📄 themezip.cpp
字号:
}
//
// sanity checks
//
// check if we are done (header record all 0)
int ctr,sum;
for(ctr=sum=0; ctr<(int)sizeof(tar_record); ctr++)
sum+=TarRecord.charptr[ctr];
if(sum==0)
{
// empty record detected, bail out
fDone = TRUE;
break;
}
// check for magic
if(TarRecord.header.magic[7]!=0 || strcmp(TarRecord.header.magic,TMAGIC))
{
// nope, something not right
gzclose(pIn);
delete pBuffer;
CleanupThemeZip();
return kError_NoDataAvail;
}
// check if checksum is still OK
int our_sum = from_oct(6,TarRecord.header.chksum);
memcpy(TarRecord.header.chksum,CHKBLANKS,8);
for(ctr=sum=0;ctr<(int)sizeof(tar_record);ctr++)
sum+=TarRecord.charptr[ctr];
if(sum!=our_sum)
{
// checksum failed
gzclose(pIn);
delete pBuffer;
CleanupThemeZip();
return kError_NoDataAvail;
}
// check if we are dealing with file
if(TarRecord.header.typeflag == REGTYPE || TarRecord.header.typeflag == AREGTYPE)
{
// all fine, just proceed
;
}
else
{
if(TarRecord.header.typeflag == DIRTYPE && !fOneDirectory)
{
// will tolearate one directory
fOneDirectory = TRUE;
continue; // go on to next record
}
else
{
// ... but not many:
// this archive is likely not theme anyway!
gzclose(pIn);
delete pBuffer;
CleanupThemeZip();
return kError_NoDataAvail;
}
}
// ... sanity checks ok, proceed with file
//
// the unpacking itself
//
oUnpackFile = string(TarRecord.header.name);
// in case we have sub-directory in tar, take only filename
unsigned int uPos;
uPos=oUnpackFile.rfind('/');
if(uPos!=oUnpackFile.npos) oUnpackFile.erase(0,uPos+1);
// open output file
oFile = oDestPath + string(DIR_MARKER_STR) + oUnpackFile;
pOut = fopen(oFile.c_str(), "wb");
if (pOut == NULL)
{
gzclose(pIn);
delete pBuffer;
CleanupThemeZip();
return kError_FileNotFound;
}
m_oCreatedFiles.push_back(oFile);
iSize = from_oct(11,TarRecord.header.size);
iPadding = (iSize/512+1)*512-iSize;
// write it's data out
for(; iSize > 0;)
{
iBlock = min(iSize, iBufferSize);
iRead = gzread(pIn, pBuffer, iBlock);
if (iRead != iBlock)
{
gzclose(pIn);
fclose(pOut);
delete pBuffer;
CleanupThemeZip();
return kError_ReadFile;
}
iWrite = fwrite(pBuffer, 1, iBlock, pOut);
if (iWrite != iBlock)
{
gzclose(pIn);
fclose(pOut);
delete pBuffer;
CleanupThemeZip();
return kError_WriteFile;
}
iSize -= iBlock;
}
fclose(pOut);
if(iPadding)
{
gzseek(pIn, iPadding, SEEK_CUR);
}
}
// all went fine
delete pBuffer;
gzclose(pIn);
return kError_NoErr;
}
Error ThemeZip::GetDescriptiveName(const string &oSrcFile, string &oDescriptiveName)
{
gzFile pIn;
tar_record TarRecord;
int iSize, iPadding;
int fDone;
// sanity check
if (oSrcFile.length() == 0)
return kError_FileNotFound;
oDescriptiveName=string(""); // return at least empty string in any case
// open theme file
pIn = gzopen(oSrcFile.c_str(), "rb");
if (pIn == NULL)
return kError_FileNotFound;
//
// loop to find directory record (descriptive name, that is)
//
fDone = FALSE;
while(!fDone)
{
if (gzread(pIn, &TarRecord, sizeof(tar_record)) != sizeof(tar_record))
{
gzclose(pIn);
return kError_ReadFile;
}
//
// sanity checks
//
// check if we are done (header record all 0)
int ctr,sum;
for(ctr=sum=0; ctr<(int)sizeof(tar_record); ctr++)
sum+=TarRecord.charptr[ctr];
if(sum==0)
{
// empty record detected, bail out
fDone = TRUE;
break;
}
// check for magic
if(TarRecord.header.magic[7]!=0 || strcmp(TarRecord.header.magic,TMAGIC))
{
// nope, something not right
gzclose(pIn);
return kError_NoDataAvail;
}
// check if checksum is still OK
int our_sum = from_oct(6,TarRecord.header.chksum);
memcpy(TarRecord.header.chksum,CHKBLANKS,8);
for(ctr=sum=0;ctr<(int)sizeof(tar_record);ctr++)
sum+=TarRecord.charptr[ctr];
if(sum!=our_sum)
{
// checksum failed
gzclose(pIn);
return kError_NoDataAvail;
}
// see if it is directory record we are looking for
if(TarRecord.header.typeflag == DIRTYPE)
{
unsigned int uPos;
oDescriptiveName = string (TarRecord.header.name);
// erase trailing slash
uPos=oDescriptiveName.rfind('/');
if(uPos!=oDescriptiveName.npos) oDescriptiveName.erase(uPos,uPos+1);
// erase (possible) extension
uPos=oDescriptiveName.rfind(".fat");
if(uPos!=oDescriptiveName.npos) oDescriptiveName.erase(uPos,uPos+1);
break; //we're done
}
if (strcasecmp(TarRecord.header.name, "title.txt") == 0)
{
char *pText;
iSize = from_oct(11,TarRecord.header.size);
if(iSize)
{
char *pPtr;
iPadding = (iSize/512+1)*512-iSize;
pText = new char[iSize + iPadding + 1];
if (gzread(pIn, pText, iSize+iPadding) != iSize+iPadding)
{
gzclose(pIn);
return kError_ReadFile;
}
pPtr = strchr(pText, '\n');
if (pPtr)
*pPtr = 0;
pPtr = strchr(pText, '\r');
if (pPtr)
*pPtr = 0;
oDescriptiveName = pText;
delete pText;
break;
}
continue;
}
// skip actual content
iSize = from_oct(11,TarRecord.header.size);
if(iSize)
{
iPadding = (iSize/512+1)*512-iSize;
gzseek(pIn, iSize+iPadding, SEEK_CUR);
}
}
gzclose(pIn);
return kError_NoErr;
}
Error ThemeZip::CleanupThemeZip(void)
{
vector<string>::iterator i;
for(i = m_oCreatedFiles.begin(); i != m_oCreatedFiles.end(); i++)
{
if (unlink((*i).c_str()))
return kError_UnlinkFailed;
}
return kError_NoErr;
}
#if 0
void main(int argc, char **argv)
{
ThemeZip a;
vector<string *> list;
string src;
if (argv[1][0] == 'e')
{
int i;
for(i = 3; i < argc; i++)
{
string *p;
p = new string(argv[i]);
list.push_back(p);
}
int r = a.CompressThemeZip(string(argv[2]), list);
printf("ret: %d", r);
exit(0);
}
if (argv[1][0] == 'd')
{
int r = a.DecompressThemeZip(string(argv[2]), string(argv[3]));
printf("ret: %d", r);
exit(0);
}
printf("Did nothing\n");
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -