#include "ge_math.h"
#include "c4d_file.h"
#include "c4d_memory.h"
#include "c4d_basecontainer.h"
#include "c4d_basebitmap.h"
#include "c4d_basechannel.h"
#include "c4d_general.h"

#define FnCall(fnc) (this->*C4DOS.Fn->fnc)
#define FlCall(fnc) (this->*C4DOS.Fl->fnc)
#define HfCall(fnc) (this->*C4DOS.Hf->fnc)

#ifdef	__C4D_NO_NEW_DELETE__
void* Filename::operator new(size_t, const std::nothrow_t&, int line, const Char* file) throw()
{
	return C4DOS.Fn->Alloc();
}

void Filename::operator delete(void* del, int line, const Char* file)
{
	C4DOS.Fn->Free((Filename*)del);
}

void Filename::operator delete(void* del)
{
	C4DOS.Fn->Free((Filename*)del);
}
#endif

Filename::Filename(void)
{
	C4DOS.Fn->Init(this);
}

Filename::Filename(const Char* string)
{
	C4DOS.Fn->Init(this);
	C4DOS.Fn->SetCString(this, string);
}

Filename::Filename(const String& string)
{
	C4DOS.Fn->Init(this);
	C4DOS.Fn->SetString(this, &string);
}

Filename::Filename(const Filename& src)
{
	C4DOS.Fn->Init(this);
	C4DOS.Fn->CopyTo(&src, this);
}

Filename::~Filename(void)
{
	C4DOS.Fn->Flush(this);
}

void Filename::CopyTo(Filename* dst) const
{
	C4DOS.Fn->CopyTo(this, dst);
}

Bool Filename::FileSelect(FILESELECTTYPE type, FILESELECT flags, const String& title, const String& force_suffix)
{
	return FnCall(FileSelect) (type, flags, title, force_suffix);
}

void Filename::SetIpConnection(IpConnection* ipc)
{
	FnCall(SetIpConnection) (ipc);
}

IpConnection* Filename::GetIpConnection() const
{
	return FnCall(GetIpConnection) ();
}

Bool Filename::Content(void) const
{
	return C4DOS.Fn->Content(this);
}

String Filename::GetString(void) const
{
	return C4DOS.Fn->GetString(this);
}

void Filename::SetString(const String& str)
{
	C4DOS.Fn->SetString(this, &str);
}

const Filename Filename::GetDirectory(void) const
{
	return C4DOS.Fn->GetDirectory(this);
}

const Filename Filename::GetFile(void) const
{
	return C4DOS.Fn->GetFile(this);
}

String Filename::GetFileString(void) const
{
	return GetFile().GetString();
}

void Filename::ClearSuffix(void)
{
	C4DOS.Fn->ClearSuffix(this);
}

void Filename::ClearSuffixComplete(void)
{
	C4DOS.Fn->ClearSuffixComplete(this);
}

void Filename::SetSuffix(const String& str)
{
	C4DOS.Fn->SetSuffix(this, &str);
}

Bool Filename::CheckSuffix(const String& str) const
{
	return C4DOS.Fn->CheckSuffix(this, &str);
}

String Filename::GetSuffix(void) const
{
	return C4DOS.Fn->GetSuffix(this);
}

Bool Filename::IsBrowserUrl() const
{
	return FnCall(IsBrowserUrl) ();
}

void Filename::SetDirectory(const Filename& str)
{
	C4DOS.Fn->SetDirectory(this, &str);
}

void Filename::SetFile(const Filename& str)
{
	C4DOS.Fn->SetFile(this, &str);
}

const Filename& Filename::operator = (const Filename& cs)
{
	C4DOS.Fn->CopyTo(&cs, this);
	return *this;
}

const Filename operator + (const Filename& Str1, const Filename& Str2)
{
	Filename fn = Str1;
	C4DOS.Fn->Add(&fn, &Str2);
	return fn;
}

const Filename& Filename::operator += (const Filename& Str)
{
	C4DOS.Fn->Add(this, &Str);
	return *this;
}

Bool Filename::operator == (const Filename& Str) const
{
	return C4DOS.Fn->Compare(this, &Str);
}

Bool Filename::operator != (const Filename& Str) const
{
	return !C4DOS.Fn->Compare(this, &Str);
}

