xref: /trunk/main/xmloff/source/transform/MetaTContext.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 #include <com/sun/star/xml/sax/SAXParseException.hpp>
31 #include <com/sun/star/xml/sax/SAXException.hpp>
32 #include <com/sun/star/xml/sax/XDocumentHandler.hpp>
33 #include <com/sun/star/xml/sax/XAttributeList.hpp>
34 #include <xmloff/nmspmap.hxx>
35 #include <xmloff/xmltoken.hxx>
36 #include "xmloff/xmlnmspe.hxx"
37 
38 #ifndef _XMLOFF_TRANSFOERMERBASE_HXX
39 #include "TransformerBase.hxx"
40 #endif
41 #include "MutableAttrList.hxx"
42 #include "MetaTContext.hxx"
43 
44 using ::rtl::OUString;
45 using namespace ::xmloff::token;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::xml::sax;
48 
49 XMLTokenEnum aMetaTokens[] =
50 {
51     XML_GENERATOR,
52     XML_TITLE,
53     XML_DESCRIPTION,
54     XML_SUBJECT,
55     XML_INITIAL_CREATOR,
56     XML_CREATION_DATE,
57     XML_CREATOR,
58     XML_DATE,
59     XML_PRINTED_BY,
60     XML_PRINT_DATE,
61     XML_KEYWORD,
62     XML_LANGUAGE,
63     XML_EDITING_CYCLES,
64     XML_EDITING_DURATION,
65     XML_HYPERLINK_BEHAVIOUR,
66     XML_AUTO_RELOAD,
67     XML_TEMPLATE,
68     XML_USER_DEFINED,
69     XML_DOCUMENT_STATISTIC,
70     XML_TOKEN_END
71 };
72 
73 TYPEINIT1( XMLMetaTransformerContext, XMLTransformerContext );
74 
75 XMLMetaTransformerContext::XMLMetaTransformerContext( XMLTransformerBase& rImp,
76                                               const OUString& rQName ) :
77     XMLTransformerContext( rImp, rQName )
78 {
79 }
80 
81 XMLMetaTransformerContext::~XMLMetaTransformerContext()
82 {
83 }
84 
85 XMLTransformerContext *XMLMetaTransformerContext::CreateChildContext(
86             sal_uInt16 /*nPrefix*/,
87             const OUString& rLocalName,
88             const OUString& rQName,
89             const Reference< XAttributeList >& )
90 {
91     XMLPersTextContentTContext *pContext =
92         new XMLPersTextContentTContext( GetTransformer(), rQName );
93     XMLMetaContexts_Impl::value_type aVal( rLocalName, pContext );
94     m_aContexts.insert( aVal );
95 
96     return pContext;
97 }
98 
99 void XMLMetaTransformerContext::EndElement()
100 {
101     // export everything in the correct order
102     OUString aKeywordsQName;
103     XMLTokenEnum *pToken = aMetaTokens;
104     while( *pToken != XML_TOKEN_END )
105     {
106         const OUString& rToken = GetXMLToken( *pToken );
107         XMLMetaContexts_Impl::const_iterator aIter =
108             m_aContexts.find( rToken );
109         if( aIter != m_aContexts.end() )
110         {
111             if( XML_KEYWORD == *pToken )
112             {
113                 aKeywordsQName =
114                     GetTransformer().GetNamespaceMap().GetQNameByKey(
115                             XML_NAMESPACE_META, GetXMLToken(XML_KEYWORDS ) );
116 
117                 Reference< XAttributeList > xAttrList =
118                     new XMLMutableAttributeList;
119                 GetTransformer().GetDocHandler()->startElement( aKeywordsQName,
120                                                             xAttrList );
121             }
122 
123             // All elements may occur multiple times
124             XMLMetaContexts_Impl::const_iterator aEndIter =
125                 m_aContexts.upper_bound( rToken );
126             while( aIter != aEndIter )
127             {
128                 (*aIter).second->Export();
129                 ++aIter;
130             }
131 
132             if( XML_KEYWORD == *pToken )
133                 GetTransformer().GetDocHandler()->endElement( aKeywordsQName );
134         }
135         pToken++;
136     }
137 
138     GetTransformer().GetDocHandler()->endElement( GetQName() );
139 }
140 
141 void XMLMetaTransformerContext::Characters( const OUString& )
142 {
143     // ignore them
144 }
145 
146 
147