1*f8e2c85aSAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f8e2c85aSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f8e2c85aSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f8e2c85aSAndrew Rist * distributed with this work for additional information
6*f8e2c85aSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f8e2c85aSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f8e2c85aSAndrew Rist * "License"); you may not use this file except in compliance
9*f8e2c85aSAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*f8e2c85aSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*f8e2c85aSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f8e2c85aSAndrew Rist * software distributed under the License is distributed on an
15*f8e2c85aSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f8e2c85aSAndrew Rist * KIND, either express or implied. See the License for the
17*f8e2c85aSAndrew Rist * specific language governing permissions and limitations
18*f8e2c85aSAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*f8e2c85aSAndrew Rist *************************************************************/
21*f8e2c85aSAndrew Rist
22*f8e2c85aSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_shell.hxx"
26cdf0e10cSrcweir #include "internal/metainforeader.hxx"
27cdf0e10cSrcweir #include "dummytag.hxx"
28cdf0e10cSrcweir #include "simpletag.hxx"
29cdf0e10cSrcweir #include "keywordstag.hxx"
30cdf0e10cSrcweir
31cdf0e10cSrcweir #include "assert.h"
32cdf0e10cSrcweir
33cdf0e10cSrcweir /** constructor.
34cdf0e10cSrcweir */
CMetaInfoReader(const std::string & DocumentName)35cdf0e10cSrcweir CMetaInfoReader::CMetaInfoReader( const std::string& DocumentName ):
36cdf0e10cSrcweir CBaseReader( DocumentName )
37cdf0e10cSrcweir {
38cdf0e10cSrcweir try
39cdf0e10cSrcweir {
40cdf0e10cSrcweir m_pKeywords_Builder = new CKeywordsTag( );
41cdf0e10cSrcweir m_pSimple_Builder = new CSimpleTag( );
42cdf0e10cSrcweir m_pDummy_Builder = new CDummyTag( );
43cdf0e10cSrcweir
44cdf0e10cSrcweir //retrieve all infomation that is useful
45cdf0e10cSrcweir m_AllMetaInfo[META_INFO_AUTHOR] = EMPTY_XML_TAG;
46cdf0e10cSrcweir m_AllMetaInfo[META_INFO_TITLE] = EMPTY_XML_TAG;
47cdf0e10cSrcweir m_AllMetaInfo[META_INFO_SUBJECT] = EMPTY_XML_TAG;
48cdf0e10cSrcweir m_AllMetaInfo[META_INFO_KEYWORDS] = EMPTY_XML_TAG;
49cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DESCRIPTION] = EMPTY_XML_TAG;
50cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DOCUMENT_STATISTIC] = EMPTY_XML_TAG;
51cdf0e10cSrcweir
52cdf0e10cSrcweir m_AllMetaInfo[META_INFO_GENERATOR] = EMPTY_XML_TAG;
53cdf0e10cSrcweir m_AllMetaInfo[META_INFO_CREATION] = EMPTY_XML_TAG;
54cdf0e10cSrcweir m_AllMetaInfo[META_INFO_CREATOR] = EMPTY_XML_TAG;
55cdf0e10cSrcweir m_AllMetaInfo[META_INFO_MODIFIED] = EMPTY_XML_TAG;
56cdf0e10cSrcweir m_AllMetaInfo[META_INFO_LANGUAGE] = EMPTY_XML_TAG;
57cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DOCUMENT_NUMBER] = EMPTY_XML_TAG;
58cdf0e10cSrcweir m_AllMetaInfo[META_INFO_EDITING_TIME] = EMPTY_XML_TAG;
59cdf0e10cSrcweir
60cdf0e10cSrcweir Initialize( META_CONTENT_NAME );
61cdf0e10cSrcweir }
62cdf0e10cSrcweir catch(xml_parser_exception&
63cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
64cdf0e10cSrcweir ex
65cdf0e10cSrcweir #endif
66cdf0e10cSrcweir )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir ENSURE(false, ex.what());
69cdf0e10cSrcweir }
70cdf0e10cSrcweir catch(...)
71cdf0e10cSrcweir {
72cdf0e10cSrcweir ENSURE(false, "Unknown error");
73cdf0e10cSrcweir }
74cdf0e10cSrcweir }
75cdf0e10cSrcweir
CMetaInfoReader(void * stream,zlib_filefunc_def * fa)76cdf0e10cSrcweir CMetaInfoReader::CMetaInfoReader( void* stream, zlib_filefunc_def* fa) :
77cdf0e10cSrcweir CBaseReader( stream, fa)
78cdf0e10cSrcweir {
79cdf0e10cSrcweir try
80cdf0e10cSrcweir {
81cdf0e10cSrcweir m_pKeywords_Builder = new CKeywordsTag( );
82cdf0e10cSrcweir m_pSimple_Builder = new CSimpleTag( );
83cdf0e10cSrcweir m_pDummy_Builder = new CDummyTag( );
84cdf0e10cSrcweir
85cdf0e10cSrcweir //retrieve all infomation that is useful
86cdf0e10cSrcweir m_AllMetaInfo[META_INFO_AUTHOR] = EMPTY_XML_TAG;
87cdf0e10cSrcweir m_AllMetaInfo[META_INFO_TITLE] = EMPTY_XML_TAG;
88cdf0e10cSrcweir m_AllMetaInfo[META_INFO_SUBJECT] = EMPTY_XML_TAG;
89cdf0e10cSrcweir m_AllMetaInfo[META_INFO_KEYWORDS] = EMPTY_XML_TAG;
90cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DESCRIPTION] = EMPTY_XML_TAG;
91cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DOCUMENT_STATISTIC] = EMPTY_XML_TAG;
92cdf0e10cSrcweir
93cdf0e10cSrcweir m_AllMetaInfo[META_INFO_GENERATOR] = EMPTY_XML_TAG;
94cdf0e10cSrcweir m_AllMetaInfo[META_INFO_CREATION] = EMPTY_XML_TAG;
95cdf0e10cSrcweir m_AllMetaInfo[META_INFO_CREATOR] = EMPTY_XML_TAG;
96cdf0e10cSrcweir m_AllMetaInfo[META_INFO_MODIFIED] = EMPTY_XML_TAG;
97cdf0e10cSrcweir m_AllMetaInfo[META_INFO_LANGUAGE] = EMPTY_XML_TAG;
98cdf0e10cSrcweir m_AllMetaInfo[META_INFO_DOCUMENT_NUMBER] = EMPTY_XML_TAG;
99cdf0e10cSrcweir m_AllMetaInfo[META_INFO_EDITING_TIME] = EMPTY_XML_TAG;
100cdf0e10cSrcweir
101cdf0e10cSrcweir Initialize( META_CONTENT_NAME );
102cdf0e10cSrcweir }
103cdf0e10cSrcweir catch(xml_parser_exception&
104cdf0e10cSrcweir #if OSL_DEBUG_LEVEL > 0
105cdf0e10cSrcweir ex
106cdf0e10cSrcweir #endif
107cdf0e10cSrcweir )
108cdf0e10cSrcweir {
109cdf0e10cSrcweir ENSURE(false, ex.what());
110cdf0e10cSrcweir }
111cdf0e10cSrcweir catch(...)
112cdf0e10cSrcweir {
113cdf0e10cSrcweir ENSURE(false, "Unknown error");
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
118cdf0e10cSrcweir /** destructor.
119cdf0e10cSrcweir */
120cdf0e10cSrcweir
~CMetaInfoReader(void)121cdf0e10cSrcweir CMetaInfoReader::~CMetaInfoReader( void )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir delete m_pKeywords_Builder;
124cdf0e10cSrcweir delete m_pSimple_Builder;
125cdf0e10cSrcweir delete m_pDummy_Builder;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir
128cdf0e10cSrcweir
129cdf0e10cSrcweir /*********************** export functions ***********************/
130cdf0e10cSrcweir
131cdf0e10cSrcweir /** check if the Tag is in the target meta.xml file.
132cdf0e10cSrcweir
133cdf0e10cSrcweir @param TagName
134cdf0e10cSrcweir the name of the tag that will be retrive.
135cdf0e10cSrcweir */
hasTag(std::wstring TagName) const136cdf0e10cSrcweir bool CMetaInfoReader::hasTag( std::wstring TagName ) const
137cdf0e10cSrcweir {
138cdf0e10cSrcweir return ( m_AllMetaInfo.find(TagName) != m_AllMetaInfo.end());
139cdf0e10cSrcweir }
140cdf0e10cSrcweir
141cdf0e10cSrcweir /** Get a specific tag content, compound tags will be returned as comma separated list.
142cdf0e10cSrcweir
143cdf0e10cSrcweir @param TagName
144cdf0e10cSrcweir the name of the tag that will be retrive.
145cdf0e10cSrcweir */
getTagData(const std::wstring & TagName)146cdf0e10cSrcweir std::wstring CMetaInfoReader::getTagData( const std::wstring& TagName)
147cdf0e10cSrcweir {
148cdf0e10cSrcweir if( hasTag( TagName ) )
149cdf0e10cSrcweir return m_AllMetaInfo[TagName].first;
150cdf0e10cSrcweir else
151cdf0e10cSrcweir return EMPTY_STRING;
152cdf0e10cSrcweir }
153cdf0e10cSrcweir
154cdf0e10cSrcweir /** check if the a tag has the specific attribute.
155cdf0e10cSrcweir
156cdf0e10cSrcweir @param TagName
157cdf0e10cSrcweir the name of the tag.
158cdf0e10cSrcweir @param AttributeName
159cdf0e10cSrcweir the name of the attribute.
160cdf0e10cSrcweir */
hasTagAttribute(const std::wstring TagName,std::wstring AttributeName)161cdf0e10cSrcweir bool CMetaInfoReader::hasTagAttribute( const std::wstring TagName, std::wstring AttributeName)
162cdf0e10cSrcweir {
163cdf0e10cSrcweir return ( m_AllMetaInfo[TagName].second.find( AttributeName) != m_AllMetaInfo[TagName].second.end() );
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
166cdf0e10cSrcweir /** Get a specific attribute content.
167cdf0e10cSrcweir
168cdf0e10cSrcweir @param TagName
169cdf0e10cSrcweir the name of the tag.
170cdf0e10cSrcweir @param AttributeName
171cdf0e10cSrcweir the name of the attribute.
172cdf0e10cSrcweir */
getTagAttribute(const std::wstring TagName,std::wstring AttributeName)173cdf0e10cSrcweir std::wstring CMetaInfoReader::getTagAttribute( const std::wstring TagName, std::wstring AttributeName)
174cdf0e10cSrcweir {
175cdf0e10cSrcweir if ( hasTagAttribute( TagName, AttributeName ) )
176cdf0e10cSrcweir return m_AllMetaInfo[ TagName ].second[AttributeName];
177cdf0e10cSrcweir else
178cdf0e10cSrcweir return EMPTY_STRING;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir
181cdf0e10cSrcweir /** helper function for getDefaultLocale().
182cdf0e10cSrcweir */
183cdf0e10cSrcweir const LocaleSet_t EN_US_LOCALE( ::std::make_pair( ::std::wstring( L"en" ), ::std::wstring( L"US" )));
184cdf0e10cSrcweir
isValidLocale(::std::wstring Locale)185cdf0e10cSrcweir bool isValidLocale ( ::std::wstring Locale )
186cdf0e10cSrcweir {
187cdf0e10cSrcweir return ( Locale.length() == 5 );
188cdf0e10cSrcweir }
189cdf0e10cSrcweir
190cdf0e10cSrcweir /** Get the default language of the whole document, if no such field, en-US is returned.
191cdf0e10cSrcweir */
getDefaultLocale()192cdf0e10cSrcweir LocaleSet_t CMetaInfoReader::getDefaultLocale()
193cdf0e10cSrcweir {
194cdf0e10cSrcweir if (hasTag(META_INFO_LANGUAGE))
195cdf0e10cSrcweir {
196cdf0e10cSrcweir ::std::wstring locale = m_AllMetaInfo[META_INFO_LANGUAGE].first;
197cdf0e10cSrcweir return isValidLocale(locale) ? ::std::make_pair(locale.substr( 0,2), locale.substr( 3,2)) : EN_US_LOCALE;
198cdf0e10cSrcweir }
199cdf0e10cSrcweir else
200cdf0e10cSrcweir return EN_US_LOCALE;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir
203cdf0e10cSrcweir /*********************** tag related functions ***********************/
204cdf0e10cSrcweir
205cdf0e10cSrcweir /** choose an appropriate tag reader
206cdf0e10cSrcweir */
207cdf0e10cSrcweir
chooseTagReader(const std::wstring & tag_name,const XmlTagAttributes_t & XmlAttributes)208cdf0e10cSrcweir ITag* CMetaInfoReader::chooseTagReader( const std::wstring& tag_name, const XmlTagAttributes_t& XmlAttributes )
209cdf0e10cSrcweir {
210cdf0e10cSrcweir if ( tag_name == META_INFO_KEYWORD )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir m_AllMetaInfo[META_INFO_KEYWORDS].second = XmlAttributes;
213cdf0e10cSrcweir return m_pKeywords_Builder;
214cdf0e10cSrcweir }
215cdf0e10cSrcweir if (( tag_name == META_INFO_TITLE )||( tag_name == META_INFO_AUTHOR )||( tag_name == META_INFO_SUBJECT )||( tag_name == META_INFO_DESCRIPTION )||
216cdf0e10cSrcweir ( tag_name == META_INFO_DOCUMENT_STATISTIC )||( tag_name == META_INFO_GENERATOR )||( tag_name == META_INFO_CREATION )||( tag_name == META_INFO_CREATOR )||
217cdf0e10cSrcweir ( tag_name == META_INFO_MODIFIED )||( tag_name == META_INFO_LANGUAGE )||( tag_name == META_INFO_DOCUMENT_NUMBER )||( tag_name == META_INFO_EDITING_TIME ) )
218cdf0e10cSrcweir {
219cdf0e10cSrcweir m_AllMetaInfo[tag_name].second = XmlAttributes;
220cdf0e10cSrcweir return m_pSimple_Builder;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir else
223cdf0e10cSrcweir return m_pDummy_Builder;
224cdf0e10cSrcweir
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir //------------------------------
228cdf0e10cSrcweir // save the received content into structure.
229cdf0e10cSrcweir //------------------------------
saveTagContent(const std::wstring & tag_name)230cdf0e10cSrcweir void CMetaInfoReader::saveTagContent( const std::wstring& tag_name )
231cdf0e10cSrcweir {
232cdf0e10cSrcweir ITag* pTagBuilder;
233cdf0e10cSrcweir if ( tag_name == META_INFO_KEYWORDS )
234cdf0e10cSrcweir pTagBuilder = m_pKeywords_Builder;
235cdf0e10cSrcweir else if ( tag_name == META_INFO_KEYWORD )
236cdf0e10cSrcweir {
237cdf0e10cSrcweir // added for support for OASIS xml file format.
238cdf0e10cSrcweir m_AllMetaInfo[META_INFO_KEYWORDS].first =m_pKeywords_Builder->getTagContent( );
239cdf0e10cSrcweir return;
240cdf0e10cSrcweir }
241cdf0e10cSrcweir else if (( tag_name == META_INFO_TITLE )||( tag_name == META_INFO_AUTHOR )||( tag_name == META_INFO_SUBJECT )||( tag_name == META_INFO_DESCRIPTION )||
242cdf0e10cSrcweir ( tag_name == META_INFO_DOCUMENT_STATISTIC )||( tag_name == META_INFO_GENERATOR )||( tag_name == META_INFO_CREATION )||( tag_name == META_INFO_CREATOR )||
243cdf0e10cSrcweir ( tag_name == META_INFO_MODIFIED )||( tag_name == META_INFO_LANGUAGE )||( tag_name == META_INFO_DOCUMENT_NUMBER )||( tag_name == META_INFO_EDITING_TIME ) )
244cdf0e10cSrcweir pTagBuilder = m_pSimple_Builder;
245cdf0e10cSrcweir else
246cdf0e10cSrcweir pTagBuilder = m_pDummy_Builder;
247cdf0e10cSrcweir
248cdf0e10cSrcweir m_AllMetaInfo[tag_name].first =pTagBuilder->getTagContent( );
249cdf0e10cSrcweir }
250cdf0e10cSrcweir
251cdf0e10cSrcweir
252cdf0e10cSrcweir /*********************** event handler functions ***********************/
253cdf0e10cSrcweir
254cdf0e10cSrcweir //------------------------------
255cdf0e10cSrcweir // start_element occurs when a tag is start
256cdf0e10cSrcweir //------------------------------
257cdf0e10cSrcweir
start_element(const std::wstring &,const std::wstring & local_name,const XmlTagAttributes_t & attributes)258cdf0e10cSrcweir void CMetaInfoReader::start_element(
259cdf0e10cSrcweir const std::wstring& /*raw_name*/,
260cdf0e10cSrcweir const std::wstring& local_name,
261cdf0e10cSrcweir const XmlTagAttributes_t& attributes)
262cdf0e10cSrcweir {
263cdf0e10cSrcweir //get appropriate Xml Tag Builder using MetaInfoBuilderFactory;
264cdf0e10cSrcweir ITag* pTagBuilder = chooseTagReader( local_name,attributes );
265cdf0e10cSrcweir assert( pTagBuilder!= NULL );
266cdf0e10cSrcweir pTagBuilder->startTag( );
267cdf0e10cSrcweir m_TagBuilderStack.push( pTagBuilder );
268cdf0e10cSrcweir
269cdf0e10cSrcweir }
270cdf0e10cSrcweir
271cdf0e10cSrcweir //------------------------------
272cdf0e10cSrcweir // end_element occurs when a tag is closed
273cdf0e10cSrcweir //------------------------------
274cdf0e10cSrcweir
end_element(const std::wstring &,const std::wstring & local_name)275cdf0e10cSrcweir void CMetaInfoReader::end_element(const std::wstring& /*raw_name*/, const std::wstring& local_name)
276cdf0e10cSrcweir {
277cdf0e10cSrcweir assert( !m_TagBuilderStack.empty() );
278cdf0e10cSrcweir ITag* pTagBuilder = m_TagBuilderStack.top();
279cdf0e10cSrcweir m_TagBuilderStack.pop();
280cdf0e10cSrcweir pTagBuilder->endTag();
281cdf0e10cSrcweir
282cdf0e10cSrcweir saveTagContent( local_name );
283cdf0e10cSrcweir
284cdf0e10cSrcweir }
285cdf0e10cSrcweir
286cdf0e10cSrcweir //------------------------------
287cdf0e10cSrcweir // characters occurs when receiving characters
288cdf0e10cSrcweir //------------------------------
289cdf0e10cSrcweir
characters(const std::wstring & character)290cdf0e10cSrcweir void CMetaInfoReader::characters( const std::wstring& character )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir if ( character.length() > 0 && !HasOnlySpaces( character ) )
293cdf0e10cSrcweir {
294cdf0e10cSrcweir ITag* pTagBuilder = m_TagBuilderStack.top();
295cdf0e10cSrcweir pTagBuilder->addCharacters( character );
296cdf0e10cSrcweir }
297cdf0e10cSrcweir }
298cdf0e10cSrcweir
299