2025-11-27 16:46:48 +09:00

280 lines
11 KiB
C++

// ==========================================================================
// Class Specification : COXResourceFile
// ==========================================================================
// Header file : OXResourceFile.h
//
// Version: 9.3
//
// Properties:
// NO Abstract class (does not have any objects)
// YES Derived from CObject
//
// NO Is a CWnd.
// NO Two stage creation (constructor & Create())
// NO Has a message map
// NO Needs a resource (template)
//
// NO Persistent objects (saveable on disk)
// NO Uses exceptions
//
// Description:
// COXResourceFile provides a resource with a CSharedFile (thus CFile)
// interface. One can read or write any type (e.g. a GIF-picture, a movie
// etc. as in RT_RCDATA) of resources directly through familiar Read(),
// Write(), Seek(), Flush(), Close(), etc.. The resource will be loaded
// into memory and wrapped by a COXResourceFile. All changes will be applied
// to the resource in memory and will be committed when the file is flushed.
//
/////////////////////////////////////////////////////////////////////////////
#ifndef __OXRESOURCEFILE_H__
#define __OXRESOURCEFILE_H__
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "OXDllExt.h"
#include <afxpriv.h>
#include "OXResourceLibrary.h"
/////////////////////////////////////////////////////////////////////////////
class OX_CLASS_DECL COXResourceFile : public CSharedFile
{
DECLARE_DYNAMIC(COXResourceFile)
// Data members -------------------------------------------------------------
public:
protected:
COXResourceLibrary* m_pResLib;
BOOL m_bAutoDeleteByLib;
BOOL m_bFlushOnClose;
CString m_sResType;
CString m_sResName;
WORD m_nResLanguage;
private:
// Member functions ---------------------------------------------------------
public:
COXResourceFile(UINT nAllocFlags = GMEM_DDESHARE | GMEM_MOVEABLE,
UINT nGrowBytes = 4096);
// --- In : nAllocFlags, specifies how to allocate memory (see Win32
// GlobalAlloc() for details)
// nGrowBytes, (same as in CMemFile)
// --- Out :
// --- Returns :
// --- Effect : Constructor of object
virtual ~COXResourceFile();
// --- In :
// --- Out :
// --- Returns :
// --- Effect : Destructor of object
virtual BOOL Open(UINT nOpenFlags, COXResourceLibrary* pResLib, BOOL bAutoDeleteByLib,
LPCTSTR pszType, LPCTSTR pszName, WORD nLanguage = OXRESOURCE_DEFLANGID,
BOOL bMakeUniqueName = FALSE);
virtual BOOL Open(UINT nOpenFlags, COXResourceLibrary* pResLib, BOOL bAutoDeleteByLib,
LPCTSTR pszType, UINT nID, WORD nLanguage = OXRESOURCE_DEFLANGID,
BOOL bMakeUniqueName = FALSE);
// --- In : nOpenFlags, specifies the action to take when opening the resource,
// can be a combination of the following values:
// CFile::modeReadWrite open an existing resource, will call Flush() on
// Close() or destruction
// CFile::modeRead open an existing resource, will not call Flush()
// on Close() or destruction (Flush() is disabled)
// CFile::modeCreate create a new resource, if the resource exists already,
// it is truncated to 0 length.
// CFile::modeNoTruncate create a new resource, (Combine this value with modeCreate)
// If the resource exists already, it is not truncated to 0 length,
// thus the resource is guaranteed to open, either as a newly
// created resource or as an existing resource.
// pResLib, the library from which this resource is opening
// (or to which this resource will be updated, if creating a new
// resource)
// bAutoDeleteByLib, whether let the library to delete this object
// when the library is closed
// pszType, the type of the resource to open
// pszName, the name of the resource to open
// nID, the integer ID of the resource to open
// nLanguage, the language of the resource to open
// bMakeUniqueName, specify whether to make sure the name of this
// resource is not duplicated (with another resource, in the library
// file and its registered COXResourceFile objects, of the same type
// and language). neglected when opening an existing resource
// --- Out :
// --- Returns : TRUE if successful; FALSE otherwise
// --- Effect : load an existing resource into memory from a library, or create a
// new empty resource
virtual void Close();
// --- In :
// --- Out :
// --- Returns :
// --- Effect : flush the contents, close the resource and release memory
// (destructor will call this if necessary)
virtual void Abort();
// --- In :
// --- Out :
// --- Returns :
// --- Effect : close the resource and release memory without flushing the contents
virtual void Flush();
// --- In :
// --- Out :
// --- Returns :
// --- Effect : write changes back to the library file
// (if COXResourceLibrary::BeginUpdate() was called, the change will
// be made until COXResourceLibrary::EndUpdate() is called; otherwise
// the change will be written back to the library file immediately.)
virtual HGLOBAL DetachEx();
// --- In :
// --- Out :
// --- Returns : the handle of the global memory that was tagged with type, name and
// language block
// --- Effect : take over the memory that contains all resource binary data plus
// type, name and language tag. Called in clipboard/OLE operations
virtual BOOL SetHandleEx(HGLOBAL hTaggedResData, BOOL bAllowGrow = TRUE);
// --- In : hTaggedResData, the handle of the memory that was returned by
// DetachEx()
// bAllowGrow, specify whether the memory can be reallocated
// (same as in CShareFile::SetHandle())
// --- Out :
// --- Returns : TRUE if successful; FALSE otherwise
// --- Effect : restore resource binary data and its type, name and language from a
// tagged memory block. Called in clipboard/OLE operations
virtual BOOL SetResType(LPCTSTR pszType);
// --- In : pszType, the resource type to set
// --- Out :
// --- Returns : (not used)
// --- Effect : set the type of a resource (not necessarily already opened)
virtual BOOL SetResName(LPCTSTR pszName);
virtual BOOL SetResName(WORD nID);
// --- In : pszName, the resource name to set
// nID, the ID of the resource to set
// --- Out :
// --- Returns : (not used)
// --- Effect : set the name of a resource (not necessarily already opened)
virtual BOOL SetResLanguage(WORD nLanguage);
// --- In : nLanguage, the resource language to set
// --- Out :
// --- Returns : (not used)
// --- Effect : set the langauge of a resource (not necessarily already opened)
virtual BOOL SetResourceLibrary(COXResourceLibrary* pResLib,
BOOL bAutoDeleteByLib = FALSE, BOOL bMakeUniqueName = FALSE);
// --- In : pResLib, the new target library to set
// bAutoDeleteByLib, whether let the library to delete this object
// when the library is closed
// bMakeUniqueName, specify whether to make sure the name of this
// resource is not duplicated (with another resource, in the library
// file and its registered COXResourceFile objects, of the same type
// and language).
// --- Out :
// --- Returns : (not used)
// --- Effect : set a new target (of updates) library (i.e. transferring)
// (the library that was used in Open() is the default target library
// when first opened)
BOOL IsAutoDeleteByLib() const;
// --- In :
// --- Out :
// --- Returns : TRUE if it will be automatically deleted when the library (specified
// when calling Open() or SetResourceLibrary()) is closed
// --- Effect : determine whether it was set to let the library to delete this
// object when the library is closed
CString GetResType() const;
// --- In :
// --- Out :
// --- Returns : the type in CString format of the resource
// --- Effect : retrieve the type of the resource
CString GetResName() const;
// --- In :
// --- Out :
// --- Returns : the name in CString format of the resource
// --- Effect : retrieve the name of the resource
WORD GetResLanguage() const;
// --- In :
// --- Out :
// --- Returns : the language of the resource
// --- Effect : retrieve the language of the resource
COXResourceLibrary* GetResourceLibrary() const;
// --- In :
// --- Out :
// --- Returns : the library (specified when calling Open() or
// SetResourceLibrary()) of the resource
// --- Effect : retrieve the target library
// *** type/name format conversion functions ***
//------------------------------------------------------------------------------
// Name In Return Explanation
//------------------------------------------------------------------------------
// CString LPCTSTR CString the CString format this class (and COXResourceFile)
// uses: either #65535 or "string"
// Item LPCTSTR LPCTSTR the internal format Win32 used in resources'
// types and names
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Int WORD WORD the integer value you usually used with
// resource editor
// String LPCTSTR CString the resource name that you can use directly
// (not recommended by Win32 when storing
// resources, yet usable)
//------------------------------------------------------------------------------
// (1) OXRes...ToInt() or OXRes...ToString() may return 0 or empty string,
// respectively, when not convertable;
//
// (2) for these conversions:
// Int --> String: (n/a);
// String --> Int: (n/a);
// String --> CString: implicit or CString(LPCTSTR);
// Int --> Item: MAKEINTRESOURCE() macro;
// String --> Item: LPTSTR = LPCTSTR
//
// (3) for CString --> Item (rarely it is needed, because all member functions of
// COXResourceLibrary and COXResourceFile accept any formats including CString,
// and all Win32 resource functions that needs item format are wrapped):
// write something like this:
//
// WORD nID = COXResourceFile::OXResCStringToInt(pszTypeOrName);
// LPCTSTR pszItemTypeOrName = nID ? MAKEINTRESOURCE(nID) : pszTypeOrName;
static BOOL OXResCStringIsInt (LPCTSTR lpszCStringTypeOrName);
static BOOL OXResItemIsInt (LPCTSTR lpszTypeOrName);
static WORD OXResCStringToInt (LPCTSTR lpszCStringTypeOrName);
static CString OXResCStringToString(LPCTSTR lpszCStringTypeOrName);
static CString OXResItemToCString (LPCTSTR lpszItemTypeOrName);
static WORD OXResItemToInt (LPCTSTR lpszItemTypeOrName);
static CString OXResItemToString (LPCTSTR lpszItemTypeOrName);
static CString OXResIntToCString (WORD nID);
static WORD OXResToInt (LPCTSTR lpszTypeOrName); // takes any formats
static CString OXResToCString (LPCTSTR lpszTypeOrName); // takes any formats
protected:
virtual BOOL MakeUniqueName(COXResourceLibrary* pSearchLibrary = NULL);
static CString ValidateResString(LPCTSTR pszTypeOrName);
private:
};
/////////////////////////////////////////////////////////////////////////////
#include "OXResourceFile.inl"
#endif // __OXRESOURCEFILE_H__
// end of OXResourceFile.h