xref: /aoo4110/main/tools/source/communi/geninfo.cxx (revision b1cdbd2c)
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_tools.hxx"
26*b1cdbd2cSJim Jagielski #include "tools/geninfo.hxx"
27*b1cdbd2cSJim Jagielski #include <stdio.h>
28*b1cdbd2cSJim Jagielski 
29*b1cdbd2cSJim Jagielski //
30*b1cdbd2cSJim Jagielski // class GenericInformation
31*b1cdbd2cSJim Jagielski //
32*b1cdbd2cSJim Jagielski 
33*b1cdbd2cSJim Jagielski /*****************************************************************************/
GenericInformation(const ByteString & rKey,const ByteString & rValue,GenericInformationList * pParentList,GenericInformationList * pSubInfos)34*b1cdbd2cSJim Jagielski GenericInformation::GenericInformation( const ByteString &rKey,
35*b1cdbd2cSJim Jagielski 						const ByteString &rValue,
36*b1cdbd2cSJim Jagielski 						GenericInformationList *pParentList,
37*b1cdbd2cSJim Jagielski 						GenericInformationList *pSubInfos )
38*b1cdbd2cSJim Jagielski /*****************************************************************************/
39*b1cdbd2cSJim Jagielski 				: ByteString( rKey ),
40*b1cdbd2cSJim Jagielski 				sValue( rValue ),
41*b1cdbd2cSJim Jagielski 				pInfoList( pSubInfos ),
42*b1cdbd2cSJim Jagielski 				pParent( pParentList )
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski 	// if a ParentList exists, insert this object into it
45*b1cdbd2cSJim Jagielski 	if ( pParent )
46*b1cdbd2cSJim Jagielski 		pParent->InsertInfo( this );
47*b1cdbd2cSJim Jagielski 	// make myself owner of pInfoList
48*b1cdbd2cSJim Jagielski 	if ( pInfoList )
49*b1cdbd2cSJim Jagielski 		pInfoList->SetOwner( this );
50*b1cdbd2cSJim Jagielski }
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski /*****************************************************************************/
GenericInformation(const GenericInformation & rInf,sal_Bool bCopySubs)53*b1cdbd2cSJim Jagielski GenericInformation::GenericInformation( const GenericInformation& rInf,
54*b1cdbd2cSJim Jagielski 										sal_Bool bCopySubs)
55*b1cdbd2cSJim Jagielski /*****************************************************************************/
56*b1cdbd2cSJim Jagielski 				: ByteString( rInf ),
57*b1cdbd2cSJim Jagielski 				sValue( rInf.sValue ),
58*b1cdbd2cSJim Jagielski 				pInfoList( 0L ),
59*b1cdbd2cSJim Jagielski 				pParent(NULL)
60*b1cdbd2cSJim Jagielski {
61*b1cdbd2cSJim Jagielski 	if(bCopySubs && rInf.pInfoList)
62*b1cdbd2cSJim Jagielski 		pInfoList = new GenericInformationList(*rInf.pInfoList, this);
63*b1cdbd2cSJim Jagielski }
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski /*****************************************************************************/
~GenericInformation()66*b1cdbd2cSJim Jagielski GenericInformation::~GenericInformation()
67*b1cdbd2cSJim Jagielski /*****************************************************************************/
68*b1cdbd2cSJim Jagielski {
69*b1cdbd2cSJim Jagielski 	// remove pInfoList and all childs out of memory
70*b1cdbd2cSJim Jagielski 	delete pInfoList;
71*b1cdbd2cSJim Jagielski 	pInfoList = 0;
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski 	// remove this Info out of ParentList
74*b1cdbd2cSJim Jagielski 	if ( pParent )
75*b1cdbd2cSJim Jagielski 		pParent->RemoveInfo( this );
76*b1cdbd2cSJim Jagielski }
77*b1cdbd2cSJim Jagielski 
78*b1cdbd2cSJim Jagielski /*****************************************************************************/
InsertSubInfo(GenericInformation * pInfo)79*b1cdbd2cSJim Jagielski sal_Bool GenericInformation::InsertSubInfo( GenericInformation *pInfo )
80*b1cdbd2cSJim Jagielski /*****************************************************************************/
81*b1cdbd2cSJim Jagielski {
82*b1cdbd2cSJim Jagielski 	return ( pInfoList && pInfoList->InsertInfo( pInfo ));
83*b1cdbd2cSJim Jagielski }
84*b1cdbd2cSJim Jagielski 
85*b1cdbd2cSJim Jagielski /*****************************************************************************/
InsertSubInfo(const ByteString & rPathKey,const ByteString & rValue,sal_Bool bSearchByPath,sal_Bool bNewPath)86*b1cdbd2cSJim Jagielski sal_Bool GenericInformation::InsertSubInfo( const ByteString &rPathKey,	const ByteString &rValue,
87*b1cdbd2cSJim Jagielski 					sal_Bool bSearchByPath, sal_Bool bNewPath )
88*b1cdbd2cSJim Jagielski /*****************************************************************************/
89*b1cdbd2cSJim Jagielski {
90*b1cdbd2cSJim Jagielski   return (pInfoList && pInfoList->InsertInfo( rPathKey, rValue, bSearchByPath, bNewPath ));
91*b1cdbd2cSJim Jagielski }
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski /*****************************************************************************/
RemoveSubInfo(GenericInformation * pInfo,sal_Bool bDelete)94*b1cdbd2cSJim Jagielski void GenericInformation::RemoveSubInfo( GenericInformation *pInfo,
95*b1cdbd2cSJim Jagielski 							sal_Bool bDelete )
96*b1cdbd2cSJim Jagielski /*****************************************************************************/
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	pInfoList->RemoveInfo( pInfo, bDelete );
99*b1cdbd2cSJim Jagielski }
100*b1cdbd2cSJim Jagielski 
101*b1cdbd2cSJim Jagielski /*****************************************************************************/
102*b1cdbd2cSJim Jagielski //void GenericInformation::RemoveSelf( sal_Bool bDelete )
103*b1cdbd2cSJim Jagielski /*****************************************************************************/
104*b1cdbd2cSJim Jagielski /*{
105*b1cdbd2cSJim Jagielski   if ( pParent )
106*b1cdbd2cSJim Jagielski     pParent->RemoveInfo( this, bDelete ); // loescht sich aus der Liste vom Parent und
107*b1cdbd2cSJim Jagielski   // bei Bedarf auch mit obiger Methode alle Sublisten
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski   // loescht sich bei Bedarf auch selbst
110*b1cdbd2cSJim Jagielski     if ( bDelete )
111*b1cdbd2cSJim Jagielski     delete this;
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski */
114*b1cdbd2cSJim Jagielski 
115*b1cdbd2cSJim Jagielski /*****************************************************************************/
GetSubInfo(ByteString & rKey,sal_Bool bSearchByPath,sal_Bool bCreatePath)116*b1cdbd2cSJim Jagielski GenericInformation *GenericInformation::GetSubInfo( ByteString &rKey,
117*b1cdbd2cSJim Jagielski 						sal_Bool bSearchByPath,
118*b1cdbd2cSJim Jagielski 						    sal_Bool bCreatePath )
119*b1cdbd2cSJim Jagielski /*****************************************************************************/
120*b1cdbd2cSJim Jagielski {
121*b1cdbd2cSJim Jagielski   if ( !pInfoList && bCreatePath )
122*b1cdbd2cSJim Jagielski 	pInfoList = new GenericInformationList( this );
123*b1cdbd2cSJim Jagielski   if ( pInfoList )
124*b1cdbd2cSJim Jagielski     return pInfoList->GetInfo( rKey, bSearchByPath, bCreatePath );
125*b1cdbd2cSJim Jagielski   return NULL;
126*b1cdbd2cSJim Jagielski }
127*b1cdbd2cSJim Jagielski 
128*b1cdbd2cSJim Jagielski 
129*b1cdbd2cSJim Jagielski //
130*b1cdbd2cSJim Jagielski // class GenericInformationList
131*b1cdbd2cSJim Jagielski //
132*b1cdbd2cSJim Jagielski 
133*b1cdbd2cSJim Jagielski /*****************************************************************************/
GenericInformationList(GenericInformation * pParent)134*b1cdbd2cSJim Jagielski GenericInformationList::GenericInformationList( GenericInformation *pParent )
135*b1cdbd2cSJim Jagielski /*****************************************************************************/
136*b1cdbd2cSJim Jagielski 				: pOwner( pParent )
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski }
139*b1cdbd2cSJim Jagielski 
140*b1cdbd2cSJim Jagielski /*****************************************************************************/
GenericInformationList(const GenericInformationList & rList,GenericInformation * pParent)141*b1cdbd2cSJim Jagielski GenericInformationList::GenericInformationList(const GenericInformationList& rList,
142*b1cdbd2cSJim Jagielski 							GenericInformation *pParent)
143*b1cdbd2cSJim Jagielski /*****************************************************************************/
144*b1cdbd2cSJim Jagielski     : GenericInformationList_Impl()
145*b1cdbd2cSJim Jagielski {
146*b1cdbd2cSJim Jagielski 	sal_uInt16 i;
147*b1cdbd2cSJim Jagielski 	GenericInformation* pTemp,*pWork;
148*b1cdbd2cSJim Jagielski 
149*b1cdbd2cSJim Jagielski 	pOwner = pParent;
150*b1cdbd2cSJim Jagielski 
151*b1cdbd2cSJim Jagielski 	for(i=0;i<rList.Count();i++)
152*b1cdbd2cSJim Jagielski 	{
153*b1cdbd2cSJim Jagielski 		pTemp = rList.GetObject(i);
154*b1cdbd2cSJim Jagielski 		pWork = new GenericInformation(*pTemp,sal_True);
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski 		Insert(pWork,LIST_APPEND);
157*b1cdbd2cSJim Jagielski 	}
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski /*****************************************************************************/
~GenericInformationList()161*b1cdbd2cSJim Jagielski GenericInformationList::~GenericInformationList()
162*b1cdbd2cSJim Jagielski /*****************************************************************************/
163*b1cdbd2cSJim Jagielski {
164*b1cdbd2cSJim Jagielski 	// delete all Informations stored in this List
165*b1cdbd2cSJim Jagielski 	// ### GH: Hier werden dann wohl etwa die H�lfte der Eintr�ge gel�scht
166*b1cdbd2cSJim Jagielski /*	for ( sal_uIntPtr i = 0; i < Count(); i++ ) {
167*b1cdbd2cSJim Jagielski 		GetObject( i )->ListDeleted();
168*b1cdbd2cSJim Jagielski 		delete GetObject( i );
169*b1cdbd2cSJim Jagielski 		Remove( i );*/
170*b1cdbd2cSJim Jagielski 	// Neue Variante:
171*b1cdbd2cSJim Jagielski 	while ( Count() ) {
172*b1cdbd2cSJim Jagielski 		GetObject( 0 )->ListDeleted();
173*b1cdbd2cSJim Jagielski 		delete GetObject( 0 );
174*b1cdbd2cSJim Jagielski 		Remove( (sal_uIntPtr)0 );
175*b1cdbd2cSJim Jagielski 	}
176*b1cdbd2cSJim Jagielski }
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski /*****************************************************************************/
Search(sal_uIntPtr & rPos,ByteString sKey,sal_uIntPtr nStart,sal_uIntPtr nEnd)179*b1cdbd2cSJim Jagielski GenericInformation *GenericInformationList::Search( sal_uIntPtr &rPos, ByteString sKey,
180*b1cdbd2cSJim Jagielski 												   sal_uIntPtr nStart, sal_uIntPtr nEnd )
181*b1cdbd2cSJim Jagielski /*****************************************************************************/
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski 	if ( Count() == 0 ) {
184*b1cdbd2cSJim Jagielski 		rPos = 0;
185*b1cdbd2cSJim Jagielski 		return NULL;
186*b1cdbd2cSJim Jagielski 	}
187*b1cdbd2cSJim Jagielski 
188*b1cdbd2cSJim Jagielski 	if ( nStart == nEnd ) {
189*b1cdbd2cSJim Jagielski 		rPos = nStart;
190*b1cdbd2cSJim Jagielski 		ByteString sCandidate = ByteString( *GetObject( nStart ));
191*b1cdbd2cSJim Jagielski 		if ( sCandidate.ToUpperAscii() == sKey.ToUpperAscii()) {
192*b1cdbd2cSJim Jagielski 			return GetObject( nStart ); // found !!!
193*b1cdbd2cSJim Jagielski 		}
194*b1cdbd2cSJim Jagielski 		else {
195*b1cdbd2cSJim Jagielski 			// requested key not found
196*b1cdbd2cSJim Jagielski 			return NULL;
197*b1cdbd2cSJim Jagielski 		}
198*b1cdbd2cSJim Jagielski 	}
199*b1cdbd2cSJim Jagielski 
200*b1cdbd2cSJim Jagielski 	// search binary in existing list
201*b1cdbd2cSJim Jagielski 	sal_uIntPtr nActPos = nStart + (( nEnd - nStart ) / 2 );
202*b1cdbd2cSJim Jagielski 	rPos = nActPos;
203*b1cdbd2cSJim Jagielski 	ByteString sCandidate = ByteString( *GetObject( nActPos ));
204*b1cdbd2cSJim Jagielski 
205*b1cdbd2cSJim Jagielski 	if ( sCandidate.ToUpperAscii()  == sKey.ToUpperAscii())
206*b1cdbd2cSJim Jagielski 		return GetObject( nActPos ); // found !!!
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski 	// split the list at ActPos
209*b1cdbd2cSJim Jagielski 	if ( sCandidate < sKey )
210*b1cdbd2cSJim Jagielski 		return Search( rPos, sKey, nActPos + 1, nEnd );
211*b1cdbd2cSJim Jagielski 	else
212*b1cdbd2cSJim Jagielski 		return Search( rPos, sKey, nStart, nActPos );
213*b1cdbd2cSJim Jagielski }
214*b1cdbd2cSJim Jagielski 
215*b1cdbd2cSJim Jagielski /*****************************************************************************/
GetInfo(ByteString & rKey,sal_Bool bSearchByPath,sal_Bool bCreatePath)216*b1cdbd2cSJim Jagielski GenericInformation *GenericInformationList::GetInfo( ByteString &rKey,
217*b1cdbd2cSJim Jagielski 						     sal_Bool bSearchByPath,
218*b1cdbd2cSJim Jagielski 						     sal_Bool bCreatePath )
219*b1cdbd2cSJim Jagielski /*****************************************************************************/
220*b1cdbd2cSJim Jagielski {
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 	rKey.EraseLeadingChars( '/' );
223*b1cdbd2cSJim Jagielski 	rKey.EraseTrailingChars( '/' );
224*b1cdbd2cSJim Jagielski 
225*b1cdbd2cSJim Jagielski 	ByteString sKey;
226*b1cdbd2cSJim Jagielski 	if ( bSearchByPath )
227*b1cdbd2cSJim Jagielski 		sKey = rKey.GetToken( 0, '/' );
228*b1cdbd2cSJim Jagielski 	else
229*b1cdbd2cSJim Jagielski 		sKey = rKey;
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 	sal_uIntPtr nPos = 0;
232*b1cdbd2cSJim Jagielski 	GenericInformation *pReturnInfo = Search( nPos, sKey, 0, Count() - 1 );
233*b1cdbd2cSJim Jagielski 	/* wenn kein Searchpath gesetzt und kein Returninfo vorhanden,
234*b1cdbd2cSJim Jagielski 	 *   gib NULL zurueck
235*b1cdbd2cSJim Jagielski 	 * wenn Searchpath gesetzt und returninfo vorhanden,
236*b1cdbd2cSJim Jagielski 	 *   suche weiter nach unten
237*b1cdbd2cSJim Jagielski 	 * wenn searchpath gesetzt kein returninfo vorhanden und newpath gesetzt,
238*b1cdbd2cSJim Jagielski 	 *   mache neues Verzeichniss
239*b1cdbd2cSJim Jagielski 	 */
240*b1cdbd2cSJim Jagielski 	sal_uInt16 nTokenCount = rKey.GetTokenCount('/');
241*b1cdbd2cSJim Jagielski 	// search for next key of path in next level of tree
242*b1cdbd2cSJim Jagielski 	if ( bSearchByPath && (nTokenCount > 1)) {
243*b1cdbd2cSJim Jagielski 	  ByteString sPath = ByteString(rKey.Copy( sKey.Len() + 1 ));
244*b1cdbd2cSJim Jagielski 	  if ( !pReturnInfo ) { // wenn kein Return, dann muss man es anlegen
245*b1cdbd2cSJim Jagielski 	    if ( !bCreatePath ) // wenn aber kein Create, dann nicht anlegen
246*b1cdbd2cSJim Jagielski 	      return NULL;
247*b1cdbd2cSJim Jagielski 	    pReturnInfo = new GenericInformation( sKey, "", this, NULL);
248*b1cdbd2cSJim Jagielski 	    pReturnInfo->SetSubList( new GenericInformationList( pReturnInfo ));
249*b1cdbd2cSJim Jagielski 	  }
250*b1cdbd2cSJim Jagielski 	  return pReturnInfo->GetSubInfo( sPath, sal_True, bCreatePath );
251*b1cdbd2cSJim Jagielski 	}
252*b1cdbd2cSJim Jagielski 	if ( !pReturnInfo && bCreatePath ) {
253*b1cdbd2cSJim Jagielski 	  pReturnInfo = new GenericInformation ( sKey, "", this, NULL);
254*b1cdbd2cSJim Jagielski 	}
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 	return pReturnInfo; // kann durchaus NULL sein.
257*b1cdbd2cSJim Jagielski }
258*b1cdbd2cSJim Jagielski 
259*b1cdbd2cSJim Jagielski /*****************************************************************************/
InsertSorted(GenericInformation * pInfo,sal_Bool bOverwrite,sal_uIntPtr nStart,sal_uIntPtr nEnd)260*b1cdbd2cSJim Jagielski sal_uIntPtr GenericInformationList::InsertSorted( GenericInformation *pInfo,
261*b1cdbd2cSJim Jagielski 										sal_Bool bOverwrite,
262*b1cdbd2cSJim Jagielski 										sal_uIntPtr nStart, sal_uIntPtr nEnd )
263*b1cdbd2cSJim Jagielski /*****************************************************************************/
264*b1cdbd2cSJim Jagielski {
265*b1cdbd2cSJim Jagielski     if ( Count() == 0 ) {
266*b1cdbd2cSJim Jagielski 		// empty list, so insert at first pos
267*b1cdbd2cSJim Jagielski 		Insert( pInfo, LIST_APPEND );
268*b1cdbd2cSJim Jagielski 		return 0;
269*b1cdbd2cSJim Jagielski 	}
270*b1cdbd2cSJim Jagielski 
271*b1cdbd2cSJim Jagielski 	ByteString sKey( pInfo->GetBuffer());
272*b1cdbd2cSJim Jagielski     sKey.ToUpperAscii();
273*b1cdbd2cSJim Jagielski 
274*b1cdbd2cSJim Jagielski     // Check to sppeed up reading a (partially) sorted list
275*b1cdbd2cSJim Jagielski     if ( nStart == 0 && Count()-1 == nEnd )
276*b1cdbd2cSJim Jagielski     {
277*b1cdbd2cSJim Jagielski 		ByteString sCandidate( *GetObject( nEnd ));
278*b1cdbd2cSJim Jagielski 		if ( sCandidate.ToUpperAscii() < sKey )
279*b1cdbd2cSJim Jagielski         {
280*b1cdbd2cSJim Jagielski 			Insert( pInfo, LIST_APPEND );
281*b1cdbd2cSJim Jagielski 			return nEnd+1;
282*b1cdbd2cSJim Jagielski         }
283*b1cdbd2cSJim Jagielski     }
284*b1cdbd2cSJim Jagielski 
285*b1cdbd2cSJim Jagielski // ### GH: dieser Block schein �berfl�ssig zu sein
286*b1cdbd2cSJim Jagielski 	if ( Count() == 1 ) {
287*b1cdbd2cSJim Jagielski 		ByteString sCandidate( *GetObject( 0 ));
288*b1cdbd2cSJim Jagielski 		if ( sCandidate.ToUpperAscii() == sKey ) {
289*b1cdbd2cSJim Jagielski 			// key allready exists in list
290*b1cdbd2cSJim Jagielski 			if ( bOverwrite )
291*b1cdbd2cSJim Jagielski 				Replace( pInfo, sal_uIntPtr(0));	// ### Laut NF scheint hier ein Memory Leak zu sein
292*b1cdbd2cSJim Jagielski 			return 0;
293*b1cdbd2cSJim Jagielski 		}
294*b1cdbd2cSJim Jagielski 		else if ( sCandidate > sKey ) {
295*b1cdbd2cSJim Jagielski 			Insert( pInfo, sal_uIntPtr(0));
296*b1cdbd2cSJim Jagielski 			return 0;
297*b1cdbd2cSJim Jagielski 		}
298*b1cdbd2cSJim Jagielski 		else {
299*b1cdbd2cSJim Jagielski 			Insert( pInfo, LIST_APPEND );
300*b1cdbd2cSJim Jagielski 			return 1;
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski // ### GH: /ENDE/ dieser Block schein �berfl�ssig zu sein
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	sal_uIntPtr nActPos = nStart + (( nEnd - nStart ) / 2 );
306*b1cdbd2cSJim Jagielski 	ByteString sCandidate = ByteString( *GetObject( nActPos ));
307*b1cdbd2cSJim Jagielski 
308*b1cdbd2cSJim Jagielski 	if ( sCandidate.ToUpperAscii() == sKey ) {
309*b1cdbd2cSJim Jagielski 		// key allready exists in list
310*b1cdbd2cSJim Jagielski 		if ( bOverwrite )
311*b1cdbd2cSJim Jagielski 			Replace( pInfo, nActPos );	// ### Laut NF scheint hier ein Memory Leak zu sein
312*b1cdbd2cSJim Jagielski 		return nActPos;
313*b1cdbd2cSJim Jagielski 	}
314*b1cdbd2cSJim Jagielski 
315*b1cdbd2cSJim Jagielski 	if ( nStart == nEnd ) {
316*b1cdbd2cSJim Jagielski 		// now more ways to search for key -> insert here
317*b1cdbd2cSJim Jagielski 		if ( sCandidate > sKey ) {
318*b1cdbd2cSJim Jagielski 			Insert( pInfo, nStart );
319*b1cdbd2cSJim Jagielski 			return nStart;
320*b1cdbd2cSJim Jagielski 		}
321*b1cdbd2cSJim Jagielski 		else {
322*b1cdbd2cSJim Jagielski 			Insert( pInfo, nStart + 1 );
323*b1cdbd2cSJim Jagielski 			return ( nStart + 1 );
324*b1cdbd2cSJim Jagielski 		}
325*b1cdbd2cSJim Jagielski 	}
326*b1cdbd2cSJim Jagielski 
327*b1cdbd2cSJim Jagielski 	if ( nActPos == Count() - 1 ) {
328*b1cdbd2cSJim Jagielski 		// reached end of list -> insert here
329*b1cdbd2cSJim Jagielski 		Insert( pInfo, LIST_APPEND );
330*b1cdbd2cSJim Jagielski 		return ( nActPos + 1 );
331*b1cdbd2cSJim Jagielski 	}
332*b1cdbd2cSJim Jagielski 
333*b1cdbd2cSJim Jagielski 	ByteString sSecondCand = ByteString( *GetObject( nActPos + 1 ));
334*b1cdbd2cSJim Jagielski 	if (( sCandidate < sKey ) && ( sSecondCand.ToUpperAscii() > sKey )) {
335*b1cdbd2cSJim Jagielski 		// optimal position to insert object
336*b1cdbd2cSJim Jagielski 		Insert( pInfo, nActPos + 1 );
337*b1cdbd2cSJim Jagielski 		return ( nActPos + 1 );
338*b1cdbd2cSJim Jagielski 	}
339*b1cdbd2cSJim Jagielski 
340*b1cdbd2cSJim Jagielski 	if ( sCandidate < sKey )
341*b1cdbd2cSJim Jagielski 		return InsertSorted( pInfo, bOverwrite, nActPos + 1, nEnd );
342*b1cdbd2cSJim Jagielski 	else
343*b1cdbd2cSJim Jagielski 		return InsertSorted( pInfo, bOverwrite, nStart, nActPos );
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski 
346*b1cdbd2cSJim Jagielski /*****************************************************************************/
InsertInfo(GenericInformation * pInfo,sal_Bool bOverwrite)347*b1cdbd2cSJim Jagielski sal_Bool GenericInformationList::InsertInfo( GenericInformation *pInfo,
348*b1cdbd2cSJim Jagielski 								sal_Bool bOverwrite )
349*b1cdbd2cSJim Jagielski /*****************************************************************************/
350*b1cdbd2cSJim Jagielski {
351*b1cdbd2cSJim Jagielski 	if ( !pInfo->Len())
352*b1cdbd2cSJim Jagielski 		return sal_False;
353*b1cdbd2cSJim Jagielski 
354*b1cdbd2cSJim Jagielski 	InsertSorted( pInfo, bOverwrite, 0, Count() - 1 );
355*b1cdbd2cSJim Jagielski 	return sal_True;
356*b1cdbd2cSJim Jagielski }
357*b1cdbd2cSJim Jagielski 
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski /*****************************************************************************/
InsertInfo(const ByteString & rPathKey,const ByteString & rValue,sal_Bool bSearchByPath,sal_Bool bNewPath)360*b1cdbd2cSJim Jagielski sal_Bool GenericInformationList::InsertInfo( const ByteString &rPathKey, const ByteString &rValue,
361*b1cdbd2cSJim Jagielski 					 sal_Bool bSearchByPath, sal_Bool bNewPath )
362*b1cdbd2cSJim Jagielski /*****************************************************************************/
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski   GenericInformation *pInfo;
365*b1cdbd2cSJim Jagielski   ByteString sPathKey ( rPathKey );
366*b1cdbd2cSJim Jagielski   sPathKey.EraseLeadingChars( '/' );
367*b1cdbd2cSJim Jagielski   sPathKey.EraseTrailingChars( '/' );
368*b1cdbd2cSJim Jagielski 
369*b1cdbd2cSJim Jagielski   pInfo = GetInfo( sPathKey, bSearchByPath, bNewPath );
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski   if ( pInfo ) {
372*b1cdbd2cSJim Jagielski     pInfo->SetValue( rValue );
373*b1cdbd2cSJim Jagielski     return sal_True;
374*b1cdbd2cSJim Jagielski   }
375*b1cdbd2cSJim Jagielski   return sal_False;
376*b1cdbd2cSJim Jagielski }
377*b1cdbd2cSJim Jagielski 
378*b1cdbd2cSJim Jagielski /*****************************************************************************/
RemoveInfo(GenericInformation * pInfo,sal_Bool bDelete)379*b1cdbd2cSJim Jagielski void GenericInformationList::RemoveInfo( GenericInformation *pInfo,
380*b1cdbd2cSJim Jagielski 								sal_Bool bDelete )
381*b1cdbd2cSJim Jagielski /*****************************************************************************/
382*b1cdbd2cSJim Jagielski {
383*b1cdbd2cSJim Jagielski 	Remove( pInfo );
384*b1cdbd2cSJim Jagielski 	if ( bDelete )
385*b1cdbd2cSJim Jagielski 		delete pInfo;
386*b1cdbd2cSJim Jagielski /*	if ( Count() == 0 && pOwner )	// Leere Listen entfernen;
387*b1cdbd2cSJim Jagielski 	{
388*b1cdbd2cSJim Jagielski 		SetOwner( NULL );
389*b1cdbd2cSJim Jagielski 		delete this;
390*b1cdbd2cSJim Jagielski 	} Rausgepatched by GH */
391*b1cdbd2cSJim Jagielski }
392*b1cdbd2cSJim Jagielski 
SetOwner(GenericInformation * pNewOwner)393*b1cdbd2cSJim Jagielski GenericInformation* GenericInformationList::SetOwner( GenericInformation *pNewOwner )
394*b1cdbd2cSJim Jagielski {
395*b1cdbd2cSJim Jagielski 	GenericInformation *pOldOwner = pOwner;
396*b1cdbd2cSJim Jagielski 	if ( pOwner )	// bei parent austragen;
397*b1cdbd2cSJim Jagielski 		pOwner->SetSubList( NULL );
398*b1cdbd2cSJim Jagielski 	if ( pNewOwner )
399*b1cdbd2cSJim Jagielski 		pNewOwner->SetSubList( this );
400*b1cdbd2cSJim Jagielski 	pOwner = pNewOwner;
401*b1cdbd2cSJim Jagielski 	return pOldOwner;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
404*b1cdbd2cSJim Jagielski 
405