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_xmlsecurity.hxx" 26 27 #include "elementmark.hxx" 28 #include "elementcollector.hxx" 29 #include "buffernode.hxx" 30 #include <com/sun/star/xml/crypto/sax/ConstOfSecurityId.hpp> 31 32 namespace cssu = com::sun::star::uno; 33 namespace cssxc = com::sun::star::xml::crypto; 34 35 ElementCollector::ElementCollector( 36 sal_Int32 nSecurityId, 37 sal_Int32 nBufferId, 38 cssxc::sax::ElementMarkPriority nPriority, 39 bool bToModify, 40 const com::sun::star::uno::Reference< 41 com::sun::star::xml::crypto::sax::XReferenceResolvedListener >& 42 xReferenceResolvedListener) 43 :ElementMark(nSecurityId, nBufferId), 44 m_nPriority(nPriority), 45 m_bToModify(bToModify), 46 m_bAbleToNotify(false), 47 m_bNotified(false), 48 m_xReferenceResolvedListener(xReferenceResolvedListener) 49 /****** ElementCollector/ElementCollector ************************************* 50 * 51 * NAME 52 * ElementCollector -- constructor method 53 * 54 * SYNOPSIS 55 * ElementCollector(nSecurityId, nBufferId, nPriority, bToModify 56 * xReferenceResolvedListener); 57 * 58 * FUNCTION 59 * construct an ElementCollector object. 60 * 61 * INPUTS 62 * nSecurityId - represents which security entity the buffer node is 63 * related with. Either a signature or an encryption is 64 * a security entity. 65 * nBufferId - the id of the element bufferred in the document 66 * wrapper component. The document wrapper component 67 * uses this id to search the particular bufferred 68 * element. 69 * nPriority - the priority value. ElementCollector with lower 70 * priority value can't notify until all ElementCollectors 71 * with higher priority value have notified. 72 * bToModify - A flag representing whether this ElementCollector 73 * notification will cause the modification of its working 74 * element. 75 * xReferenceResolvedListener 76 * - the listener that this ElementCollector notifies to. 77 * 78 * RESULT 79 * empty 80 * 81 * HISTORY 82 * 05.01.2004 - implemented 83 * 84 * AUTHOR 85 * Michael Mi 86 * Email: michael.mi@sun.com 87 ******************************************************************************/ 88 { 89 m_type = cssxc::sax::ElementMarkType_ELEMENTCOLLECTOR; 90 } 91 92 /* 93 bool ElementCollector::isInternalNotificationSuppressed() const 94 { 95 return m_bInternalNotificationSuppressed; 96 } 97 */ 98 99 cssxc::sax::ElementMarkPriority ElementCollector::getPriority() const 100 { 101 return m_nPriority; 102 } 103 104 bool ElementCollector::getModify() const 105 { 106 return m_bToModify; 107 } 108 109 void ElementCollector::notifyListener() 110 /****** ElementCollector/notifyListener *************************************** 111 * 112 * NAME 113 * notifyListener -- enable the ability to notify the listener 114 * 115 * SYNOPSIS 116 * notifyListener(); 117 * 118 * FUNCTION 119 * enable the ability to notify the listener and try to notify then. 120 * 121 * INPUTS 122 * empty 123 * 124 * RESULT 125 * empty 126 * 127 * HISTORY 128 * 05.01.2004 - implemented 129 * 130 * AUTHOR 131 * Michael Mi 132 * Email: michael.mi@sun.com 133 ******************************************************************************/ 134 { 135 m_bAbleToNotify = true; 136 doNotify(); 137 } 138 139 bool ElementCollector::isAbleToNotify() const 140 { 141 return m_bAbleToNotify; 142 } 143 144 void ElementCollector::setReferenceResolvedListener( 145 const cssu::Reference< cssxc::sax::XReferenceResolvedListener >& xReferenceResolvedListener) 146 /****** ElementCollector/setReferenceResolvedListener ************************* 147 * 148 * NAME 149 * setReferenceResolvedListener -- configures a listener for the buffer 150 * node in this object 151 * 152 * SYNOPSIS 153 * setReferenceResolvedListener(xReferenceResolvedListener); 154 * 155 * FUNCTION 156 * configures a new listener and try to notify then. 157 * 158 * INPUTS 159 * xReferenceResolvedListener - the new listener 160 * 161 * RESULT 162 * empty 163 * 164 * HISTORY 165 * 05.01.2004 - implemented 166 * 167 * AUTHOR 168 * Michael Mi 169 * Email: michael.mi@sun.com 170 ******************************************************************************/ 171 { 172 m_xReferenceResolvedListener = xReferenceResolvedListener; 173 doNotify(); 174 } 175 176 void ElementCollector::setSecurityId(sal_Int32 nSecurityId) 177 /****** ElementCollector/setSecurityId **************************************** 178 * 179 * NAME 180 * setSecurityId -- configures the security Id of the buffer node 181 * 182 * SYNOPSIS 183 * setSecurityId(nSecurityId); 184 * 185 * FUNCTION 186 * configures the security Id and try to notify then 187 * 188 * INPUTS 189 * nSecurityId - the security Id 190 * 191 * RESULT 192 * empty 193 * 194 * HISTORY 195 * 05.01.2004 - implemented 196 * 197 * AUTHOR 198 * Michael Mi 199 * Email: michael.mi@sun.com 200 ******************************************************************************/ 201 { 202 m_nSecurityId = nSecurityId; 203 doNotify(); 204 } 205 206 void ElementCollector::doNotify() 207 /****** ElementCollector/doNotify ********************************************* 208 * 209 * NAME 210 * doNotify -- tries to notify the listener 211 * 212 * SYNOPSIS 213 * doNotify(); 214 * 215 * FUNCTION 216 * notifies the listener when all below conditions are satisfied: 217 * the listener has not been notified; 218 * the notify right is granted; 219 * the listener has already been configured; 220 * the security id has already been configure 221 * 222 * INPUTS 223 * empty 224 * 225 * RESULT 226 * empty 227 * 228 * HISTORY 229 * 05.01.2004 - implemented 230 * 231 * AUTHOR 232 * Michael Mi 233 * Email: michael.mi@sun.com 234 ******************************************************************************/ 235 { 236 if (!m_bNotified && 237 m_bAbleToNotify && 238 m_xReferenceResolvedListener.is() && 239 m_nSecurityId != cssxc::sax::ConstOfSecurityId::UNDEFINEDSECURITYID) 240 { 241 m_bNotified = true; 242 m_xReferenceResolvedListener->referenceResolved(m_nBufferId); 243 } 244 } 245 246 ElementCollector* ElementCollector::clone( 247 sal_Int32 nBufferId, 248 cssxc::sax::ElementMarkPriority nPriority ) const 249 /****** ElementCollector/clone ************************************************ 250 * 251 * NAME 252 * clone -- duplicates this ElementCollector object 253 * 254 * SYNOPSIS 255 * cloned = clone(nBufferId, nPriority); 256 * 257 * FUNCTION 258 * duplicates this ElementCollector object with new buffer Id, priority. 259 * 260 * INPUTS 261 * nBufferId - the buffer node's Id 262 * nPriority - the priority 263 * 264 * RESULT 265 * clone - a new ElementCollector 266 * 267 * HISTORY 268 * 05.01.2004 - implemented 269 * 270 * AUTHOR 271 * Michael Mi 272 * Email: michael.mi@sun.com 273 ******************************************************************************/ 274 { 275 ElementCollector* pClonedOne 276 = new ElementCollector(m_nSecurityId, 277 nBufferId, nPriority, m_bToModify, 278 m_xReferenceResolvedListener); 279 280 if (m_bAbleToNotify) 281 { 282 pClonedOne->notifyListener(); 283 } 284 285 if (m_pBufferNode != NULL) 286 { 287 m_pBufferNode->addElementCollector(pClonedOne); 288 } 289 290 return pClonedOne; 291 } 292 293