xref: /trunk/main/rsc/source/res/rsccont.cxx (revision 477794c1)
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_rsc.hxx"
26 /****************** I N C L U D E S **************************************/
27 
28 // C and C++ Includes.
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <string.h>
32 
33 // Programmabh�ngige Includes.
34 #include <rsccont.hxx>
35 
36 #include <tools/rcid.h>
37 
38 /****************** C O D E **********************************************/
39 /****************** E N T R Y S T R U C T ********************************/
40 /*************************************************************************
41 |*
42 |*	  ENTRYSTRUCT::Destroy()
43 |*
44 |*	  Beschreibung
45 |*	  Ersterstellung	MM 06.08.91
46 |*	  Letzte Aenderung	MM 06.08.91
47 |*
48 *************************************************************************/
Destroy()49 void ENTRY_STRUCT::Destroy()
50 {
51 	aName.Destroy();
52 	if( aInst.IsInst() ){
53 		aInst.pClass->Destroy( aInst );
54 		rtl_freeMemory( aInst.pData );
55 	};
56 }
57 
58 /****************** R s c B a s e C o n t ********************************/
59 /*************************************************************************
60 |*
61 |*	  RscBaseCont::RscBaseCont()
62 |*
63 |*	  Beschreibung
64 |*	  Ersterstellung	MM 25.05.91
65 |*	  Letzte Aenderung	MM 25.05.91
66 |*
67 *************************************************************************/
RscBaseCont(Atom nId,sal_uInt32 nTypeId,RscTop * pSuper,sal_Bool bNoIdent)68 RscBaseCont::RscBaseCont( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper,
69 						  sal_Bool bNoIdent )
70 	: RscTop( nId, nTypeId, pSuper ),
71       nSize( 0 )
72 {
73 	pTypeClass = NULL;
74 	pTypeClass1 = NULL;
75 	bNoId = bNoIdent;
76 	nOffInstData = RscTop::Size();
77 	nSize = nOffInstData + ALIGNED_SIZE( sizeof( RscBaseContInst ) );
78 }
79 
80 /*************************************************************************
81 |*
82 |*	  RscBaseCont::~RscBaseCont()
83 |*
84 |*	  Beschreibung
85 |*	  Ersterstellung	MM 25.05.91
86 |*	  Letzte Aenderung	MM 25.05.91
87 |*
88 *************************************************************************/
~RscBaseCont()89 RscBaseCont::~RscBaseCont()
90 {
91 }
92 
93 /*************************************************************************
94 |*
95 |*	  RscBaseCont::GetClassType()
96 |*
97 |*	  Beschreibung
98 |*	  Ersterstellung	MM 25.05.91
99 |*	  Letzte Aenderung	MM 25.05.91
100 |*
101 *************************************************************************/
GetClassType() const102 RSCCLASS_TYPE RscBaseCont::GetClassType() const
103 {
104 	return RSCCLASS_COMPLEX;
105 }
106 
107 /*************************************************************************
108 |*
109 |*	  DestroyElements()
110 |*
111 |*	  Beschreibung
112 |*	  Ersterstellung	MM 26.04.91
113 |*	  Letzte Aenderung	MM 26.04.91
114 |*
115 *************************************************************************/
DestroyElements(RscBaseContInst * pClassData)116 void RscBaseCont::DestroyElements( RscBaseContInst * pClassData )
117 {
118 	sal_uInt32	i = 0;
119 
120 	if( pClassData->nEntries ){
121 		for( i = 0; i < pClassData->nEntries; i++ ){
122 			pClassData->pEntries[ i ].Destroy();
123 		};
124 		rtl_freeMemory( pClassData->pEntries );
125 		pClassData->pEntries = NULL;
126 		pClassData->nEntries = 0;
127 	};
128 }
129 
130 /*************************************************************************
131 |*
132 |*	  RscBaseCont::Create()
133 |*
134 |*	  Beschreibung
135 |*	  Ersterstellung	MM 26.04.91
136 |*	  Letzte Aenderung	MM 26.04.91
137 |*
138 *************************************************************************/
Create(RSCINST * pInst,const RSCINST & rDflt,sal_Bool bOwnClass)139 RSCINST RscBaseCont::Create( RSCINST * pInst, const RSCINST & rDflt,
140 							 sal_Bool bOwnClass )
141 {
142 	sal_uInt32	i = 0;
143 	RSCINST aInst;
144 	RscBaseContInst * pClassData;
145 
146 	if( !pInst ){
147 		aInst.pClass = this;
148 		aInst.pData = (CLASS_DATA) rtl_allocateMemory( Size() );
149 	}
150 	else
151 		aInst = *pInst;
152 	if( !bOwnClass && rDflt.IsInst() )
153 		bOwnClass = rDflt.pClass->InHierarchy( this );
154 
155 	RscTop::Create( &aInst, rDflt, bOwnClass );
156 
157 	pClassData = (RscBaseContInst *)(aInst.pData + nOffInstData);
158 	pClassData->nEntries = 0;
159 	pClassData->pEntries = NULL;
160 	pClassData->bDflt = sal_True;
161 
162 	if( bOwnClass ){
163 		RscBaseContInst *	pDfltClassData;
164 		RSCINST 		aDfltI;
165 
166 		pDfltClassData = (RscBaseContInst *)(rDflt.pData + nOffInstData);
167 
168 		if( 0 != pDfltClassData->nEntries ){
169 			*pClassData = *pDfltClassData;
170 			pClassData->pEntries =
171 				(ENTRY_STRUCT *)rtl_allocateMemory( sizeof( ENTRY_STRUCT )
172 												* pClassData->nEntries );
173 			for( i = 0; i < pClassData->nEntries; i++ ){
174 				pClassData->pEntries[ i ].Create();
175 				pClassData->pEntries[ i ].aName =
176 									pDfltClassData->pEntries[ i ].aName;
177 				aDfltI = pDfltClassData->pEntries[ i ].aInst;
178 				pClassData->pEntries[ i ].aInst =
179 									aDfltI.pClass->Create( NULL, aDfltI );
180 			};
181 		};
182 	}
183 
184 	return( aInst );
185 }
186 
187 /*************************************************************************
188 |*
189 |*	  RscBaseCont::Destroy()
190 |*
191 |*	  Beschreibung
192 |*	  Ersterstellung	MM 25.05.91
193 |*	  Letzte Aenderung	MM 25.05.91
194 |*
195 *************************************************************************/
Destroy(const RSCINST & rInst)196 void RscBaseCont::Destroy( const RSCINST & rInst ){
197 	RscBaseContInst * pClassData;
198 
199 	RscTop::Destroy( rInst);
200 
201 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
202 	DestroyElements( pClassData );
203 }
204 
205 /*************************************************************************
206 |*
207 |*	  RscBaseCont::SearchEle()
208 |*
209 |*	  Beschreibung
210 |*	  Ersterstellung	MM 17.05.91
211 |*	  Letzte Aenderung	MM 17.05.91
212 |*
213 *************************************************************************/
SearchElePos(const RSCINST & rInst,const RscId & rEleName,RscTop * pClass,sal_uInt32 nPos)214 RSCINST RscBaseCont::SearchElePos( const RSCINST & rInst, const RscId & rEleName,
215 								   RscTop * pClass, sal_uInt32 nPos )
216 {
217 	sal_uInt32	i = 0;
218 	RscBaseContInst * pClassData;
219 
220 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
221 	if( !pClass )
222 		pClass = pTypeClass;
223 
224 	if( rEleName.IsId() ){
225 		for( i = nPos; i < pClassData->nEntries; i++ ){
226 			if( pClassData->pEntries[ i ].aName == rEleName
227 			  && pClassData->pEntries[ i ].aInst.pClass == pClass )
228 			{
229 				return( pClassData->pEntries[ i ].aInst );
230 			};
231 		};
232 	};
233 	return RSCINST();
234 }
235 
236 /*************************************************************************
237 |*
238 |*	  RscBaseCont::SearchEle()
239 |*
240 |*	  Beschreibung
241 |*	  Ersterstellung	MM 17.05.91
242 |*	  Letzte Aenderung	MM 17.05.91
243 |*
244 *************************************************************************/
SearchEle(const RSCINST & rInst,const RscId & rEleName,RscTop * pClass)245 RSCINST RscBaseCont::SearchEle( const RSCINST & rInst, const RscId & rEleName,
246 								RscTop * pClass )
247 {
248 	return SearchElePos( rInst, rEleName, pClass, 0 );
249 }
250 
251 /*************************************************************************
252 |*
253 |*	  RscBaseCont::GetElement()
254 |*
255 |*	  Beschreibung
256 |*	  Ersterstellung	MM 26.04.91
257 |*	  Letzte Aenderung	MM 26.04.91
258 |*
259 *************************************************************************/
GetElement(const RSCINST & rInst,const RscId & rEleName,RscTop * pCreateClass,const RSCINST & rCreateInst,RSCINST * pGetInst)260 ERRTYPE RscBaseCont::GetElement( const RSCINST & rInst, const RscId & rEleName,
261 								 RscTop * pCreateClass,
262 								 const RSCINST & rCreateInst, RSCINST * pGetInst )
263 {
264 	RscBaseContInst * pClassData;
265 	RSCINST 		  aTmpI;
266 	ERRTYPE 		  aError;
267 
268 	if( !bNoId && !rEleName.IsId() )
269 		aError = WRN_CONT_NOID;
270 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
271 
272 	if( pCreateClass ){
273 		if( !pCreateClass->InHierarchy( pTypeClass ) ){
274 			if( pTypeClass1 ){
275 				if( !pCreateClass->InHierarchy( pTypeClass1 ) ){
276 					// Falscher Typ
277 					return ERR_CONT_INVALIDTYPE;
278 				}
279 			}
280 			else{
281 				// Falscher Typ
282 				return ERR_CONT_INVALIDTYPE;
283 			};
284 		};
285 	}
286 	else
287 		pCreateClass = pTypeClass;
288 
289 	pClassData->bDflt = sal_False;
290 	if( !bNoId )
291 		aTmpI = SearchEle( rInst, rEleName, pCreateClass );
292 	// Eintrag gefunden
293 	if( aTmpI.IsInst() ){
294 		aError = WRN_CONT_DOUBLEID;
295 		if( rCreateInst.IsInst() ){
296 			aTmpI.pClass->Destroy( aTmpI );
297 			aTmpI.pClass->Create( &aTmpI, rCreateInst );
298 		};
299 	}
300 	else {
301 		if( pClassData->pEntries ){
302 			pClassData->pEntries =
303 				(ENTRY_STRUCT *)rtl_reallocateMemory( pClassData->pEntries,
304 						 sizeof( ENTRY_STRUCT ) * (pClassData->nEntries +1) );
305 		}
306 		else {
307 			pClassData->pEntries =
308 				(ENTRY_STRUCT *)rtl_allocateMemory( sizeof( ENTRY_STRUCT )
309 												* (pClassData->nEntries +1) );
310 		};
311 
312 		pClassData->pEntries[ pClassData->nEntries ].Create();
313 		pClassData->pEntries[ pClassData->nEntries ].aName = rEleName;
314 
315 		if( rCreateInst.IsInst() ){
316 			// Instanz mit CreateInst-Daten initialisieren
317 			pClassData->pEntries[ pClassData->nEntries ].aInst =
318 						pCreateClass->Create( NULL, rCreateInst );
319 		}
320 		else {
321 			pClassData->pEntries[ pClassData->nEntries ].aInst =
322 						pCreateClass->Create( NULL, RSCINST() );
323 		};
324 
325 		pClassData->nEntries++;
326 		aTmpI = pClassData->pEntries[ pClassData->nEntries -1 ].aInst;
327 	}
328 
329 	*pGetInst = aTmpI;
330 	return aError;
331 }
332 
333 /*************************************************************************
334 |*
335 |*	  RscBaseCont::GetCount()
336 |*
337 |*	  Beschreibung
338 |*	  Ersterstellung	MM 08.05.91
339 |*	  Letzte Aenderung	MM 08.05.91
340 |*
341 *************************************************************************/
GetCount(const RSCINST & rInst)342 sal_uInt32 RscBaseCont::GetCount( const RSCINST & rInst ){
343 	RscBaseContInst * pClassData;
344 
345 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
346 	return( pClassData->nEntries );
347 }
348 
349 /*************************************************************************
350 |*
351 |*	  RscBaseCont::GetPosEle()
352 |*
353 |*	  Beschreibung
354 |*	  Ersterstellung	MM 08.05.91
355 |*	  Letzte Aenderung	MM 08.05.91
356 |*
357 *************************************************************************/
GetPosEle(const RSCINST & rInst,sal_uInt32 nPos)358 RSCINST RscBaseCont::GetPosEle( const RSCINST & rInst, sal_uInt32 nPos ){
359 	RscBaseContInst * pClassData;
360 
361 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
362 
363 	if( nPos < pClassData->nEntries )
364 		return( pClassData->pEntries[ nPos ].aInst );
365 	return RSCINST();
366 }
367 
368 /*************************************************************************
369 |*
370 |*	  RscBaseCont::MovePosEle()
371 |*
372 |*	  Beschreibung
373 |*	  Ersterstellung	MM 23.10.91
374 |*	  Letzte Aenderung	MM 23.10.91
375 |*
376 *************************************************************************/
MovePosEle(const RSCINST & rInst,sal_uInt32 nDestPos,sal_uInt32 nSourcePos)377 ERRTYPE RscBaseCont::MovePosEle( const RSCINST & rInst, sal_uInt32 nDestPos,
378 								 sal_uInt32 nSourcePos )
379 {
380 	ERRTYPE aError;
381 	RscBaseContInst * pClassData;
382 
383 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
384 
385 	if( (nDestPos < pClassData->nEntries) && (nSourcePos < pClassData->nEntries) ){
386 		ENTRY_STRUCT aEntry;
387 		int		     nInc = 1;
388 		sal_uInt32		 i = 0;
389 
390 		// Quelle Merken
391 		aEntry = pClassData->pEntries[ nSourcePos ];
392 		// Richtung der for-Schleife bestimmen
393 		if( nDestPos < nSourcePos )
394 			nInc = -1;
395 
396 		for( i = nSourcePos; i != nDestPos; i += nInc )
397 			pClassData->pEntries[ i ] = pClassData->pEntries[ i + nInc ];
398 
399 		// Zuweisung Quelle auf Ziel
400 		pClassData->pEntries[ nDestPos ] = aEntry;
401 	}
402 	else
403 		aError = ERR_RSCCONT;
404 	return aError;
405 }
406 
407 /*************************************************************************
408 |*
409 |*	  RscBaseCont::SetPosRscId()
410 |*
411 |*	  Beschreibung
412 |*	  Ersterstellung	MM 30.09.91
413 |*	  Letzte Aenderung	MM 30.09.91
414 |*
415 *************************************************************************/
SetPosRscId(const RSCINST & rInst,sal_uInt32 nPos,const RscId & rId)416 ERRTYPE RscBaseCont::SetPosRscId( const RSCINST & rInst, sal_uInt32 nPos,
417 								  const RscId & rId ){
418 	RscBaseContInst * pClassData;
419 	RSCINST 		  aTmpI;
420 	ERRTYPE 		  aError;
421 
422 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
423 
424 	if( nPos < pClassData->nEntries ){
425 		if( ! (rId == pClassData->pEntries[ nPos ].aName) )
426 			aTmpI = SearchEle( rInst, rId,
427 							   pClassData->pEntries[ nPos ].aInst.pClass );
428 		if( !aTmpI.IsInst() )
429 			pClassData->pEntries[ nPos ].aName = rId;
430 		else
431 			aError = ERR_RSCCONT;
432 	}
433 	else
434 		aError = ERR_RSCCONT;
435 	return( aError );
436 }
437 
438 /*************************************************************************
439 |*
440 |*	  RscBaseCont::GetInfoEle()
441 |*
442 |*	  Beschreibung
443 |*	  Ersterstellung	MM 08.05.91
444 |*	  Letzte Aenderung	MM 08.05.91
445 |*
446 *************************************************************************/
GetInfoEle(const RSCINST & rInst,sal_uInt32 nPos)447 SUBINFO_STRUCT RscBaseCont::GetInfoEle( const RSCINST & rInst, sal_uInt32 nPos ){
448 	RscBaseContInst * pClassData;
449 	SUBINFO_STRUCT	aInfo;
450 
451 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
452 
453 	if( nPos < pClassData->nEntries ){
454 		aInfo.aId	 = pClassData->pEntries[ nPos ].aName;
455 		aInfo.nPos	 = nPos;
456 		aInfo.pClass = pClassData->pEntries[ nPos ].aInst.pClass;
457 	}
458 	return( aInfo );
459 }
460 
461 /*************************************************************************
462 |*
463 |*	  RscBaseCont::SetString()
464 |*
465 |*	  Beschreibung
466 |*	  Ersterstellung	MM 29.04.91
467 |*	  Letzte Aenderung	MM 29.04.91
468 |*
469 *************************************************************************/
SetString(const RSCINST & rInst,const char * pStr)470 ERRTYPE RscBaseCont::SetString( const RSCINST & rInst, const char * pStr )
471 {
472 	RscBaseContInst * pClassData;
473 	RSCINST aTmpI;
474 	ERRTYPE aError;
475 	char	*pTmpStr;
476 
477 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
478 
479 //?B 040991
480 //?W 040991 sonst Endlosrekursion moeglich
481 if( RSC_NOTYPE == pTypeClass->GetTypId() ){
482 	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
483 	aError = aTmpI.pClass->GetString( aTmpI, &pTmpStr );
484 	if( aError.IsOk() )
485 		aError = aTmpI.pClass->SetString( aTmpI, pStr );
486 	else {
487 		aError.Clear();
488 		DeletePos( rInst, pClassData->nEntries -1 );
489 		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
490 		aError = aTmpI.pClass->GetString( aTmpI, &pTmpStr );
491 		if( aError.IsOk() )
492 			aError = aTmpI.pClass->SetString( aTmpI, pStr );
493 	}
494 	if( aError.IsError() )
495 		DeletePos( rInst, pClassData->nEntries -1 );
496 }
497 else
498 	aError = ERR_UNKNOWN_METHOD;
499 
500 	return( aError );
501 }
502 
503 /*************************************************************************
504 |*
505 |*	  RscBaseCont::SetNumber()
506 |*
507 |*	  Beschreibung
508 |*	  Ersterstellung	MM 12.06.91
509 |*	  Letzte Aenderung	MM 12.06.91
510 |*
511 *************************************************************************/
SetNumber(const RSCINST & rInst,sal_Int32 lValue)512 ERRTYPE RscBaseCont::SetNumber( const RSCINST & rInst, sal_Int32 lValue ){
513 	RscBaseContInst * pClassData;
514 	RSCINST aTmpI;
515 	ERRTYPE aError;
516 	sal_Int32	lNumber;
517 
518 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
519 
520 //?B 040991
521 //?W 040991 sonst Endlosrekursion moeglich
522 if( RSC_NOTYPE == pTypeClass->GetTypId() ){
523 	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
524 	aError = aTmpI.pClass->GetNumber( aTmpI, &lNumber );
525 	if( aError.IsOk() )
526 		aError = aTmpI.pClass->SetNumber( aTmpI, lValue );
527 	else {
528 		aError.Clear();
529 		DeletePos( rInst, pClassData->nEntries -1 );
530 		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
531 		aError = aTmpI.pClass->GetNumber( aTmpI, &lNumber );
532 		if( aError.IsOk() )
533 			aError = aTmpI.pClass->SetNumber( aTmpI, lValue );
534 	}
535 	if( aError.IsError() )
536 		DeletePos( rInst, pClassData->nEntries -1 );
537 }
538 else
539 	aError = ERR_UNKNOWN_METHOD;
540 
541 	return( aError );
542 }
543 
544 //==================================================================
SetBool(const RSCINST & rInst,sal_Bool bValue)545 ERRTYPE RscBaseCont::SetBool
546 (
547 	const RSCINST & rInst,
548 	sal_Bool bValue
549 )
550 {
551 	RscBaseContInst * pClassData;
552 	RSCINST aTmpI;
553 	ERRTYPE aError;
554 	sal_Bool	bBool;
555 
556 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
557 
558 //?B 040991
559 //?W 040991 sonst Endlosrekursion moeglich
560 if( RSC_NOTYPE == pTypeClass->GetTypId() )
561 {
562 	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
563 	aError = aTmpI.pClass->GetBool( aTmpI, &bBool );
564 	if( aError.IsOk() )
565 		aError = aTmpI.pClass->SetBool( aTmpI, bValue );
566 	else {
567 		aError.Clear();
568 		DeletePos( rInst, pClassData->nEntries -1 );
569 		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
570 		aError = aTmpI.pClass->GetBool( aTmpI, &bBool );
571 		if( aError.IsOk() )
572 			aError = aTmpI.pClass->SetBool( aTmpI, bValue );
573 	}
574 	if( aError.IsError() )
575 		DeletePos( rInst, pClassData->nEntries -1 );
576 }
577 else
578 	aError = ERR_UNKNOWN_METHOD;
579 
580 	return( aError );
581 }
582 
583 //==================================================================
SetConst(const RSCINST & rInst,Atom nValueId,sal_Int32 lValue)584 ERRTYPE RscBaseCont::SetConst
585 (
586 	const RSCINST & rInst,
587 	Atom nValueId,
588 	sal_Int32 lValue
589 )
590 {
591 	RscBaseContInst * pClassData;
592 	RSCINST aTmpI;
593 	ERRTYPE aError;
594 	Atom	nConst;
595 
596 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
597 
598 //?B 040991
599 //?W 040991 sonst Endlosrekursion moeglich
600 if( RSC_NOTYPE == pTypeClass->GetTypId() ){
601 	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
602 	aError = aTmpI.pClass->GetConst( aTmpI, &nConst );
603 	if( aError.IsOk() )
604 		aError = aTmpI.pClass->SetConst( aTmpI, nValueId, lValue );
605 	else {
606 		aError.Clear();
607 		DeletePos( rInst, pClassData->nEntries -1 );
608 		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
609 		aError = aTmpI.pClass->GetConst( aTmpI, &nConst );
610 		if( aError.IsOk() )
611 			aError = aTmpI.pClass->SetConst( aTmpI, nValueId, lValue );
612 	}
613 	if( aError.IsError() )
614 		DeletePos( rInst, pClassData->nEntries -1 );
615 }
616 else
617 	aError = ERR_UNKNOWN_METHOD;
618 
619 	return( aError );
620 }
621 
622 /*************************************************************************
623 |*
624 |*	  RscBaseCont::SetRef()
625 |*
626 |*	  Beschreibung
627 |*	  Ersterstellung	MM 02.12.91
628 |*	  Letzte Aenderung	MM 02.12.91
629 |*
630 *************************************************************************/
SetRef(const RSCINST & rInst,const RscId & rRefId)631 ERRTYPE RscBaseCont::SetRef( const RSCINST & rInst, const RscId & rRefId ){
632 	RscBaseContInst * pClassData;
633 	RSCINST aTmpI;
634 	ERRTYPE aError;
635 	RscId	aId;
636 
637 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
638 
639 //?B 040991
640 //?W 040991 sonst Endlosrekursion moeglich
641 if( RSC_NOTYPE == pTypeClass->GetTypId() ){
642 	aError = GetElement( rInst, RscId(), pTypeClass, RSCINST(), &aTmpI );
643 	aError = aTmpI.pClass->GetRef( aTmpI, &aId );
644 	if( aError.IsOk() )
645 		aError = aTmpI.pClass->SetRef( aTmpI, rRefId );
646 	else {
647 		aError.Clear();
648 		DeletePos( rInst, pClassData->nEntries -1 );
649 		aError = GetElement( rInst, RscId(), pTypeClass1, RSCINST(), &aTmpI );
650 		aError = aTmpI.pClass->GetRef( aTmpI, &aId );
651 		if( aError.IsOk() )
652 			aError = aTmpI.pClass->SetNumber( aTmpI, rRefId );
653 	}
654 	if( aError.IsError() )
655 		DeletePos( rInst, pClassData->nEntries -1 );
656 }
657 else
658 	aError = ERR_UNKNOWN_METHOD;
659 
660 	return( aError );
661 }
662 
663 /*************************************************************************
664 |*
665 |*	  RscBaseCont::IsConsistent()
666 |*
667 |*	  Beschreibung
668 |*	  Ersterstellung	MM 23.09.91
669 |*	  Letzte Aenderung	MM 23.09.91
670 |*
671 *************************************************************************/
IsConsistent(const RSCINST & rInst,RscInconsList * pList)672 sal_Bool RscBaseCont::IsConsistent( const RSCINST & rInst, RscInconsList * pList ){
673 	sal_uInt32	i = 0;
674 	RscBaseContInst * pClassData;
675 	sal_Bool	bRet;
676 
677 	bRet = RscTop::IsConsistent( rInst, pList );
678 
679 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
680 
681 	// auf doppelten Id Testen und Reihenfolge beibehalten
682 	// Komplexitaet = n^2 / 2
683 	for( i = 0; i < pClassData->nEntries; i++ ){
684 		if( !bNoId ){
685 			if( (sal_Int32)pClassData->pEntries[ i ].aName > 0x7FFF
686 			  || (sal_Int32)pClassData->pEntries[ i ].aName < 1 ){
687 				bRet = sal_False;
688 				if( pList )
689 					pList->Insert( new RscInconsistent(
690 						pClassData->pEntries[ i ].aName,
691 						pClassData->pEntries[ i ].aName ) );
692 			}
693 			else if( SearchElePos( rInst, pClassData->pEntries[ i ].aName,
694 				pClassData->pEntries[ i ].aInst.pClass, i +1 ).IsInst() )
695 			{
696 				 bRet = sal_False;
697 				 if( pList )
698 					 pList->Insert( new RscInconsistent(
699 						 pClassData->pEntries[ i	].aName,
700 						 pClassData->pEntries[ i +1 ].aName ) );
701 			 };
702 		}
703 		if( ! pClassData->pEntries[ i ].aInst.pClass->
704 			  IsConsistent( pClassData->pEntries[ i ].aInst, pList ) )
705 			bRet = sal_False;
706 	};
707 
708 	return( bRet );
709 }
710 
711 /*************************************************************************
712 |*
713 |*	  RscBaseCont::SetToDefault()
714 |*
715 |*	  Beschreibung
716 |*	  Ersterstellung	MM 25.04.91
717 |*	  Letzte Aenderung	MM 25.04.91
718 |*
719 *************************************************************************/
SetToDefault(const RSCINST & rInst)720 void RscBaseCont::SetToDefault( const RSCINST & rInst )
721 {
722 	sal_uInt32	i = 0;
723 	RscBaseContInst * pClassData;
724 
725 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
726 
727 	for( i = 0; i < pClassData->nEntries; i++ )
728 	{
729 		pClassData->pEntries[ i ].aInst.pClass->
730 				  SetToDefault( pClassData->pEntries[ i ].aInst );
731 	};
732 
733 	RscTop::SetToDefault( rInst );
734 }
735 
736 /*************************************************************************
737 |*
738 |*	  RscBaseCont::IsDefault()
739 |*
740 |*	  Beschreibung
741 |*	  Ersterstellung	MM 25.04.91
742 |*	  Letzte Aenderung	MM 25.04.91
743 |*
744 *************************************************************************/
IsDefault(const RSCINST & rInst)745 sal_Bool RscBaseCont::IsDefault( const RSCINST & rInst ){
746 	sal_uInt32	i = 0;
747 	RscBaseContInst * pClassData;
748 
749 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
750 
751 	if( !pClassData->bDflt )
752 		return sal_False;
753 
754 	for( i = 0; i < pClassData->nEntries; i++ ){
755 		if( ! pClassData->pEntries[ i ].aInst.pClass->
756 				  IsDefault( pClassData->pEntries[ i ].aInst ) )
757 		{
758 			return( sal_False );
759 		};
760 	};
761 
762 	return( RscTop::IsDefault( rInst ) );
763 }
764 
765 /*************************************************************************
766 |*
767 |*	  RscBaseCont::IsValueDefault()
768 |*
769 |*	  Beschreibung
770 |*	  Ersterstellung	MM 25.04.91
771 |*	  Letzte Aenderung	MM 15.01.92
772 |*
773 *************************************************************************/
IsValueDefault(const RSCINST & rInst,CLASS_DATA pDef)774 sal_Bool RscBaseCont::IsValueDefault( const RSCINST & rInst, CLASS_DATA pDef )
775 {
776 	RscBaseContInst * pClassData;
777 
778 	if( !RscTop::IsValueDefault( rInst, pDef ) )
779 		return sal_False;
780 
781 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
782 
783 	if( pClassData->nEntries )
784 		return sal_False;
785 	else
786 		return sal_True;
787 }
788 
789 /*************************************************************************
790 |*
791 |*	  RscBaseCont::Delete()
792 |*
793 |*	  Beschreibung
794 |*	  Ersterstellung	MM 12.06.91
795 |*	  Letzte Aenderung	MM 12.06.91
796 |*
797 *************************************************************************/
Delete(const RSCINST & rInst,RscTop * pClass,const RscId & rId)798 void RscBaseCont::Delete( const RSCINST & rInst, RscTop * pClass,
799 						  const RscId & rId )
800 {
801 	sal_uInt32	i = 0;
802 	RscBaseContInst * pClassData;
803 
804 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
805 	if( !pClass )
806 		pClass = pTypeClass;
807 
808 	for( i = 0; i < pClassData->nEntries; i++ ){
809 		if( pClassData->pEntries[ i ].aName == rId )
810 			if( pClassData->pEntries[ i ].aInst.pClass == pClass || !pClass ){
811 				DeletePos( rInst, i );
812 				return;
813 			};
814 	};
815 
816 }
817 
818 /*************************************************************************
819 |*
820 |*	  RscBaseCont::DeletePos()
821 |*
822 |*	  Beschreibung
823 |*	  Ersterstellung	MM 12.06.91
824 |*	  Letzte Aenderung	MM 12.06.91
825 |*
826 *************************************************************************/
DeletePos(const RSCINST & rInst,sal_uInt32 nPos)827 void RscBaseCont::DeletePos( const RSCINST & rInst, sal_uInt32 nPos ){
828 	RscBaseContInst *	pClassData;
829 	sal_uInt32				i = 0;
830 
831 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
832 
833 	if( nPos < pClassData->nEntries ){
834 		if( 1 == pClassData->nEntries )
835 			DestroyElements( pClassData );
836 		else{
837 			pClassData->pEntries[ nPos ].Destroy();
838 			pClassData->nEntries--;
839 			for( i = nPos; i < pClassData->nEntries; i++ )
840 				pClassData->pEntries[ i ] = pClassData->pEntries[ i + 1 ];
841 		};
842 	};
843 }
844 
845 /*************************************************************************
846 |*
847 |*	  RscBaseCont::ContWriteSrc()
848 |*
849 |*	  Beschreibung
850 |*	  Ersterstellung	MM 26.04.91
851 |*	  Letzte Aenderung	MM 26.04.91
852 |*
853 *************************************************************************/
ContWriteSrc(const RSCINST & rInst,FILE * fOutput,RscTypCont * pTC,sal_uInt32 nTab,const char * pVarName)854 void RscBaseCont::ContWriteSrc( const RSCINST & rInst, FILE * fOutput,
855 								RscTypCont * pTC, sal_uInt32 nTab,
856 								const char * pVarName )
857 {
858 	sal_uInt32	i = 0, t = 0;
859 	RscBaseContInst * pClassData;
860 
861 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
862 
863 	for( i = 0; i < pClassData->nEntries; i++ )
864 	{
865 		for( t = 0; t < nTab; t++ )
866 			fputc( '\t', fOutput );
867 		pClassData->pEntries[ i ].aInst.pClass->
868 				  WriteSrcHeader( pClassData->pEntries[ i ].aInst,
869 								  fOutput, pTC, nTab,
870 								  pClassData->pEntries[ i ].aName, pVarName );
871 		fprintf( fOutput, ";\n" );
872 	};
873 }
874 
875 /*************************************************************************
876 |*
877 |*	  RscBaseCont::ContWriteRc()
878 |*
879 |*	  Beschreibung
880 |*	  Ersterstellung	MM 26.04.91
881 |*	  Letzte Aenderung	MM 26.04.91
882 |*
883 *************************************************************************/
ContWriteRc(const RSCINST & rInst,RscWriteRc & rMem,RscTypCont * pTC,sal_uInt32 nDeep,sal_Bool bExtra)884 ERRTYPE RscBaseCont::ContWriteRc( const RSCINST & rInst, RscWriteRc & rMem,
885 							  RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
886 {
887 	sal_uInt32		  i = 0;
888 	RscBaseContInst * pClassData;
889 	ERRTYPE 	  aError;
890 
891 	if( bExtra || bNoId )
892 	{ // Nur Subresourcen schreiben, wenn bExtra == sal_True
893 		pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
894 
895 		for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ ){
896 			aError = pClassData->pEntries[ i ].aInst.pClass->
897 						 WriteRcHeader( pClassData->pEntries[ i ].aInst,
898 										rMem, pTC,
899 										pClassData->pEntries[ i ].aName,
900 										nDeep, bExtra );
901 		}
902 	}
903 
904 	return( aError );
905 }
906 
907 //==================================================================
ContWriteRcAccess(FILE * fOutput,RscTypCont * pTC,const char * pName,sal_Bool bWriteSize)908 void RscBaseCont::ContWriteRcAccess
909 (
910 	FILE * fOutput,
911 	RscTypCont * pTC,
912 	const char * pName,
913 	sal_Bool bWriteSize
914 )
915 {
916 	if( (bNoId || bWriteSize) && !pTypeClass1 )
917 	{
918 		fprintf( fOutput, "\t\tsal_uInt32 nItems = *(sal_uInt32 *)(pResData+nOffset) );\n" );
919 		fprintf( fOutput, "\t\tnOffset += sizeof( sal_uInt32 );\n" );
920 
921 		fprintf( fOutput, "\t\t// Items hinzufuegen\n" );
922 		fprintf( fOutput, "\t\tfor( sal_uInt32 i = 0; i < nItems; i++ )\n" );
923 		fprintf( fOutput, "\t\t{\n" );
924 		pTypeClass->WriteRcAccess( fOutput, pTC, "Item" );
925 		fprintf( fOutput, "\t\t}\n" );
926 	}
927 	else
928 	{
929 		fprintf( fOutput, "\t\tSet%s( %s ", pName, pHS->getString( GetId() ).getStr() );
930 		fprintf( fOutput, "%s ", aCallPar2.GetBuffer() );
931 		fprintf( fOutput, "ResId( (RSHEADER_TYPE*)(pResData+nOffset) ) ) );\n" );
932 		fprintf( fOutput, "\t\tnOffset += GetObjSizeRes( (RSHEADER_TYPE*)(pResData+nOffset) );\n" );
933 	}
934 }
935 
936 
937 /*************************************************************************
938 |*
939 |*	  RscBaseCont::WriteSrc()
940 |*
941 |*	  Beschreibung
942 |*	  Ersterstellung	MM 26.04.91
943 |*	  Letzte Aenderung	MM 26.04.91
944 |*
945 *************************************************************************/
WriteSrc(const RSCINST & rInst,FILE * fOutput,RscTypCont * pTC,sal_uInt32 nTab,const char * pVarName)946 void RscBaseCont::WriteSrc( const RSCINST & rInst, FILE * fOutput,
947 							RscTypCont * pTC, sal_uInt32 nTab,
948 							const char * pVarName )
949 {
950 	RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );
951 	ContWriteSrc( rInst, fOutput, pTC, nTab, pVarName );
952 }
953 
954 /*************************************************************************
955 |*
956 |*	  RscBaseCont::WriteRc()
957 |*
958 |*	  Beschreibung
959 |*	  Ersterstellung	MM 26.04.91
960 |*	  Letzte Aenderung	MM 26.04.91
961 |*
962 *************************************************************************/
WriteRc(const RSCINST & rInst,RscWriteRc & rMem,RscTypCont * pTC,sal_uInt32 nDeep,sal_Bool bExtra)963 ERRTYPE RscBaseCont::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
964 							  RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
965 {
966 	ERRTYPE 	  aError;
967 
968 	aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
969 	if( aError.IsOk() )
970 		aError = ContWriteRc( rInst, rMem, pTC, nDeep, bExtra );
971 
972 	return( aError );
973 }
974 
975 /*************************************************************************
976 |*
977 |*	  RscBaseCont::WriteHxx()
978 |*
979 |*	  Beschreibung
980 |*	  Ersterstellung	MM 26.04.91
981 |*	  Letzte Aenderung	MM 26.04.91
982 |*
983 *************************************************************************/
WriteHxx(const RSCINST & rInst,FILE * fOutput,RscTypCont * pTC,const RscId & rRscId)984 ERRTYPE RscBaseCont::WriteHxx( const RSCINST & rInst, FILE * fOutput,
985 							   RscTypCont * pTC, const RscId & rRscId )
986 {
987 	sal_uInt32		  i = 0;
988 	RscBaseContInst * pClassData;
989 	ERRTYPE 	  aError;
990 
991 	aError = RscTop::WriteHxx( rInst, fOutput, pTC, rRscId );
992 
993 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
994 
995 	for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ )
996 	{
997 		if( pClassData->pEntries[ i ].aName.IsId()
998 		  && pClassData->pEntries[ i ].aInst.pClass->IsCodeWriteable() )
999 		{
1000 			aError = pClassData->pEntries[ i ].aInst.pClass->
1001 						 WriteHxx( pClassData->pEntries[ i ].aInst,
1002 								   fOutput, pTC,
1003 								   pClassData->pEntries[ i ].aName );
1004 		}
1005 	};
1006 
1007 	return( aError );
1008 }
1009 
1010 /*************************************************************************
1011 |*
1012 |*	  RscBaseCont::WriteCxx()
1013 |*
1014 |*	  Beschreibung
1015 |*	  Ersterstellung	MM 26.04.91
1016 |*	  Letzte Aenderung	MM 26.04.91
1017 |*
1018 *************************************************************************/
WriteCxx(const RSCINST & rInst,FILE * fOutput,RscTypCont * pTC,const RscId & rRscId)1019 ERRTYPE RscBaseCont::WriteCxx( const RSCINST & rInst, FILE * fOutput,
1020 							   RscTypCont * pTC, const RscId & rRscId )
1021 {
1022 	sal_uInt32		  i = 0;
1023 	RscBaseContInst * pClassData;
1024 	ERRTYPE 	  aError;
1025 
1026 	aError = RscTop::WriteCxx( rInst, fOutput, pTC, rRscId );
1027 
1028 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
1029 
1030 	for( i = 0; i < pClassData->nEntries && aError.IsOk(); i++ )
1031 	{
1032 		if( pClassData->pEntries[ i ].aName.IsId()
1033 		  && pClassData->pEntries[ i ].aInst.pClass->IsCodeWriteable() )
1034 		{
1035 			aError = pClassData->pEntries[ i ].aInst.pClass->
1036 						 WriteCxx( pClassData->pEntries[ i ].aInst,
1037 								   fOutput, pTC,
1038 								   pClassData->pEntries[ i ].aName );
1039 		}
1040 	};
1041 
1042 	return( aError );
1043 }
1044 
1045 /*************** R s c C o n t W r i t e S r c ***************************/
1046 /*************************************************************************
1047 |*
1048 |*	  RscContWriteSrc::RscContWriteSrc()
1049 |*
1050 |*	  Beschreibung
1051 |*	  Ersterstellung	MM 08.05.91
1052 |*	  Letzte Aenderung	MM 08.05.91
1053 |*
1054 *************************************************************************/
RscContWriteSrc(Atom nId,sal_uInt32 nTypeId,RscTop * pSuper,sal_Bool bNoIdent)1055 RscContWriteSrc::RscContWriteSrc( Atom nId, sal_uInt32 nTypeId,
1056 								 RscTop * pSuper, sal_Bool bNoIdent )
1057 				  : RscBaseCont( nId, nTypeId, pSuper, bNoIdent )
1058 {}
1059 
1060 /*************************************************************************
1061 |*
1062 |*	  RscContWriteSrc::WriteSrc()
1063 |*
1064 |*	  Beschreibung
1065 |*	  Ersterstellung	MM 08.05.91
1066 |*	  Letzte Aenderung	MM 08.05.91
1067 |*
1068 *************************************************************************/
WriteSrc(const RSCINST & rInst,FILE * fOutput,RscTypCont * pTC,sal_uInt32 nTab,const char * pVarName)1069 void RscContWriteSrc::WriteSrc( const RSCINST & rInst, FILE * fOutput,
1070 								RscTypCont * pTC, sal_uInt32 nTab,
1071 								const char * pVarName )
1072 {
1073 	sal_uInt32	i;
1074 
1075 	RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );
1076 
1077 	fprintf( fOutput, "\n" );
1078 	for( i = 0; i < nTab; i++ )
1079 		fputc( '\t', fOutput );
1080 	fprintf( fOutput, "{\n" );
1081 
1082 	ContWriteSrc( rInst, fOutput, pTC, nTab +1, pVarName );
1083 
1084 	for( i = 0; i < nTab; i++ )
1085 		fputc( '\t', fOutput );
1086 	fprintf( fOutput, "}" );
1087 }
1088 
1089 /*************** R s c C o n t *******************************************/
1090 /*************************************************************************
1091 |*
1092 |*	  RscCont::RscCont()
1093 |*
1094 |*	  Beschreibung
1095 |*	  Ersterstellung	MM 08.05.91
1096 |*	  Letzte Aenderung	MM 08.05.91
1097 |*
1098 *************************************************************************/
RscCont(Atom nId,sal_uInt32 nTypeId,RscTop * pSuper,sal_Bool bNoIdent)1099 RscCont::RscCont( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper, sal_Bool bNoIdent )
1100 			  : RscContWriteSrc( nId, nTypeId, pSuper, bNoIdent )
1101 {}
1102 
1103 /*************************************************************************
1104 |*
1105 |*	  RscCont::WriteRc()
1106 |*
1107 |*	  Beschreibung
1108 |*	  Ersterstellung	MM 08.05.91
1109 |*	  Letzte Aenderung	MM 08.05.91
1110 |*
1111 *************************************************************************/
WriteRc(const RSCINST & rInst,RscWriteRc & rMem,RscTypCont * pTC,sal_uInt32 nDeep,sal_Bool bExtra)1112 ERRTYPE RscCont::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
1113 								 RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
1114 {
1115 	RscBaseContInst * pClassData;
1116 	ERRTYPE aError;
1117 
1118 	aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1119 
1120 	pClassData = (RscBaseContInst *)(rInst.pData + nOffInstData);
1121 
1122 	rMem.Put( pClassData->nEntries );
1123 
1124 	if( aError.IsOk() )
1125 		aError = ContWriteRc( rInst, rMem, pTC, nDeep, bExtra );
1126 
1127 	return aError;
1128 }
1129 
1130 //==================================================================
WriteRcAccess(FILE * fOutput,RscTypCont * pTC,const char * pName)1131 void RscCont::WriteRcAccess
1132 (
1133 	FILE * fOutput,
1134 	RscTypCont * pTC,
1135 	const char * pName
1136 )
1137 {
1138 	ContWriteRcAccess( fOutput, pTC, pName, sal_True );
1139 }
1140 
1141 /*************************************************************************
1142 |*
1143 |*	  RscContExtraData::RscContExtraData()
1144 |*
1145 |*	  Beschreibung
1146 |*	  Ersterstellung	MM 08.05.91
1147 |*	  Letzte Aenderung	MM 08.05.91
1148 |*
1149 *************************************************************************/
RscContExtraData(Atom nId,sal_uInt32 nTypeId,RscTop * pSuper,sal_Bool bNoIdent)1150 RscContExtraData::RscContExtraData( Atom nId, sal_uInt32 nTypeId,
1151 							 RscTop * pSuper, sal_Bool bNoIdent )
1152 					 : RscContWriteSrc( nId, nTypeId, pSuper, bNoIdent )
1153 {}
1154 
1155 /*************************************************************************
1156 |*
1157 |*	  RscContExtraData::WriteRc()
1158 |*
1159 |*	  Beschreibung
1160 |*	  Ersterstellung	MM 08.05.91
1161 |*	  Letzte Aenderung	MM 08.05.91
1162 |*
1163 *************************************************************************/
WriteRc(const RSCINST & rInst,RscWriteRc & rMem,RscTypCont * pTC,sal_uInt32 nDeep,sal_Bool bExtra)1164 ERRTYPE RscContExtraData::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
1165 							 RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
1166 {
1167 	ERRTYPE aError;
1168 
1169 	if( bExtra )
1170 		aError = RscContWriteSrc::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1171 	else
1172 		aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1173 
1174 	return aError;
1175 }
1176