xref: /AOO41X/main/shell/source/all/ooofilereader/metainforeader.cxx (revision f8e2c85a611dbc087707e0b32c9aee1ddf7485ca)
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