office-gobmx/include/tools/resmgr.hxx
Noel Grandin c9b4e29813 loplugin:constparams in tools
Change-Id: Iea05efbb90a0a95fefd18ae9673095a31422f06c
Reviewed-on: https://gerrit.libreoffice.org/27137
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Noel Grandin <noelgrandin@gmail.com>
2016-07-13 06:38:12 +00:00

227 lines
8 KiB
C++

/* -*- 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 INCLUDED_TOOLS_RESMGR_HXX
#define INCLUDED_TOOLS_RESMGR_HXX
#include <tools/toolsdllapi.h>
#include <i18nlangtag/languagetag.hxx>
#include <tools/resid.hxx>
#include <o3tl/typed_flags_set.hxx>
#include <vector>
class SvStream;
class InternalResMgr;
/// Defines structure used to build resource
struct RSHEADER_TYPE
{
private:
char nId[4]; ///< Identifier of resource
char nRT[4]; ///< Resource type
char nGlobOff[4]; ///< Global offset
char nLocalOff[4]; ///< 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
enum class RCFlags
{
NONE = 0x00,
GLOBAL = 0x01, // Global resource
AUTORELEASE = 0x02,
NOTFOUND = 0x04,
FALLBACK_DOWN = 0x08,
FALLBACK_UP = 0x10,
};
namespace o3tl
{
template<> struct typed_flags<RCFlags> : is_typed_flags<RCFlags, 0x1f> {};
}
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
RCFlags 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) ? nullptr : &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();
ResMgr(const ResMgr&) = delete;
ResMgr& operator=(const ResMgr&) = delete;
public:
static void DestroyAllResMgr(); ///< Called upon app shutdown
~ResMgr();
/// Language-dependent resource library
static ResMgr* SearchCreateResMgr( const sal_Char* pPrefixName,
LanguageTag& rLocale );
static ResMgr* CreateResMgr( const sal_Char* pPrefixName,
const LanguageTag& aLocale = LanguageTag( LANGUAGE_SYSTEM) );
#ifdef DBG_UTIL
/// Test whether resource still exists
void TestStack();
#endif
/// Check whether resource is available
bool IsAvailable( const ResId& rId,
const Resource* = nullptr) const;
/// Search and load resource, given its ID
bool GetResource( const ResId& rId, const Resource * = nullptr );
static void * GetResourceSkipHeader( const ResId& rResId, ResMgr ** ppResMgr );
/// Free resource context
void PopContext( const Resource* = nullptr );
/// 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 const * pDatum );
/// Return a long
static sal_Int32 GetLong( void const * pLong );
/// Return a short
static sal_Int16 GetShort( void const * 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: */