xref: /AOO41X/main/xmloff/source/script/XMLEventsImportContext.cxx (revision 63bba73cc51e0afb45f8a8d578158724bb5afee8)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_xmloff.hxx"
26 #include <xmloff/XMLEventsImportContext.hxx>
27 
28 #ifndef _XMLOFF_XMLEVENTIMPORTHELPER_HXX
29 #include "XMLEventImportHelper.hxx"
30 #endif
31 
32 #ifndef _COM_SUN_STAR_DOCUMENT_XEVENTSSUPPLIER_HPP
33 #include <com/sun/star/document/XEventsSupplier.hpp>
34 #endif
35 #include <tools/debug.hxx>
36 #include <xmloff/xmlimp.hxx>
37 #include <xmloff/nmspmap.hxx>
38 #include "xmloff/xmlnmspe.hxx"
39 #include <xmloff/xmltoken.hxx>
40 #include "xmloff/xmlerror.hxx"
41 
42 using namespace ::com::sun::star::uno;
43 using namespace ::xmloff::token;
44 
45 using ::rtl::OUString;
46 using ::com::sun::star::xml::sax::XAttributeList;
47 using ::com::sun::star::beans::PropertyValue;
48 using ::com::sun::star::container::XNameReplace;
49 using ::com::sun::star::document::XEventsSupplier;
50 using ::com::sun::star::lang::IllegalArgumentException;
51 
52 TYPEINIT1(XMLEventsImportContext,  SvXMLImportContext);
53 
54 
XMLEventsImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName)55 XMLEventsImportContext::XMLEventsImportContext(
56     SvXMLImport& rImport,
57     sal_uInt16 nPrfx,
58     const OUString& rLocalName) :
59         SvXMLImportContext(rImport, nPrfx, rLocalName)
60 {
61 }
62 
63 
XMLEventsImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const Reference<XEventsSupplier> & xEventsSupplier)64 XMLEventsImportContext::XMLEventsImportContext(
65     SvXMLImport& rImport,
66     sal_uInt16 nPrfx,
67     const OUString& rLocalName,
68     const Reference<XEventsSupplier> & xEventsSupplier) :
69         SvXMLImportContext(rImport, nPrfx, rLocalName),
70         xEvents(xEventsSupplier->getEvents())
71 {
72 }
73 
74 
XMLEventsImportContext(SvXMLImport & rImport,sal_uInt16 nPrfx,const OUString & rLocalName,const Reference<XNameReplace> & xNameReplace)75 XMLEventsImportContext::XMLEventsImportContext(
76     SvXMLImport& rImport,
77     sal_uInt16 nPrfx,
78     const OUString& rLocalName,
79     const Reference<XNameReplace> & xNameReplace) :
80         SvXMLImportContext(rImport, nPrfx, rLocalName),
81         xEvents(xNameReplace)
82 {
83 }
84 
~XMLEventsImportContext()85 XMLEventsImportContext::~XMLEventsImportContext()
86 {
87 //  // if, for whatever reason, the object gets destroyed prematurely,
88 //  // we need to delete the collected events
89 //  EventsVector::iterator aEnd = aCollectEvents.end();
90 //  for(EventsVector::iterator aIter = aCollectEvents.begin();
91 //      aIter != aEnd;
92 //      aIter++)
93 //  {
94 //      EventNameValuesPair* pPair = &(*aIter);
95 //      delete pPair;
96 //  }
97 //  aCollectEvents.clear();
98 }
99 
100 
StartElement(const Reference<XAttributeList> &)101 void XMLEventsImportContext::StartElement(
102     const Reference<XAttributeList> &)
103 {
104     // nothing to be done
105 }
106 
EndElement()107 void XMLEventsImportContext::EndElement()
108 {
109     // nothing to be done
110 }
111 
CreateChildContext(sal_uInt16 p_nPrefix,const OUString & rLocalName,const Reference<XAttributeList> & xAttrList)112 SvXMLImportContext* XMLEventsImportContext::CreateChildContext(
113     sal_uInt16 p_nPrefix,
114     const OUString& rLocalName,
115     const Reference<XAttributeList> & xAttrList )
116 {
117     // a) search for script:language and script:event-name attribute
118     // b) delegate to factory. The factory will:
119     //    1) translate XML event name into API event name
120     //    2) get proper event context factory from import
121     //    3) instantiate context
122 
123     // a) search for script:language and script:event-name attribute
124     OUString sLanguage;
125     OUString sEventName;
126     sal_Int16 nCount = xAttrList->getLength();
127     for (sal_Int16 nAttr = 0; nAttr < nCount; nAttr++)
128     {
129         OUString sLocalName;
130         sal_uInt16 nPrefix = GetImport().GetNamespaceMap().
131             GetKeyByAttrName( xAttrList->getNameByIndex(nAttr), &sLocalName );
132 
133         if (XML_NAMESPACE_SCRIPT == nPrefix)
134         {
135             if (IsXMLToken(sLocalName, XML_EVENT_NAME))
136             {
137                 sEventName = xAttrList->getValueByIndex(nAttr);
138             }
139             else if (IsXMLToken(sLocalName, XML_LANGUAGE))
140             {
141                 sLanguage = xAttrList->getValueByIndex(nAttr);
142             }
143             // else: ignore -> let child context handle this
144         }
145         // else: ignore -> let child context handle this
146     }
147 
148     // b) delegate to factory
149     return GetImport().GetEventImport().CreateContext(
150         GetImport(), p_nPrefix, rLocalName, xAttrList,
151         this, sEventName, sLanguage);
152 }
153 
SetEvents(const Reference<XEventsSupplier> & xEventsSupplier)154 void XMLEventsImportContext::SetEvents(
155     const Reference<XEventsSupplier> & xEventsSupplier)
156 {
157     if (xEventsSupplier.is())
158     {
159         SetEvents(xEventsSupplier->getEvents());
160     }
161 }
162 
SetEvents(const Reference<XNameReplace> & xNameRepl)163 void XMLEventsImportContext::SetEvents(
164     const Reference<XNameReplace> & xNameRepl)
165 {
166     if (xNameRepl.is())
167     {
168         xEvents = xNameRepl;
169 
170         // now iterate over vector and a) insert b) delete all elements
171         EventsVector::iterator aEnd = aCollectEvents.end();
172         for(EventsVector::iterator aIter = aCollectEvents.begin();
173             aIter != aEnd;
174             aIter++)
175         {
176             AddEventValues(aIter->first, aIter->second);
177 //          EventNameValuesPair* pPair = &(*aIter);
178 //          delete pPair;
179         }
180         aCollectEvents.clear();
181     }
182 }
183 
GetEventSequence(const OUString & rName,Sequence<PropertyValue> & rSequence)184 sal_Bool XMLEventsImportContext::GetEventSequence(
185     const OUString& rName,
186     Sequence<PropertyValue> & rSequence )
187 {
188     // search through the vector
189     // (This shouldn't take a lot of time, since this method should only get
190     //  called if only one (or few) events are being expected)
191 
192     // iterate over vector until end or rName is found;
193     EventsVector::iterator aIter = aCollectEvents.begin();
194     while( (aIter != aCollectEvents.end()) && (aIter->first != rName) )
195     {
196         aIter++;
197     }
198 
199     // if we're not at the end, set the sequence
200     sal_Bool bRet = (aIter != aCollectEvents.end());
201     if (bRet)
202         rSequence = aIter->second;
203 
204     return bRet;
205 }
206 
AddEventValues(const OUString & rEventName,const Sequence<PropertyValue> & rValues)207 void XMLEventsImportContext::AddEventValues(
208     const OUString& rEventName,
209     const Sequence<PropertyValue> & rValues )
210 {
211     // if we already have the events, set them; else just collect
212     if (xEvents.is())
213     {
214         // set event (if name is known)
215         if (xEvents->hasByName(rEventName))
216         {
217             Any aAny;
218             aAny <<= rValues;
219 
220             try
221             {
222                 xEvents->replaceByName(rEventName, aAny);
223             } catch ( const IllegalArgumentException & rException )
224             {
225                 Sequence<OUString> aMsgParams(1);
226 
227                 aMsgParams[0] = rEventName;
228 
229                 GetImport().SetError(XMLERROR_FLAG_ERROR |
230                                      XMLERROR_ILLEGAL_EVENT,
231                                      aMsgParams, rException.Message, 0);
232             }
233         }
234     }
235     else
236     {
237 //      EventNameValuesPair* aPair = new EventNameValuesPair(rEventName,
238 //                                                          rValues);
239 //      aCollectEvents.push_back(*aPair);
240         EventNameValuesPair aPair(rEventName, rValues);
241         aCollectEvents.push_back(aPair);
242     }
243 }
244