xref: /trunk/main/xmloff/source/script/XMLEventImportHelper.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 
31 #ifndef _XMLOFF_XMLEVENTIMPORTHELPER_HXX
32 #include "XMLEventImportHelper.hxx"
33 #endif
34 #include <tools/debug.hxx>
35 #include <xmloff/xmlimp.hxx>
36 #include <xmloff/nmspmap.hxx>
37 #include "xmloff/xmlnmspe.hxx"
38 #include "xmloff/xmlerror.hxx"
39 
40 using ::rtl::OUString;
41 using ::com::sun::star::xml::sax::XAttributeList;
42 using ::com::sun::star::uno::Reference;
43 using ::com::sun::star::uno::Sequence;
44 
45 XMLEventImportHelper::XMLEventImportHelper() :
46     aFactoryMap(),
47     pEventNameMap(new NameMap()),
48     aEventNameMapList()
49 {
50 }
51 
52 
53 XMLEventImportHelper::~XMLEventImportHelper()
54 {
55     // delete factories
56     FactoryMap::iterator aEnd = aFactoryMap.end();
57     for(FactoryMap::iterator aIter = aFactoryMap.begin();
58         aIter != aEnd;
59         aIter++ )
60     {
61         delete aIter->second;
62     }
63     aFactoryMap.clear();
64 
65     // delete name map
66     delete pEventNameMap;
67 }
68 
69 void XMLEventImportHelper::RegisterFactory(
70     const OUString& rLanguage,
71     XMLEventContextFactory* pFactory )
72 {
73     DBG_ASSERT(pFactory != NULL, "I need a factory.");
74     if (NULL != pFactory)
75     {
76         aFactoryMap[rLanguage] = pFactory;
77     }
78 }
79 
80 void XMLEventImportHelper::AddTranslationTable(
81     const XMLEventNameTranslation* pTransTable )
82 {
83     if (NULL != pTransTable)
84     {
85         // put translation table into map
86         for(const XMLEventNameTranslation* pTrans = pTransTable;
87             pTrans->sAPIName != NULL;
88             pTrans++)
89         {
90             XMLEventName aName( pTrans->nPrefix, pTrans->sXMLName );
91 
92             // check for conflicting entries
93             DBG_ASSERT(pEventNameMap->find(aName) == pEventNameMap->end(),
94                        "conflicting event translations");
95 
96             // assign new translation
97             (*pEventNameMap)[aName] =
98                 OUString::createFromAscii(pTrans->sAPIName);
99         }
100     }
101     // else? ignore!
102 }
103 
104 void XMLEventImportHelper::PushTranslationTable()
105 {
106     // save old map and install new one
107     aEventNameMapList.push_back(pEventNameMap);
108     pEventNameMap = new NameMap();
109 }
110 
111 void XMLEventImportHelper::PopTranslationTable()
112 {
113     DBG_ASSERT(aEventNameMapList.size() > 0,
114                "no translation tables left to pop");
115     if ( !aEventNameMapList.empty() )
116     {
117         // delete current and install old map
118         delete pEventNameMap;
119         pEventNameMap = aEventNameMapList.back();
120         aEventNameMapList.pop_back();
121     }
122 }
123 
124 
125 SvXMLImportContext* XMLEventImportHelper::CreateContext(
126     SvXMLImport& rImport,
127     sal_uInt16 nPrefix,
128     const OUString& rLocalName,
129     const Reference<XAttributeList> & xAttrList,
130     XMLEventsImportContext* rEvents,
131     const OUString& rXmlEventName,
132     const OUString& rLanguage)
133 {
134     SvXMLImportContext* pContext = NULL;
135 
136     // translate event name form xml to api
137     OUString sMacroName;
138     sal_uInt16 nMacroPrefix =
139         rImport.GetNamespaceMap().GetKeyByAttrName( rXmlEventName,
140                                                         &sMacroName );
141     XMLEventName aEventName( nMacroPrefix, sMacroName );
142     NameMap::iterator aNameIter = pEventNameMap->find(aEventName);
143     if (aNameIter != pEventNameMap->end())
144     {
145         OUString aScriptLanguage;
146         sal_uInt16 nScriptPrefix = rImport.GetNamespaceMap().
147                 GetKeyByAttrName( rLanguage, &aScriptLanguage );
148         if( XML_NAMESPACE_OOO != nScriptPrefix )
149             aScriptLanguage = rLanguage ;
150 
151         // check for factory
152         FactoryMap::iterator aFactoryIterator =
153             aFactoryMap.find(aScriptLanguage);
154         if (aFactoryIterator != aFactoryMap.end())
155         {
156             // delegate to factory
157             pContext = aFactoryIterator->second->CreateContext(
158                 rImport, nPrefix, rLocalName, xAttrList,
159                 rEvents, aNameIter->second, aScriptLanguage);
160         }
161     }
162 
163     // default context (if no context was created above)
164     if( NULL == pContext )
165     {
166         pContext = new SvXMLImportContext(rImport, nPrefix, rLocalName);
167 
168         Sequence<OUString> aMsgParams(2);
169 
170         aMsgParams[0] = rXmlEventName;
171         aMsgParams[1] = rLanguage;
172 
173         rImport.SetError(XMLERROR_FLAG_ERROR | XMLERROR_ILLEGAL_EVENT,
174                          aMsgParams);
175 
176     }
177 
178     return pContext;
179 }
180