void Filename::SetMemoryReadMode(void* adr, Int size)
{
	C4DOS.Fn->SetMemoryReadMode(this, adr, size);
}

void Filename::SetMemoryWriteMode(MemoryFileStruct* mfs)
{
	C4DOS.Fn->SetMemoryWriteMode(this, mfs);
}

MemoryFileStruct* MemoryFileStruct::Alloc()
{
	return C4DOS.Fn->MemoryFileStructAlloc();
}

void MemoryFileStruct::Free(MemoryFileStruct*& mfs)
{
	C4DOS.Fn->MemoryFileStructFree(mfs);
}

void MemoryFileStruct::GetData(void*& data, Int& size, Bool release)
{
	C4DOS.Fn->MemoryFileStructGetData(this, data, size, release);
}


BaseFile* BaseFile::Alloc(void)
{
	return C4DOS.Fl->Alloc();
}

void BaseFile::Free(BaseFile*& fl)
{
	C4DOS.Fl->Free(fl);
	fl = nullptr;
}

Bool BaseFile::Open(const Filename& name, FILEOPEN mode, FILEDIALOG error_dialog, BYTEORDER order, Int32 type, Int32 creator)
{
	return FlCall(Open) (name, mode, error_dialog, order, type, creator);
}

Bool BaseFile::Close(void)
{
	return FlCall(Close) ();
}

void BaseFile::SetOrder(BYTEORDER order)
{
	FlCall(SetOrder) (order);
}

Int BaseFile::ReadBytes(void* data, Int len, Bool just_try_it)
{
	return FlCall(ReadBytes) (data, len, just_try_it);
}

Bool BaseFile::WriteBytes(const void* data, Int len)
{
	return FlCall(WriteBytes) (data, len);
}

Int BaseFile::TryReadBytes(void* data, Int len)
{
	return FlCall(ReadBytes) (data, len, true);
}

Bool BaseFile::Seek(Int64 pos, FILESEEK mode)
{
	return FlCall(Seek) (pos, mode);
}

Int64 BaseFile::GetPosition()
{
	return FlCall(GetPosition) ();
}

Int64 BaseFile::GetLength()
{
	return FlCall(GetLength) ();
}

LOCATION BaseFile::GetLocation() const
{
	return FlCall(GetLocation) ();
}

FILEERROR BaseFile::GetError() const
{
	return FlCall(GetError) ();
}

void BaseFile::SetError(FILEERROR error)
{
	FlCall(SetError) (error);
}

Bool BaseFile::ReadChar (Char* v)
{
	return FlCall(ReadChar) (v);
}

Bool BaseFile::ReadUChar(UChar* v)
{
	return FlCall(ReadUChar) (v);
}

Bool BaseFile::ReadInt16 (Int16* v)
{
	return FlCall(ReadInt16) (v);
}

Bool BaseFile::ReadUInt16(UInt16* v)
{
	return FlCall(ReadUInt16) (v);
}

Bool BaseFile::ReadInt32 (Int32* v)
{
	return FlCall(ReadInt32) (v);
}

Bool BaseFile::ReadUInt32(UInt32* v)
{
	return FlCall(ReadUInt32) (v);
}

Bool BaseFile::ReadInt64(Int64* v)
{
	return FlCall(ReadInt64) (v);
}

Bool BaseFile::ReadUInt64(UInt64* v)
{
	return FlCall(ReadUInt64) (v);
}

Bool BaseFile::ReadFloat64(Float64* v)
{
	return FlCall(ReadFloat64) (v);
}

Bool BaseFile::ReadFloat32(Float32* v)
{
	return FlCall(ReadFloat32) (v);
}

Bool BaseFile::ReadVector32(Vector32* v)
{
	return ReadFloat32(&v->x) && ReadFloat32(&v->y) && ReadFloat32(&v->z);
}

Bool BaseFile::WriteVector32(const Vector32& v)
{
	return WriteFloat32(v.x) && WriteFloat32(v.y) && WriteFloat32(v.z);
}

Bool BaseFile::ReadVector64(Vector64* v)
{
	return ReadFloat64(&v->x) && ReadFloat64(&v->y) && ReadFloat64(&v->z);
}

Bool BaseFile::WriteVector64(const Vector64& v)
{
	return WriteFloat64(v.x) && WriteFloat64(v.y) && WriteFloat64(v.z);
}

Bool BaseFile::ReadMatrix32(Matrix32* v)
{
	return ReadVector32(&v->off) && ReadVector32(&v->v1) && ReadVector32(&v->v2) && ReadVector32(&v->v3);
}

Bool BaseFile::WriteMatrix32(const Matrix32& v)
{
	return WriteVector32(v.off) && WriteVector32(v.v1) && WriteVector32(v.v2) && WriteVector32(v.v3);
}

Bool BaseFile::ReadMatrix64(Matrix64* v)
{
	return ReadVector64(&v->off) && ReadVector64(&v->v1) && ReadVector64(&v->v2) && ReadVector64(&v->v3);
}

Bool BaseFile::WriteMatrix64(const Matrix64& v)
{
	return WriteVector64(v.off) && WriteVector64(v.v1) && WriteVector64(v.v2) && WriteVector64(v.v3);
}

Bool BaseFile::ReadString(String* v)
{
	Int32 len = 0;
	Char* c = nullptr;

	if (!ReadInt32(&len))
		return false;
	if (!len)
	{
		*v = String(); return true;
	}

	c = NewMemClear(Char, len);
	if (!c)
	{
		SetError(FILEERROR_OUTOFMEMORY);
		return false;
	}
	if (!ReadBytes(c, len))
	{
		DeleteMem(c);
		return false;
	}

	v->SetCString(c, len - 1);
	DeleteMem(c);

	return true;
}

Bool BaseFile::ReadFilename(Filename* v)
{
	String str;
	if (!ReadString(&str))
		return false;
	v->SetString(str);
	return true;
}

Bool BaseFile::ReadBool(Bool* v)
{
	Char c;
	if (!ReadChar(&c))
		return false;
	*v = c != 0;
	return true;
}

Bool BaseFile::WriteBool(Bool v)
{
	return WriteChar(Char(v != 0));
}

Bool BaseFile::WriteString(const String& v)
{
	Bool	ok;
	Int32 len = v.GetCStringLen() + 1;
	Char* mem = NewMemClear(Char, len);
	if (!mem)
	{
		SetError(FILEERROR_OUTOFMEMORY);
		return false;
	}

	v.GetCString(mem, len);
	ok = WriteInt32(len) && WriteBytes(mem, len);
	DeleteMem(mem);

	return ok;
}

Bool BaseFile::WriteFilename(const Filename& v)
{
	return WriteString(v.GetString());
}

Bool BaseFile::WriteChar (Char v)
{
	return FlCall(WriteChar) (v);
}

Bool BaseFile::WriteUChar(UChar v)
{
	return FlCall(WriteUChar) (v);
}

Bool BaseFile::WriteInt16 (Int16 v)
{
	return FlCall(WriteInt16) (v);
}

Bool BaseFile::WriteUInt16(UInt16 v)
{
	return FlCall(WriteUInt16) (v);
}

Bool BaseFile::WriteInt32 (Int32 v)
{
	return FlCall(WriteInt32) (v);
}

Bool BaseFile::WriteInt64(Int64 v)
{
	return FlCall(WriteInt64) (v);
}

Bool BaseFile::WriteUInt32(UInt32 v)
{
	return FlCall(WriteUInt32) (v);
}

Bool BaseFile::WriteUInt64(UInt64 v)
{
	return FlCall(WriteUInt64) (v);
}

Bool BaseFile::WriteFloat64(Float64 v)
{
	return FlCall(WriteFloat64) (v);
}

Bool BaseFile::WriteFloat32(Float32 v)
{
	return FlCall(WriteFloat32) (v);
}


AESFile* AESFile::Alloc(void)
{
	return C4DOS.Fl->AESAlloc();
}

void AESFile::Free(AESFile*& fl)
{
	C4DOS.Fl->Free((BaseFile*)fl);
	fl = nullptr;
}

Bool AESFile::Open(const Filename& name, const char* key, Int32 keylen, Int32 blocksize, UInt32 aes_flags, FILEOPEN mode, FILEDIALOG error_dialog, BYTEORDER order, Int32 type, Int32 creator)
{
	return FlCall(AESOpen) (name, key, keylen, blocksize, aes_flags, mode, error_dialog, order, type, creator);
}

