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 55 XMLEventsImportContext::XMLEventsImportContext( 56 SvXMLImport& rImport, 57 sal_uInt16 nPrfx, 58 const OUString& rLocalName) : 59 SvXMLImportContext(rImport, nPrfx, rLocalName) 60 { 61 } 62 63 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 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 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 101 void XMLEventsImportContext::StartElement( 102 const Reference<XAttributeList> &) 103 { 104 // nothing to be done 105 } 106 107 void XMLEventsImportContext::EndElement() 108 { 109 // nothing to be done 110 } 111 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 154 void XMLEventsImportContext::SetEvents( 155 const Reference<XEventsSupplier> & xEventsSupplier) 156 { 157 if (xEventsSupplier.is()) 158 { 159 SetEvents(xEventsSupplier->getEvents()); 160 } 161 } 162 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 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 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