1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir #ifndef _TOOLS_RESMGR_HXX 28*cdf0e10cSrcweir #define _TOOLS_RESMGR_HXX 29*cdf0e10cSrcweir 30*cdf0e10cSrcweir #include "tools/toolsdllapi.h" 31*cdf0e10cSrcweir #include <i18npool/lang.h> 32*cdf0e10cSrcweir #include <tools/string.hxx> 33*cdf0e10cSrcweir #include <tools/ref.hxx> 34*cdf0e10cSrcweir #include <tools/resid.hxx> 35*cdf0e10cSrcweir #include <com/sun/star/lang/Locale.hpp> 36*cdf0e10cSrcweir 37*cdf0e10cSrcweir #define CREATEVERSIONRESMGR_NAME( Name ) #Name 38*cdf0e10cSrcweir #define CREATEVERSIONRESMGR( Name ) ResMgr::CreateResMgr( CREATEVERSIONRESMGR_NAME( Name ) ) 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir #define LOCALE_MAX_FALLBACK 6 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir #include <vector> 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir class SvStream; 45*cdf0e10cSrcweir class InternalResMgr; 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir // ----------------- 48*cdf0e10cSrcweir // - RSHEADER_TYPE - 49*cdf0e10cSrcweir // ----------------- 50*cdf0e10cSrcweir 51*cdf0e10cSrcweir // Definition der Struktur, aus denen die Resource aufgebaut ist 52*cdf0e10cSrcweir struct RSHEADER_TYPE 53*cdf0e10cSrcweir { 54*cdf0e10cSrcweir private: 55*cdf0e10cSrcweir sal_uInt32 nId; // Identifier der Resource 56*cdf0e10cSrcweir RESOURCE_TYPE nRT; // Resource Typ 57*cdf0e10cSrcweir sal_uInt32 nGlobOff; // Globaler Offset 58*cdf0e10cSrcweir sal_uInt32 nLocalOff; // Lokaler Offset 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir public: 61*cdf0e10cSrcweir inline sal_uInt32 GetId(); // Identifier der Resource 62*cdf0e10cSrcweir inline RESOURCE_TYPE GetRT(); // Resource Typ 63*cdf0e10cSrcweir inline sal_uInt32 GetGlobOff(); // Globaler Offset 64*cdf0e10cSrcweir inline sal_uInt32 GetLocalOff(); // Lokaler Offset 65*cdf0e10cSrcweir }; 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir // ---------- 68*cdf0e10cSrcweir // - ResMgr - 69*cdf0e10cSrcweir // ---------- 70*cdf0e10cSrcweir 71*cdf0e10cSrcweir typedef void (*ResHookProc)( UniString& rStr ); 72*cdf0e10cSrcweir 73*cdf0e10cSrcweir // ---------- 74*cdf0e10cSrcweir // - ResMgr - 75*cdf0e10cSrcweir // ---------- 76*cdf0e10cSrcweir 77*cdf0e10cSrcweir // Initialisierung 78*cdf0e10cSrcweir #define RC_NOTYPE 0x00 79*cdf0e10cSrcweir // Globale Resource 80*cdf0e10cSrcweir #define RC_GLOBAL 0x01 81*cdf0e10cSrcweir #define RC_AUTORELEASE 0x02 82*cdf0e10cSrcweir #define RC_NOTFOUND 0x04 83*cdf0e10cSrcweir #define RC_FALLBACK_DOWN 0x08 84*cdf0e10cSrcweir #define RC_FALLBACK_UP 0x10 85*cdf0e10cSrcweir 86*cdf0e10cSrcweir class Resource; 87*cdf0e10cSrcweir class ResMgr; 88*cdf0e10cSrcweir struct ImpRCStack 89*cdf0e10cSrcweir { 90*cdf0e10cSrcweir // pResource and pClassRes equal NULL: resource was not loaded 91*cdf0e10cSrcweir RSHEADER_TYPE * pResource; // pointer to resource 92*cdf0e10cSrcweir void * pClassRes; // pointer to class specified init data 93*cdf0e10cSrcweir short Flags; // resource status 94*cdf0e10cSrcweir void * aResHandle; // Resource-Identifier from InternalResMgr 95*cdf0e10cSrcweir const Resource* pResObj; // pointer to Resource object 96*cdf0e10cSrcweir sal_uInt32 nId; // ResId used for error message 97*cdf0e10cSrcweir ResMgr* pResMgr; // ResMgr for Resource pResObj 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir void Clear(); 100*cdf0e10cSrcweir void Init( ResMgr * pMgr, const Resource * pObj, sal_uInt32 nId ); 101*cdf0e10cSrcweir }; 102*cdf0e10cSrcweir 103*cdf0e10cSrcweir class TOOLS_DLLPUBLIC ResMgr 104*cdf0e10cSrcweir { 105*cdf0e10cSrcweir private: 106*cdf0e10cSrcweir InternalResMgr* pImpRes; 107*cdf0e10cSrcweir std::vector< ImpRCStack > aStack; // resource context stack 108*cdf0e10cSrcweir int nCurStack; 109*cdf0e10cSrcweir ResMgr* pFallbackResMgr; // fallback ResMgr in case the Resource 110*cdf0e10cSrcweir // was not contained in this ResMgr 111*cdf0e10cSrcweir ResMgr* pOriginalResMgr; // the res mgr that fell back to this 112*cdf0e10cSrcweir // stack level 113*cdf0e10cSrcweir 114*cdf0e10cSrcweir TOOLS_DLLPRIVATE void incStack(); 115*cdf0e10cSrcweir TOOLS_DLLPRIVATE void decStack(); 116*cdf0e10cSrcweir 117*cdf0e10cSrcweir TOOLS_DLLPRIVATE const ImpRCStack * StackTop( sal_uInt32 nOff = 0 ) const 118*cdf0e10cSrcweir { 119*cdf0e10cSrcweir return (((int)nOff >= nCurStack) ? NULL : &aStack[nCurStack-nOff]); 120*cdf0e10cSrcweir } 121*cdf0e10cSrcweir TOOLS_DLLPRIVATE void Init( const rtl::OUString& rFileName ); 122*cdf0e10cSrcweir 123*cdf0e10cSrcweir TOOLS_DLLPRIVATE ResMgr( InternalResMgr * pImp ); 124*cdf0e10cSrcweir 125*cdf0e10cSrcweir #ifdef DBG_UTIL 126*cdf0e10cSrcweir TOOLS_DLLPRIVATE static void RscError_Impl( const sal_Char* pMessage, ResMgr* pResMgr, 127*cdf0e10cSrcweir RESOURCE_TYPE nRT, sal_uInt32 nId, 128*cdf0e10cSrcweir std::vector< ImpRCStack >& rResStack, int nDepth ); 129*cdf0e10cSrcweir #endif 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir // called from within GetResource() if a resource could not be found 132*cdf0e10cSrcweir TOOLS_DLLPRIVATE ResMgr* CreateFallbackResMgr( const ResId& rId, const Resource* pResource ); 133*cdf0e10cSrcweir // creates a 1k sized buffer set to zero for unfound resources 134*cdf0e10cSrcweir // used in case RC_NOTFOUND 135*cdf0e10cSrcweir static void* pEmptyBuffer; 136*cdf0e10cSrcweir TOOLS_DLLPRIVATE static void* getEmptyBuffer(); 137*cdf0e10cSrcweir 138*cdf0e10cSrcweir // the next two methods are needed to prevent the string hook called 139*cdf0e10cSrcweir // with the res mgr mutex locked 140*cdf0e10cSrcweir // like GetString, but doesn't call the string hook 141*cdf0e10cSrcweir TOOLS_DLLPRIVATE static sal_uInt32 GetStringWithoutHook( UniString& rStr, const sal_uInt8* pStr ); 142*cdf0e10cSrcweir // like ReadString but doesn't call the string hook 143*cdf0e10cSrcweir TOOLS_DLLPRIVATE UniString ReadStringWithoutHook(); 144*cdf0e10cSrcweir 145*cdf0e10cSrcweir static ResMgr* ImplCreateResMgr( InternalResMgr* pImpl ) { return new ResMgr( pImpl ); } 146*cdf0e10cSrcweir 147*cdf0e10cSrcweir //No copying 148*cdf0e10cSrcweir ResMgr(const ResMgr&); 149*cdf0e10cSrcweir ResMgr& operator=(const ResMgr&); 150*cdf0e10cSrcweir public: 151*cdf0e10cSrcweir static void DestroyAllResMgr(); // Wird gerufen, wenn App beendet wird 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir ~ResMgr(); 154*cdf0e10cSrcweir 155*cdf0e10cSrcweir // Sprachabhaengige Ressource Library 156*cdf0e10cSrcweir static const sal_Char* GetLang( LanguageType& eLanguage, sal_uInt16 nPrio = 0 ); //depricated! see "tools/source/rc/resmgr.cxx" 157*cdf0e10cSrcweir static ResMgr* SearchCreateResMgr( const sal_Char* pPrefixName, 158*cdf0e10cSrcweir com::sun::star::lang::Locale& rLocale ); 159*cdf0e10cSrcweir static ResMgr* CreateResMgr( const sal_Char* pPrefixName, 160*cdf0e10cSrcweir com::sun::star::lang::Locale aLocale = com::sun::star::lang::Locale( rtl::OUString(), 161*cdf0e10cSrcweir rtl::OUString(), 162*cdf0e10cSrcweir rtl::OUString())); 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir // Testet ob Resource noch da ist 165*cdf0e10cSrcweir void TestStack( const Resource * ); 166*cdf0e10cSrcweir 167*cdf0e10cSrcweir // ist Resource verfuegbar 168*cdf0e10cSrcweir sal_Bool IsAvailable( const ResId& rId, 169*cdf0e10cSrcweir const Resource* = NULL) const; 170*cdf0e10cSrcweir 171*cdf0e10cSrcweir // Resource suchen und laden 172*cdf0e10cSrcweir sal_Bool GetResource( const ResId& rId, const Resource * = NULL ); 173*cdf0e10cSrcweir static void * GetResourceSkipHeader( const ResId& rResId, ResMgr ** ppResMgr ); 174*cdf0e10cSrcweir // Kontext freigeben 175*cdf0e10cSrcweir void PopContext( const Resource* = NULL ); 176*cdf0e10cSrcweir 177*cdf0e10cSrcweir // Resourcezeiger erhoehen 178*cdf0e10cSrcweir void* Increment( sal_uInt32 nSize ); 179*cdf0e10cSrcweir 180*cdf0e10cSrcweir // Groesse ein Objektes in der Resource 181*cdf0e10cSrcweir static sal_uInt32 GetObjSize( RSHEADER_TYPE* pHT ) 182*cdf0e10cSrcweir { return( pHT->GetGlobOff() ); } 183*cdf0e10cSrcweir 184*cdf0e10cSrcweir // returns a string and its length out of the resource 185*cdf0e10cSrcweir static sal_uInt32 GetString( UniString& rStr, const sal_uInt8* pStr ); 186*cdf0e10cSrcweir // returns a byte string and its length out of the resource 187*cdf0e10cSrcweir static sal_uInt32 GetByteString( rtl::OString& rStr, const sal_uInt8* pStr ); 188*cdf0e10cSrcweir 189*cdf0e10cSrcweir // Groesse eines Strings in der Resource 190*cdf0e10cSrcweir static sal_uInt32 GetStringSize( sal_uInt32 nLen ) 191*cdf0e10cSrcweir { nLen++; return (nLen + nLen%2); } 192*cdf0e10cSrcweir static sal_uInt32 GetStringSize( const sal_uInt8* pStr, sal_uInt32& nLen ); 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir // return a int64 195*cdf0e10cSrcweir static sal_uInt64 GetUInt64( void* pDatum ); 196*cdf0e10cSrcweir // Gibt einen long zurueck 197*cdf0e10cSrcweir static sal_Int32 GetLong( void * pLong ); 198*cdf0e10cSrcweir // return a short 199*cdf0e10cSrcweir static sal_Int16 GetShort( void * pShort ); 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir // Gibt einen Zeiger auf die Resource zurueck 202*cdf0e10cSrcweir void * GetClass(); 203*cdf0e10cSrcweir 204*cdf0e10cSrcweir RSHEADER_TYPE * CreateBlock( const ResId & rId ); 205*cdf0e10cSrcweir 206*cdf0e10cSrcweir // Gibt die verbleibende Groesse zurueck 207*cdf0e10cSrcweir sal_uInt32 GetRemainSize(); 208*cdf0e10cSrcweir 209*cdf0e10cSrcweir const rtl::OUString&GetFileName() const; 210*cdf0e10cSrcweir 211*cdf0e10cSrcweir sal_Int16 ReadShort(); 212*cdf0e10cSrcweir sal_Int32 ReadLong(); 213*cdf0e10cSrcweir UniString ReadString(); 214*cdf0e10cSrcweir rtl::OString ReadByteString(); 215*cdf0e10cSrcweir 216*cdf0e10cSrcweir // generate auto help id for current resource stack 217*cdf0e10cSrcweir rtl::OString GetAutoHelpId(); 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir static void SetReadStringHook( ResHookProc pProc ); 220*cdf0e10cSrcweir static ResHookProc GetReadStringHook(); 221*cdf0e10cSrcweir static void SetDefaultLocale( const com::sun::star::lang::Locale& rLocale ); 222*cdf0e10cSrcweir }; 223*cdf0e10cSrcweir 224*cdf0e10cSrcweir inline sal_uInt32 RSHEADER_TYPE::GetId() 225*cdf0e10cSrcweir { 226*cdf0e10cSrcweir return (sal_uInt32)ResMgr::GetLong( &nId ); 227*cdf0e10cSrcweir } 228*cdf0e10cSrcweir inline RESOURCE_TYPE RSHEADER_TYPE::GetRT() 229*cdf0e10cSrcweir { 230*cdf0e10cSrcweir return (RESOURCE_TYPE)ResMgr::GetLong( &nRT ); 231*cdf0e10cSrcweir } 232*cdf0e10cSrcweir inline sal_uInt32 RSHEADER_TYPE::GetGlobOff() 233*cdf0e10cSrcweir { 234*cdf0e10cSrcweir return (sal_uInt32)ResMgr::GetLong( &nGlobOff ); 235*cdf0e10cSrcweir } 236*cdf0e10cSrcweir inline sal_uInt32 RSHEADER_TYPE::GetLocalOff() 237*cdf0e10cSrcweir { 238*cdf0e10cSrcweir return (sal_uInt32)ResMgr::GetLong( &nLocalOff ); 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir 241*cdf0e10cSrcweir #endif // _SV_RESMGR_HXX 242