Bool AESFile::CheckEncryption(const Filename& encrypt, const Filename& decrypt, const char* key, Int32 keylen, Int32 blocksize)
{
	return C4DOS.Fl->AESCheckEncryption(encrypt, decrypt, key, keylen, blocksize);
}

BrowseVolumes* BrowseVolumes::Alloc()
{
	return C4DOS.Bf->BvAlloc();
}

void BrowseVolumes::Init(void)
{
	(this->*C4DOS.Bf->BvInit)();
}

void BrowseVolumes::Free(BrowseVolumes*& bf)
{
	C4DOS.Bf->BvFree(bf);
	bf = nullptr;
}

Bool BrowseVolumes::GetNext(void)
{
	return (this->*C4DOS.Bf->BvGetNext)();
}

Filename BrowseVolumes::GetFilename(void)
{
	return (this->*C4DOS.Bf->BvGetFilename)();
}

String BrowseVolumes::GetVolumeName(Int32* out_flags)
{
	return (this->*C4DOS.Bf->BvGetVolumeName)(out_flags);
}

BrowseFiles* BrowseFiles::Alloc()
{
	return C4DOS.Bf->Alloc(nullptr, 0);
}

void BrowseFiles::Init(const Filename& directory, Int32 flags)
{
	C4DOS.Bf->Init(this, &directory, flags);
}

void BrowseFiles::Free(BrowseFiles*& bf)
{
	C4DOS.Bf->Free(bf);
	bf = nullptr;
}

Bool BrowseFiles::GetNext(void)
{
	return (this->*C4DOS.Bf->GetNext)();
}

Int64 BrowseFiles::GetSize(void)
{
	return (this->*C4DOS.Bf->GetSize)();
}

Bool BrowseFiles::IsDir(void)
{
	return (this->*C4DOS.Bf->IsDir)();
}

Bool BrowseFiles::IsHidden(void)
{
	return (this->*C4DOS.Bf->IsHidden)();
}

Bool BrowseFiles::IsReadOnly(void)
{
	return (this->*C4DOS.Bf->IsReadOnly)();
}

Bool BrowseFiles::IsBundle(void)
{
	return (this->*C4DOS.Bf->IsBundle)();
}

void BrowseFiles::GetFileTime(Int32 mode, LocalFileTime* out)
{
	(this->*C4DOS.Bf->GetFileTime)(mode, out);
}

Filename BrowseFiles::GetFilename(void)
{
	return (this->*C4DOS.Bf->GetFilename)();
}

Bool GeGetFileTime(const Filename& name, Int32 mode, LocalFileTime* out)
{
	return C4DOS.Ge->GetFileTime(name, mode, out);
}

Bool GeSetFileTime(const Filename& name, Int32 mode, const LocalFileTime* in)
{
	return C4DOS.Ge->SetFileTime(name, mode, in);
}

void GeGetCurrentTime(LocalFileTime* out)
{
	C4DOS.Ge->GetCurrentTime(out);
}

Bool GeFExist(const Filename& name, Bool isdir)
{
	return C4DOS.Ge->FExist(&name, isdir);
}

Bool GeSearchFile(const Filename& directory, const Filename& name, Filename* found)
{
	return C4DOS.Ge->SearchFile(&directory, &name, found);
}

Bool GeFKill(const Filename& name, Int32 flags)
{
	return C4DOS.Ge->FKill(&name, flags);
}

Bool GeFCopyFile(const Filename& source, const Filename& dest, Int32 flags)
{
	return C4DOS.Ge->FCopyFile(&source, &dest, flags);
}

Bool GeFRename(const Filename& source, const Filename& dest)
{
	return C4DOS.Ge->FRename(&source, &dest);
}

Bool GeFMove(const Filename& source, const Filename& dest)
{
	return C4DOS.Ge->FMove(source, dest);
}

Bool GeFCreateDir(const Filename& name)
{
	return C4DOS.Ge->FCreateDir(&name);
}

Bool GeFCreateDirRec(const Filename& fn)
{
	Filename parent = fn.GetDirectory();

	if (!parent.Content())
		return false;

	if (!GeFExist(parent, true))
	{
		if (!GeFCreateDirRec(parent))
			return false;
	}

	if (!GeFExist(fn, true))
	{
		if (!GeFCreateDir(fn))
		{
			return false;
		}
	}
	return true;
}

