diff options
| author | Carl Hetherington <cth@carlh.net> | 2013-01-01 23:17:07 +0000 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2013-01-01 23:17:07 +0000 |
| commit | aef58f7a1caf6a67c2c0b12ba3a6bc632d890f4e (patch) | |
| tree | de09dea793415454c0e656b5cfd27a027abc8f57 /src/dcp.cc | |
| parent | 039ea029c811b7f74f02befad10d2106ad645e74 (diff) | |
Use libxml++ to write CPLs.
Diffstat (limited to 'src/dcp.cc')
| -rw-r--r-- | src/dcp.cc | 130 |
1 files changed, 67 insertions, 63 deletions
@@ -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 ()); |
