// RegFile.cpp: implementation of the CRegFile class. // ////////////////////////////////////////////////////////////////////// #include "RegFile.h" #include #include ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CRegFile::CRegFile() : m_pFile(NULL), m_pTempLine(NULL), m_TempNameBuf(256) { } CRegFile::~CRegFile() { if (m_pFile != NULL) fclose(m_pFile); for (int i=0; i < m_TempNameBuf.GetNumElementsStored(); i++) { delete m_TempNameBuf.Access()[i]; } // m_TempName.OverideBuffer(NULL); } void CRegFile::WriteString(LPCTSTR str) { // DWORD bw; // WriteFile(m_hFile, str, _tcsclen(str)*sizeof(TCHAR), &bw, NULL); if (m_pFile == NULL) return; fwrite(str,sizeof(TCHAR),_tcsclen(str),m_pFile); } void CRegFile::WriteData(LPBYTE pData, DWORD NumBytes) { // DWORD bw; // WriteFile(m_hFile, pData, NumBytes, &bw, NULL); if (m_pFile == NULL) return; fwrite(pData,sizeof(BYTE),NumBytes,m_pFile); } void CRegFile::WriteNewLine() { //TCHAR nl[] = {13,10,0}; WriteString(TEXT("\r\n")); } bool CRegFile::Init(LPCTSTR FileName, BOOL bForReading) { /* m_hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL); return (m_hFile != INVALID_HANDLE_VALUE);*/ CHAR signature[4] = "\xFF\xFE"; CHAR buffer[4]; DWORD rc; if(bForReading) { m_pFile = _tfopen(FileName, TEXT("rb")); if (m_pFile) { if (fread (buffer, 1, 2, m_pFile) < 2) { rc = GetLastError (); fclose (m_pFile); m_pFile = NULL; } } } else { m_pFile = _tfopen(FileName, TEXT("wb")); if (m_pFile) { if (fwrite (signature, 1, 2, m_pFile) < 2) { rc = GetLastError (); fclose (m_pFile); m_pFile = NULL; } } } if (m_pFile == NULL) { SetLastError (rc); } return (m_pFile != NULL); } LPCTSTR CRegFile::GetNextLine() { if (m_pFile == NULL) return NULL; LPTSTR result; if (m_pTempLine != NULL) { result = (LPTSTR)m_pTempLine; m_pTempLine = NULL; return (LPCTSTR)result; } result = new TCHAR[1024]; if (result == NULL) { LOG0(LOG_ERROR, "Could not allocate array in CRegFile::GetNextLine()"); //ASSERT(0); return NULL; } LPTSTR code = _fgetts(result, 1024, m_pFile); if (code == NULL) { delete[] result; return NULL; } else { //UNICODE HERE??? int pos = _tcsclen(result); result[pos-2] = NULL; return result; } } LPCTSTR CRegFile::GetNextSubKey(LPCTSTR KeyName) { if (m_pFile == NULL) return NULL; LPCTSTR SubKey; int keyLen = _tcsclen(KeyName); // long oldPos; // oldPos = GetPos(); if (m_pTempLine == NULL) { SubKey = GetNextLine(); } else { SubKey = m_pTempLine; m_pTempLine = NULL; } if (SubKey != NULL) { if (_tcsncmp(KeyName, SubKey, keyLen) != 0) { //delete SubKey; //SeekToPos(oldPos); m_pTempLine = SubKey; //put SubKey back on the stream, since it //is no longer a sub key of Key. } else { return SubKey; } } return NULL; } //for unicode #define ERR_VALUE WEOF CRegDataItemPtr CRegFile::GetNextDataItem() { if (m_pFile == NULL) return new CRegDataItem(); TCHAR c = (TCHAR)_fgettc(m_pFile); if ((c == EOF) || (c == WEOF)) return new CRegDataItem(); if (c != TEXT('S')) { _ungettc(c, m_pFile); return new CRegDataItem(); //no data item - only reg key on the current line } CRegDataItem* result = new CRegDataItem; if (!result) { LOG0(LOG_ERROR,"Could not allocate CRegDataItem"); return NULL; } TCHAR type; //Scan in the length of the variable name if (_ftscanf(m_pFile, TEXT("%u:"), &result->m_NameLen) == ERR_VALUE) { delete result; LOG0(LOG_ERROR,"CRegDataItem - could not read result->m_NameLen"); return new CRegDataItem(); } result->m_NameLen++; //names of variables always forget the blank at end //may be introducing memory leak here! //*********************************** /* //Scan in the variable name CStr name(new TCHAR[result->m_NameLen+1]); _fgetts(name.get(), result->m_NameLen, m_pFile); result->m_Name = name; //************************************ */ //Scan in the variable name TCHAR* temp = new TCHAR[result->m_NameLen+1]; if(_fgetts(temp, result->m_NameLen, m_pFile) == NULL) { delete result; LOG0(LOG_ERROR,"CRegDataItem - could not read result->m_Name"); return new CRegDataItem(); } result->m_Name = temp; m_TempNameBuf.AddElement(temp); //delete[] temp; //************************************ /* m_TempNameBuf.Allocate(result->m_NameLen+1); _fgetts(m_TempNameBuf.Access(), result->m_NameLen, m_pFile); m_TempName.OverideBuffer(m_TempNameBuf.Access()); result->m_Name = m_TempName; */ //Scan in the type of variable and the length of its data if (_ftscanf(m_pFile, TEXT(" = %c(%u)%u:"), &type, &result->m_Type, &result->m_DataLen) == ERR_VALUE) { delete result; LOG0(LOG_ERROR,"CRegDataItem - could not scan in other data values"); return new CRegDataItem(); } //read in the null byte (for unicode compatibility, can't have odd # of bytes) if ((result->m_DataLen % 2) != 0) { BYTE nullByte; if (fread(&nullByte,1,1,m_pFile)==0) { delete result; LOG0(LOG_ERROR,"CRegDataItem - could not read null byte"); return new CRegDataItem(); } } result->m_bIsEmpty = false; if (result->m_DataLen > 0) { result->m_pDataBuf = new BYTE[result->m_DataLen]; if (fread(result->m_pDataBuf,result->m_DataLen,1,m_pFile) ==0) { delete result; LOG0(LOG_ERROR,"CRegDataItem - could not read null byte"); return new CRegDataItem(); } } else { result->m_pDataBuf =NULL; } //read in cr/lf c = (TCHAR)_fgettc(m_pFile); if (c != 13) {LOG0(LOG_ERROR,"CRegDataItem - could not read char 13");} c = (TCHAR)_fgettc(m_pFile); if (c != 10) {LOG0(LOG_ERROR,"CRegDataItem - could not read char 10");} return result; } TCHAR CRegFile::PeekNextChar() { TCHAR c = (TCHAR)_fgettc(m_pFile); _ungettc(c, m_pFile); return c; } void CRegFile::WriteDataItem(enum SectionType t, CRegDataItemPtr r) { //ignore section type if (!r->m_Name.IsEmpty()) r->m_KeyName = NULL; r->WriteToFile(*this); } bool CRegFile::NeedStorageOfValueData() { return false; }