Специализированный программно-аппаратный комплекс обучения русскому жестовому языку. Учебное пособие
.pdf*/
SeekToEntries(SEEK_ENTRIESDATA); LONG newPos = m_Entries_pos+4*num;
if(num!=-1)
{
chandle.AssertValid();
if(chandle.Seek(newPos,CFile::begin)==newPos) return true;
}
return false;
}
bool CDataContainerFile::SeekToBuildInFile(LPCTSTR subfile)
{
chandle.AssertValid(); if(!SeekToNamePos(subfile)) return false; DWORD pos; if(chandle.Read(&pos,4)!=4) return false; chandle.Seek(pos,CFile::begin);
return true;
}
bool CDataContainerFile::SeekToBuildInFile(DWORD num)
{
chandle.AssertValid(); if(!SeekToNamePos(num)) return false; DWORD pos; if(chandle.Read(&pos,4)!=4) return false;
chandle.Seek(pos,CFile::begin); return true;
}
bool CDataContainerFile::PrepareDataContainerToRebild(CString fname)//,LPPROGRESS_ROUTINE lpProgressRoutine)
{
//CopyFileEx(); return true;
}
CFile * CDataContainerFile::GetHandle()
{
chandle.AssertValid();
return &chandle;//.Duplicate();
}
CString CDataContainerFile::NumberToName(long Number)
{
if(Number>=num_entries) return _TEXT("");
71
StoreHandle(); SeekToEntries(SEEK_ENTRIESNAMES); BYTE buf[_MAX_LINK_SIZE];
long num=0; while(GetNextName((char *)buf))
{
if(num==Number) break; num++;
}
RestoreHandle(); return _TEXT(buf);
}
int CDataContainerFile::SelectNeededImage(LPTSTR iText)
{
return 1;
}
bool CDataContainerFile::ExtractFile(LPCTSTR DestFileName, LPCTSTR OriginFileName)
{
ASSERT(chandle); CFile DestFile;
const DWORD Count=1024;
LONG Size=GetFileSize(NULL,OriginFileName),Back; BYTE Buffer[Count];
if(Size && SeekToBuildInFile(OriginFileName))
{
if(DestFile.Open(DestFileName,CFile::modeCreate | CFile::modeWrite))
{
while(1)
{
if(Size<=0) break;
Back = chandle.Read(Buffer,1024); if(Size>=1024)
{
DestFile.Write(Buffer,Back);
}
else if(Size!=0)
{
DestFile.Write(Buffer,Size);
break;
}
Size-=1024;
}
72
DestFile.Close(); return true;
}
}
return false;
}
bool CDataContainerFile::ExtractFileName(LPSTR Name, LPSTR PathName)
{
ASSERT(Name);
long Len = strlen(PathName); Name[0]=0;
if(Len==0) return false; for(long k=Len;k>=0;k--)
{
if(PathName[k]=='\\') break;
}
strcpy(Name,(LPSTR)((DWORD)PathName+k+1));
if(strlen(Name)) return true;
return false;
}
bool CDataContainerFile::ChangeFolder(LPSTR NewFolder, LPSTR PathNameFile)
{
ASSERT(NewFolder);
ASSERT(PathNameFile);
long Len = strlen(PathNameFile); if(Len==0) return false;
for(long k=Len;k>=0;k--)
{
if(PathNameFile[k]=='\\') break;
}
strcat(NewFolder,(LPSTR)((DWORD)PathNameFile+k+1));
if(strlen(NewFolder)) return true;
return false;
}
DWORD CDataContainerFile::GetCount(void)
{
return num_entries;
}
bool CDataContainerFile::GetFileInfo(DWORD Num, LPFILEINFO fileinfo)
73
{
fileinfo->size = GetFileSize(Num); fileinfo->type = GetFileType(Num); fileinfo->ver = GetFileVer(Num); return true;
}
BYTE CDataContainerFile::GetFileType(DWORD Num)
{
BYTE buf[SIGNATURE_LEN+2]; if(GetFileSize(Num)<8) return 0;
//ASSERT(chandle);
chandle.AssertValid();
bool State=SeekToBuildInFile(Num); ASSERT(State); if(IsWGTSprite(&chandle,NULL)) return SPR; chandle.Read((LPSTR)buf,SIGNATURE_LEN);
return GetTypeFromSignature((char *)buf,SIGNATURE_LEN);
}
LONG CDataContainerFile::GetFileSize(DWORD Num)
{
LONG size=0; StoreHandle(); chandle.AssertValid();
if(!SeekToNamePos(Num)) return false; LONG posx;
chandle.Read(&posx,4);
chandle.Read(&size,4);
#pragma warning( disable : 4018 ) if(Num+1==num_entries)
size=m_ContainerSize; #pragma warning( default : 4018 )
ASSERT(size); size-=posx; RestoreHandle(); if(size>0)
return size;
return UNKNOWN;
}
DWORD CDataContainerFile::GetFileVer(DWORD Num)
{
DWORD file_ver=0; BYTE bVer=0;
if(GetFileSize(Num)<8) return 0;
74
if((bVer=GetFileType(Num))!=UNKNOWN)
{
if(bVer==SPR) chandle.Read(&file_ver,2);
else chandle.Read(&file_ver,4);
return file_ver;
}
return UNKNOWN;
}
bool CDataContainerFile::DoValidFiltering(LPTSTR lpszText, LPCTSTR Filter, DWORD dwFilteringFlags)
{
char buffer[1024]; int i_counter;
bool IsValid = false; ExtractFolder(buffer,lpszText); int Lenght = strlen(lpszText); if(Lenght==0)
return true; if(!strlen(lpszText)) return false;
if(dwFilteringFlags&FF_BY_EXTENSIONS)
{
for(int i=Lenght;i>=0;i--)
{
if(lpszText[i]=='.')
{
if(strcmp((LPSTR)((DWORD)lpszText+i),Filter)==0)
IsValid=true;
}
}
}
else if(
(strcmp(buffer,Filter)==0 && dwFilteringFlags&FF_NO_SUBFOLDERS)
||
(strncmp(buffer,Filter,Lenght)==0 && dwFilteringFlags&FF_PLACE_NO_PATH))
IsValid=true;
if(IsValid)
{
//Extract filename if needed if(dwFilteringFlags&FF_PLACE_NO_PATH &&
75
dwFilteringFlags&FF_NO_SUBFOLDERS)
{
ExtractFileName(lpszText,lpszText);
}
if(dwFilteringFlags&FF_CUT_EXTENSIONS)
{
i_counter=strlen(lpszText); for(int i=i_counter;i>=0;i--)
{
if(lpszText[i]=='.')
{
lpszText[i]=0;
break;
}
}
}
return true;
}
return false;
}
bool CDataContainerFile::ExtractFolder(LPSTR OnlyFolder, LPSTR FullPathName)
{
ASSERT(OnlyFolder);
ASSERT(FullPathName);
long Len = strlen(FullPathName); OnlyFolder[0]=0;
if(Len==0) return false; for(long k=Len;k>=0;k--)
{
if(FullPathName[k]=='\\') break;
}
strncpy(OnlyFolder,FullPathName,k+1);
OnlyFolder[k+1]=0;
if(strlen(OnlyFolder)) return true;
return false;
}
bool CDataContainerFile::EnumerateEntries(CComboBox *m_WndCombo,LPCTSTR FilterString /*= NULL*/, DWORD dwFilteringFlags /*= NULL*/)
{
BYTE Type=0;
76
chandle.AssertValid(); ASSERT(m_WndCombo);
char lpszText[_MAX_LINK_SIZE]; // CString lpszText;
//Bind our images to this data file /*
if(cImList == NULL)
{
cImList = new CImageList;
cImList->Create( MAKEINTRESOURCE(IDB_TVIMAGELIST), 16, MAX_SUPPORTED_FILE_TYPES, RGB(255,255,255));
m_WndTree->SetImageList( cImList, TVSIL_NORMAL); m_WndTree->SetImageList( cImList, TVSIL_STATE);
}
*/
//skip header=> go to names SeekToEntries(SEEK_ENTRIESNAMES);
for(int i=0;i<num_entries;i++)
{
if(!GetNextName(lpszText)) return false;
//Do filtering process if(FilterString)
{
if(!DoValidFiltering(lpszText,FilterString,dwFilteringFlags))
continue;
}
//AfxMessageBox(lpszText);
//StoreHandle();
//Type = GetFileType(i);
//if(Type!=0)
// |
Type+=2; |
//RestoreHandle(); if(!PlaseIntoComboBox(m_WndCombo,
lpszText,GetDataPos(i),dwFilteringFlags)) return false;
}
return true;
}
bool CDataContainerFile::EnumerateEntriesProgress(CTreeCtrl *m_WndTree, HTREEITEM root /*= NULL*/,LPCTSTR FilterString /*= NULL*/, DWORD
dwFilteringFlags /*= NULL*/)
77
{
CDlgEnum cd(this,m_WndTree,root,FilterString,dwFilteringFlags); if(cd.DoModal()==IDOK)
{
m_WndTree->SetFocus(); return true;
}
return false;
}
bool CDataContainerFile::EnumerateEntries(CTreeCtrl *m_WndTree, HTREEITEM root /*= NULL*/,LPCTSTR FilterString /*= NULL*/, DWORD dwFilteringFlags /*= NULL*/, CDialog *m_EnumDlg /*= NULL*/)
{
BYTE Type=0; chandle.AssertValid(); ASSERT(m_WndTree); CProgressCtrl *m_EnumPrgs;
char lpszText[_MAX_LINK_SIZE];
//CString lpszText; if(dwFilteringFlags&FF_SHOWPROGRESS)
{
m_EnumPrgs=(CProgressCtrl *)m_EnumDlg- >GetDlgItem(IDC_PROGRESS);
m_EnumPrgs->SetRange32(0,num_entries);
}
//Bind our images to this data file /*
if(cImList == NULL)
{
cImList = new CImageList;
cImList->Create( MAKEINTRESOURCE(IDB_TVIMAGELIST), 16, MAX_SUPPORTED_FILE_TYPES, RGB(255,255,255));
m_WndTree->SetImageList( cImList, TVSIL_NORMAL); m_WndTree->SetImageList( cImList, TVSIL_STATE);
}
*/
//skip header=> go to names SeekToEntries(SEEK_ENTRIESNAMES);
for(int i=0;i<num_entries;i++)
{
if(!GetNextName(lpszText)) return false;
//Do filtering process
78
if(FilterString)
{
if(!DoValidFiltering(lpszText,FilterString,dwFilteringFlags))
continue;
}
//AfxMessageBox(lpszText);
StoreHandle();
Type = GetFileType(i); if(Type!=0)
Type+=2;
RestoreHandle(); if(!PlaseFileIntoTree(m_WndTree,
root,lpszText,GetDataPos(i),dwFilteringFlags,Type)) return false;
if(dwFilteringFlags&FF_SHOWPROGRESS)
{
if((i&0xFFFFFFF0)==i)
{
m_EnumPrgs->SetPos(i); m_EnumDlg->SetDlgItemInt(IDC_COUNTED,i);
}
}
}
if(dwFilteringFlags&FF_SHOWPROGRESS)
{
m_EnumPrgs->SetPos(i); m_EnumDlg->SetDlgItemInt(IDC_COUNTED,i);
}
return true;
}
void CDataContainerFile::StoreExHandle(CFile *ExFp)
{
ASSERT(ExFp); ExFp->AssertValid();
m_dwExPos = ExFp->GetPosition();
}
void CDataContainerFile::ReStoreExHandle(CFile *ExFp)
{
ASSERT(ExFp); ExFp->AssertValid();
ExFp->Seek(m_dwExPos,CFile::begin);
}
bool CDataContainerFile::IsWGTSprite(CFile *fp,LPFILEINFO fileinfo)
79
{
char buffer[14]; buffer[13]=0;
bool bIsWGTSprite=false; ASSERT(fp); fp->AssertValid(); StoreExHandle(fp); if(fileinfo)
fp->Read(&fileinfo->ver,0x02); else
fp->Seek(2,CFile::current); fp->Read(buffer,0x0D);
if(memcmp(buffer,sz_FileTypes[SPR],0x0D)==0 && strlen(buffer)>0)
{
bIsWGTSprite = true; if(fileinfo)
fileinfo->type=SPR;
}
ReStoreExHandle(fp); return bIsWGTSprite;
}
ПРИЛОЖЕНИЕ 3
Листинг работы с данными
//CreateNewFile.cpp : implementation file
#include "stdafx.h" #include "DCFEditor.h" #include "CreateNewFile.h"
#include "DataContainerFile\DataContainer.h" #ifdef _DEBUG
#define new DEBUG_NEW #undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
//CreateNewFile dialog CreateNewFile::CreateNewFile(CWnd* pParent /*=NULL*/)
: CDialog(CreateNewFile::IDD, pParent)
{
80
