#ifndef MRT_CJFILE_H
#define MRT_CJFILE_H
#include "Base/Types.h"
#include "BaseFile.h"
#include "CjFileMeta.h"
namespace MapleRuntime {
class CJFile : public BaseFile {
public:
explicit CJFile(CString path, Uptr addr) : BaseFile(path), cJFileMetaBegin(addr){};
~CJFile() override = default;
void RegisterFile() override;
void UnregisterFile() override;
void LoadCJFileMeta();
Uptr GetFileMetaAddr() const override;
const CJFileMeta& GetCJFileMeta() const;
bool IsAddrInCJFile(Uptr addr) const override;
Uptr GetPackageInfoBase() override;
U32 GetPackageInfoTotalSize() override;
Uptr GetExtensionDataBase() override;
U32 GetExtensionDataSize() override;
Uptr GetInnerTypeExtensionsBase() override;
U32 GetInnerTypeExtensionsSize() override;
Uptr GetOuterTypeExtensionsBase() override;
U32 GetOuterTypeExtensionsSize() override;
Uptr GetStaticGIBase() override;
U32 GetStaticGISize() override;
Uptr GetTypeInfoBase() override;
U32 GetTypeInfoTotalSize() override;
Uptr GetTypeExtBase() override;
U32 GetTypeExtTotalSize() override;
CString GetSDKVersion() const override;
void GetGlobalInitFunc(std::vector<Uptr> &globalInitFuncs) const override;
#if defined(_WIN64)
void LoadWinCJFileMeta();
#elif defined(__APPLE__)
void LoadMacCJFileMeta();
#else
void LoadLinuxCJFileMeta();
#endif
private:
Uptr* GetGlobalInitFuncPtr(const CJFileMeta& cFileMeta) const;
U32 GetGlobalInitFuncSize(const CJFileMeta& cFileMeta) const;
CJFileMeta cJFileMeta;
Uptr cJFileMetaBegin;
Uptr cJFileMetaEnd;
};
using CJFileRef = CJFile*;
}
#endif