📄 anifile.cpp
字号:
int nExtAmount = m_pDaiFileByOrder->setExt.size();
for(i= 0; i < nExtAmount; i ++)
{
char* pszStr = m_pDaiFileByOrder->setExt[i];
if(pszStr)
delete[] pszStr;
}
m_pDaiFileByOrder->setExt.clear();
int nStrAmount = m_pDaiFileByOrder->setStr.size();
for(i= 0; i < nStrAmount; i ++)
{
char* pszStr = m_pDaiFileByOrder->setStr[i];
if(pszStr)
delete[] pszStr;
}
m_pDaiFileByOrder->setStr.clear();
delete m_pDaiFileByOrder;
m_pDaiFileByOrder = NULL;
}
m_pDaiFileByOrder = new DaiFileInfoByOrder;
if(!m_pDaiFileByOrder)
return IDai::CODE_INTERIOR_ERROR;
FILE* fp = fopen(pszFile, "wb");
if(!fp)
return IDai::CODE_OPENFILE_FALSE;
int nRecordAmount = m_pAniFileByOrder->setAniInfo.size();
int i;
for(i = 0; i < nRecordAmount; i++)
{
AniInfoByOrder* pAniInfo = m_pAniFileByOrder->setAniInfo[i];
if(!pAniInfo)
return IDai::CODE_INTERIOR_ERROR;
DaiInfo* pInfo = new DaiInfo;
if(!pInfo)
return IDai::CODE_INTERIOR_ERROR;
m_pDaiFileByOrder->setDaiInfo.push_back(pInfo);
if(!pAniInfo->pszIndex)
return IDai::CODE_INTERIOR_ERROR;
this->ZipStr(m_pDaiFileByOrder->setStr, pAniInfo->pszIndex, pInfo->usIndexNameIndex,
pInfo->cIndexNameAdjust1, pInfo->cIndexNameAdjust2);
// frame ...
pInfo->ucFrameAmount = pAniInfo->setFrame.size();
if(pInfo->ucFrameAmount >= 255)
return IDai::CODE_FRAMEAMOUNT_OVERFLOW;
pInfo->pFrameInfo = new DaiFrameInfo[pInfo->ucFrameAmount];
if(!pInfo->pFrameInfo)
return IDai::CODE_INTERIOR_ERROR;
for(int j = 0; j < pInfo->ucFrameAmount; j ++)
{
char* pszFrame = pAniInfo->setFrame[j];
if(!pszFrame)
return IDai::CODE_INTERIOR_ERROR;
DaiFrameInfo* pCurrentInfo = pInfo->pFrameInfo+j;
this->ZipFrame(m_pDaiFileByOrder->setStr, m_pDaiFileByOrder->setExt, m_pDaiFileByOrder->setDir,
pszFrame, pCurrentInfo->usPath, pCurrentInfo->ucExtendName, pCurrentInfo->usFileNameIndex,
pCurrentInfo->cFileNameAdjust1, pCurrentInfo->cFileNameAdjust2);
}
}
// now save ...
char szTitle[8] = "ND_DAI";
DWORD dwVersion = 1000;
fwrite(szTitle, sizeof(char), 8, fp);
fwrite(&dwVersion, sizeof(DWORD), 1, fp);
// path...
unsigned short usPathAmount = m_pDaiFileByOrder->setDir.size();
fwrite(&usPathAmount, sizeof(unsigned short), 1, fp);
for(i = 0; i < usPathAmount; i ++)
{
char* pszDir = m_pDaiFileByOrder->setDir[i];
if(!pszDir)
{
fclose(fp);
return IDai::CODE_INTERIOR_ERROR;
}
unsigned short usLength = strlen(pszDir)+1;
fwrite(&usLength, sizeof(unsigned short), 1, fp);
fwrite(pszDir, sizeof(char), usLength, fp);
}
// save Ext ...
unsigned char ucExtAmount = m_pDaiFileByOrder->setExt.size();
fwrite(&ucExtAmount, sizeof(unsigned char), 1, fp);
for(i = 0; i < ucExtAmount; i ++)
{
char* pszExt = m_pDaiFileByOrder->setExt[i];
if(!pszExt)
{
fclose(fp);
return IDai::CODE_INTERIOR_ERROR;
}
unsigned short usLength = strlen(pszExt)+1;
fwrite(&usLength, sizeof(unsigned short), 1, fp);
fwrite(pszExt, sizeof(char), usLength, fp);
}
// save Str ...
unsigned short usStrAmount = m_pDaiFileByOrder->setStr.size();
fwrite(&usStrAmount, sizeof(unsigned short), 1, fp);
for(i = 0; i < usStrAmount; i ++)
{
char* pszStr = m_pDaiFileByOrder->setStr[i];
if(!pszStr)
{
fclose(fp);
return IDai::CODE_INTERIOR_ERROR;
}
unsigned short usLength = strlen(pszStr)+1;
fwrite(&usLength, sizeof(unsigned short), 1, fp);
fwrite(pszStr, sizeof(char), usLength, fp);
}
// get filename
// save record
unsigned long uAniAmount = m_pDaiFileByOrder->setDaiInfo.size();
fwrite(&uAniAmount, sizeof(DWORD), 1, fp);
char szDir[_MAX_DIR] = "";
char szDrive[_MAX_PATH] = "";
char szFileName[_MAX_FNAME] = "";
char szExt[_MAX_EXT] = "";
_splitpath(pszFile, szDrive, szDir, szFileName, szExt);
for(i = 0; i < uAniAmount; i ++)
{
DaiInfo* pInfo = m_pDaiFileByOrder->setDaiInfo[i];
if(!pInfo)
{
fclose(fp);
return IDai::CODE_INTERIOR_ERROR;
}
if(!pInfo->pFrameInfo)
{
fclose(fp);
return IDai::CODE_INTERIOR_ERROR;
}
// encrypt ...
int nLength = strlen(szFileName);
strupr(szFileName);
unsigned char ucFrameAmount = pInfo->ucFrameAmount^szFileName[i%nLength];
fwrite(&ucFrameAmount, sizeof(unsigned char), 1, fp);
fwrite(&pInfo->usIndexNameIndex, sizeof(unsigned short), 1, fp);
fwrite(&pInfo->cIndexNameAdjust1, sizeof(char), 1, fp);
fwrite(&pInfo->cIndexNameAdjust2, sizeof(char), 1, fp);
fwrite(pInfo->pFrameInfo, sizeof(DaiFrameInfo), pInfo->ucFrameAmount, fp);
}
fclose(fp);
return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long CAniFile::ZipStr(deque<char*>& setStr, const char* pszStr, unsigned short& usStrIndex, char& cAdjustA, char& cAdjustB)
{
if(!pszStr)
return IDai::CODE_INTERIOR_ERROR;
DWORD dwLength = strlen(pszStr);
if(dwLength == 1)
{
usStrIndex = 65535;
cAdjustA = pszStr[0];
cAdjustB = '\0';
return IDai::SUCCESS;
}
if(dwLength == 2)
{
usStrIndex = 65534;
cAdjustA = pszStr[0];
cAdjustB = pszStr[1];
return IDai::SUCCESS;
}
// get index
char szIndex[_MAX_PATH];
strcpy(szIndex, pszStr);
szIndex[dwLength-2] = '\0';
int nAmount = setStr.size();
for(int i = 0; i < nAmount; i ++)
{
char* pStr = setStr[i];
if(pStr && strcmp(pStr, szIndex) == 0)
{
// found ...
usStrIndex = i;
break;
}
}
if(i == nAmount)
{
if(i >= 65533)
return IDai::CODE_STRINDEX_OVERFLOW;
char* pszNewIndex = new char[strlen(szIndex)+1];
if(!pszNewIndex)
return IDai::CODE_INTERIOR_ERROR;
strcpy(pszNewIndex, szIndex);
setStr.push_back(pszNewIndex);
usStrIndex = setStr.size()-1;
}
cAdjustA = pszStr[dwLength-2];
cAdjustB = pszStr[dwLength-1];
return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long CAniFile::ZipFrame(deque<char*>& setStr, deque<char*>& setExt, deque<char*>& setDir,
const char* pszFrame, unsigned short& usPathIndex, unsigned char& ucExtIndex,
unsigned short& usNameIndex, char& cNameAdjustA, char& cNameAdjustB)
{
if(!pszFrame)
return IDai::CODE_INTERIOR_ERROR;
// assay path
char szDir[_MAX_DIR] = "";
char szDrive[_MAX_PATH] = "";
char szFileName[_MAX_FNAME] = "";
char szExt[_MAX_EXT] = "";
_splitpath(pszFrame, szDrive, szDir, szFileName, szExt);
// continue ...
int i;
// direction ...
int nDirAmount = setDir.size();
for(i = 0; i < nDirAmount; i ++)
{
char* pszDir = setDir[i];
if(pszDir && (strcmp(szDir, pszDir) == 0))
{
usPathIndex = i;
break;
}
}
if(i == nDirAmount)
{
if(i >= 65535)
return IDai::CODE_DIRINDEX_OVERFLOW;
char* pszNewDir = new char[strlen(szDir)+1];
if(!pszNewDir)
return IDai::CODE_INTERIOR_ERROR;
strcpy(pszNewDir, szDir);
setDir.push_back(pszNewDir);
usPathIndex = setDir.size()-1;
}
// ext name ...
int nExtNameAmount = setExt.size();
for(i = 0; i < nExtNameAmount; i ++)
{
char* pszExt = setExt[i];
if(pszExt && strcmp(pszExt, szExt) == 0)
{
ucExtIndex = i;
break;
}
}
if(i == nExtNameAmount)
{
if(i >= 255)
return IDai::CODE_EXTINDEX_OVERFLOW;
char* pszNewExt = new char[strlen(szExt)+1];
if(!pszNewExt)
return IDai::CODE_INTERIOR_ERROR;
strcpy(pszNewExt, szExt);
setExt.push_back(pszNewExt);
ucExtIndex = setExt.size()-1;
}
// file name ...
unsigned long uCode = this->ZipStr(setStr, szFileName, usNameIndex, cNameAdjustA, cNameAdjustB);
if(IDai::SUCCESS != uCode)
return uCode;
return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
bool CAniFile::CheckFile(const char* pszDir, const char* pszFileName)
{
if(!pszDir || !pszFileName)
return false;
if(strcmp(this->m_infoIndex.szPath, pszDir) == 0 && strcmp(this->m_infoIndex.szFile, pszFileName) == 0)
return true;
return false;
}
//--------------------------------------------------------------------------------------
unsigned long CAniFile::UnZipStr(deque<char*>& setStr, char* pszBuffer, unsigned long uBufferSize,
unsigned short& usStrIndex, char& cAdjustA, char& cAdjustB)
{
if(!pszBuffer)
return IDai::CODE_INTERIOR_ERROR;
int nStrAmount = setStr.size();
// special string index ...
if(uBufferSize < 3)
return IDai::CODE_STRINGBUFFER_OVERFLOW;
if(usStrIndex == 65535)
{
pszBuffer[0] = cAdjustA;
pszBuffer[1] = '\0';
return IDai::SUCCESS;
}
if(usStrIndex == 65534)
{
pszBuffer[0] = cAdjustA;
pszBuffer[1] = cAdjustB;
pszBuffer[2] = '\0';
return IDai::SUCCESS;
}
// check index
int nAmount = setStr.size();
if(usStrIndex >= nAmount)
return IDai::CODE_STRINDEX_OVERFLOW;
if(!setStr[usStrIndex])
return IDai::CODE_INTERIOR_ERROR;
// check size
unsigned long uSize = 1+1+1+sizeof(setStr[usStrIndex]);
if(uSize > uBufferSize)
return IDai::CODE_STRINGBUFFER_OVERFLOW;
strcpy(pszBuffer, setStr[usStrIndex]);
// adjust ...
int nLength = strlen(pszBuffer);
pszBuffer[nLength] = cAdjustA;
pszBuffer[nLength+1] = cAdjustB;
pszBuffer[nLength+2] = '\0';
return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long CAniFile::UnZipFrame(deque<char*>& setStr, deque<char*>& setExt, deque<char*>& setDir,
char* pszBuffer, unsigned long uBufferSize, unsigned short& usPathIndex, unsigned char& ucExtIndex,
unsigned short& usNameIndex, char& cNameAdjustA, char& cNameAdjustB)
{
if(!pszBuffer)
return IDai::CODE_INTERIOR_ERROR;
// check index
int nExtAmount = setExt.size();
if(ucExtIndex >= nExtAmount)
return IDai::CODE_EXTINDEX_OVERFLOW;
int nDirAmount = setDir.size();
if(usPathIndex >= nDirAmount)
return IDai::CODE_DIRINDEX_OVERFLOW;
if(!setExt[ucExtIndex] || !setDir[usPathIndex])
return IDai::CODE_INTERIOR_ERROR;
static char szFileName[512];
unsigned long uCode = this->UnZipStr(setStr, szFileName, 512, usNameIndex, cNameAdjustA, cNameAdjustB);
if(uCode != IDai::SUCCESS)
return uCode;
// check size
unsigned long uSize = strlen(szFileName)+strlen(setExt[ucExtIndex])+strlen(setDir[usPathIndex])+1;
if(uBufferSize < uSize)
return IDai::CODE_STRINGBUFFER_OVERFLOW;
sprintf(pszBuffer, "%s%s%s", setDir[usPathIndex], szFileName, setExt[ucExtIndex]);
return IDai::SUCCESS;
}
//--------------------------------------------------------------------------------------
unsigned long CAniFile::GetAni(const char* pszIndex, IFrameSet* pInfoFrame)
{
if(!pszIndex && ! pInfoFrame)
return IDai::CODE_EXTERIOR_ERROR;
if(!m_pAniFile && !m_pDaiFile)
return IDai::CODE_INTERIOR_ERROR;
unsigned long uKey = this->Str2Id(pszIndex);
// clear buffer if not empty
pInfoFrame->Clear();
if(m_pDaiFile)
{
// search ...
map<unsigned long, DaiInfo*>::iterator iter= m_pDaiFile->setDaiInfo.find(uKey);
if(iter == m_pDaiFile->setDaiInfo.end())
return IDai::CODE_INFO_NOTFOUND;
// found ...
DaiInfo* pInfo = iter->second;
if(!pInfo)
return IDai::CODE_INTERIOR_ERROR;
for(int i = 0; i < pInfo->ucFrameAmount; i++)
{
if(!pInfo)
return IDai::CODE_INTERIOR_ERROR;
DaiFrameInfo* pFrameInfo = pInfo->pFrameInfo + i;
char szFrame[256];
unsigned long uCode;
uCode = this->UnZipFrame(m_pDaiFile->setStr, m_pDaiFile->setExt, m_pDaiFile->setDir,
szFrame, 256, pFrameInfo->usPath, pFrameInfo->ucExtendName,
pFrameInfo->usFileNameIndex, pFrameInfo->cFileNameAdjust1,
pFrameInfo->cFileNameAdjust2);
pInfoFrame->InsertFrame(szFrame);
if(uCode != IDai::SUCCESS)
return uCode;
}
return IDai::SUCCESS;
}
else if(m_pAniFile)
{
// search ...
map<unsigned long, AniInfo*>::iterator iter= m_pAniFile->setAniInfo.find(uKey);
if(iter == m_pAniFile->setAniInfo.end())
return IDai::CODE_INFO_NOTFOUND;
AniInfo* pAniInfo = iter->second;
if(!pAniInfo)
return IDai::CODE_INTERIOR_ERROR;
// found ...
int nFrameAmount = pAniInfo->setFrame.size();
for(int i = 0; i < nFrameAmount; i ++)
{
char* pszFile = pAniInfo->setFrame[i];
if(!pszFile)
return IDai::CODE_INTERIOR_ERROR;
pInfoFrame->InsertFrame(pszFile);
}
return IDai::SUCCESS;
}
return IDai::CODE_INFO_NOTFOUND;
}
//--------------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -