summaryrefslogtreecommitdiff
path: root/include/tools/resmgr.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'include/tools/resmgr.hxx')
-rw-r--r--include/tools/resmgr.hxx223
1 files changed, 223 insertions, 0 deletions
diff --git a/include/tools/resmgr.hxx b/include/tools/resmgr.hxx
new file mode 100644
index 000000000000..603a2c7a2eb5
--- /dev/null
+++ b/include/tools/resmgr.hxx
@@ -0,0 +1,223 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+#ifndef _TOOLS_RESMGR_HXX
+#define _TOOLS_RESMGR_HXX
+
+#include "tools/toolsdllapi.h"
+#include <i18nlangtag/languagetag.hxx>
+#include <tools/string.hxx>
+#include <tools/resid.hxx>
+
+#include <vector>
+
+class SvStream;
+class InternalResMgr;
+
+/// Defines structure used to build resource
+struct RSHEADER_TYPE
+{
+private:
+ sal_uInt32 nId; ///< Identifier of resource
+ RESOURCE_TYPE nRT; ///< Resource type
+ sal_uInt32 nGlobOff; ///< Global offset
+ sal_uInt32 nLocalOff; ///< Local offset
+
+public:
+ inline sal_uInt32 GetId(); ///< Identifier of resource
+ inline RESOURCE_TYPE GetRT(); ///< Resource type
+ inline sal_uInt32 GetGlobOff(); ///< Global offset
+ inline sal_uInt32 GetLocalOff(); ///< Local offset
+};
+
+typedef OUString (*ResHookProc)( const OUString& rStr );
+
+// Initialization
+#define RC_NOTYPE 0x00
+// Global resource
+#define RC_GLOBAL 0x01
+#define RC_AUTORELEASE 0x02
+#define RC_NOTFOUND 0x04
+#define RC_FALLBACK_DOWN 0x08
+#define RC_FALLBACK_UP 0x10
+
+class Resource;
+class ResMgr;
+
+struct ImpRCStack
+{
+ // pResource and pClassRes equal NULL: resource was not loaded
+ RSHEADER_TYPE * pResource; ///< pointer to resource
+ void * pClassRes; ///< pointer to class specified init data
+ short Flags; ///< resource status
+ void * aResHandle; ///< Resource-Identifier from InternalResMgr
+ const Resource* pResObj; ///< pointer to Resource object
+ sal_uInt32 nId; ///< ResId used for error message
+ ResMgr* pResMgr; ///< ResMgr for Resource pResObj
+
+ void Clear();
+ void Init( ResMgr * pMgr, const Resource * pObj, sal_uInt32 nId );
+};
+
+class TOOLS_DLLPUBLIC ResMgr
+{
+private:
+ InternalResMgr* pImpRes;
+ std::vector< ImpRCStack > aStack; ///< resource context stack
+ int nCurStack;
+ ResMgr* pFallbackResMgr; ///< fallback ResMgr in case the Resource
+ ///< was not contained in this ResMgr
+ ResMgr* pOriginalResMgr; ///< the res mgr that fell back to this
+ ///< stack level
+
+ TOOLS_DLLPRIVATE void incStack();
+ TOOLS_DLLPRIVATE void decStack();
+
+ TOOLS_DLLPRIVATE const ImpRCStack * StackTop( sal_uInt32 nOff = 0 ) const
+ {
+ return (((int)nOff >= nCurStack) ? NULL : &aStack[nCurStack-nOff]);
+ }
+ TOOLS_DLLPRIVATE void Init( const OUString& rFileName );
+
+ TOOLS_DLLPRIVATE ResMgr( InternalResMgr * pImp );
+
+ #ifdef DBG_UTIL
+ TOOLS_DLLPRIVATE static void RscError_Impl( const sal_Char* pMessage,
+ ResMgr* pResMgr,
+ RESOURCE_TYPE nRT,
+ sal_uInt32 nId,
+ std::vector< ImpRCStack >& rResStack,
+ int nDepth );
+ #endif
+
+ // called from within GetResource() if a resource could not be found
+ TOOLS_DLLPRIVATE ResMgr* CreateFallbackResMgr( const ResId& rId,
+ const Resource* pResource );
+ // creates a 1k sized buffer set to zero for unfound resources
+ // used in case RC_NOTFOUND
+ static void* pEmptyBuffer;
+ TOOLS_DLLPRIVATE static void* getEmptyBuffer();
+
+ // the next two methods are needed to prevent the string hook called
+ // with the res mgr mutex locked
+ // like GetString, but doesn't call the string hook
+ TOOLS_DLLPRIVATE static sal_uInt32 GetStringWithoutHook( OUString& rStr,
+ const sal_uInt8* pStr );
+ // like ReadString but doesn't call the string hook
+ TOOLS_DLLPRIVATE OUString ReadStringWithoutHook();
+
+ static ResMgr* ImplCreateResMgr( InternalResMgr* pImpl ) { return new ResMgr( pImpl ); }
+
+ // no copying
+ ResMgr(const ResMgr&);
+ ResMgr& operator=(const ResMgr&);
+
+public:
+ static void DestroyAllResMgr(); ///< Called upon app shutdown
+
+ ~ResMgr();
+
+ /// Language-dependent resource library
+ static const sal_Char* GetLang( LanguageType& eLanguage, sal_uInt16 nPrio = 0 ); ///< @deprecated see "tools/source/rc/resmgr.cxx"
+ static ResMgr* SearchCreateResMgr( const sal_Char* pPrefixName,
+ LanguageTag& rLocale );
+ static ResMgr* CreateResMgr( const sal_Char* pPrefixName,
+ LanguageTag aLocale = LanguageTag( LANGUAGE_SYSTEM) );
+
+ /// Test whether resource still exists
+ void TestStack( const Resource * );
+
+ /// Check whether resource is available
+ sal_Bool IsAvailable( const ResId& rId,
+ const Resource* = NULL) const;
+
+ /// Search and load resource, given its ID
+ sal_Bool GetResource( const ResId& rId, const Resource * = NULL );
+ static void * GetResourceSkipHeader( const ResId& rResId, ResMgr ** ppResMgr );
+ /// Free resource context
+ void PopContext( const Resource* = NULL );
+
+ /// Increment resource pointer
+ void* Increment( sal_uInt32 nSize );
+
+ /// Size of an object within the resource
+ static sal_uInt32 GetObjSize( RSHEADER_TYPE* pHT )
+ { return( pHT->GetGlobOff() ); }
+
+ /// Return a string and its length out of the resource
+ static sal_uInt32 GetString( OUString& rStr, const sal_uInt8* pStr );
+ /// Return a byte string and its length out of the resource
+ static sal_uInt32 GetByteString( OString& rStr, const sal_uInt8* pStr );
+
+ /// Return the size of a string in the resource
+ static sal_uInt32 GetStringSize( sal_uInt32 nLen )
+ { nLen++; return (nLen + nLen%2); }
+ static sal_uInt32 GetStringSize( const sal_uInt8* pStr, sal_uInt32& nLen );
+
+ /// Return a int64
+ static sal_uInt64 GetUInt64( void* pDatum );
+ /// Return a long
+ static sal_Int32 GetLong( void * pLong );
+ /// Return a short
+ static sal_Int16 GetShort( void * pShort );
+
+ /// Return a pointer to the resource
+ void * GetClass();
+
+ RSHEADER_TYPE * CreateBlock( const ResId & rId );
+
+ sal_uInt32 GetRemainSize();
+
+ const OUString& GetFileName() const;
+
+ sal_Int16 ReadShort();
+ sal_Int32 ReadLong();
+ OUString ReadString();
+ OString ReadByteString();
+
+ /// Generate auto help ID for current resource stack
+ OString GetAutoHelpId();
+
+ static void SetReadStringHook( ResHookProc pProc );
+ static ResHookProc GetReadStringHook();
+ static void SetDefaultLocale( const LanguageTag& rLocale );
+};
+
+inline sal_uInt32 RSHEADER_TYPE::GetId()
+{
+ return (sal_uInt32)ResMgr::GetLong( &nId );
+}
+
+inline RESOURCE_TYPE RSHEADER_TYPE::GetRT()
+{
+ return (RESOURCE_TYPE)ResMgr::GetLong( &nRT );
+}
+
+inline sal_uInt32 RSHEADER_TYPE::GetGlobOff()
+{
+ return (sal_uInt32)ResMgr::GetLong( &nGlobOff );
+}
+
+inline sal_uInt32 RSHEADER_TYPE::GetLocalOff()
+{
+ return (sal_uInt32)ResMgr::GetLong( &nLocalOff );
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */