xref: /trunk/main/xmloff/source/transform/DocumentTContext.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 <com/sun/star/beans/XPropertySetInfo.hpp>
35 #include <xmloff/nmspmap.hxx>
36 #include <xmloff/xmltoken.hxx>
37 #include "xmloff/xmlnmspe.hxx"
38 
39 #ifndef _XMLOFF_TRANSFOERMERBASE_HXX
40 #include "TransformerBase.hxx"
41 #endif
42 #include "MutableAttrList.hxx"
43 
44 #ifndef _XMLOFF_METATCONTEXT_HXX
45 #include "DocumentTContext.hxx"
46 #endif
47 
48 using ::rtl::OUString;
49 
50 using namespace ::xmloff::token;
51 using namespace ::com::sun::star::uno;
52 using namespace ::com::sun::star::xml::sax;
53 using namespace ::com::sun::star::beans;
54 
55 TYPEINIT1( XMLDocumentTransformerContext, XMLTransformerContext );
56 
57 XMLDocumentTransformerContext::XMLDocumentTransformerContext( XMLTransformerBase& rImp,
58                                               const OUString& rQName ) :
59     XMLTransformerContext( rImp, rQName )
60 {
61 }
62 
63 XMLDocumentTransformerContext::~XMLDocumentTransformerContext()
64 {
65 }
66 
67 void XMLDocumentTransformerContext::StartElement( const Reference< XAttributeList >& rAttrList )
68 {
69     Reference< XAttributeList > xAttrList( rAttrList );
70 
71     sal_Bool bMimeFound = sal_False;
72     OUString aClass;
73     OUString aClassQName(
74                     GetTransformer().GetNamespaceMap().GetQNameByKey(
75                                 XML_NAMESPACE_OFFICE, GetXMLToken(XML_CLASS ) ) );
76 
77     XMLMutableAttributeList *pMutableAttrList = 0;
78     sal_Int16 nAttrCount = xAttrList.is() ? xAttrList->getLength() : 0;
79     for( sal_Int16 i=0; i < nAttrCount; i++ )
80     {
81         const OUString& rAttrName = xAttrList->getNameByIndex( i );
82         OUString aLocalName;
83         sal_uInt16 nPrefix =
84             GetTransformer().GetNamespaceMap().GetKeyByAttrName( rAttrName,
85                                                                  &aLocalName );
86         if( XML_NAMESPACE_OFFICE == nPrefix &&
87             IsXMLToken( aLocalName, XML_MIMETYPE ) )
88         {
89             const OUString& rValue = xAttrList->getValueByIndex( i );
90             static const char * aTmp[] =
91             {
92                 "application/vnd.oasis.openoffice.",
93                 "application/x-vnd.oasis.openoffice.",
94                 "application/vnd.oasis.opendocument.",
95                 "application/x-vnd.oasis.document.",
96                 NULL
97             };
98             for (int k=0; aTmp[k]; k++)
99             {
100                 ::rtl::OUString sTmpString = ::rtl::OUString::createFromAscii(aTmp[k]);
101                 if( rValue.matchAsciiL( aTmp[k], sTmpString.getLength() ) )
102                 {
103                     aClass = rValue.copy( sTmpString.getLength() );
104                     break;
105                 }
106             }
107 
108             if( !pMutableAttrList )
109             {
110                 pMutableAttrList = new XMLMutableAttributeList( xAttrList );
111                 xAttrList = pMutableAttrList;
112             }
113             pMutableAttrList->SetValueByIndex( i, aClass );
114             pMutableAttrList->RenameAttributeByIndex(i, aClassQName );
115             bMimeFound = sal_True;
116             break;
117         }
118     }
119 
120     if( !bMimeFound )
121     {
122         const Reference< XPropertySet > rPropSet =
123             GetTransformer().GetPropertySet();
124 
125         if( rPropSet.is() )
126         {
127             Reference< XPropertySetInfo > xPropSetInfo(
128                 rPropSet->getPropertySetInfo() );
129             OUString aPropName(RTL_CONSTASCII_USTRINGPARAM("Class"));
130             if( xPropSetInfo.is() && xPropSetInfo->hasPropertyByName( aPropName ) )
131             {
132                 Any aAny = rPropSet->getPropertyValue( aPropName );
133                 aAny >>= aClass;
134             }
135         }
136 
137         if( aClass.getLength() )
138         {
139             if( !pMutableAttrList )
140             {
141                 pMutableAttrList = new XMLMutableAttributeList( xAttrList );
142                 xAttrList = pMutableAttrList;
143             }
144 
145             pMutableAttrList->AddAttribute( aClassQName, aClass );
146         }
147     }
148     XMLTransformerContext::StartElement( xAttrList );
149 }
150