mirror of
https://github.com/gwdevhub/gMod.git
synced 2026-07-16 15:39:31 +00:00
uMod2 Alpha Version: known bugs: I disabled the remove device function inside the gui, because something in the event handling goes terrible wrong.
Implemented a some new features.
This commit is contained in:
+474
-159
@@ -20,11 +20,19 @@ along with Universal Modding Engine. If not, see <http://www.gnu.org/licenses/>
|
||||
#include "unzip.h"
|
||||
|
||||
|
||||
#ifdef __CDT_PARSER__
|
||||
#define FindZipItem(...) 0
|
||||
#define UnzipItem(...) 0
|
||||
#define CloseZip(...) 0
|
||||
#define GetZipItem(...) 0
|
||||
#endif
|
||||
|
||||
|
||||
uMod_File::uMod_File(void)
|
||||
{
|
||||
Loaded=false;
|
||||
XORed=false;
|
||||
FileInMemory=NULL;
|
||||
FileInMemory=(char*)0;
|
||||
MemoryLength=0u;
|
||||
FileLen=0u;
|
||||
}
|
||||
@@ -33,7 +41,7 @@ uMod_File::uMod_File(const wxString &file)
|
||||
{
|
||||
Loaded=false;
|
||||
XORed=false;
|
||||
FileInMemory=NULL;
|
||||
FileInMemory=(char*)0;
|
||||
MemoryLength=0u;
|
||||
FileLen=0u;
|
||||
SetFile(file);
|
||||
@@ -42,7 +50,7 @@ uMod_File::uMod_File(const wxString &file)
|
||||
|
||||
uMod_File::~uMod_File(void)
|
||||
{
|
||||
if (FileInMemory!=NULL) delete [] FileInMemory;
|
||||
if (FileInMemory!=(char*)0) delete [] FileInMemory;
|
||||
}
|
||||
|
||||
|
||||
@@ -57,6 +65,14 @@ bool uMod_File::FileSupported(void)
|
||||
}
|
||||
|
||||
|
||||
bool uMod_File::SingleFile(void)
|
||||
{
|
||||
wxString file_type = FileName.AfterLast( '.');
|
||||
if (file_type == L"dds") return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
int uMod_File::GetComment( wxString &tool_tip)
|
||||
{
|
||||
wxString file_type = FileName.AfterLast( '.');
|
||||
@@ -103,6 +119,32 @@ int uMod_File::GetContent( AddTextureClass &tex, bool add)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
int uMod_File::GetContent( uMod_TreeViewNode* node)
|
||||
{
|
||||
wxString file_type = FileName.AfterLast( '.');
|
||||
if (file_type == L"zip")
|
||||
{
|
||||
AddZip( node);
|
||||
}
|
||||
else if (file_type == L"tpf")
|
||||
{
|
||||
AddTpf( node);
|
||||
}
|
||||
else if (file_type == L"dds")
|
||||
{
|
||||
AddFile( node);
|
||||
}
|
||||
else
|
||||
{
|
||||
LastError << Language->Error_FileNotSupported;
|
||||
LastError << "\n" << FileName;
|
||||
}
|
||||
if (LastError.Len()>0) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int uMod_File::ReadFile(void)
|
||||
{
|
||||
@@ -118,9 +160,9 @@ int uMod_File::ReadFile(void)
|
||||
|
||||
if (FileLen>=MemoryLength)
|
||||
{
|
||||
if (FileInMemory!=NULL) delete [] FileInMemory;
|
||||
if (FileInMemory!=(char*)0) delete [] FileInMemory;
|
||||
try {FileInMemory = new char [FileLen+1];}
|
||||
catch (...) {FileInMemory=NULL; MemoryLength=0; FileLen=0; LastError << Language->Error_Memory; return -1;}
|
||||
catch (...) {FileInMemory=(char*)0; MemoryLength=0; FileLen=0; LastError << Language->Error_Memory; return -1;}
|
||||
MemoryLength = FileLen+1;
|
||||
}
|
||||
unsigned int result = dat.Read( FileInMemory, FileLen);
|
||||
@@ -178,103 +220,244 @@ int uMod_File::UnXOR(void)
|
||||
|
||||
|
||||
|
||||
int uMod_File::GetCommentZip( wxString &tool_tip)
|
||||
/*
|
||||
int uMod_File::AddFile( uMod_TreeViewNode* node)
|
||||
{
|
||||
DWORD64 temp_hash;
|
||||
|
||||
wxString name = FileName.AfterLast( '_');
|
||||
name = name.BeforeLast( '.');
|
||||
if (!name.ToULongLong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\n" << FileName << "\n"; return -1;} // return if hash could not be extracted
|
||||
|
||||
if (int ret = ReadFile()) return ret;
|
||||
|
||||
HZIP ZIP_Handle = OpenZip( FileInMemory, FileLen, NULL);
|
||||
if (ZIP_Handle==NULL) {tool_tip = Language->NoComment; LastError << Language->Error_Unzip; return -1;}
|
||||
uMod_TextureElement *texture = new uMod_TextureElement();
|
||||
|
||||
ZIPENTRY ze;
|
||||
int index;
|
||||
FindZipItem( ZIP_Handle, L"Comment.txt", false, &index, &ze);
|
||||
if (index>=0) //if Comment.txt is present in the zip file
|
||||
if (texture->Content().SetSize(FileLen))
|
||||
{
|
||||
char* comment;
|
||||
int len = ze.unc_size;
|
||||
try {comment=new char[len+1];}
|
||||
catch(...) {tool_tip = Language->NoComment; LastError << Language->Error_Memory; return -1;}
|
||||
ZRESULT zr = UnzipItem( ZIP_Handle, index, comment, len);
|
||||
|
||||
if (zr!=ZR_OK && zr!=ZR_MORE) {delete [] comment; tool_tip = Language->NoComment; LastError << Language->Error_Unzip <<"\nZIP:" << L"Comment.txt"; return -1;}
|
||||
comment[len]=0;
|
||||
tool_tip = comment;
|
||||
delete [] comment;
|
||||
LastError << Language->Error_Memory;
|
||||
texture->Release();
|
||||
return -1;
|
||||
}
|
||||
else tool_tip = Language->NoComment;
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
CloseZip(ZIP_Handle);
|
||||
for (unsigned int i=0; i<FileLen; i++) data[i] = FileInMemory[i];
|
||||
|
||||
texture->Hash() = temp_hash;
|
||||
texture->Title() = FileName;
|
||||
texture->Status() = uMod_TextureElement::Activate;
|
||||
|
||||
uMod_ModElement *element = new uMod_ModElement(uMod_ModElement::Group, uMod_ModElement::NONE);
|
||||
element->Title() = FileName;
|
||||
node = new uMod_TreeViewNode( (uMod_TreeViewNode*)0, element);
|
||||
uMod_TreeViewNode *texture_node = new uMod_TreeViewNode( node, texture);
|
||||
node->Append(texture_node);
|
||||
|
||||
texture->Release();
|
||||
element->Release();
|
||||
return 0;
|
||||
}
|
||||
*/
|
||||
|
||||
int uMod_File::AddFile( uMod_TreeViewNode* node)
|
||||
{
|
||||
DWORD64 temp_hash;
|
||||
|
||||
wxString name = FileName.AfterLast( '_');
|
||||
name = name.BeforeLast( '.');
|
||||
if (!name.ToULongLong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\n" << FileName << "\n"; return -1;} // return if hash could not be extracted
|
||||
|
||||
if (int ret = ReadFile()) return ret;
|
||||
|
||||
uMod_TextureElement *texture = new uMod_TextureElement();
|
||||
|
||||
if (texture->Content().SetSize(FileLen))
|
||||
{
|
||||
LastError << Language->Error_Memory;
|
||||
texture->Release();
|
||||
return -1;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
for (unsigned int i=0; i<FileLen; i++) data[i] = FileInMemory[i];
|
||||
|
||||
texture->Hash() = temp_hash;
|
||||
texture->File() = FileName;
|
||||
texture->Status() = uMod_TextureElement::Activate;
|
||||
|
||||
|
||||
uMod_TreeViewNode *texture_node = new uMod_TreeViewNode( node, texture);
|
||||
node->Append(texture_node);
|
||||
|
||||
texture->Release();
|
||||
return 0;
|
||||
}
|
||||
|
||||
int uMod_File::GetCommentTpf( wxString &tool_tip)
|
||||
|
||||
int uMod_File::GetContentTemplate(const wxString &content, uMod_TreeViewNode* node)
|
||||
{
|
||||
uMod_TreeViewNode_ArrayPtr list_node;
|
||||
|
||||
if (uMod_TreeViewModel::String2Node( content, node, &list_node))
|
||||
{
|
||||
LastError << uMod_TreeViewModel::LastError << "\n" << FileName << "\n";
|
||||
uMod_TreeViewModel::LastError.Empty();
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (node->myElement->File().IsEmpty())
|
||||
return GetContentTemplate_SF( list_node, node);
|
||||
else
|
||||
return GetContentTemplate_ZIP( list_node, node);
|
||||
}
|
||||
|
||||
int uMod_File::GetContentTemplate_ZIP( const uMod_TreeViewNode_ArrayPtr &list_node, uMod_TreeViewNode* node)
|
||||
{
|
||||
SetFile(node->myElement->File());
|
||||
if (!FileSupported())
|
||||
{
|
||||
LastError << Language->Error_FileNotSupported <<"\n" << FileName;
|
||||
return -1;
|
||||
}
|
||||
if (int ret = ReadFile()) return ret;
|
||||
wxString file_type = FileName.AfterLast( '.');
|
||||
bool tpf = false;
|
||||
if (file_type == L"tpf")
|
||||
{
|
||||
tpf = true;
|
||||
UnXOR();
|
||||
}
|
||||
|
||||
const char pw[] = {0x73, 0x2A, 0x63, 0x7D, 0x5F, 0x0A, 0xA6, 0xBD,
|
||||
0x7D, 0x65, 0x7E, 0x67, 0x61, 0x2A, 0x7F, 0x7F,
|
||||
0x74, 0x61, 0x67, 0x5B, 0x60, 0x70, 0x45, 0x74,
|
||||
0x5C, 0x22, 0x74, 0x5D, 0x6E, 0x6A, 0x73, 0x41,
|
||||
0x77, 0x6E, 0x46, 0x47, 0x77, 0x49, 0x0C, 0x4B,
|
||||
0x46, 0x6F, '\0'};
|
||||
|
||||
ZIPENTRY ze;
|
||||
int index = -1;
|
||||
HZIP ZIP_Handle;
|
||||
if (tpf) ZIP_Handle= OpenZip( FileInMemory, FileLen, pw);
|
||||
else ZIP_Handle= OpenZip( FileInMemory, FileLen, (const char*)0);
|
||||
|
||||
if (ZIP_Handle==(HZIP)0)
|
||||
{
|
||||
LastError << Language->Error_Unzip <<"\n" << FileName;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (unsigned int i=0; i<list_node.GetCount(); i++)
|
||||
{
|
||||
if (list_node[i]->myElement->Type() == uMod_ModElement::Texture)
|
||||
{
|
||||
uMod_TextureElement *texture = (uMod_TextureElement*) list_node[i]->myElement;
|
||||
|
||||
wxString file = texture->File();
|
||||
while ( (file[0]=='.' && (file[1]=='/' || file[1]=='\\')) || file[0]=='/' || file[0]=='\\') file.Remove(0,1);
|
||||
|
||||
FindZipItem( ZIP_Handle, file.wc_str(), false, &index, &ze); // look for texture
|
||||
if (index>=0)
|
||||
{
|
||||
if (texture->Content().SetSize(ze.unc_size))
|
||||
{
|
||||
texture->Comment() = Language->Error_Memory;
|
||||
continue;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, index, data, ze.unc_size);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
{
|
||||
texture->Content().SetSize(0);
|
||||
texture->Comment() = Language->Error_Unzip;
|
||||
texture->Comment() <<" : " << FileName << " ==>> " << file;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
texture->Content().SetSize(0);
|
||||
texture->Comment() = Language->Error_Unzip;
|
||||
texture->Comment() << " : " << FileName << " -> " << file;
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
if (tpf) ZIP_Handle= OpenZip( FileInMemory, FileLen, pw);
|
||||
else ZIP_Handle= OpenZip( FileInMemory, FileLen, (const char*)0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CloseZip(ZIP_Handle);
|
||||
if (node->myChildren.GetCount()==0)
|
||||
{
|
||||
LastError << Language->Error_FileIsEmpty << FileName << "\n";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int uMod_File::GetContentTemplate_SF( const uMod_TreeViewNode_ArrayPtr &list_node, uMod_TreeViewNode* node)
|
||||
{
|
||||
DWORD64 temp_hash;
|
||||
wxString name;
|
||||
|
||||
for (unsigned int i=0; i<list_node.GetCount(); i++)
|
||||
{
|
||||
if (list_node[i]->myElement->Type() != uMod_ModElement::Texture) continue;
|
||||
|
||||
uMod_TextureElement *texture = (uMod_TextureElement*) list_node[i]->myElement;
|
||||
|
||||
SetFile( texture->File());
|
||||
if (int ret = ReadFile())
|
||||
{
|
||||
texture->Comment() = Language->Error_FileRead;
|
||||
texture->Comment() << " : " << texture->File();
|
||||
continue;
|
||||
}
|
||||
|
||||
if (texture->Content().SetSize(FileLen))
|
||||
{
|
||||
texture->Comment() = Language->Error_Memory;
|
||||
texture->Comment() << " : " << texture->File();
|
||||
continue;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
for (unsigned int i=0; i<FileLen; i++) data[i] = FileInMemory[i];
|
||||
|
||||
texture->Hash() = temp_hash;
|
||||
texture->Status() = uMod_TextureElement::Activate;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int uMod_File::AddZip( uMod_TreeViewNode* node)
|
||||
{
|
||||
if (int ret = ReadFile()) return ret;
|
||||
return AddContent( (char*)0, node);
|
||||
}
|
||||
|
||||
int uMod_File::AddTpf( uMod_TreeViewNode* node)
|
||||
{
|
||||
if (int ret = ReadFile()) return ret;
|
||||
|
||||
UnXOR();
|
||||
tool_tip = &FileInMemory[FileLen];
|
||||
tool_tip.Prepend( Language->Author);
|
||||
return 0;
|
||||
|
||||
const char pw[] = {0x73, 0x2A, 0x63, 0x7D, 0x5F, 0x0A, 0xA6, 0xBD,
|
||||
0x7D, 0x65, 0x7E, 0x67, 0x61, 0x2A, 0x7F, 0x7F,
|
||||
0x74, 0x61, 0x67, 0x5B, 0x60, 0x70, 0x45, 0x74,
|
||||
0x5C, 0x22, 0x74, 0x5D, 0x6E, 0x6A, 0x73, 0x41,
|
||||
0x77, 0x6E, 0x46, 0x47, 0x77, 0x49, 0x0C, 0x4B,
|
||||
0x46, 0x6F, '\0'};
|
||||
|
||||
return AddContent( pw, node);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
int uMod_File::AddFile( AddTextureClass &tex, bool add)
|
||||
{
|
||||
tex.SetSize(1);
|
||||
unsigned long temp_hash;
|
||||
|
||||
wxString name = FileName.AfterLast( '_');
|
||||
name = name.BeforeLast( '.');
|
||||
if (!name.ToULong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\n" << FileName << "\n"; return -1;} // return if hash could not be extracted
|
||||
|
||||
if (add)
|
||||
{
|
||||
if (int ret = ReadFile()) return ret;
|
||||
|
||||
try {tex.Textures[0] = new char[FileLen];}
|
||||
catch (...) {tex.Textures[0]=NULL; LastError << Language->Error_Memory; return -1;}
|
||||
for (unsigned int i=0; i<FileLen; i++) tex.Textures[0][i] = FileInMemory[i];
|
||||
tex.Size[0] = FileLen;
|
||||
}
|
||||
else {tex.Size[0] = 0; tex.Textures[0] = NULL;}
|
||||
|
||||
tex.Num = 1;
|
||||
tex.Hash[0] = temp_hash;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int uMod_File::AddZip( AddTextureClass &tex, bool add, bool tpf)
|
||||
{
|
||||
if (int ret = ReadFile()) return ret;
|
||||
|
||||
if (tpf)
|
||||
{
|
||||
UnXOR();
|
||||
|
||||
const char pw[] = {0x73, 0x2A, 0x63, 0x7D, 0x5F, 0x0A, 0xA6, 0xBD,
|
||||
0x7D, 0x65, 0x7E, 0x67, 0x61, 0x2A, 0x7F, 0x7F,
|
||||
0x74, 0x61, 0x67, 0x5B, 0x60, 0x70, 0x45, 0x74,
|
||||
0x5C, 0x22, 0x74, 0x5D, 0x6E, 0x6A, 0x73, 0x41,
|
||||
0x77, 0x6E, 0x46, 0x47, 0x77, 0x49, 0x0C, 0x4B,
|
||||
0x46, 0x6F, '\0'};
|
||||
|
||||
return AddContent( pw, tex, add);
|
||||
}
|
||||
else
|
||||
{
|
||||
return AddContent( NULL, tex, add);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int uMod_File::AddContent( const char* pw, AddTextureClass &tex, bool add)
|
||||
int uMod_File::AddContent( const char* pw, uMod_TreeViewNode* node)
|
||||
{
|
||||
// Thats is really nasty code, but atm I am happy that it works. I should try an other unzip api,
|
||||
// This one seems to behave very strange.
|
||||
@@ -288,7 +471,9 @@ int uMod_File::AddContent( const char* pw, AddTextureClass &tex, bool add)
|
||||
//
|
||||
|
||||
HZIP ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
if (ZIP_Handle==NULL) {LastError << Language->Error_Unzip; return -1;}
|
||||
if (ZIP_Handle==(HZIP)0) {LastError << Language->Error_Unzip; return -1;}
|
||||
|
||||
node->myElement->File() = FileName;
|
||||
|
||||
ZIPENTRY ze;
|
||||
int index;
|
||||
@@ -308,11 +493,7 @@ int uMod_File::AddContent( const char* pw, AddTextureClass &tex, bool add)
|
||||
|
||||
int num = token.CountTokens();
|
||||
|
||||
|
||||
tex.SetSize(num);
|
||||
|
||||
unsigned long temp_hash;
|
||||
int count = 0;
|
||||
DWORD64 temp_hash;
|
||||
wxString entry;
|
||||
wxString file;
|
||||
|
||||
@@ -320,122 +501,256 @@ int uMod_File::AddContent( const char* pw, AddTextureClass &tex, bool add)
|
||||
{
|
||||
entry = token.GetNextToken();
|
||||
file = entry.BeforeFirst( '|');
|
||||
if (!file.ToULong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\nTPF:" << entry << "\n"; continue;}
|
||||
if (!file.ToULongLong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\nTPF:" << entry << "\n"; continue;}
|
||||
|
||||
file = entry.AfterFirst( '|');
|
||||
file.Replace( "\r", "");
|
||||
|
||||
while ( (file[0]=='.' && (file[1]=='/' || file[1]=='\\')) || file[0]=='/' || file[0]=='\\') file.Remove(0,1);
|
||||
|
||||
if (add)
|
||||
FindZipItem( ZIP_Handle, file.wc_str(), false, &index, &ze); // look for texture
|
||||
if (index>=0)
|
||||
{
|
||||
FindZipItem( ZIP_Handle, file.wc_str(), false, &index, &ze); // look for texture
|
||||
if (index>=0)
|
||||
{
|
||||
try {tex.Textures[count] = new char[ze.unc_size];}
|
||||
catch(...)
|
||||
{
|
||||
tex.Textures[count] = NULL;
|
||||
LastError << Language->Error_Memory;
|
||||
continue;
|
||||
}
|
||||
uMod_TextureElement *texture = new uMod_TextureElement();
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, index, tex.Textures[count], ze.unc_size);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
{
|
||||
delete [] tex.Textures[count];
|
||||
LastError << Language->Error_Unzip <<"\nTPF:" << file << "\n";
|
||||
tex.Textures[count] = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
tex.Hash[count] = temp_hash;
|
||||
tex.Size[count] = ze.unc_size;
|
||||
count++;
|
||||
}
|
||||
if (texture->Content().SetSize(ze.unc_size))
|
||||
{
|
||||
LastError << Language->Error_Memory;
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, index, data, ze.unc_size);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
{
|
||||
texture->Release();
|
||||
LastError << Language->Error_Unzip <<"\nTPF:" << file << "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
LastError << Language->Error_Unzip <<"\nTPF:" << file << "\n";
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
texture->Hash() = temp_hash;
|
||||
texture->Title() = file;
|
||||
texture->File() = file;
|
||||
texture->Status() = uMod_TextureElement::Activate;
|
||||
|
||||
uMod_TreeViewNode *node_texture = new uMod_TreeViewNode( node, texture);
|
||||
node->Append(node_texture);
|
||||
texture->Release();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
tex.Hash[count] = temp_hash;
|
||||
tex.Size[count] = 0;
|
||||
count++;
|
||||
LastError << Language->Error_Unzip <<"\nTPF:" << file << "\n";
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
}
|
||||
}
|
||||
delete [] def;
|
||||
tex.Num = count;
|
||||
|
||||
wxString temp = &FileInMemory[FileLen];
|
||||
node->myElement->Author() = temp.BeforeFirst('\n');
|
||||
node->myElement->Author().Replace("\r", "", true);
|
||||
node->myElement->Author().Replace("\n", "", true);
|
||||
|
||||
node->myElement->Comment() = temp.AfterFirst('\n');
|
||||
node->myElement->Comment().Replace("\r\n", " ; ", true);
|
||||
node->myElement->Comment().Replace("\n", " ; ", true);
|
||||
|
||||
CloseZip(ZIP_Handle);
|
||||
|
||||
if (node->myChildren.GetCount()==0)
|
||||
{
|
||||
LastError << Language->Error_FileIsEmpty << FileName << "\n";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
else // texmod.def is not present in the zip file
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
if (ZIP_Handle==(HZIP)0) {LastError << Language->Error_Unzip; return -1;}
|
||||
FindZipItem( ZIP_Handle, L"content.txt", false, &index, &ze);
|
||||
|
||||
|
||||
|
||||
|
||||
if (index>=0) //if content.txt is present in the zip file
|
||||
{
|
||||
char* def;
|
||||
int len = ze.unc_size;
|
||||
try {def=new char[len+1];}
|
||||
catch(...) {LastError << Language->Error_Memory; return -1;}
|
||||
ZRESULT zr = UnzipItem( ZIP_Handle, index, def, len);
|
||||
|
||||
if (zr!=ZR_OK && zr!=ZR_MORE) {delete [] def; return -1;}
|
||||
def[len]=0;
|
||||
|
||||
wxString content = def;
|
||||
|
||||
uMod_TreeViewNode_ArrayPtr list_node;
|
||||
|
||||
if (uMod_TreeViewModel::String2Node( content, node, &list_node))
|
||||
{
|
||||
LastError << uMod_TreeViewModel::LastError << "\n" << FileName << "\n";
|
||||
uMod_TreeViewModel::LastError.Empty();
|
||||
return -1;
|
||||
}
|
||||
|
||||
// overwrite file information
|
||||
node->myElement->File() = FileName;
|
||||
|
||||
for (unsigned int i=0; i< list_node.GetCount(); i++)
|
||||
{
|
||||
if (list_node[i]->myElement->Type() == uMod_ModElement::Texture)
|
||||
{
|
||||
uMod_TextureElement *texture = (uMod_TextureElement*) list_node[i]->myElement;
|
||||
|
||||
wxString file = texture->File();
|
||||
while ( (file[0]=='.' && (file[1]=='/' || file[1]=='\\')) || file[0]=='/' || file[0]=='\\') file.Remove(0,1);
|
||||
|
||||
FindZipItem( ZIP_Handle, file.wc_str(), false, &index, &ze); // look for texture
|
||||
if (index>=0)
|
||||
{
|
||||
if (texture->Content().SetSize(ze.unc_size))
|
||||
{
|
||||
texture->Comment() = Language->Error_Memory;
|
||||
continue;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, index, data, ze.unc_size);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
{
|
||||
texture->Content().SetSize(0);
|
||||
texture->Comment() = Language->Error_Unzip;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
texture->Content().SetSize(0);
|
||||
texture->Comment() = Language->Error_Unzip;
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
CloseZip(ZIP_Handle);
|
||||
if (node->myChildren.GetCount()==0)
|
||||
{
|
||||
LastError << Language->Error_FileIsEmpty << FileName << "\n";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//we load each dds file
|
||||
{
|
||||
CloseZip(ZIP_Handle); //somehow we need to close and to reopen the zip handle, otherwise the program crashes
|
||||
ZIP_Handle = OpenZip( FileInMemory, FileLen, pw);
|
||||
if (ZIP_Handle==NULL) {LastError << Language->Error_Unzip; return -1;}
|
||||
if (ZIP_Handle==(HZIP)0) {LastError << Language->Error_Unzip; return -1;}
|
||||
wxString name;
|
||||
wxString file;
|
||||
GetZipItem( ZIP_Handle, -1, &ze); //ask for number of entries
|
||||
int num = ze.index;
|
||||
|
||||
tex.SetSize(num);
|
||||
int count = 0;
|
||||
unsigned long temp_hash;
|
||||
DWORD64 temp_hash;
|
||||
for (int i=0; i<num; i++)
|
||||
{
|
||||
if (GetZipItem( ZIP_Handle, i, &ze)!=ZR_OK) continue; //ask for name and size
|
||||
int len = ze.unc_size;
|
||||
|
||||
char *buffer;
|
||||
try {buffer = new char[len+1];}
|
||||
catch(...)
|
||||
uMod_TextureElement *texture = new uMod_TextureElement();
|
||||
|
||||
if (texture->Content().SetSize(ze.unc_size))
|
||||
{
|
||||
LastError << Language->Error_Memory;
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
char *data = texture->Content().Data();
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, i, data, len);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
{
|
||||
texture->Release();
|
||||
LastError << Language->Error_Unzip <<"\nZIP:" << FileName << "\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
ZRESULT rz = UnzipItem( ZIP_Handle, i, buffer, len);
|
||||
if (rz!=ZR_OK && rz!=ZR_MORE)
|
||||
file = ze.name;
|
||||
if (file.Len()==0)
|
||||
{
|
||||
delete [] buffer;
|
||||
buffer = NULL;
|
||||
LastError << Language->Error_Unzip <<"\nZIP:" << file << "\n";
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
|
||||
file = ze.name;
|
||||
if (file.Len()==0) continue;
|
||||
if (file == "Comment.txt") // load comment
|
||||
{
|
||||
char *buffer;
|
||||
try {buffer = new char [len+1];}
|
||||
catch (...)
|
||||
{
|
||||
LastError << Language->Error_Memory;
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
for (int i=0; i<len; i++) buffer[i] = data[i];
|
||||
buffer[len]=0;
|
||||
|
||||
node->myElement->Comment() = buffer;
|
||||
|
||||
node->myElement->Comment().Replace("\r\n", " ; ", true);
|
||||
node->myElement->Comment().Replace("\n", " ; ", true);
|
||||
|
||||
delete [] buffer;
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
|
||||
name = file.AfterLast( '.');
|
||||
if (name!="dds") continue; //if this is not texture file, continue
|
||||
if (name!="dds")
|
||||
{
|
||||
texture->Release();
|
||||
continue;
|
||||
}
|
||||
|
||||
name = file.AfterLast( '_');
|
||||
name = name.BeforeLast( '.');
|
||||
|
||||
if (!name.ToULong( &temp_hash, 16)) {LastError << Language->Error_Hash <<"\nZIP:" << file << "\n"; continue;} //if hash could not be extracted
|
||||
|
||||
if (add)
|
||||
if (!name.ToULongLong( &temp_hash, 16))
|
||||
{
|
||||
if (buffer==NULL) continue;
|
||||
texture->Release();
|
||||
LastError << Language->Error_Hash <<"\nZIP:" << file << "\n";
|
||||
continue;
|
||||
} //if hash could not be extracted
|
||||
|
||||
tex.Textures[count] = buffer;
|
||||
tex.Hash[count] = temp_hash;
|
||||
tex.Size[count] = len;//ze.unc_size;
|
||||
count++;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (buffer!=NULL) delete [] buffer;
|
||||
tex.Hash[count] = temp_hash;
|
||||
tex.Size[count] = 0;
|
||||
count++;
|
||||
}
|
||||
|
||||
texture->Hash() = temp_hash;
|
||||
texture->Title() = ze.name;
|
||||
texture->File() = ze.name;
|
||||
texture->Status() = uMod_TextureElement::Activate;
|
||||
|
||||
uMod_TreeViewNode *node_texture = new uMod_TreeViewNode( node, texture);
|
||||
node->Append(node_texture);
|
||||
texture->Release();
|
||||
}
|
||||
tex.Num = count;
|
||||
}
|
||||
|
||||
CloseZip(ZIP_Handle);
|
||||
CloseZip(ZIP_Handle);
|
||||
|
||||
if (node->myChildren.GetCount()==0)
|
||||
{
|
||||
LastError << Language->Error_FileIsEmpty << FileName << "\n";
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user