]> git.donarmstrong.com Git - flightcrew.git/blob - src/FlightCrew/Validators/Opf/MetadataAllowedChildren.cpp
Imported Upstream version 0.7.2+dfsg
[flightcrew.git] / src / FlightCrew / Validators / Opf / MetadataAllowedChildren.cpp
1 /************************************************************************\r
2 **\r
3 **  Copyright (C) 2010  Strahinja Markovic\r
4 **\r
5 **  This file is part of FlightCrew.\r
6 **\r
7 **  FlightCrew is free software: you can redistribute it and/or modify\r
8 **  it under the terms of the GNU Lesser General Public License as published\r
9 **  by the Free Software Foundation, either version 3 of the License, or\r
10 **  (at your option) any later version.\r
11 **\r
12 **  FlightCrew is distributed in the hope that it will be useful,\r
13 **  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15 **  GNU Lesser General Public License for more details.\r
16 **\r
17 **  You should have received a copy of the GNU Lesser General Public License\r
18 **  along with FlightCrew.  If not, see <http://www.gnu.org/licenses/>.\r
19 **\r
20 *************************************************************************/\r
21 \r
22 #include <stdafx.h>\r
23 #include "MetadataAllowedChildren.h"\r
24 #include <ToXercesStringConverter.h>\r
25 #include <FromXercesStringConverter.h>\r
26 #include <XmlUtils.h>\r
27 \r
28 namespace FlightCrew\r
29 {\r
30 \r
31 // These have to go here; otherwise, we get the static initialization order fiasco\r
32 const std::string MAIN_XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"; \r
33 const std::string OPF_XML_NAMESPACE  = "http://www.idpf.org/2007/opf"; \r
34 const std::string DC_XML_NAMESPACE   = "http://purl.org/dc/elements/1.1/";\r
35 const std::string NCX_XML_NAMESPACE  = "http://www.daisy.org/z3986/2005/ncx/";\r
36     \r
37 const QName DC_METADATA_QNAME = QName( "dc-metadata", OPF_XML_NAMESPACE );\r
38 const QName X_METADATA_QNAME  = QName( "x-metadata",  OPF_XML_NAMESPACE );\r
39 \r
40 const QName TITLE_QNAME       = QName( "title",       DC_XML_NAMESPACE  );\r
41 const QName LANGUAGE_QNAME    = QName( "language",    DC_XML_NAMESPACE  );\r
42 const QName IDENTIFIER_QNAME  = QName( "identifier",  DC_XML_NAMESPACE  );\r
43 const QName CREATOR_QNAME     = QName( "creator",     DC_XML_NAMESPACE  );\r
44 const QName SUBJECT_QNAME     = QName( "subject",     DC_XML_NAMESPACE  );\r
45 const QName DESCRIPTION_QNAME = QName( "description", DC_XML_NAMESPACE  );\r
46 const QName PUBLISHER_QNAME   = QName( "publisher",   DC_XML_NAMESPACE  );\r
47 const QName CONTRIBUTOR_QNAME = QName( "contributor", DC_XML_NAMESPACE  );\r
48 const QName DATE_QNAME        = QName( "date",        DC_XML_NAMESPACE  );\r
49 const QName TYPE_QNAME        = QName( "type",        DC_XML_NAMESPACE  );\r
50 const QName FORMAT_QNAME      = QName( "format",      DC_XML_NAMESPACE  );\r
51 const QName SOURCE_QNAME      = QName( "source",      DC_XML_NAMESPACE  );\r
52 const QName RELATION_QNAME    = QName( "relation",    DC_XML_NAMESPACE  );\r
53 const QName COVERAGE_QNAME    = QName( "coverage",    DC_XML_NAMESPACE  );\r
54 const QName RIGHTS_QNAME      = QName( "rights",      DC_XML_NAMESPACE  );\r
55 const QName META_QNAME        = QName( "meta",        OPF_XML_NAMESPACE );\r
56 \r
57 \r
58 std::vector< Result > MetadataAllowedChildren::ValidateXml(\r
59     const xc::DOMDocument &document,\r
60     const fs::path& )\r
61 {\r
62     xc::DOMNodeList *metadatas = document.getElementsByTagNameNS(\r
63                                     toX( OPF_XML_NAMESPACE ),  toX( "metadata" ) );\r
64 \r
65     std::vector< Result > results;\r
66 \r
67     if ( metadatas->getLength() < 1 )\r
68     \r
69         return results;    \r
70 \r
71     xc::DOMElement* metadata = static_cast< xc::DOMElement* >( metadatas->item( 0 ) );\r
72     std::vector< xc::DOMElement* > children = xe::GetElementChildren( *metadata );\r
73 \r
74     // A <metadata> element can have either a dc-metadata element and an optional\r
75     // x-metadata element, OR the standard children (title, creator, language etc.)\r
76     // plus any other child not in the reserved namespaces.\r
77     // See the OPF schema: \r
78     // http://www.idpf.org/doc_library/epub/OPF_2.0.1_draft.htm#AppendixA\r
79 \r
80     if ( xe::ElementListContains( children, DC_METADATA_QNAME ) ||\r
81          xe::ElementListContains( children, X_METADATA_QNAME  ) )\r
82     {\r
83         std::vector< Result > subresults = ValidateDCXChildrenSubset( children );\r
84         results.insert( results.end(), subresults.begin(), subresults.end() );\r
85     }\r
86 \r
87     else\r
88     {\r
89         std::vector< Result > subresults = ValidateStandardChildren( children );\r
90         results.insert( results.end(), subresults.begin(), subresults.end() );\r
91     }\r
92 \r
93     return results;\r
94 }\r
95 \r
96 \r
97 std::vector< Result > MetadataAllowedChildren::ValidateDCXChildrenSubset(\r
98     std::vector< xc::DOMElement* > children )\r
99 {\r
100     std::vector< Result > results;\r
101 \r
102     for ( uint i = 0; i < children.size(); ++i )\r
103     {\r
104         xc::DOMElement *child = children[ i ];\r
105         QName current_qname( fromX( child->getLocalName() ), \r
106                              fromX( child->getNamespaceURI() ) );\r
107 \r
108         if ( current_qname != DC_METADATA_QNAME &&\r
109              current_qname != X_METADATA_QNAME \r
110             )\r
111         {\r
112             results.push_back( NotAllowedChildResult( *children[ i ] ) );\r
113         }\r
114     } \r
115 \r
116     return results;\r
117 }\r
118 \r
119 \r
120 std::vector< Result > MetadataAllowedChildren::ValidateStandardChildren( \r
121     std::vector< xc::DOMElement* > children )\r
122 {\r
123     std::vector< Result > results;\r
124 \r
125     for ( uint i = 0; i < children.size(); ++i )\r
126     {\r
127         std::string local_name     = fromX( children[ i ]->getLocalName() );\r
128         std::string namespace_name = fromX( children[ i ]->getNamespaceURI() );\r
129         QName child_qname( local_name, namespace_name );\r
130 \r
131         if ( child_qname != TITLE_QNAME       &&\r
132              child_qname != LANGUAGE_QNAME    &&\r
133              child_qname != IDENTIFIER_QNAME  &&\r
134              child_qname != CREATOR_QNAME     &&\r
135              child_qname != SUBJECT_QNAME     &&\r
136              child_qname != DESCRIPTION_QNAME &&\r
137              child_qname != PUBLISHER_QNAME   &&\r
138              child_qname != CONTRIBUTOR_QNAME &&\r
139              child_qname != DATE_QNAME        &&\r
140              child_qname != TYPE_QNAME        &&\r
141              child_qname != FORMAT_QNAME      &&\r
142              child_qname != SOURCE_QNAME      &&\r
143              child_qname != RELATION_QNAME    &&\r
144              child_qname != COVERAGE_QNAME    &&\r
145              child_qname != RIGHTS_QNAME      &&\r
146              child_qname != META_QNAME \r
147             )\r
148         {            \r
149             if ( namespace_name == OPF_XML_NAMESPACE ||\r
150                  namespace_name == DC_XML_NAMESPACE\r
151                 )\r
152             {\r
153                 results.push_back( NotAllowedChildResult( *children[ i ] ) );\r
154             }\r
155         }\r
156     } \r
157 \r
158     return results;\r
159 }\r
160 \r
161 } //namespace FlightCrew