Специализированный программно-аппаратный комплекс обучения русскому жестовому языку. Учебное пособие
.pdfchandle.Abort();
/*
if(cImList)
{
cImList->DeleteImageList(); delete cImList;
}
*/
}
/////////////////////////////////////////////////////////////////////////////
// CDataContainerFile message handlers
bool CDataContainerFile::InitDataContainer(CString fname,bool bInit,BYTE Version)
{
//AfxMessageBox(fname); BYTE buf[10];
if(bInit)
{
if( !chandle.Open(fname,CFile::modeCreate | CFile::modeWrite,&m_pError))
{
ASSERT(0); return false;
}
chandle.SeekToBegin();
if(Version==1)
{
chandle.Write(sz_Head_Ver1,8); chandle.Write(&num_entries,4); m_Entries_pos=0x08+0x04; m_ContainerSize=12;
}
else
{
chandle.Write(sz_Head_Ver2,8); chandle.Write(&num_entries,4); chandle.Write(&m_Entries_pos,4); m_ContainerSize=16;
}
m_Max_Link_Size=_MAX_LINK_SIZE; return true;
}
else
61
{
if( !chandle.Open(fname,CFile::modeReadWrite,&m_pError))
{
//ASSERT(0); return false;
}
m_ContainerSize=chandle.GetLength(); chandle.SeekToBegin(); chandle.Read(buf,8); chandle.Seek(4,CFile::begin); chandle.Read(ver,4);
ver[4]=0;
ver[5]=0; chandle.Read(&num_entries,4); if(memcmp(sz_Head_Ver1,buf,8)==0)
{
ver_switch=DSF_VER1; m_Max_Link_Size=_MAX_LINK_SIZE_OLD; m_Entries_pos=0x08+0x04+num_entries*m_Max_Link_Size;
}
else if(memcmp(sz_Head_Ver2,buf,8)==0)
{
chandle.Read(&m_Entries_pos,4); ver_switch=DSF_VER2; m_Max_Link_Size=_MAX_LINK_SIZE;
}
if(num_entries>=0 && ver_switch>0)
{
return true;
}
else
{
chandle.Close(); return false;
}
}
return false;
}
void CDataContainerFile::CloseDataContainer()
{
chandle.AssertValid();
//if(m_ContainerSize!=0) chandle.Close();
62
}
void CDataContainerFile::SeekToEntries(int SeekTo)
{
if(ver_switch==DSF_VER2) switch(SeekTo)
{
// commented for ver 1
case SEEK_FILEINFOHEAD: chandle.Seek(0x08+0x04,CFile::begin); //chandle.Seek(0x08+0x04,CFile::begin); return;
case SEEK_ENTRIESNAMES: chandle.Seek(0x08+0x04+0x04,CFile::begin); //chandle.Seek(0x08+0x04,CFile::begin); return;
case SEEK_ENTRIESDATA: ASSERT(m_Entries_pos); chandle.Seek(m_Entries_pos,CFile::begin);
//chandle.Seek(0x08+0x04+_MAX_LINK_SIZE*num_entries,CFile::begin); return;
}
if(ver_switch==DSF_VER1) switch(SeekTo)
{
// commented for ver 1
case SEEK_FILEINFOHEAD: chandle.Seek(0x08,CFile::begin); break;
case SEEK_ENTRIESNAMES: chandle.Seek(0x08+0x04,CFile::begin); break;
case SEEK_ENTRIESDATA: ASSERT(m_Entries_pos); chandle.Seek(m_Entries_pos,CFile::begin); break;
}
}
bool CDataContainerFile::PlaseFileIntoTree(CTreeCtrl *m_WndTree, HTREEITEM root, LPTSTR lpszName, DWORD pos, DWORD dwFlags, BYTE Type)
{
//GoToNamedFolder;
HTREEITEM cur_root;// = m_WndTree->GetChildItem(root);
63
HTREEITEM main_root = root; CString csf;
BYTE buf[_MAX_LINK_SIZE]; while(1)
{
if(dwFlags&FF_EXPAND_ROOTS) m_WndTree->Expand(main_root,TVE_EXPAND);
if(!GetFolderName(lpszName,( char *)buf))//take sub folder
{
InsertItemAndData(m_WndTree, lpszName, main_root,TVI_SORT, TREE_DATALINK,Type);//none sub folder
return true;
}
else//sub folder present
{
//searching for sub folder
cur_root = m_WndTree->GetNextItem(main_root,TVGN_CHILD); while(cur_root!=NULL)
{
csf=m_WndTree->GetItemText(cur_root); if(strcmp(csf,(char *)buf)==NULL)
{
main_root = cur_root; break;
}
//dwFlags
cur_root = m_WndTree->GetNextItem(cur_root,TVGN_NEXT);
}
if(!cur_root)
{
main_root = InsertItemAndData(m_WndTree, ( char *)buf, main_root,TVI_SORT, TREE_FOLDER,2);//create sub folder
}
}
}
return false;
}
bool CDataContainerFile::PlaseIntoComboBox(CComboBox *m_WndCombo, LPTSTR lpszName, DWORD pos, DWORD dwFlags)
{
//GoToNamedFolder; CString csf;
64
BYTE buf[_MAX_LINK_SIZE]; while(1)
{
if(!GetFolderName(lpszName,( char *)buf))//take sub folder
{
m_WndCombo->AddString(lpszName);
// InsertItemAndData(m_WndCombo, lpszName, main_root,TVI_SORT, TREE_DATALINK);//none sub folder
return true;
}
}
return false;
}
bool CDataContainerFile::GetNextName(LPTSTR lpszText)
{
chandle.AssertValid(); if(m_Entries_pos<chandle.GetPosition())
return false; switch(ver_switch)
{
case DSF_VER1:
//For version DCFv1.00 get name is very sample, all entries have size _MAX_LINK_SIZE bytes;
chandle.Read((void *)lpszText,m_Max_Link_Size); break;
case DSF_VER2:
{
StoreHandle(); chandle.Read(lpszText,m_Max_Link_Size); RestoreHandle();
long len = strlen(lpszText); if(len<=0) return false; chandle.Seek(len+1,CFile::current);
}
break;
default:
return false;
}
return true;
}
DWORD CDataContainerFile::GetDataPos(int Pos)
{
DWORD xPos;
65
StoreHandle(); SeekToEntries(SEEK_ENTRIESDATA); chandle.Seek(4*Pos,CFile::current); chandle.Read(&xPos,4); RestoreHandle();
return xPos;
}
int CDataContainerFile::NameToNumber(LPCTSTR Name)
{
StoreHandle(); SeekToEntries(SEEK_ENTRIESNAMES); BYTE buf[_MAX_LINK_SIZE];
for(int i = 0;i<num_entries;i++)
{
GetNextName(( char *)buf); if(strcmp(Name,( char *)buf)==NULL)
{
RestoreHandle(); return i;
}
}
RestoreHandle(); return -1;
}
void CDataContainerFile::StoreHandle()
{
HandlePos = chandle.GetPosition();
}
void CDataContainerFile::RestoreHandle()
{
chandle.Seek(HandlePos,CFile::begin);
}
bool CDataContainerFile::GetFolderName(LPTSTR Name, LPTSTR FoldName)
{
long Len = strlen(Name); for(int i=0;i<Len;i++)
{
FoldName[i]=Name[i];
if(Name[i]==0x5C)
{
FoldName[i]=0;
FoldName[i+1]=0;
CutFirstFolder(Name,i+1);
66
return true;
}
}
FoldName[Len]=0;
//AfxMessageBox(FoldName); return false;
}
void CDataContainerFile::CutFirstFolder(LPTSTR Name, int pos)
{
long Len = strlen(Name)-pos; for(int i=0;i<Len;i++)
{
Name[i]=Name[i+pos];
}
Name[i]=0;
Name[i+1]=0;
}
//Insert item and data, select and set nEEded image
HTREEITEM CDataContainerFile::InsertItemAndData(CTreeCtrl *m_WndTree,LPTSTR Text, HTREEITEM xFolder,HTREEITEM hInsertAfter, DWORD Data, int nImage /*=NULL*/)
{
HTREEITEM curDir; if(strcmp(Text,"description")==NULL)
curDir = m_WndTree->InsertItem( Text, 16, 16, xFolder, hInsertAfter); else
curDir = m_WndTree->InsertItem( Text, nImage, nImage, xFolder, hInsertAfter);
//InsertItem(Text,xFolder,hInsertAfter); m_WndTree->SetItemData(curDir,Data);
//return curDir;
return curDir;
}
bool CDataContainerFile::GetFileInfo(LPCTSTR file, LPCTSTR subfile, LPFILEINFO fileinfo)
{
if(subfile==NULL)
{
CFile fp;
if( !fp.Open(file,CFile::modeRead,&m_pError))
{
fp.AssertValid(); return false;
67
}
fp.AssertValid();
fileinfo->type = GetFileType(&fp); fileinfo->size = GetFileSize(&fp); fileinfo->ver = GetFileVer(&fp); fp.Close();
}
else
{
bool init = InitDataContainer(file,false); ASSERT(init);
if(!init)
return false;
fileinfo->size = GetFileSize(NULL,subfile); fileinfo->type = GetFileType(NULL,subfile); fileinfo->ver = GetFileVer(NULL,subfile);
// CloseDataContainer();
}
return true;
}
BYTE CDataContainerFile::GetFileType(CFile *fp, LPCTSTR subfile)
{
BYTE buf[SIGNATURE_LEN+2]; if(GetFileSize(fp,subfile)<8) return 0; if(fp == NULL)
{
//ASSERT(chandle);
chandle.AssertValid();
bool State = SeekToBuildInFile(subfile); ASSERT(State); if(IsWGTSprite(&chandle,NULL))
return SPR; else
chandle.Read((LPSTR)buf,SIGNATURE_LEN);
}
else
{
fp->Seek(0,CFile::begin); if(IsWGTSprite(fp,NULL))
return SPR; else
fp->Read((LPSTR)buf,SIGNATURE_LEN);
}
68
return GetTypeFromSignature((char *)buf,SIGNATURE_LEN); return UNKNOWN;
}
BYTE CDataContainerFile::GetTypeFromSignature(LPSTR sz_Sig,int len)
{
ASSERT(len); ASSERT(sz_Sig);
for(int t=0;t<MAX_SUPPORTED_FILE_TYPES;t++) if(memcmp(sz_FileTypes[t],sz_Sig,len)==NULL) return t;
return UNKNOWN;
}
LONG CDataContainerFile::GetFileSize(CFile *fp, LPCTSTR subfile)
{
LONG size=0; if(fp == NULL)
{
StoreHandle();
chandle.AssertValid(); if(!SeekToNamePos(subfile)) return false; LONG posx;
chandle.Read(&posx,4);
chandle.Read(&size,4); if(NameToNumber(subfile)+1==num_entries)
size=m_ContainerSize; ASSERT(size); size-=posx; RestoreHandle();
}
else
{
fp->Seek(0,CFile::begin); size = fp->GetLength();
}
if(size>0) return size;
return UNKNOWN;
}
DWORD CDataContainerFile::GetFileVer(CFile *fp, LPCTSTR subfile)
{
DWORD file_ver; BYTE Type=0;
if(GetFileSize(fp,subfile)<8) return 0; if((Type=GetFileType(fp, subfile))!=UNKNOWN)
69
{
if(Type==SPR) memcpy(&file_ver,"4.00",4);
else
{
if(fp) fp->Read(&file_ver,4);
else chandle.Read(&file_ver,4);
}
return file_ver;
}
return UNKNOWN;
}
bool CDataContainerFile::SeekToNamePos(LPCTSTR name, CFile *fp)//Goto position definition by name
{
/* if(fp!=NULL) chandle = fp;
*/
int num = NameToNumber((char *)name); SeekToEntries(SEEK_ENTRIESDATA); LONG newPos = m_Entries_pos+4*num;
if(num!=-1)
{
if(fp!=NULL)
{
if(fp->Seek(newPos,CFile::begin)==newPos) return true;
}
else
{
chandle.AssertValid();
if(chandle.Seek(newPos,CFile::begin)==newPos) return true;
}
}
return false;
}
bool CDataContainerFile::SeekToNamePos(DWORD num)
{
/* if(fp!=NULL) chandle = fp;
70
