194 lines
5.5 KiB
C++
194 lines
5.5 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#ifndef BAGEL_MFC_AFX_H
|
|
#define BAGEL_MFC_AFX_H
|
|
|
|
#include "common/stream.h"
|
|
#include "bagel/mfc/minwindef.h"
|
|
|
|
namespace Bagel {
|
|
namespace MFC {
|
|
|
|
struct CRuntimeClass;
|
|
class CObject;
|
|
class CException;
|
|
class CFileException;
|
|
|
|
#define DECLARE_DYNAMIC(class_name) \
|
|
public: \
|
|
static const CRuntimeClass class##class_name; \
|
|
virtual const CRuntimeClass *GetRuntimeClass() const override; \
|
|
|
|
|
|
#define RUNTIME_CLASS(class_name) ((const CRuntimeClass *)(&class_name::class##class_name))
|
|
|
|
#define IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
|
|
const CRuntimeClass class_name::class##class_name = { \
|
|
#class_name, sizeof(class class_name), wSchema, pfnNew, \
|
|
RUNTIME_CLASS(base_class_name) }; \
|
|
const CRuntimeClass* class_name::GetRuntimeClass() const \
|
|
{ return RUNTIME_CLASS(class_name); }
|
|
|
|
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
|
|
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, nullptr)
|
|
|
|
#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
|
|
CObject *class_name::CreateObject() \
|
|
{ return new class_name; } \
|
|
IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
|
|
class_name::CreateObject)
|
|
|
|
#define ASSERT_KINDOF(class_name, object) \
|
|
assert((object)->IsKindOf(RUNTIME_CLASS(class_name)))
|
|
#define ASSERT_VALID(X) assert((X) != nullptr)
|
|
|
|
struct CRuntimeClass {
|
|
const char *m_lpszClassName;
|
|
int m_nObjectSize;
|
|
unsigned int m_wSchema;
|
|
CObject *(*m_pfnCreateObject)();
|
|
const CRuntimeClass *m_pBaseClass;
|
|
|
|
CObject *CreateObject() const;
|
|
bool IsDerivedFrom(const CRuntimeClass *pBaseClass) const;
|
|
};
|
|
|
|
class CDumpContext {
|
|
};
|
|
|
|
class CObject {
|
|
public:
|
|
static const CRuntimeClass classCObject;
|
|
public:
|
|
CObject();
|
|
CObject(const CObject &) = default;
|
|
CObject &operator=(const CObject &) = default;
|
|
virtual ~CObject() = 0;
|
|
virtual const CRuntimeClass *GetRuntimeClass() const;
|
|
|
|
virtual void AssertValid() const {}
|
|
virtual void Dump(CDumpContext &dc) const {}
|
|
|
|
bool IsKindOf(const CRuntimeClass *pClass) const;
|
|
};
|
|
|
|
class CFile : public CObject {
|
|
DECLARE_DYNAMIC(CFile)
|
|
public:
|
|
// Flag values
|
|
enum OpenFlags {
|
|
modeRead = (int)0x00000,
|
|
modeWrite = (int)0x00001,
|
|
modeReadWrite = (int)0x00002,
|
|
shareCompat = (int)0x00000,
|
|
shareExclusive = (int)0x00010,
|
|
shareDenyWrite = (int)0x00020,
|
|
shareDenyRead = (int)0x00030,
|
|
shareDenyNone = (int)0x00040,
|
|
modeNoInherit = (int)0x00080,
|
|
typeUnicode = (int)0x00400, // used in derived classes (e.g. CStdioFile) only
|
|
modeCreate = (int)0x01000,
|
|
modeNoTruncate = (int)0x02000,
|
|
typeText = (int)0x04000, // used in derived classes (e.g. CStdioFile) only
|
|
typeBinary = (int)0x08000, // used in derived classes (e.g. CStdioFile) only
|
|
osNoBuffer = (int)0x10000,
|
|
osWriteThrough = (int)0x20000,
|
|
osRandomAccess = (int)0x40000,
|
|
osSequentialScan = (int)0x80000,
|
|
};
|
|
|
|
enum Attribute {
|
|
normal = 0x00, // note: not same as FILE_ATTRIBUTE_NORMAL
|
|
readOnly = FILE_ATTRIBUTE_READONLY,
|
|
hidden = FILE_ATTRIBUTE_HIDDEN,
|
|
system = FILE_ATTRIBUTE_SYSTEM,
|
|
volume = 0x08,
|
|
directory = FILE_ATTRIBUTE_DIRECTORY,
|
|
archive = FILE_ATTRIBUTE_ARCHIVE,
|
|
device = FILE_ATTRIBUTE_DEVICE,
|
|
temporary = FILE_ATTRIBUTE_TEMPORARY,
|
|
sparse = FILE_ATTRIBUTE_SPARSE_FILE,
|
|
reparsePt = FILE_ATTRIBUTE_REPARSE_POINT,
|
|
compressed = FILE_ATTRIBUTE_COMPRESSED,
|
|
offline = FILE_ATTRIBUTE_OFFLINE,
|
|
notIndexed = FILE_ATTRIBUTE_NOT_CONTENT_INDEXED,
|
|
encrypted = FILE_ATTRIBUTE_ENCRYPTED
|
|
};
|
|
|
|
enum SeekPosition {
|
|
begin = 0x0, current = 0x1, end = 0x2
|
|
};
|
|
|
|
private:
|
|
Common::Stream *_stream = nullptr;
|
|
|
|
Common::SeekableReadStream *readStream() const;
|
|
Common::WriteStream *writeStream() const;
|
|
|
|
public:
|
|
CFile() {}
|
|
CFile(const char *lpszFileName, unsigned int nOpenFlags);
|
|
~CFile() {
|
|
Close();
|
|
}
|
|
|
|
bool Open(const char *lpszFileName,
|
|
unsigned int nOpenFlags = CFile::modeRead,
|
|
CFileException *pError = nullptr);
|
|
void Close();
|
|
void Abort();
|
|
uint64 SeekToEnd();
|
|
void SeekToBegin();
|
|
virtual uint64 Seek(int64 lOff, unsigned int nFrom);
|
|
virtual uint64 GetLength() const;
|
|
virtual uint64 GetPosition() const;
|
|
|
|
virtual unsigned int Read(void *lpBuf, unsigned int nCount);
|
|
virtual void Write(const void *lpBuf, unsigned int nCount);
|
|
unsigned int ReadHuge(void *lpBuf, unsigned int nCount) {
|
|
return Read(lpBuf, nCount);
|
|
}
|
|
|
|
operator Common::SeekableReadStream *() {
|
|
return readStream();
|
|
}
|
|
operator Common::SeekableReadStream &() {
|
|
return *readStream();
|
|
}
|
|
|
|
/**
|
|
* Detaches the stream from the CFile
|
|
* without destroying it.
|
|
*/
|
|
Common::SeekableReadStream *detach();
|
|
};
|
|
|
|
/*============================================================================*/
|
|
/* Exceptions - Not supported in ScummVM */
|
|
class CException {};
|
|
class CFileException : public CException {};
|
|
|
|
} // namespace MFC
|
|
} // namespace Bagel
|
|
|
|
#endif
|