public function parseToPart($text, $charset = 'UTF-8')
{
$parts = $this->parse($text);
if (empty($parts) || count($parts) == 1 && $parts[0]['type'] == self::ARMOR_TEXT) {
return null;
}
$new_part = new Horde_Mime_Part();
$new_part->setType('multipart/mixed');
while (list(, $val) = each($parts)) {
switch ($val['type']) {
case self::ARMOR_TEXT:
$part = new Horde_Mime_Part();
$part->setType('text/plain');
$part->setCharset($charset);
$part->setContents(implode("\n", $val['data']));
$new_part->addPart($part);
break;
case self::ARMOR_PUBLIC_KEY:
$part = new Horde_Mime_Part();
$part->setType('application/pgp-keys');
$part->setContents(implode("\n", $val['data']));
$new_part->addPart($part);
break;
case self::ARMOR_MESSAGE:
$part = new Horde_Mime_Part();
$part->setType('multipart/encrypted');
$part->setMetadata(self::PGP_ARMOR, true);
$part->setContentTypeParameter('protocol', 'application/pgp-encrypted');
$part1 = new Horde_Mime_Part();
$part1->setType('application/pgp-encrypted');
$part1->setContents("Version: 1\n");
$part2 = new Horde_Mime_Part();
$part2->setType('application/octet-stream');
$part2->setContents(implode("\n", $val['data']));
$part2->setDisposition('inline');
$part->addPart($part1);
$part->addPart($part2);
$new_part->addPart($part);
break;
case self::ARMOR_SIGNED_MESSAGE:
if ((list(, $sig) = each($parts)) && $sig['type'] == self::ARMOR_SIGNATURE) {
$part = new Horde_Mime_Part();
$part->setType('multipart/signed');
// TODO: add micalg parameter
$part->setContentTypeParameter('protocol', 'application/pgp-signature');
$part1 = new Horde_Mime_Part();
$part1->setType('text/plain');
$part1->setCharset($charset);
$part1_data = implode("\n", $val['data']);
$part1->setContents(substr($part1_data, strpos($part1_data, "\n\n") + 2));
$part2 = new Horde_Mime_Part();
$part2->setType('application/pgp-signature');
$part2->setContents(implode("\n", $sig['data']));
$part2->setMetadata(self::SIG_CHARSET, $charset);
$part2->setMetadata(self::SIG_RAW, implode("\n", $val['data']) . "\n" . implode("\n", $sig['data']));
$part->addPart($part1);
$part->addPart($part2);
$new_part->addPart($part);
next($parts);
}
}
}
return $new_part;
}