summaryrefslogtreecommitdiff
path: root/src/dcp.cc
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-01-01 23:17:07 +0000
committerCarl Hetherington <cth@carlh.net>2013-01-01 23:17:07 +0000
commitaef58f7a1caf6a67c2c0b12ba3a6bc632d890f4e (patch)
treede09dea793415454c0e656b5cfd27a027abc8f57 /src/dcp.cc
parent039ea029c811b7f74f02befad10d2106ad645e74 (diff)
Use libxml++ to write CPLs.
Diffstat (limited to 'src/dcp.cc')
-rw-r--r--src/dcp.cc130
1 files changed, 67 insertions, 63 deletions
diff --git a/src/dcp.cc b/src/dcp.cc
index 647ff7f6..bd3cc80b 100644
--- a/src/dcp.cc
+++ b/src/dcp.cc
@@ -293,7 +293,7 @@ DCP::assets () const
a.merge (t);
}
- a.sort ();
+ a.sort (AssetComparator ());
a.unique ();
return a;
}
@@ -431,77 +431,81 @@ CPL::write_xml (bool encrypted, CertificateChain const & certificates) const
stringstream s;
s << _uuid << "_cpl.xml";
p /= s.str();
- ofstream os (p.string().c_str());
-
- os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
- << "<CompositionPlaylist xmlns=\"http://www.smpte-ra.org/schemas/429-7/2006/CPL\">\n"
- << " <Id>urn:uuid:" << _uuid << "</Id>\n"
- << " <AnnotationText>" << _name << "</AnnotationText>\n"
- << " <IssueDate>" << Metadata::instance()->issue_date << "</IssueDate>\n"
- << " <Creator>" << Metadata::instance()->creator << "</Creator>\n"
- << " <ContentTitleText>" << _name << "</ContentTitleText>\n"
- << " <ContentKind>" << content_kind_to_string (_content_kind) << "</ContentKind>\n"
- << " <ContentVersion>\n"
- << " <Id>urn:uri:" << _uuid << "_" << Metadata::instance()->issue_date << "</Id>\n"
- << " <LabelText>" << _uuid << "_" << Metadata::instance()->issue_date << "</LabelText>\n"
- << " </ContentVersion>\n"
- << " <RatingList/>\n"
- << " <ReelList>\n";
-
- for (list<shared_ptr<const Reel> >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) {
- (*i)->write_to_cpl (os);
+
+ xmlpp::Document doc;
+ xmlpp::Element* cpl = doc.create_root_node("CompositionPlaylist", "http://www.smpte-ra.org/schemas/429-7/2006/CPL");
+
+ cpl->add_child("Id")->add_child_text ("urn:uuid:" + _uuid);
+ cpl->add_child("AnnotationText")->add_child_text (_name);
+ cpl->add_child("IssueDate")->add_child_text (Metadata::instance()->issue_date);
+ cpl->add_child("Creator")->add_child_text (Metadata::instance()->creator);
+ cpl->add_child("ContentTitleText")->add_child_text (_name);
+ cpl->add_child("ContentKind")->add_child_text (content_kind_to_string (_content_kind));
+
+ {
+ xmlpp::Element* cv = cpl->add_child ("ContentVersion");
+ cv->add_child("Id")->add_child_text ("urn:uri:" + _uuid + "_" + Metadata::instance()->issue_date);
+ cv->add_child("LabelText")->add_child_text (_uuid + "_" + Metadata::instance()->issue_date);
}
- os << " </AssetList>\n"
- << " </Reel>\n"
- << " </ReelList>\n";
+ cpl->add_child("RatingList");
+
+ xmlpp::Element* reel_list = cpl->add_child("ReelList");
+ for (list<shared_ptr<const Reel> >::const_iterator i = _reels.begin(); i != _reels.end(); ++i) {
+ (*i)->write_to_cpl (reel_list);
+ }
if (encrypted) {
- os << " <Signer>\n"
- << " <dsig:X509Data>\n"
- << " <dsig:X509IssuerSerial>\n"
- << " <dsig:X509IssuerName>" << Certificate::name_for_xml (certificates.leaf()->issuer()) << "</dsig:IssuerName>\n"
- << " <dsig:X509SerialNumber>" << certificates.leaf()->serial() << "</dsig:X509SerialNumber>\n"
- << " <dsig:X509IssuerSerial>\n"
- << " <dsig:X509SubjectName>" << Certificate::name_for_xml (certificates.leaf()->subject()) << "</dsig:X509SubjectName>\n"
- << " </dsig:X509Data>\n"
- << " </Signer>\n"
- << " <dsig:Signature>\n"
- << " <dsig:SignedInfo>\n"
- << " <dsig:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n"
- << " <dsig:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n"
- << " <dsig:Reference URI=\"\">\n"
- << " <dsig:Transforms>\n"
- << " <dsig:Transform Algorithm=\"http://www.w3.org/2000/09/xmldsig#enveloped-signature\"/>\n"
- << " </dsig:Transforms>\n"
- << " <dsig:DigestMethod Algorithm=\"http://www.w3.org/2000/09/xmldsig#sha1\"/>\n"
- /* this is done by xmlsec1 in cinemaslides */
- << " <dsig:DigestValue>" << "XXX" << "</dsig:DigestValue>\n"
- << " </dsig:Reference>\n"
- << " </dsig:SignedInfo>\n"
- /* this is done by xmlsec1 in cinemaslides */
- << " <dsig:SignatureValue>" << "XXX" << "</dsig:SignatureValue>\n";
-
- os << " <dsig:KeyInfo>\n";
-
+ xmlpp::Element* signer = cpl->add_child("Signer");
+ {
+ xmlpp::Element* data = signer->add_child("X509Data", "dsig");
+ {
+ xmlpp::Element* serial = data->add_child("X509IssuerSerial", "dsig");
+ serial->add_child("X509IssuerName", "dsig")->add_child_text (
+ Certificate::name_for_xml (certificates.leaf()->issuer())
+ );
+ serial->add_child("X509SerialNumber", "dsig")->add_child_text (
+ certificates.leaf()->serial()
+ );
+ }
+ data->add_child("X509SubjectName", "dsig")->add_child_text (
+ Certificate::name_for_xml (certificates.leaf()->subject())
+ );
+ }
+
+ xmlpp::Element* signature = cpl->add_child("Signature", "dsig");
+ {
+ xmlpp::Element* signed_info = signature->add_child ("SignedInfo", "dsig");
+ signed_info->add_child("CanonicalizationMethod", "dsig")->set_attribute ("Algorithm", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315");
+ signed_info->add_child("SignatureMethod", "dsig")->set_attribute("Algorithm", "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256");
+ {
+ xmlpp::Element* reference = signature->add_child("Reference", "dsig");
+ reference->set_attribute ("URI", "");
+ {
+ xmlpp::Element* transforms = reference->add_child("Transforms", "dsig");
+ transforms->add_child("Transform", "dsig")->set_attribute (
+ "Algorithm", "http://www.w3.org/2000/09/xmldsig#enveloped-signature"
+ );
+ }
+ reference->add_child("DigestMethod", "dsig")->set_attribute("Algorithm", "http://www.w3.org/2000/09/xmldsig#sha1");
+ }
+ }
+
list<shared_ptr<Certificate> > c = certificates.leaf_to_root ();
for (list<shared_ptr<Certificate> >::iterator i = c.begin(); i != c.end(); ++i) {
- os << " <dsig:X509Data>\n"
- << " <dsig:X509IssuerSerial>\n"
- << " <dsig:X509IssuerName>" << Certificate::name_for_xml ((*i)->issuer()) << "</dsig:IssuerName>\n"
- << " <dsig:X509SerialNumber>" << (*i)->serial() << "</dsig:X509SerialNumber>\n"
- << " </dsig:X509IssuerSerial>\n"
- << " <dsig:X509Certificate>" << "XXX" << "</dsig:X509Certificate>\n"
- << " </dsig:X509Data>\n";
+ xmlpp::Element* data = signature->add_child("X509Data", "dsig");
+ {
+ xmlpp::Element* serial = data->add_child("X509IssuerSerial", "data");
+ serial->add_child("X509IssuerName", "dsig")->add_child_text(
+ Certificate::name_for_xml ((*i)->issuer())
+ );
+ serial->add_child("X509SerialNumber", "dsig")->add_child_text((*i)->serial());
+ serial->add_child("X509Certificate", "dsig")->add_child_text("XXX");
+ }
}
-
- os << " </dsig:KeyInfo>\n";
- os << " </dsig:Signature>\n";
}
-
- os << "</CompositionPlaylist>\n";
- os.close ();
+ doc.write_to_file_formatted (p.string(), "UTF-8");
_digest = make_digest (p.string (), 0);
_length = boost::filesystem::file_size (p.string ());