1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_framework.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski /*TODO
28*b1cdbd2cSJim Jagielski     - change "singleton" behaviour by using new helper ::comhelper::SingletonRef
29*b1cdbd2cSJim Jagielski     - rename method exist() to existHandlerForURL() or similar one
30*b1cdbd2cSJim Jagielski     - may its a good idea to replace struct ProtocolHandler by css::beans::NamedValue type?!
31*b1cdbd2cSJim Jagielski */
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
34*b1cdbd2cSJim Jagielski //	my own includes
35*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <classes/protocolhandlercache.hxx>
38*b1cdbd2cSJim Jagielski #include <classes/converter.hxx>
39*b1cdbd2cSJim Jagielski #include <threadhelp/readguard.hxx>
40*b1cdbd2cSJim Jagielski #include <threadhelp/writeguard.hxx>
41*b1cdbd2cSJim Jagielski #include <threadhelp/lockhelper.hxx>
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
44*b1cdbd2cSJim Jagielski //	interface includes
45*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
48*b1cdbd2cSJim Jagielski //	other includes
49*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
50*b1cdbd2cSJim Jagielski #include <tools/wldcrd.hxx>
51*b1cdbd2cSJim Jagielski #include <unotools/configpathes.hxx>
52*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
53*b1cdbd2cSJim Jagielski 
54*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
55*b1cdbd2cSJim Jagielski //	namespace
56*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski namespace framework{
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
61*b1cdbd2cSJim Jagielski //  non exported const
62*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
65*b1cdbd2cSJim Jagielski //  non exported definitions
66*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
67*b1cdbd2cSJim Jagielski 
68*b1cdbd2cSJim Jagielski /**
69*b1cdbd2cSJim Jagielski     @short      overloaded index operator of hash map to support pattern key search
70*b1cdbd2cSJim Jagielski     @descr      All keys inside this hash map are URL pattern which points to an uno
71*b1cdbd2cSJim Jagielski                 implementation name of a protocol handler service which is registered
72*b1cdbd2cSJim Jagielski                 for this pattern. This operator makes it easy to find such registered
73*b1cdbd2cSJim Jagielski                 handler by using a full qualified URL and compare it with all pattern
74*b1cdbd2cSJim Jagielski                 keys.
75*b1cdbd2cSJim Jagielski 
76*b1cdbd2cSJim Jagielski     @param      sURL
77*b1cdbd2cSJim Jagielski                 the full qualified URL which should match to a registered pattern
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski     @return     An iterator which points to the found item inside the hash or PatternHash::end()
80*b1cdbd2cSJim Jagielski                 if no pattern match this given <var>sURL</var>.
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski     @modified   30.04.2002 09:52, as96863
83*b1cdbd2cSJim Jagielski  */
findPatternKey(const::rtl::OUString & sURL)84*b1cdbd2cSJim Jagielski PatternHash::iterator PatternHash::findPatternKey( const ::rtl::OUString& sURL )
85*b1cdbd2cSJim Jagielski {
86*b1cdbd2cSJim Jagielski     PatternHash::iterator pItem = this->begin();
87*b1cdbd2cSJim Jagielski     while( pItem!=this->end() )
88*b1cdbd2cSJim Jagielski     {
89*b1cdbd2cSJim Jagielski         WildCard aPattern(pItem->first);
90*b1cdbd2cSJim Jagielski         if (aPattern.Matches(sURL))
91*b1cdbd2cSJim Jagielski             break;
92*b1cdbd2cSJim Jagielski         ++pItem;
93*b1cdbd2cSJim Jagielski     }
94*b1cdbd2cSJim Jagielski     return pItem;
95*b1cdbd2cSJim Jagielski }
96*b1cdbd2cSJim Jagielski 
97*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
98*b1cdbd2cSJim Jagielski 
99*b1cdbd2cSJim Jagielski /**
100*b1cdbd2cSJim Jagielski     @short      initialize static member of class HandlerCache
101*b1cdbd2cSJim Jagielski     @descr      We use a singleton pattern to implement this handler cache.
102*b1cdbd2cSJim Jagielski                 That means it use two static member list to hold all neccessary informations
103*b1cdbd2cSJim Jagielski                 and a ref count mechanism to create/destroy it on demand.
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski     @modified   30.04.2002 11:13, as96863
106*b1cdbd2cSJim Jagielski  */
107*b1cdbd2cSJim Jagielski HandlerHash* HandlerCache::m_pHandler  = NULL;
108*b1cdbd2cSJim Jagielski PatternHash* HandlerCache::m_pPattern  = NULL;
109*b1cdbd2cSJim Jagielski sal_Int32    HandlerCache::m_nRefCount = 0   ;
110*b1cdbd2cSJim Jagielski HandlerCFGAccess* HandlerCache::m_pConfig = NULL;
111*b1cdbd2cSJim Jagielski 
112*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski /**
115*b1cdbd2cSJim Jagielski     @short      ctor of the cache of all registered protoco handler
116*b1cdbd2cSJim Jagielski     @descr      It tries to open the right configuration package automaticly
117*b1cdbd2cSJim Jagielski                 and fill the internal structures. After that the cache can be
118*b1cdbd2cSJim Jagielski                 used for read access on this data and perform some search
119*b1cdbd2cSJim Jagielski                 operations on it.
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski     @modified   30.04.2002 10:02, as96863
122*b1cdbd2cSJim Jagielski  */
HandlerCache()123*b1cdbd2cSJim Jagielski HandlerCache::HandlerCache()
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski     /* SAFE */{
126*b1cdbd2cSJim Jagielski         WriteGuard aGlobalLock( LockHelper::getGlobalLock() );
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski         if (m_nRefCount==0)
129*b1cdbd2cSJim Jagielski         {
130*b1cdbd2cSJim Jagielski             m_pHandler = new HandlerHash();
131*b1cdbd2cSJim Jagielski             m_pPattern = new PatternHash();
132*b1cdbd2cSJim Jagielski             m_pConfig  = new HandlerCFGAccess(PACKAGENAME_PROTOCOLHANDLER);
133*b1cdbd2cSJim Jagielski             m_pConfig->read(&m_pHandler,&m_pPattern);
134*b1cdbd2cSJim Jagielski             m_pConfig->setCache(this);
135*b1cdbd2cSJim Jagielski         }
136*b1cdbd2cSJim Jagielski 
137*b1cdbd2cSJim Jagielski         ++m_nRefCount;
138*b1cdbd2cSJim Jagielski     /* SAFE */}
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski /**
144*b1cdbd2cSJim Jagielski     @short      dtor of the cache
145*b1cdbd2cSJim Jagielski     @descr      It frees all used memory. In further implementations (may if we support write access too)
146*b1cdbd2cSJim Jagielski                 it's a good place to flush changes back to the configuration - but not needed yet.
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski     @modified   30.04.2002 09:54, as96863
149*b1cdbd2cSJim Jagielski  */
~HandlerCache()150*b1cdbd2cSJim Jagielski HandlerCache::~HandlerCache()
151*b1cdbd2cSJim Jagielski {
152*b1cdbd2cSJim Jagielski     /* SAFE */{
153*b1cdbd2cSJim Jagielski         WriteGuard aGlobalLock( LockHelper::getGlobalLock() );
154*b1cdbd2cSJim Jagielski 
155*b1cdbd2cSJim Jagielski         if( m_nRefCount==1)
156*b1cdbd2cSJim Jagielski         {
157*b1cdbd2cSJim Jagielski             m_pConfig->setCache(NULL);
158*b1cdbd2cSJim Jagielski             m_pHandler->free();
159*b1cdbd2cSJim Jagielski             m_pPattern->free();
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski             delete m_pConfig;
162*b1cdbd2cSJim Jagielski             delete m_pHandler;
163*b1cdbd2cSJim Jagielski             delete m_pPattern;
164*b1cdbd2cSJim Jagielski             m_pConfig = NULL;
165*b1cdbd2cSJim Jagielski 			m_pHandler= NULL;
166*b1cdbd2cSJim Jagielski 			m_pPattern= NULL;
167*b1cdbd2cSJim Jagielski         }
168*b1cdbd2cSJim Jagielski 
169*b1cdbd2cSJim Jagielski         --m_nRefCount;
170*b1cdbd2cSJim Jagielski     /* SAFE */}
171*b1cdbd2cSJim Jagielski }
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
174*b1cdbd2cSJim Jagielski 
175*b1cdbd2cSJim Jagielski /**
176*b1cdbd2cSJim Jagielski     @short      dtor of the cache
177*b1cdbd2cSJim Jagielski     @descr      It frees all used memory. In further implementations (may if we support write access too)
178*b1cdbd2cSJim Jagielski                 it's a good place to flush changes back to the configuration - but not needed yet.
179*b1cdbd2cSJim Jagielski 
180*b1cdbd2cSJim Jagielski     @modified   30.04.2002 09:54, as96863
181*b1cdbd2cSJim Jagielski  */
search(const::rtl::OUString & sURL,ProtocolHandler * pReturn) const182*b1cdbd2cSJim Jagielski sal_Bool HandlerCache::search( const ::rtl::OUString& sURL, ProtocolHandler* pReturn ) const
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski     sal_Bool bFound = sal_False;
185*b1cdbd2cSJim Jagielski     /* SAFE */{
186*b1cdbd2cSJim Jagielski         ReadGuard aReadLock( LockHelper::getGlobalLock() );
187*b1cdbd2cSJim Jagielski         PatternHash::const_iterator pItem = m_pPattern->findPatternKey(sURL);
188*b1cdbd2cSJim Jagielski         if (pItem!=m_pPattern->end())
189*b1cdbd2cSJim Jagielski         {
190*b1cdbd2cSJim Jagielski             *pReturn = (*m_pHandler)[pItem->second];
191*b1cdbd2cSJim Jagielski             bFound = sal_True;
192*b1cdbd2cSJim Jagielski         }
193*b1cdbd2cSJim Jagielski     /* SAFE */}
194*b1cdbd2cSJim Jagielski     return bFound;
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
198*b1cdbd2cSJim Jagielski 
199*b1cdbd2cSJim Jagielski /**
200*b1cdbd2cSJim Jagielski     @short      search for a registered handler by using an URL struct
201*b1cdbd2cSJim Jagielski     @descr      We combine neccessary parts of this struct to a valid URL string
202*b1cdbd2cSJim Jagielski                 and call our other search method ...
203*b1cdbd2cSJim Jagielski                 It's a helper for outside code.
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski     @modified   30.04.2002 09:54, as96863
206*b1cdbd2cSJim Jagielski  */
search(const css::util::URL & aURL,ProtocolHandler * pReturn) const207*b1cdbd2cSJim Jagielski sal_Bool HandlerCache::search( const css::util::URL& aURL, ProtocolHandler* pReturn ) const
208*b1cdbd2cSJim Jagielski {
209*b1cdbd2cSJim Jagielski     return search( aURL.Complete, pReturn );
210*b1cdbd2cSJim Jagielski }
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
213*b1cdbd2cSJim Jagielski 
exists(const::rtl::OUString & sURL) const214*b1cdbd2cSJim Jagielski sal_Bool HandlerCache::exists( const ::rtl::OUString& sURL ) const
215*b1cdbd2cSJim Jagielski {
216*b1cdbd2cSJim Jagielski     sal_Bool bFound = sal_False;
217*b1cdbd2cSJim Jagielski     /* SAFE */{
218*b1cdbd2cSJim Jagielski         ReadGuard aReadLock( LockHelper::getGlobalLock() );
219*b1cdbd2cSJim Jagielski         PatternHash::const_iterator pItem = m_pPattern->findPatternKey(sURL);
220*b1cdbd2cSJim Jagielski         bFound = pItem!=m_pPattern->end();
221*b1cdbd2cSJim Jagielski     /* SAFE */}
222*b1cdbd2cSJim Jagielski     return bFound;
223*b1cdbd2cSJim Jagielski }
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
takeOver(HandlerHash * pHandler,PatternHash * pPattern)226*b1cdbd2cSJim Jagielski void HandlerCache::takeOver(HandlerHash* pHandler, PatternHash* pPattern)
227*b1cdbd2cSJim Jagielski {
228*b1cdbd2cSJim Jagielski     // SAFE ->
229*b1cdbd2cSJim Jagielski     WriteGuard aWriteLock( LockHelper::getGlobalLock() );
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski     HandlerHash* pOldHandler = m_pHandler;
232*b1cdbd2cSJim Jagielski     PatternHash* pOldPattern = m_pPattern;
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski     m_pHandler = pHandler;
235*b1cdbd2cSJim Jagielski     m_pPattern = pPattern;
236*b1cdbd2cSJim Jagielski 
237*b1cdbd2cSJim Jagielski     pOldHandler->free();
238*b1cdbd2cSJim Jagielski     pOldPattern->free();
239*b1cdbd2cSJim Jagielski     delete pOldHandler;
240*b1cdbd2cSJim Jagielski     delete pOldPattern;
241*b1cdbd2cSJim Jagielski 
242*b1cdbd2cSJim Jagielski     aWriteLock.unlock();
243*b1cdbd2cSJim Jagielski     // <- SAFE
244*b1cdbd2cSJim Jagielski }
245*b1cdbd2cSJim Jagielski 
246*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
247*b1cdbd2cSJim Jagielski 
248*b1cdbd2cSJim Jagielski /**
249*b1cdbd2cSJim Jagielski     @short      dtor of the config access class
250*b1cdbd2cSJim Jagielski     @descr      It opens the configuration package automaticly by using base class mechanism.
251*b1cdbd2cSJim Jagielski                 After that "read()" method of this class should be called to use it.
252*b1cdbd2cSJim Jagielski 
253*b1cdbd2cSJim Jagielski     @param      sPackage
254*b1cdbd2cSJim Jagielski                 specifies the package name of the configuration data which should be used
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski     @modified   30.04.2002 10:06, as96863
257*b1cdbd2cSJim Jagielski  */
HandlerCFGAccess(const::rtl::OUString & sPackage)258*b1cdbd2cSJim Jagielski HandlerCFGAccess::HandlerCFGAccess( const ::rtl::OUString& sPackage )
259*b1cdbd2cSJim Jagielski     : ConfigItem( sPackage )
260*b1cdbd2cSJim Jagielski {
261*b1cdbd2cSJim Jagielski     css::uno::Sequence< ::rtl::OUString > lListenPathes(1);
262*b1cdbd2cSJim Jagielski     lListenPathes[0] = SETNAME_HANDLER;
263*b1cdbd2cSJim Jagielski     EnableNotification(lListenPathes);
264*b1cdbd2cSJim Jagielski }
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski /**
269*b1cdbd2cSJim Jagielski     @short      use base class mechanism to fill given structures
270*b1cdbd2cSJim Jagielski     @descr      User use us as a wrapper between configuration api and his internal structures.
271*b1cdbd2cSJim Jagielski                 He give us some pointer to his member and we fill it.
272*b1cdbd2cSJim Jagielski 
273*b1cdbd2cSJim Jagielski     @param      pHandler
274*b1cdbd2cSJim Jagielski                 pointer to a list of protocol handler infos
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski     @param      pPattern
277*b1cdbd2cSJim Jagielski                 reverse map of handler pattern to her uno names
278*b1cdbd2cSJim Jagielski 
279*b1cdbd2cSJim Jagielski     @modified   30.04.2002 09:54, as96863
280*b1cdbd2cSJim Jagielski  */
read(HandlerHash ** ppHandler,PatternHash ** ppPattern)281*b1cdbd2cSJim Jagielski void HandlerCFGAccess::read( HandlerHash** ppHandler ,
282*b1cdbd2cSJim Jagielski                              PatternHash** ppPattern )
283*b1cdbd2cSJim Jagielski {
284*b1cdbd2cSJim Jagielski     // list of all uno implementation names without encoding
285*b1cdbd2cSJim Jagielski     css::uno::Sequence< ::rtl::OUString > lNames = GetNodeNames( SETNAME_HANDLER, ::utl::CONFIG_NAME_LOCAL_PATH );
286*b1cdbd2cSJim Jagielski     sal_Int32 nSourceCount = lNames.getLength();
287*b1cdbd2cSJim Jagielski     sal_Int32 nTargetCount = nSourceCount;
288*b1cdbd2cSJim Jagielski     // list of all full qualified path names of configuration entries
289*b1cdbd2cSJim Jagielski     css::uno::Sequence< ::rtl::OUString > lFullNames ( nTargetCount );
290*b1cdbd2cSJim Jagielski 
291*b1cdbd2cSJim Jagielski     // expand names to full path names
292*b1cdbd2cSJim Jagielski     sal_Int32 nSource=0;
293*b1cdbd2cSJim Jagielski     sal_Int32 nTarget=0;
294*b1cdbd2cSJim Jagielski     for( nSource=0; nSource<nSourceCount; ++nSource )
295*b1cdbd2cSJim Jagielski 	{
296*b1cdbd2cSJim Jagielski         ::rtl::OUStringBuffer sPath( SETNAME_HANDLER );
297*b1cdbd2cSJim Jagielski         sPath.append(CFG_PATH_SEPERATOR);
298*b1cdbd2cSJim Jagielski         sPath.append(lNames[nSource]);
299*b1cdbd2cSJim Jagielski         sPath.append(CFG_PATH_SEPERATOR);
300*b1cdbd2cSJim Jagielski         sPath.append(PROPERTY_PROTOCOLS);
301*b1cdbd2cSJim Jagielski 
302*b1cdbd2cSJim Jagielski         lFullNames[nTarget]  = sPath.makeStringAndClear();
303*b1cdbd2cSJim Jagielski         ++nTarget;
304*b1cdbd2cSJim Jagielski     }
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski     // get values at all
307*b1cdbd2cSJim Jagielski     css::uno::Sequence< css::uno::Any > lValues = GetProperties( lFullNames );
308*b1cdbd2cSJim Jagielski     LOG_ASSERT2( lFullNames.getLength()!=lValues.getLength(), "HandlerCFGAccess::read()", "Miss some configuration values of handler set!" )
309*b1cdbd2cSJim Jagielski 
310*b1cdbd2cSJim Jagielski     // fill structures
311*b1cdbd2cSJim Jagielski     nSource = 0;
312*b1cdbd2cSJim Jagielski     for( nTarget=0; nTarget<nTargetCount; ++nTarget )
313*b1cdbd2cSJim Jagielski 	{
314*b1cdbd2cSJim Jagielski         // create it new for every loop to guarantee a real empty object!
315*b1cdbd2cSJim Jagielski         ProtocolHandler aHandler;
316*b1cdbd2cSJim Jagielski         aHandler.m_sUNOName = ::utl::extractFirstFromConfigurationPath(lNames[nSource]);
317*b1cdbd2cSJim Jagielski 
318*b1cdbd2cSJim Jagielski         // unpack all values of this handler
319*b1cdbd2cSJim Jagielski         css::uno::Sequence< ::rtl::OUString > lTemp;
320*b1cdbd2cSJim Jagielski         lValues[nTarget] >>= lTemp;
321*b1cdbd2cSJim Jagielski         aHandler.m_lProtocols = Converter::convert_seqOUString2OUStringList(lTemp);
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski         // register his pattern into the performance search hash
324*b1cdbd2cSJim Jagielski         for (OUStringList::iterator pItem =aHandler.m_lProtocols.begin();
325*b1cdbd2cSJim Jagielski                                     pItem!=aHandler.m_lProtocols.end()  ;
326*b1cdbd2cSJim Jagielski                                     ++pItem                             )
327*b1cdbd2cSJim Jagielski         {
328*b1cdbd2cSJim Jagielski             (**ppPattern)[*pItem] = lNames[nSource];
329*b1cdbd2cSJim Jagielski         }
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski         // ï¿œnsert the handler info into the normal handler cache
332*b1cdbd2cSJim Jagielski         (**ppHandler)[lNames[nSource]] = aHandler;
333*b1cdbd2cSJim Jagielski         ++nSource;
334*b1cdbd2cSJim Jagielski     }
335*b1cdbd2cSJim Jagielski }
336*b1cdbd2cSJim Jagielski 
337*b1cdbd2cSJim Jagielski //_________________________________________________________________________________________________________________
Notify(const css::uno::Sequence<rtl::OUString> &)338*b1cdbd2cSJim Jagielski void HandlerCFGAccess::Notify(const css::uno::Sequence< rtl::OUString >& /*lPropertyNames*/)
339*b1cdbd2cSJim Jagielski {
340*b1cdbd2cSJim Jagielski     HandlerHash* pHandler = new HandlerHash;
341*b1cdbd2cSJim Jagielski     PatternHash* pPattern = new PatternHash;
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     read(&pHandler, &pPattern);
344*b1cdbd2cSJim Jagielski     if (m_pCache)
345*b1cdbd2cSJim Jagielski         m_pCache->takeOver(pHandler, pPattern);
346*b1cdbd2cSJim Jagielski     else
347*b1cdbd2cSJim Jagielski     {
348*b1cdbd2cSJim Jagielski         delete pHandler;
349*b1cdbd2cSJim Jagielski         delete pPattern;
350*b1cdbd2cSJim Jagielski     }
351*b1cdbd2cSJim Jagielski }
352*b1cdbd2cSJim Jagielski 
Commit()353*b1cdbd2cSJim Jagielski void HandlerCFGAccess::Commit()
354*b1cdbd2cSJim Jagielski {
355*b1cdbd2cSJim Jagielski }
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski } // namespace framework
358