xref: /trunk/main/rsc/source/res/rscclass.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_rsc.hxx"
30 /****************** I N C L U D E S **************************************/
31 
32 // C and C++ Includes.
33 #include <stdlib.h>
34 #include <stdio.h>
35 #include <string.h>
36 
37 // Programmabhaengige Includes.
38 #include <rscdb.hxx>
39 #include <rscclass.hxx>
40 
41 #include <tools/fsys.hxx>
42 #include <tools/rcid.h>
43 #include <tools/rc.h>
44 
45 /****************** C O D E **********************************************/
46 /****************** R s c C l a s s **************************************/
47 /*************************************************************************
48 |*
49 |*    RscClass::RscClass()
50 |*
51 |*    Beschreibung
52 |*    Ersterstellung    MM 25.05.91
53 |*    Letzte Aenderung  MM 25.05.91
54 |*
55 *************************************************************************/
56 RscClass::RscClass( Atom nId, sal_uInt32 nTypeId, RscTop * pSuperCl )
57     : RscTop( nId, nTypeId, pSuperCl )
58 {
59     nEntries = 0;
60     pVarTypeList = NULL;
61     nSuperSize = RscTop::Size();
62     nSize = nSuperSize + ALIGNED_SIZE( sizeof( RscClassInst ) );
63 }
64 
65 /*************************************************************************
66 |*
67 |*    RscClass::Pre_dtor()
68 |*
69 |*    Beschreibung
70 |*    Ersterstellung    MM 25.05.91
71 |*    Letzte Aenderung  MM 25.05.91
72 |*
73 *************************************************************************/
74 void RscClass::Pre_dtor()
75 {
76     sal_uInt32  i;
77 
78     RscTop::Pre_dtor();
79 
80     for( i = 0; i < nEntries; i++ )
81     {
82         if( pVarTypeList[ i ].pDefault )
83         {
84             pVarTypeList[ i ].pClass->Destroy(
85                          RSCINST( pVarTypeList[ i ].pClass,
86                                   pVarTypeList[ i ].pDefault ) );
87             rtl_freeMemory( pVarTypeList[ i ].pDefault );
88             pVarTypeList[ i ].pDefault = NULL;
89         };
90     };
91 }
92 
93 /*************************************************************************
94 |*
95 |*    RscClass::~RscClass()
96 |*
97 |*    Beschreibung
98 |*    Ersterstellung    MM 25.05.91
99 |*    Letzte Aenderung  MM 25.05.91
100 |*
101 *************************************************************************/
102 RscClass::~RscClass()
103 {
104     if( pVarTypeList )
105         rtl_freeMemory( (void *)pVarTypeList );
106 }
107 
108 /*************************************************************************
109 |*
110 |*    RscClass::GetClassType()
111 |*
112 |*    Beschreibung
113 |*    Ersterstellung    MM 25.05.91
114 |*    Letzte Aenderung  MM 25.05.91
115 |*
116 *************************************************************************/
117 RSCCLASS_TYPE RscClass::GetClassType() const
118 {
119     return RSCCLASS_COMPLEX;
120 }
121 
122 /*************************************************************************
123 |*
124 |*    RscClass::GetInstData()
125 |*
126 |*    Beschreibung
127 |*    Ersterstellung    MM 15.04.91
128 |*    Letzte Aenderung  MM 15.04.91
129 |*
130 *************************************************************************/
131 RSCINST RscClass::GetInstData
132 (
133     CLASS_DATA pData,
134     sal_uInt32 nEle,
135     sal_Bool bGetCopy
136 )
137 {
138     RSCINST aInst;
139 
140     aInst.pClass = pVarTypeList[ nEle ].pClass;
141     if( pData )
142     {
143         if( VAR_NODATAINST & pVarTypeList[ nEle ].nVarType )
144         {
145             RSCINST aTmpI;
146 
147             aTmpI.pClass = this;
148             aTmpI.pData = pData;
149             if( bGetCopy )
150                 aInst.pData = GetCopyVar(
151                                   aTmpI,
152                                   pVarTypeList[ nEle ].nDataBaseName
153                               ).pData;
154             else
155                 aInst.pData = GetVariable(
156                                   aTmpI,
157                                   pVarTypeList[ nEle ].nDataBaseName,
158                                   RSCINST()
159                               ).pData;
160         }
161         else if( VAR_POINTER & pVarTypeList[ nEle ].nVarType )
162         {
163             if( VAR_EXTENDABLE & pVarTypeList[ nEle ].nVarType )
164                 aInst = *(RSCINST *)
165                               (pData + pVarTypeList[ nEle ].nOffset);
166             else
167                 aInst.pData = *(CLASS_DATA *)
168                               (pData + pVarTypeList[ nEle ].nOffset);
169         }
170         else
171             aInst.pData = pData + pVarTypeList[ nEle ].nOffset;
172     };
173     return( aInst );
174 }
175 
176 /*************************************************************************
177 |*
178 |*    RscClass::GetInstDflt()
179 |*
180 |*    Beschreibung
181 |*
182 *************************************************************************/
183 CLASS_DATA RscClass::GetDfltData( sal_uInt32 nEle )
184 {
185     if( pVarTypeList[ nEle ].pDefault )
186         return pVarTypeList[ nEle ].pDefault;
187 
188     return pVarTypeList[ nEle ].pClass->GetDefault().pData;
189 }
190 
191 /*************************************************************************
192 |*
193 |*    RscClass::SetVarDflt()
194 |*
195 |*    Beschreibung
196 |*    Ersterstellung    MM 22.07.91
197 |*    Letzte Aenderung  MM 22.07.91
198 |*
199 *************************************************************************/
200 void RscClass::SetVarDflt( CLASS_DATA pData, sal_uInt32 nEle, sal_Bool bSet )
201 {
202     RscClassInst * pClass;
203 
204     pClass = (RscClassInst *)(pData + nSuperSize );
205     if( bSet )
206         pClass->nVarDflt |= ((sal_uLong)1 << nEle);
207     else
208         pClass->nVarDflt &= ~((sal_uLong)1 << nEle);
209 }
210 
211 /*************************************************************************
212 |*
213 |*    RscClass::IsDflt()
214 |*
215 |*    Beschreibung
216 |*    Ersterstellung    MM 22.07.91
217 |*    Letzte Aenderung  MM 08.01.92
218 |*
219 *************************************************************************/
220 sal_Bool RscClass::IsDflt( CLASS_DATA pData, sal_uInt32 nEle )
221 {
222     RscClassInst *  pClass;
223     sal_Bool            bRet;
224 
225     pClass = (RscClassInst *)(pData + nSuperSize );
226     if( pClass->nVarDflt & ((sal_uLong)1 << nEle) )
227         bRet = sal_True;
228     else
229         bRet = sal_False;
230 /*  {
231         //Variablenname ist Default
232         RSCINST aTmpI;
233 
234         aTmpI = GetInstData( pData, nEle, sal_True );
235         if( aTmpI.IsInst() && !aTmpI.pClass->IsDefault( aTmpI ) )
236             bRet = sal_False;
237     }
238 */
239     return bRet;
240 }
241 
242 /*************************************************************************
243 |*
244 |*    RscClass::Create()
245 |*
246 |*    Beschreibung
247 |*    Ersterstellung    MM 03.04.91
248 |*    Letzte Aenderung  MM 03.04.91
249 |*
250 *************************************************************************/
251 RSCINST RscClass::Create
252 (
253     RSCINST * pInst,
254     const RSCINST & rDflt,
255     sal_Bool bOwnClass
256 )
257 {
258     sal_uInt32  i;
259     CLASS_DATA  * ppData;
260     RSCINST aInst;
261     RSCINST aMemInst, aDfltI;
262 
263     if( !pInst )
264     {
265         aInst.pClass = this;
266         aInst.pData = (CLASS_DATA) rtl_allocateMemory( Size() );
267     }
268     else
269         aInst = *pInst;
270     if( !bOwnClass && rDflt.IsInst() )
271         bOwnClass = rDflt.pClass->InHierarchy( this );
272 
273     RscTop::Create( &aInst, rDflt, bOwnClass );
274 
275     if( bOwnClass )
276         ((RscClassInst *)(aInst.pData + nSuperSize))->nVarDflt =
277             ((RscClassInst *)(rDflt.pData + nSuperSize))->nVarDflt;
278     else
279         ((RscClassInst *)(aInst.pData + nSuperSize))->nVarDflt = ~((sal_uLong)0);
280 
281     for( i = 0; i < nEntries; i++ )
282     {
283         aDfltI = GetInstData( bOwnClass ? rDflt.pData : NULL, i, sal_True );
284 
285         if( (VAR_POINTER & pVarTypeList[ i ].nVarType)
286           && !(VAR_NODATAINST & pVarTypeList[ i ].nVarType) )
287         {
288             if( VAR_EXTENDABLE & pVarTypeList[ i ].nVarType )
289             {
290                 RSCINST * pInstance = (RSCINST *)
291                         (aInst.pData + pVarTypeList[ i ].nOffset );
292                 pInstance->pClass = pVarTypeList[ i ].pClass;
293                 ppData = &pInstance->pData;
294             }
295             else
296                 ppData = (CLASS_DATA* )
297                         (aInst.pData + pVarTypeList[ i ].nOffset );
298             *ppData = NULL;
299             if( aDfltI.IsInst() )
300             {
301                 aMemInst = pVarTypeList[ i ].pClass->Create( NULL, aDfltI );
302                 *ppData = aMemInst.pData;
303             };
304         }
305         else
306         {
307             aMemInst = GetInstData( aInst.pData, i, sal_True );
308             aMemInst = aMemInst.pClass->Create( &aMemInst, aDfltI );
309         };
310     }
311 
312     return( aInst );
313 }
314 
315 /*************************************************************************
316 |*
317 |*    RscClass::Destroy()
318 |*
319 |*    Beschreibung
320 |*
321 *************************************************************************/
322 void RscClass::Destroy( const RSCINST & rInst )
323 {
324     sal_uInt32  i;
325 
326     RscTop::Destroy( rInst );
327 
328     for( i = 0; i < nEntries; i++ )
329     {
330         if( !(pVarTypeList[ i ].nVarType & VAR_NODATAINST) )
331         {
332             RSCINST aTmpI;
333 
334             aTmpI = GetInstData( rInst.pData, i, sal_True );
335             if( aTmpI.IsInst() )
336             {
337                 // Objekt loeschen
338                 aTmpI.pClass->Destroy( aTmpI );
339                 if( pVarTypeList[ i ].nVarType & VAR_POINTER )
340                 {
341                     // Speicher freigeben
342                     rtl_freeMemory( aTmpI.pData );
343                 };
344             };
345         }
346     };
347 }
348 
349 /*************************************************************************
350 |*
351 |*    RscClass::SetVariable()
352 |*
353 |*    Beschreibung
354 |*
355 *************************************************************************/
356 ERRTYPE RscClass::SetVariable
357 (
358     Atom nVarName,
359     RscTop * pClass,
360     RSCINST * pDflt,
361     RSCVAR nVarType,
362     sal_uInt32 nMask,
363     Atom nDataBaseName
364 )
365 {
366     if( pVarTypeList )
367         pVarTypeList = (VARTYPE_STRUCT *)
368                  rtl_reallocateMemory( (void *)pVarTypeList,
369                  ((nEntries +1) * sizeof( VARTYPE_STRUCT )) );
370     else
371         pVarTypeList = (VARTYPE_STRUCT *)
372             rtl_allocateMemory( ((nEntries +1)
373                             * sizeof( VARTYPE_STRUCT )) );
374 
375     pVarTypeList[ nEntries ].nVarName       = nVarName;
376     pVarTypeList[ nEntries ].nMask          = nMask;
377     pVarTypeList[ nEntries ].pClass         = pClass;
378     pVarTypeList[ nEntries ].nOffset        = nSize;
379     pVarTypeList[ nEntries ].nDataBaseName  = nDataBaseName;
380     if( pDflt )
381         pVarTypeList[ nEntries ].pDefault = pDflt->pData;
382     else
383         pVarTypeList[ nEntries ].pDefault = NULL;
384 
385     pVarTypeList[ nEntries ].nVarType = ~VAR_POINTER & nVarType;
386     if( pClass->Size() > 10 || (nVarType & VAR_EXTENDABLE) )
387         pVarTypeList[ nEntries ].nVarType |= VAR_POINTER;
388 
389     if( !(pVarTypeList[ nEntries ].nVarType & VAR_NODATAINST) )
390     {
391         if( pVarTypeList[ nEntries ].nVarType & VAR_POINTER )
392         {
393             if( pVarTypeList[ nEntries ].nVarType & VAR_EXTENDABLE )
394                 nSize += sizeof( RSCINST );
395             else
396                 nSize += sizeof( CLASS_DATA );
397         }
398         else
399             nSize += pClass->Size();
400     }
401 
402     nEntries++;
403     if( nEntries > (sizeof( sal_uLong ) * 8) )
404     {
405         // Bereich fuer Default zu klein
406         RscExit( 16 );
407     };
408     return( ERR_OK );
409 }
410 
411 /*************************************************************************
412 |*
413 |*    RscClass::EnumVariable()
414 |*
415 |*    Beschreibung
416 |*
417 *************************************************************************/
418 void RscClass::EnumVariables( void * pData, VarEnumCallbackProc pProc )
419 {
420     sal_uInt32 i;
421 
422     RscTop::EnumVariables( pData, pProc );
423     for( i = 0; i < nEntries; i ++ )
424     {
425         if( !(pVarTypeList[ i ].nVarType & VAR_NOENUM) )
426             (*pProc)( pData, pVarTypeList[ i ].pClass->GetClassType(),
427                         pVarTypeList[ i ].nVarName );
428     }
429 }
430 
431 /*************************************************************************
432 |*
433 |*    RscClass::GetVariable()
434 |*
435 |*    Beschreibung
436 |*
437 *************************************************************************/
438 RSCINST RscClass::GetVariable
439 (
440     const RSCINST & rInst,
441     Atom nVarName,
442     const RSCINST & rInitInst,
443     sal_Bool bInitDflt,
444     RscTop * pCreateClass
445 )
446 {
447     sal_uInt32  i = 0;
448     RSCINST aTmpI;
449 
450     while( i < nEntries && pVarTypeList[ i ].nVarName != nVarName )
451         i++;
452     if( i < nEntries )
453     {
454         if( VAR_NODATAINST & pVarTypeList[ i ].nVarType )
455         {
456             aTmpI = GetVariable( rInst,
457                                  pVarTypeList[ i ].nDataBaseName,
458                                  RSCINST() );
459             aTmpI.pClass = pVarTypeList[ i ].pClass;
460         }
461         else
462         {
463             // Default Instanz generieren
464             RSCINST aDefInst = rInitInst;
465             if( !aDefInst.IsInst() && bInitDflt )
466             {
467                 // mit dem Variablen-Default besetzen
468                 aDefInst.pData  = pVarTypeList[ i ].pDefault;
469                 aDefInst.pClass = pVarTypeList[ i ].pClass;
470             }
471 
472             aTmpI = GetInstData( rInst.pData, i );
473             if( aTmpI.IsInst() )
474             {
475                 if( aDefInst.IsInst() )
476                 {
477                     aTmpI.pClass->Destroy( aTmpI );
478                     aTmpI.pClass->Create( &aTmpI, aDefInst );
479                 }
480             }
481             else
482             { // Wird ueber Zeiger angegeben
483                 if( VAR_EXTENDABLE & pVarTypeList[ i ].nVarType )
484                 {
485                     RSCINST * pInst = (RSCINST *)
486                             (rInst.pData + pVarTypeList[ i ].nOffset );
487                     if( pCreateClass && pCreateClass->InHierarchy( aTmpI.pClass ) )
488                         *pInst = pCreateClass->Create( NULL, aDefInst );
489                     else
490                         *pInst = aTmpI.pClass->Create( NULL, aDefInst );
491                     aTmpI = *pInst;
492                 }
493                 else
494                 {
495                     CLASS_DATA  * ppData
496                         = (CLASS_DATA *)(rInst.pData + pVarTypeList[ i ].nOffset);
497                     aTmpI = aTmpI.pClass->Create( NULL, aDefInst );
498                     *ppData = aTmpI.pData;
499                 }
500             }
501         };
502         // auf nicht Default setzen
503         SetVarDflt( rInst.pData, i, sal_False );
504         return( aTmpI );
505     };
506 
507     return( RscTop::GetVariable( rInst, nVarName, rInitInst,
508                                 bInitDflt, pCreateClass ) );
509 }
510 
511 /*************************************************************************
512 |*
513 |*    RscClass::GetCopyVar()
514 |*
515 |*    Beschreibung
516 |*
517 *************************************************************************/
518 RSCINST RscClass::GetCopyVar
519 (
520     const RSCINST & rInst,
521     Atom nVarName
522 )
523 {
524     sal_uInt32  i = 0;
525     RSCINST aVarI;
526 
527     while( i < nEntries && pVarTypeList[ i ].nVarName != nVarName )
528         i++;
529 
530     if( i < nEntries )
531     {
532         if( VAR_NODATAINST & pVarTypeList[ i ].nVarType )
533         {
534             aVarI = GetCopyVar( rInst, pVarTypeList[ i ].nDataBaseName );
535             aVarI.pClass = pVarTypeList[ i ].pClass;
536         }
537         else
538         {
539             if( IsDflt( rInst.pData, i ) )
540             {
541                 // mit Variablen Default initialiaieren
542                 aVarI = GetVariable( rInst, nVarName, RSCINST(), sal_True );
543                 SetVarDflt( rInst.pData, i, sal_True );
544             }
545             else
546                 aVarI = GetInstData( rInst.pData, i, sal_True );
547 
548         };
549         return aVarI ;
550     };
551 
552     return RscTop::GetCopyVar( rInst, nVarName );
553 }
554 
555 /*************************************************************************
556 |*
557 |*    RscClass::IsConsistent()
558 |*
559 |*    Beschreibung
560 |*
561 *************************************************************************/
562 sal_Bool RscClass::IsConsistent( const RSCINST & rInst, RscInconsList * pList )
563 {
564     sal_uInt32  i = 0;
565     RSCINST aTmpI;
566     sal_Bool    bRet;
567 
568     bRet = RscTop::IsConsistent( rInst, pList );
569 
570     for( i = 0; i < nEntries; i++ )
571     {
572         if( !(VAR_NODATAINST & pVarTypeList[ i ].nVarType) )
573         {
574             aTmpI = GetInstData( rInst.pData, i, sal_True );
575 
576             if( aTmpI.IsInst() )
577                 if( ! aTmpI.pClass->IsConsistent( aTmpI, pList ) )
578                     bRet = sal_False;
579         }
580     };
581 
582     return( bRet );
583 }
584 
585 /*************************************************************************
586 |*
587 |*    RscClass::SetToDefault()
588 |*
589 |*    Beschreibung
590 |*
591 *************************************************************************/
592 void RscClass::SetToDefault( const RSCINST & rInst )
593 {
594     sal_uInt32  i;
595     RSCINST aTmpI;
596     RscClassInst *  pClass;
597 
598     pClass = (RscClassInst *)(rInst.pData + nSuperSize );
599 
600     for( i = 0; i < nEntries; i++ )
601     {
602         // Variablen ohne eigenen Speicher werden vom "Datenserver"
603         // auf Default gesetzt
604         if( !(VAR_NODATAINST & pVarTypeList[ i ].nVarType) )
605         {
606             aTmpI = GetInstData( rInst.pData, i, sal_True );
607             if( aTmpI.IsInst() )
608                 aTmpI.pClass->SetToDefault( aTmpI );
609         }
610     }
611     pClass->nVarDflt = ~((sal_uLong)0); // alles auf Default
612 
613     RscTop::SetToDefault( rInst );
614 }
615 
616 /*************************************************************************
617 |*
618 |*    RscClass::IsDefault()
619 |*
620 |*    Beschreibung
621 |*
622 *************************************************************************/
623 sal_Bool RscClass::IsDefault( const RSCINST & rInst )
624 {
625     sal_uInt32  i;
626     RSCINST aTmpI;
627 
628     for( i = 0; i < nEntries; i++ )
629     {
630         // Variablen ohne eigenen Speicher werden vom "Datenserver"
631         // auf Default untersucht
632         if( !(VAR_NODATAINST & pVarTypeList[ i ].nVarType) )
633             if( !IsDflt( rInst.pData, i ) )
634                 return( sal_False );
635     };
636 
637     return( RscTop::IsDefault( rInst ) );
638 }
639 
640 /*************************************************************************
641 |*
642 |*    RscClass::GetDefault()
643 |*
644 |*    Beschreibung
645 |*
646 *************************************************************************/
647 RSCINST RscClass::GetDefault( Atom nVarId )
648 {
649     sal_uInt32  i;
650 
651     i = 0;
652     while( i < nEntries && pVarTypeList[ i ].nVarName != nVarId )
653         i++;
654     if( i < nEntries )
655     {
656         RSCINST aTmpI;
657 
658         aTmpI.pClass = pVarTypeList[ i ].pClass;
659         aTmpI.pData  = GetDfltData( i );
660         return( aTmpI );
661     };
662 
663     return( RscTop::GetDefault( nVarId ) );
664 }
665 
666 /*************************************************************************
667 |*
668 |*    RscClass::IsValueDflt()
669 |*
670 |*    Beschreibung
671 |*
672 *************************************************************************/
673 sal_Bool RscClass::IsValueDflt( CLASS_DATA pData, sal_uInt32 nEle )
674 {
675     RSCINST aTmpI;
676 
677     aTmpI = GetInstData( pData, nEle, sal_True );
678 
679     if( aTmpI.IsInst() )
680     {
681         if( VAR_SVDYNAMIC & pVarTypeList[ nEle ].nVarType )
682             return sal_False;
683 
684         if( aTmpI.pClass == pVarTypeList[ nEle ].pClass )
685             //sie haben auch die gleiche Klasse
686             return aTmpI.pClass->IsValueDefault( aTmpI, GetDfltData( nEle ) );
687         else
688             return sal_False;
689     }
690     return sal_True;
691 }
692 
693 /*************************************************************************
694 |*
695 |*    RscClass::IsValueDefault()
696 |*
697 |*    Beschreibung
698 |*
699 *************************************************************************/
700 sal_Bool RscClass::IsValueDefault( const RSCINST & rInst, CLASS_DATA pDef )
701 {
702     sal_uInt32  i = 0;
703     RSCINST aTmpI;
704     RSCINST aDfltI;
705 
706     if( !RscTop::IsValueDefault( rInst, pDef ) )
707         return sal_False;
708 
709     if( pDef )
710     {
711         for( i = 0; i < nEntries; i++ )
712         {
713             aTmpI = GetInstData( rInst.pData, i, sal_True );
714             if( aTmpI.IsInst() )
715             {
716                 if( aTmpI.pClass != pVarTypeList[ i ].pClass )
717                     //sie haben nicht die gleiche Klasse
718                     return sal_False;
719 
720                 aDfltI = GetInstData( pDef, i, sal_True );
721                 if( !aDfltI.IsInst() )
722                     aDfltI.pData = GetDfltData( i );
723 
724                 if( !aTmpI.pClass->IsValueDefault( aTmpI, aDfltI.pData ) )
725                     return sal_False;
726             }
727         }
728     }
729     else
730         return sal_False;
731 
732     return sal_True;
733 }
734 
735 /*************************************************************************
736 |*
737 |*    RscClass::SetDefault()
738 |*
739 |*    Beschreibung
740 |*
741 *************************************************************************/
742 void RscClass::SetDefault( const RSCINST & rInst, Atom nVarName )
743 {
744     sal_uInt32  i = 0;
745     RSCINST aTmpI;
746 
747     while( i < nEntries && pVarTypeList[ i ].nVarName != nVarName )
748         i++;
749 
750     if( i < nEntries )
751     {
752         aTmpI = GetInstData( rInst.pData, i, sal_True );
753         if( aTmpI.IsInst() )
754         {
755             aTmpI.pClass->Destroy( aTmpI );
756             aTmpI.pClass->Create( &aTmpI, RSCINST() );
757             SetVarDflt( rInst.pData, i, sal_True );
758         }
759     }
760     else //In Superklasse nach Variable suchen
761         RscTop::SetDefault( rInst, nVarName );
762 
763 }
764 
765 
766 /*************************************************************************
767 |*
768 |*    RscClass::WriteSrc()
769 |*
770 |*    Beschreibung
771 |*
772 *************************************************************************/
773 void RscClass::WriteSrc
774 (
775     const RSCINST & rInst,
776     FILE * fOutput,
777     RscTypCont * pTC,
778     sal_uInt32 nTab,
779     const char * pVarName
780 )
781 {
782     sal_uInt32  i = 0, n = 0;
783     RSCINST aTmpI;
784 
785     RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );
786 
787     for( i = 0; i < nEntries; i++ )
788     {
789         if( !(VAR_HIDDEN & pVarTypeList[ i ].nVarType) )
790         {
791             // Hack wegen Position und Dimensiuon
792             if( nRsc_XYMAPMODEId == pVarTypeList[ i ].nVarName
793               || nRsc_WHMAPMODEId == pVarTypeList[ i ].nVarName )
794             {
795                 if( !IsDflt( rInst.pData, i )     //MapUnit
796                   || !IsDflt( rInst.pData, i+1 )  //X, Width
797                   || !IsDflt( rInst.pData, i+2 ) )//Y, Height
798                 {// ein Wert ist nicht Default
799                     for( n = 0; n < nTab; n++ )
800                         fputc( '\t', fOutput );
801                     if( nRsc_XYMAPMODEId == pVarTypeList[ i ].nVarName )
802                         fprintf( fOutput, "Pos = " );
803                     else
804                         fprintf( fOutput, "Size = " );
805 
806                     if( !IsDflt( rInst.pData, i ) )
807                     {
808                         aTmpI = GetInstData( rInst.pData, i, sal_True );
809                         aTmpI.pClass->WriteSrcHeader(
810                               aTmpI, fOutput, pTC, nTab, RscId(), pVarName );
811                     }
812 
813                     fprintf( fOutput, "( " );
814                     aTmpI = GetInstData( rInst.pData, i+1, sal_True );
815                     if( !aTmpI.IsInst() )
816                         aTmpI.pData = GetDfltData( i+1 );
817                     aTmpI.pClass->WriteSrcHeader(
818                               aTmpI, fOutput, pTC, nTab, RscId(), pVarName );
819 
820                     fprintf( fOutput, ", " );
821                     aTmpI = GetInstData( rInst.pData, i+2, sal_True );
822                     if( !aTmpI.IsInst() )
823                         aTmpI.pData = GetDfltData( i+2 );
824                     aTmpI.pClass->WriteSrcHeader(
825                               aTmpI, fOutput, pTC, nTab, RscId(), pVarName );
826                     fprintf( fOutput, " );\n" );
827                 }
828                 i += 2; //_X, _Y oder _Widht, Height ueberlesen
829             }
830             else if( !IsDflt( rInst.pData, i )
831               && !IsValueDflt( rInst.pData, i ) )
832             {
833                 aTmpI = GetInstData( rInst.pData, i, sal_True );
834 
835                 if( aTmpI.IsInst() )
836                 {
837                     const char * pName = pHS->getString( pVarTypeList[ i ].nVarName ).getStr();
838 
839                     for( n = 0; n < nTab; n++ )
840                         fputc( '\t', fOutput );
841                     fprintf( fOutput, "%s", pName );
842                     fprintf( fOutput, " = " );
843                     aTmpI.pClass->WriteSrcHeader(
844                               aTmpI, fOutput, pTC, nTab, RscId(), pName );
845                     fprintf( fOutput, ";\n" );
846                 }
847             };
848         };
849     };
850 
851     return;
852 }
853 
854 /*************************************************************************
855 |*
856 |*    RscClass::WriteInstRc()
857 |*
858 |*    Beschreibung
859 |*
860 *************************************************************************/
861 sal_Int32 RscClass::GetCorrectValues
862 (
863     const RSCINST & rInst,
864     sal_uInt32 nVarPos,
865     sal_uInt32 nTupelIdx,
866     RscTypCont * pTC
867 )
868 {
869     sal_Int32 nLang = 0;
870     sal_Int32 nBaseValue;
871 
872     // Basiswert holen
873     RSCINST aTmpI = GetInstData( rInst.pData, nVarPos, sal_True );
874     aTmpI.pClass->GetNumber( aTmpI, &nBaseValue );
875 
876     // Sprach Delta holen
877     aTmpI = rInst.pClass->GetVariable( rInst, nRsc_DELTALANG, RSCINST() );
878     if( aTmpI.IsInst() )
879     {
880         RscWriteRc aMem;
881         aTmpI.pClass->WriteRc( aTmpI, aMem, pTC, 0, sal_False );
882         nLang = (sal_Int32)aMem.GetShort( nTupelIdx * sizeof(sal_uInt16) );
883     }
884 
885     return nLang + nBaseValue;
886 }
887 
888 ERRTYPE RscClass::WriteInstRc
889 (
890     const RSCINST & rInst,
891     RscWriteRc & rMem,
892     RscTypCont * pTC,
893     sal_uInt32 nDeep,
894     sal_Bool bExtra
895 )
896 {
897     sal_uInt32 i = 0;
898     ERRTYPE aError;
899     RSCINST aTmpI;
900     sal_uInt32  nMaskOff = 0;// Offset um Maskenfeld zu addressieren
901 
902     // Wenn eine Variable Maskierung hat, dann Maskenfeld
903     for( i = 0; i < nEntries; i++ )
904     {
905         if( pVarTypeList[ i ].nMask )
906         {
907             nMaskOff = rMem.Size();
908             rMem.Put( sal_uInt32(0) );
909             break;
910         }
911     };
912 
913     for( i = 0; i < nEntries && aError.IsOk(); i++ )
914     {
915         if( !((VAR_NODATAINST | VAR_NORC) & pVarTypeList[ i ].nVarType ))
916         {
917             if( pVarTypeList[ i ].nMask )
918             {
919                 if( !IsDflt( rInst.pData, i ) )
920                 {
921                     if( nRsc_X == pVarTypeList[ i ].nVarName )
922                     {
923                         sal_Int32 nVal = GetCorrectValues( rInst, i, 0, pTC );
924                         rMem.Put( nVal );
925                     }
926                     else if( nRsc_Y == pVarTypeList[ i ].nVarName )
927                     {
928                         sal_Int32 nVal = GetCorrectValues( rInst, i, 1, pTC );
929                         rMem.Put( nVal );
930                     }
931                     else if( nRsc_WIDTH == pVarTypeList[ i ].nVarName )
932                     {
933                         sal_Int32 nVal = GetCorrectValues( rInst, i, 2, pTC );
934                         rMem.Put( nVal );
935                     }
936                     else if( nRsc_HEIGHT == pVarTypeList[ i ].nVarName )
937                     {
938                         sal_Int32 nVal = GetCorrectValues( rInst, i, 3, pTC );
939                         rMem.Put( nVal );
940                     }
941                     else
942                     {
943                         aTmpI = GetInstData( rInst.pData, i, sal_True );
944                         // Nur an Variable Extradata bExtra nicht auf sal_False
945                         // setzen
946                         aError = aTmpI.pClass->
947                             WriteRcHeader( aTmpI, rMem, pTC,
948                                         RscId(), nDeep,
949                                         (nRsc_EXTRADATA
950                                         == pVarTypeList[ i ].nVarName)
951                                         ? bExtra : sal_False );
952                     }
953                     sal_uInt32 nMask = rMem.GetLong( nMaskOff );
954                     nMask |= pVarTypeList[ i ].nMask;
955                     rMem.PutAt( nMaskOff, nMask );
956                 }
957             }
958             else{
959                 if( IsDflt( rInst.pData, i ) )
960                 {
961                     aTmpI.pClass = pVarTypeList[ i ].pClass;
962                     aTmpI.pData  = GetDfltData( i );
963                 }
964                 else
965                     aTmpI = GetInstData( rInst.pData, i, sal_True );
966                 // Nur an Variable Extradata bExtra nicht auf sal_False
967                 // setzen
968                 aError = aTmpI.pClass->
969                             WriteRcHeader( aTmpI, rMem, pTC,
970                                         RscId(), nDeep,
971                                         (nRsc_EXTRADATA
972                                         == pVarTypeList[ i ].nVarName)
973                                         ? bExtra : sal_False );
974             }
975         }
976     }
977 
978     return( aError );
979 }
980 
981 /*************************************************************************
982 |*
983 |*    RscClass::WriteRc()
984 |*
985 |*    Beschreibung
986 |*
987 *************************************************************************/
988 ERRTYPE RscClass::WriteRc
989 (
990     const RSCINST & rInst,
991     RscWriteRc & rMem,
992     RscTypCont * pTC,
993     sal_uInt32 nDeep,
994     sal_Bool bExtra
995 )
996 {
997     ERRTYPE aError;
998 
999     aError = RscTop::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1000     if( aError.IsOk() )
1001         aError = WriteInstRc( rInst, rMem, pTC, nDeep, bExtra );
1002 
1003     return( aError );
1004 }
1005 
1006 /*************************************************************************
1007 |*
1008 |*    RscClass::WriteSyntax()
1009 |*
1010 |*    Beschreibung
1011 |*
1012 *************************************************************************/
1013 void RscClass::WriteSyntax( FILE * fOutput, RscTypCont * pTC )
1014 {
1015     RscTop::WriteSyntax( fOutput, pTC );
1016 
1017     sal_uInt32 i;
1018     // Wenn eine Variable Maskierung hat, dann Maskenfeld
1019     fprintf( fOutput, "\t//%s\n", pHS->getString( GetId() ).getStr() );
1020     for( i = 0; i < nEntries; i++ )
1021     {
1022         fprintf( fOutput, "\t%s", pHS->getString( pVarTypeList[ i ].nVarName ).getStr() );
1023         sal_uInt32 n = strlen( pHS->getString( pVarTypeList[ i ].nVarName ).getStr() );
1024         while( n < 20 )
1025         {
1026             putc( ' ', fOutput );
1027             n++;
1028         }
1029         fprintf( fOutput, " = %s;\n",
1030                 pHS->getString( pVarTypeList[ i ].pClass->GetId() ).getStr() );
1031     };
1032 }
1033 
1034 //==================================================================
1035 void RscClass::WriteRcAccess
1036 (
1037     FILE * fOutput,
1038     RscTypCont * /*pTC*/,
1039     const char * pName
1040 )
1041 {
1042     fprintf( fOutput, "\t\tSet%s( %s ", pName, pHS->getString( GetId() ).getStr() );
1043     fprintf( fOutput, "%s ", aCallPar2.GetBuffer() );
1044     fprintf( fOutput, "ResId( (RSHEADER_TYPE*)(pResData+nOffset) ) ) );\n" );
1045     fprintf( fOutput, "\t\tnOffset += GetObjSizeRes( (RSHEADER_TYPE*)(pResData+nOffset) );\n" );
1046 }
1047 
1048 //==================================================================
1049 void RscClass::WriteRcCtor( FILE * fOutput, RscTypCont * pTC )
1050 {
1051     if( GetId() != InvalidAtom )
1052     {
1053         // Konstruktor
1054         fprintf( fOutput, "%s::%s%s bFreeResource )",
1055                 pHS->getString( GetId() ).getStr(),
1056                 pHS->getString( GetId() ).getStr(),
1057                 aCallParType.GetBuffer() );
1058         if( GetSuperClass() )
1059         {
1060             // Superaufruf
1061             fprintf( fOutput, "\n\t: %s", pHS->getString( GetSuperClass()->GetId() ).getStr() );
1062             fprintf( fOutput, "%s", GetSuperClass()->aCallPar1.GetBuffer() );
1063             fprintf( fOutput, " rResId.SetRT2( 0x%lx ) )",
1064                      sal::static_int_cast< unsigned long >(GetTypId()) );
1065         }
1066         fprintf( fOutput, "\n{\n" );
1067         fprintf( fOutput, "\tsal_uInt32\tnObjMask;\n" );
1068         fprintf( fOutput, "\tsal_uInt32\tnOffset = 0;\n" );
1069         fprintf( fOutput, "\tBYTE *\tpResData;\n\n" );
1070         fprintf( fOutput, "\tpResData = (tBYTE *)GetClassRes();\n\n" );
1071         fprintf( fOutput, "\tnObjMask = *(sal_uInt32*)pResData;\n" );
1072         fprintf( fOutput, "\tnOffset += 4;\n\n" );
1073 
1074         for( sal_uInt32 i = 0; i < nEntries; i++ )
1075         {
1076             if( !((VAR_NODATAINST | VAR_NORC) & pVarTypeList[ i ].nVarType ))
1077             {
1078                 fprintf( fOutput, "\tif( nObjMask & 0x%lx )\n\t{\n",
1079                          sal::static_int_cast< unsigned long >(
1080                              pVarTypeList[ i ].nMask) );
1081 
1082                 pVarTypeList[ i ].pClass->WriteRcAccess( fOutput, pTC,
1083                                     pHS->getString( pVarTypeList[ i ].nVarName ).getStr() );
1084 
1085                 fprintf( fOutput, "\t}\n" );
1086             }
1087         }
1088         fprintf( fOutput, "\tIncrementRes( nOffset );\n" );
1089         fprintf( fOutput, "\tif( bFreeResource )\n" );
1090         fprintf( fOutput, "\t\tFreeResource();\n" );
1091         fprintf( fOutput, "}\n\n" );
1092     }
1093 }
1094 
1095 /*************************************************************************
1096 |*
1097 |*    RscSysDepend::RscSysDepend()
1098 |*
1099 |*    Beschreibung
1100 |*
1101 *************************************************************************/
1102 RscSysDepend::RscSysDepend( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper )
1103             : RscClass( nId, nTypeId, pSuper )
1104 {}
1105 
1106 /*************************************************************************
1107 |*
1108 |*    RscSysDepend::WriteRc()
1109 |*
1110 |*    Beschreibung
1111 |*
1112 *************************************************************************/
1113 ERRTYPE RscSysDepend::WriteSysDependRc( const RSCINST & rInst, RscWriteRc & rMem,
1114                 RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra, sal_Bool bFirst )
1115 {
1116     sal_uInt32  nId = 0xFFFFFFFF;
1117     ERRTYPE     aError;
1118     RSCINST     aFileName;
1119 
1120     //Instanz mit dem Dateinamen "FILENAME" holen
1121     aFileName = RscClass::GetCopyVar( rInst, pHS->getID( "FILE", true ) );
1122     if( aFileName.IsInst() )
1123     {
1124         RscWriteRc aTmpMem;
1125         aError = aFileName.pClass->WriteRcHeader( aFileName, aTmpMem, pTC,
1126                                                   RscId(), nDeep, bExtra );
1127         // Obsolete - need changes in VCL
1128         rMem.Put( sal_uInt32(0) );
1129 
1130         // Identifier schreiben
1131         if( aTmpMem.Size() && pTC && (*aTmpMem.GetUTF8( 0 ) != '\0') )
1132         {
1133             nId = pTC->PutSysName( rInst.pClass->GetTypId(),
1134                                    aTmpMem.GetUTF8( 0 ),
1135                                    0, 0, bFirst );
1136         }
1137         rMem.Put( nId );
1138         aError = aFileName.pClass->WriteRcHeader( aFileName, rMem, pTC,
1139                                                   RscId(), nDeep, bExtra );
1140     }
1141     else
1142         aError = ERR_ERROR;
1143 
1144     return( aError );
1145 }
1146 
1147 /*************************************************************************
1148 |*
1149 |*    RscSysDepend::WriteRc()
1150 |*
1151 |*    Beschreibung
1152 |*
1153 *************************************************************************/
1154 ERRTYPE RscSysDepend::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
1155                             RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
1156 {
1157     ERRTYPE     aError = RscClass::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1158 
1159     if( this == rInst.pClass )
1160         // nur wenn es eigen Klasse ist
1161         aError = WriteSysDependRc( rInst, rMem, pTC, nDeep, bExtra );
1162     return aError;
1163 }
1164 
1165 /*************************************************************************
1166 |*
1167 |*    RscFirstSysDepend::RscFirstSysDepend()
1168 |*
1169 |*    Beschreibung
1170 |*
1171 *************************************************************************/
1172 RscFirstSysDepend::RscFirstSysDepend( Atom nId, sal_uInt32 nTypeId,
1173                                         RscTop * pSuper )
1174             : RscSysDepend( nId, nTypeId, pSuper )
1175 {}
1176 
1177 /*************************************************************************
1178 |*
1179 |*    RscFirstSysDepend::WriteRc()
1180 |*
1181 |*    Beschreibung
1182 |*
1183 *************************************************************************/
1184 ERRTYPE RscFirstSysDepend::WriteRc( const RSCINST & rInst, RscWriteRc & rMem,
1185                             RscTypCont * pTC, sal_uInt32 nDeep, sal_Bool bExtra )
1186 {
1187     ERRTYPE aError = RscClass::WriteRc( rInst, rMem, pTC, nDeep, bExtra );
1188     aError = WriteSysDependRc( rInst, rMem, pTC, nDeep, bExtra, sal_True );
1189     return aError;
1190 }
1191 
1192 /*************************************************************************
1193 |*
1194 |*    RscTupel::RscTupel()
1195 |*
1196 |*    Beschreibung
1197 |*
1198 *************************************************************************/
1199 RscTupel::RscTupel( Atom nId, sal_uInt32 nTypeId, RscTop * pSuper )
1200     : RscClass( nId, nTypeId, pSuper )
1201 {}
1202 
1203 /*************************************************************************
1204 |*
1205 |*    RscTupel::GetTupelVar()
1206 |*
1207 |*    Beschreibung
1208 |*
1209 *************************************************************************/
1210 RSCINST RscTupel::GetTupelVar( const RSCINST & rInst, sal_uInt32 nPos,
1211                                  const RSCINST & rInitInst )
1212 {
1213     if( nPos >= nEntries )
1214     {
1215         return RSCINST();
1216     }
1217     else
1218         return GetVariable( rInst, pVarTypeList[ nPos ].nVarName, rInitInst );
1219 }
1220 
1221 /*************************************************************************
1222 |*
1223 |*    RscTupel::WriteSrc()
1224 |*
1225 |*    Beschreibung
1226 |*
1227 *************************************************************************/
1228 void RscTupel::WriteSrc( const RSCINST & rInst, FILE * fOutput,
1229                          RscTypCont * pTC, sal_uInt32 nTab,
1230                          const char * pVarName )
1231 {
1232     sal_uInt32  i = 0;
1233     RSCINST aTmpI;
1234 
1235     RscTop::WriteSrc( rInst, fOutput, pTC, nTab, pVarName );
1236 
1237     fprintf( fOutput, "< " );
1238     for( i = 0; i < nEntries; i++ )
1239     {
1240         if( !(VAR_HIDDEN & pVarTypeList[ i ].nVarType) )
1241         {
1242             if( !IsDflt( rInst.pData, i )
1243               && !IsValueDflt( rInst.pData, i ) )
1244             {
1245                 aTmpI = GetInstData( rInst.pData, i, sal_True );
1246 
1247                 if( aTmpI.IsInst() )
1248                     aTmpI.pClass->WriteSrcHeader(
1249                               aTmpI, fOutput, pTC, nTab, RscId(), pVarName );
1250                 else
1251                     fprintf( fOutput, "Default" );
1252             }
1253             else
1254                 fprintf( fOutput, "Default" );
1255             fprintf( fOutput, "; " );
1256         };
1257     };
1258     fprintf( fOutput, ">" );
1259 
1260     return;
1261 }
1262