Bool GeExecuteFile(const Filename& path)
{
	return C4DOS.Ge->ExecuteFile(&path);
}

Bool GeExecuteProgram(const Filename& program, const Filename& img)
{
	return C4DOS.Ge->ExecuteProgram(&program, &img);
}

Bool GeExecuteProgramEx(const Filename& program, const String* args, Int32 argcnt, GeExecuteProgramExCallback callback, void* userdata)
{
	return C4DOS.Ge->GeExecuteProgramEx(program, args, argcnt, callback, userdata);
}

Bool GeFGetDiskFreeSpace(const Filename& vol, UInt64& freecaller, UInt64& total, UInt64& freespace)
{
	return C4DOS.Ge->GeFGetDiskFreeSpace(vol, freecaller, total, freespace);
}

UInt32 GeFGetAttributes(const Filename& name)
{
	return C4DOS.Ge->GeFGetAttributes(&name);
}

Bool GeFSetAttributes(const Filename& name, UInt32 flags, UInt32 mask)
{
	return C4DOS.Ge->GeFSetAttributes(&name, flags, mask);
}

const Filename GeGetStartupPath(void)
{
	return C4DOS.Ge->GetStartupPath();
}

const Filename GeGetStartupApplication(void)
{
	return C4DOS.Ge->GetStartupApplication();
}

Bool RequestFileFromServer(const Filename& fn, Filename& res)
{
	return C4DOS.Ge->RequestFileFromServer(fn, res);
}

const Filename GeGetPluginPath(void)
{
	extern Filename* path_storage;

	return path_storage ? path_storage->GetDirectory() : Filename();
}

const Filename GeGetC4DPath(Int32 whichpath)
{
	return C4DOS.Ge->GetC4DPath(whichpath);
}

const Filename GeGetStartupWritePath(void)
{
	return GeGetC4DPath(C4D_PATH_STARTUPWRITE);
}

Bool FileMonitor::WatchFolder(const Filename& folder, FileMonitorCallback callback, void* userdata)
{
	return C4DOS.Ge->WatchFolder(folder, callback, userdata);
}

Bool FileMonitor::DontWatchFolder(const Filename& folder, FileMonitorCallback callback, void* userdata)
{
	return C4DOS.Ge->DontWatchFolder(folder, callback, userdata);
};

Bool FileMonitor::WatchFile(const Filename& file, FileMonitorCallback callback, void* userdata)
{
	return C4DOS.Ge->WatchFile(file, callback, userdata);
}

Bool FileMonitor::DontWatchFile(const Filename& file, FileMonitorCallback callback, void* userdata)
{
	return C4DOS.Ge->DontWatchFile(file, callback, userdata);
};

HyperFile* HyperFile::Alloc(void)
{
	return C4DOS.Hf->AllocHF();
}

void HyperFile::Free(HyperFile*& fl)
{
	C4DOS.Hf->FreeHF(fl);
	fl = nullptr;
}

Bool HyperFile::Open(Int32 ident, const Filename& filename, FILEOPEN mode, FILEDIALOG error_mode)
{
	return HfCall(Open) (ident, filename, mode, error_mode);
}

Bool HyperFile::Close()
{
	return HfCall(Close) ();
}

BaseDocument* HyperFile::GetDocument() const
{
	return HfCall(GetDocument) ();
}

Bool HyperFile::ReadChar (Char* v)
{
	return HfCall(ReadChar) (v);
}

Bool HyperFile::ReadUChar(UChar* v)
{
	return HfCall(ReadUChar) (v);
}

Bool HyperFile::ReadInt16 (Int16* v)
{
	return HfCall(ReadInt16) (v);
}

Bool HyperFile::ReadUInt16(UInt16* v)
{
	return HfCall(ReadUInt16) (v);
}

Bool HyperFile::ReadInt32 (Int32* v)
{
	return HfCall(ReadInt32) (v);
}

Bool HyperFile::ReadUInt32(UInt32* v)
{
	return HfCall(ReadUInt32) (v);
}

Bool HyperFile::ReadInt64(Int64* v)
{
	return HfCall(ReadInt64) (v);
}

