// Persistor.cpp: implementation of the CPersistor class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #include #include #include using namespace std; #include #include "t_string.h" #include "Persistor.h" #include "StructureWapperHelpers.h" #ifdef _UNICODE static TCHAR g_tcBeginFile[] = {0xfeff}; static TCHAR g_atcNL[] = {0x0d, 0x0a, 0x00}; #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CPersistor::CPersistor (const char *pszFilename, int nMode, bool bLoading) { m_sFilename = pszFilename; m_nMode = nMode; m_bLoading = bLoading; m_pfsFile = NULL; m_bFirst = true; m_pfsFile = NULL; } CPersistor::~CPersistor() { Close(); } HRESULT CPersistor::Close() { if (m_pfsFile && m_pfsFile->is_open()) { #ifdef _UNICODE if (!m_bLoading) { } #endif m_pfsFile->flush(); m_pfsFile->close(); delete m_pfsFile; m_pfsFile = NULL; } else if (m_pfsFile) { delete m_pfsFile; m_pfsFile = NULL; } return S_OK; } HRESULT CPersistor::Open() { m_pfsFile = NULL; m_pfsFile = new t_fstream (m_sFilename.c_str(),m_nMode | ios_base::binary); if (m_pfsFile && m_pfsFile->fail()) { return HRESULT_FROM_WIN32(GetLastError()); } else { #ifdef _UNICODE if (m_bFirst && !m_bLoading) { // To Do: Need to write out here the UNICODE string. PutALine(*m_pfsFile, g_tcBeginFile, 1); } else if (m_bFirst) { // Need to skip over the UNICODE string. fpos_t p = m_pfsFile->tellp(); if (p == (fpos_t) 0) { TCHAR tc; tc = Stream().peek(); // Need to make sure that the file is unicode. if (tc != 0xff) { m_pfsFile ->close(); delete m_pfsFile; m_pfsFile = NULL; return HRESULT_FROM_WIN32(ERROR_NO_UNICODE_TRANSLATION); } TCHAR t; GetAChar(Stream(), t); } } #else if (m_bFirst && m_bLoading) { // Need to make sure that the file is not unicode. int tc; tc = Stream().peek(); if (tc == 0xff) { m_pfsFile ->close(); delete m_pfsFile; m_pfsFile = NULL; return HRESULT_FROM_WIN32(ERROR_NO_UNICODE_TRANSLATION); } } #endif m_bFirst = false; return S_OK; } } // HRESULT CPersistor::OpenLog(bool bAppend) { m_pfsFile = NULL; m_pfsFile = new t_fstream (m_sFilename.c_str(),m_nMode | ios_base::binary | (bAppend ? ios::app : 0)); if (m_pfsFile && m_pfsFile->fail()) { return HRESULT_FROM_WIN32(GetLastError()); } else { #ifdef _UNICODE //m_pfsFile->seekp(ios::end); //fpos_t p = m_pfsFile->tellp(); //if (p == (fpos_t) 0) //{ PutALine(*m_pfsFile, g_tcBeginFile, 1); //} #endif return S_OK; } }