Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Специализированный программно-аппаратный комплекс обучения русскому жестовому языку. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
15.08.2026
Размер:
1 Мб
Скачать

chandle.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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]