Bool HyperFile::ReadUInt64(UInt64* v)
{
	return HfCall(ReadUInt64) (v);
}

Bool HyperFile::ReadFloat (Float* v)
{
	return HfCall(ReadFloat) (v);
}

Bool HyperFile::ReadFloat64(Float64* v)
{
	return HfCall(ReadFloat64) (v);
}

Bool HyperFile::ReadFloat32(Float32* v)
{
	return HfCall(ReadFloat32) (v);
}

Bool HyperFile::ReadBool(Bool* v)
{
	return HfCall(ReadBool) (v);
}

Bool HyperFile::ReadTime(BaseTime* v)
{
	return HfCall(ReadTime) (v);
}

Bool HyperFile::ReadVector(Vector* v)
{
	return HfCall(ReadVector) (v);
}

Bool HyperFile::ReadVector64(Vector64* v)
{
	return HfCall(ReadVector64) (v);
}

Bool HyperFile::ReadVector32(Vector32* v)
{
	return HfCall(ReadVector32) (v);
}

Bool HyperFile::ReadMatrix(Matrix* v)
{
	return HfCall(ReadMatrix) (v);
}

Bool HyperFile::ReadMatrix64(Matrix64* v)
{
	return HfCall(ReadMatrix64) (v);
}

Bool HyperFile::ReadMatrix32(Matrix32* v)
{
	return HfCall(ReadMatrix32) (v);
}

Bool HyperFile::ReadString(String* v)
{
	return HfCall(ReadString) (v);
}

Bool HyperFile::ReadFilename(Filename* v)
{
	return HfCall(ReadFilename) (v);
}

Bool HyperFile::ReadGeData(GeData* v)
{
	return C4DOS.Hf->ReadGeData(this, *v);
}

Bool HyperFile::ReadUuid(C4DUuid* v)
{
	return HfCall(ReadUuid) (v);
}

Bool HyperFile::ReadContainer(BaseContainer* v, Bool flush)
{
	return HfCall(ReadContainer) (v, flush);
}

Bool HyperFile::ReadMemory(void** data, Int* size)
{
	return HfCall(ReadMemory) (data, size);
}

Bool HyperFile::ReadImage(BaseBitmap* v)
{
	return HfCall(ReadImage) (v);
}

Bool HyperFile::ReadChannel(BaseChannel* bc)
{
	return bc && C4DOS.Ba->ReadData(this, bc);
}

Bool HyperFile::ReadChannelConvert(GeListNode* node, Int32 link_id)
{
	return C4DOS.Ba->ReadDataConvert(node, link_id, this);
}

Bool HyperFile::WriteChannel(BaseChannel* bc)
{
	if (!bc)
		return false;
	C4DOS.Ba->WriteData(this, bc);
	return true;
}

Bool HyperFile::WriteChar (Char v)
{
	return HfCall(WriteChar) (v);
}

Bool HyperFile::WriteUChar(UChar v)
{
	return HfCall(WriteUChar) (v);
}

Bool HyperFile::WriteInt16 (Int16 v)
{
	return HfCall(WriteInt16) (v);
}

Bool HyperFile::WriteUInt16(UInt16 v)
{
	return HfCall(WriteUInt16) (v);
}

Bool HyperFile::WriteInt32 (Int32 v)
{
	return HfCall(WriteInt32) (v);
}

Bool HyperFile::WriteUInt32(UInt32 v)
{
	return HfCall(WriteUInt32) (v);
}

Bool HyperFile::WriteInt64(Int64 v)
{
	return HfCall(WriteInt64) (v);
}

Bool HyperFile::WriteUInt64(UInt64 v)
{
	return HfCall(WriteUInt64) (v);
}

Bool HyperFile::WriteFloat(Float v)
{
	return HfCall(WriteFloat) (v);
}

Bool HyperFile::WriteFloat32(Float32 v)
{
	return HfCall(WriteFloat32) (v);
}

Bool HyperFile::WriteFloat64(Float64 v)
{
	return HfCall(WriteFloat64) (v);
}

Bool HyperFile::WriteBool(Bool v)
{
	return HfCall(WriteBool) (v);
}

Bool HyperFile::WriteTime(const BaseTime& v)
{
	return HfCall(WriteTime) (v);
}

Bool HyperFile::WriteVector(const Vector& v)
{
	return HfCall(WriteVector) (v);
}

Bool HyperFile::WriteVector32(const Vector32& v)
{
	return HfCall(WriteVector32) (v);
}

Bool HyperFile::WriteVector64(const Vector64& v)
{
	return HfCall(WriteVector64) (v);
}

Bool HyperFile::WriteMatrix(const Matrix& v)
{
	return HfCall(WriteMatrix) (v);
}

Bool HyperFile::WriteMatrix32(const Matrix32& v)
{
	return HfCall(WriteMatrix32) (v);
}

Bool HyperFile::WriteMatrix64(const Matrix64& v)
{
	return HfCall(WriteMatrix64) (v);
}

Bool HyperFile::WriteString(const String& v)
{
	return HfCall(WriteString) (v);
}

Bool HyperFile::WriteFilename(const Filename& v)
{
	return HfCall(WriteFilename) (v);
}

Bool HyperFile::WriteImage(BaseBitmap* v, Int32 format, BaseContainer* data, SAVEBIT savebits)
{
	return HfCall(WriteImage) (v, format, data, savebits);
}

Bool HyperFile::WriteContainer(const BaseContainer& v)
{
	return HfCall(WriteContainer) (v);
}

Bool HyperFile::WriteGeData(const GeData& v)
{
	return C4DOS.Hf->WriteGeData(this, v);
}

Bool HyperFile::WriteUuid(const C4DUuid& v)
{
	return HfCall(WriteUuid) (v);
}

Bool HyperFile::WriteArray(const void* data, HYPERFILEARRAY datatype, Int32 structure_increment, Int32 count)
{
	return HfCall(WriteArray) (data, datatype, structure_increment, count);
}

Bool HyperFile::ReadArray(void* data, HYPERFILEARRAY datatype, Int32 structure_increment, Int32 count)
{
	return HfCall(ReadArray) (data, datatype, structure_increment, count);
}

Bool HyperFile::WriteMemory(const void* data, Int count)
{
	return HfCall(WriteMemory) (data, count);
}

FILEERROR HyperFile::GetError() const
{
	return HfCall(GetError) ();
}

void HyperFile::SetError(FILEERROR err)
{
	HfCall(SetError) (err);
}

Bool HyperFile::ReadValueHeader(HYPERFILEVALUE* h)
{
	return HfCall(ReadValueHeader) (h);
}

Bool HyperFile::SkipValue(HYPERFILEVALUE h)
{
	return HfCall(SkipValue) (h);
}

Bool HyperFile::WriteChunkStart(Int32 id, Int32 level)
{
	return HfCall(WriteChunkStart) (id, level);
}

Bool HyperFile::WriteChunkEnd(void)
{
	return HfCall(WriteChunkEnd) ();
}

Bool HyperFile::ReadChunkStart(Int32* id, Int32* level)
{
	return HfCall(ReadChunkStart) (id, level);
}

Bool HyperFile::ReadChunkEnd(void)
{
	return HfCall(ReadChunkEnd) ();
}

LOCATION HyperFile::GetLocation(void) const
{
	return HfCall(GetLocation) ();
}

Bool HyperFile::SkipToEndChunk(void)
{
	return HfCall(SkipToEndChunk) ();
}

Int32 HyperFile::GetFileVersion() const
{
	return HfCall(GetFileVersion) ();
}

void HyperFile::SetFileVersion(Int32 val)
{
	return HfCall(SetFileVersion) (val);
}

FILEERROR ReadHyperFile(BaseDocument* doc, GeListNode* node, const Filename& filename, Int32 ident, String* warning_string)
{
	return C4DOS.Hf->ReadFile(doc, node, filename, ident, warning_string);
}

FILEERROR WriteHyperFile(BaseDocument* doc, GeListNode* node, const Filename& filename, Int32 ident)
{
	return C4DOS.Hf->WriteFile(doc, node, filename, ident);
}

String DateToString(const LocalFileTime& t, Bool date_only)
{
	return C4DOS.Ge->DateToString(t, date_only);
}

Bool ShowInFinder(const Filename& fn, Bool open)
{
	return C4DOS.Ge->ShowInFinder(fn, open);
}
