int RageFile::Seek( int offset ) { if( !IsOpen() ) RageException::Throw("\"%s\" is not open.", GetPath().c_str()); if( !(m_Mode&READ) ) RageException::Throw("\"%s\" is not open for reading; can't seek", GetPath().c_str()); m_EOF = false; ResetBuf(); if( offset == 0 ) { m_File->Rewind(); m_FilePos = 0; return 0; } int pos = m_File->Seek( offset ); if( pos == -1 ) return -1; m_FilePos = pos; return pos; }
void CStrSafeTester::test_StringCchPrintf() { HRESULT hr = E_FAIL; TCHAR bufMin[MIN_BUFFER_SIZE] = {0}; ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintf(bufMin,_countof(bufMin),TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); }
RageFileObj::RageFileObj() { m_pBuffer = NULL; ResetBuf(); m_iBufAvail = 0; m_bEOF = false; m_iFilePos = 0; m_bCRC32Enabled = false; m_iCRC32 = 0; }
void CEgIStream::Assign( CEgIStream* inSource, long inBytes ) { if ( inSource ) { Dim( inBytes ); if ( long(length()) < inBytes ) inBytes = length(); inSource -> GetBlock( getCStr(), inBytes ); } ResetBuf(); }
void CTCharTester::test_tcscpy() { TCHAR bufMin[MIN_BUFFER_SIZE] = {0}; errno_t eRet = 0; TCHAR* pChatRet = NULL; //注意:本语句会造成程序崩溃 -- 而且无法用异常机制捕获 // 调试版本弹出对话框 -- "Buffer is too small" //ResetBuf(bufMin,_countof(bufMin)); // _tcscpy_s(bufMin, _countof(bufMin) , TEST_STRING); //"abc\0" -- Buf足够大,完整拷贝字符串,而且返回0表示正确 ResetBuf(bufMin,_countof(bufMin)); eRet = _tcsncpy_s(bufMin, _countof(bufMin), SHORT_TEST_STRING, _TRUNCATE); CPPUNIT_ASSERT(0 == eRet); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abc")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == TEXT('*')); //超过范围的字符不会变 //"abcd\0" -- _tcsncpy_s 自动填充结束NULL ResetBuf(bufMin,_countof(bufMin)); eRet = _tcsncpy_s(bufMin,_countof(bufMin),TEST_STRING,_TRUNCATE); CPPUNIT_ASSERT(STRUNCATE == eRet); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == TEXT('\0')); //"abcd*" -- _tcsncpy 不会自动填充结束NULL ResetBuf(bufMin,_countof(bufMin)); pChatRet = _tcsncpy(bufMin,TEST_STRING,_countof(bufMin) - 1); CPPUNIT_ASSERT(pChatRet == bufMin); //返回目的字符串的地址 CPPUNIT_ASSERT(_tcsncmp(bufMin,TEXT("abcd"), MIN_BUFFER_SIZE - 1) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == TEXT('*')); //没有自动填充最后的NULL bufMin[MIN_BUFFER_SIZE - 1] = 0; //需要手工填充确保结束NULL CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == TEXT('\0')); }
RageFile::RageFile( const RageFile &cpy ) { ResetBuf(); /* This will copy the file driver, including its internal file pointer. */ m_File = FILEMAN->CopyFileObj( cpy.m_File, *this ); m_Path = cpy.m_Path; m_Mode = cpy.m_Mode; m_Error = cpy.m_Error; m_EOF = cpy.m_EOF; m_FilePos = cpy.m_FilePos; memcpy( this->m_Buffer, cpy.m_Buffer, sizeof(m_Buffer) ); m_pBuf = m_Buffer + (cpy.m_pBuf-cpy.m_Buffer); m_BufAvail = cpy.m_BufAvail; }
void CStrSafeTester::test_StringCchCopy() { HRESULT hr = E_FAIL; TCHAR bufMin[MIN_BUFFER_SIZE] = {0}; ResetBuf(bufMin,_countof(bufMin)); hr = StringCchCopy(bufMin,_countof(bufMin) - 1,TEST_STRING);//注意,这是错误写法,函数内部会考虑最后的 NULL 空间 CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abc")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 2] == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == TEXT('*')); //最后还有一个字符空间没有使用 hr = StringCchCopy(bufMin,_countof(bufMin),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); }
int RageFileObj::Seek( int iOffset ) { /* If we're already at the requested position, short circuit and don't flush * our buffer. */ if( iOffset == m_iFilePos ) return m_iFilePos; m_bEOF = false; /* If we're calculating a CRC32, disable it. */ m_bCRC32Enabled = false; ResetBuf(); int iPos = SeekInternal( iOffset ); if( iPos != -1 ) m_iFilePos = iPos; return iPos; }
bool RageFile::Open( const CString& path, int mode ) { ASSERT( FILEMAN ); Close(); m_Path = path; FixSlashesInPlace(m_Path); m_Mode = mode; m_EOF = false; m_FilePos = 0; ResetBuf(); if( (m_Mode&READ) && (m_Mode&WRITE) ) { SetError( "Reading and writing are mutually exclusive" ); return false; } if( !(m_Mode&READ) && !(m_Mode&WRITE) ) { SetError( "Neither reading nor writing specified" ); return false; } int error; m_File = FILEMAN->Open( path, mode, *this, error ); if( m_File == NULL ) { SetError( strerror(error) ); return false; } return true; }
void LoadCtrl::ChangeDirectory () { ::SetCurrentDirectory (GetBuffer ()); ResetBuf (); _listBox.ListDirectory (GetWindow (), GetBuffer (), IDC_STATICPATH); }
int CPlayer::ReStartMonitor() { m_comSocket.Close(); m_streamParser.ClearBuf();//清除缓冲 memset(&m_rcRenderRect, 0, sizeof(RECT)); if( m_comSocket.Connect(m_clientInfo.connInfo.ip, m_clientInfo.connInfo.port) < 0 ) { m_comSocket.Close(); return HHV_ERROR_CONNECT; } int streamHeaderSize = 4*1024; memset( m_streamHeader, 0x00, sizeof(m_streamHeader) ); int ret = MonitorStartCmdMT(m_comSocket.m_hSocket, &m_clientInfo, m_streamHeader, streamHeaderSize); if( ret < 0 ) { m_comSocket.Close(); return ret; } PlayM4_Stop(m_index); PlayM4_CloseStream( m_index); ResetBuf(); //mode- 流模式(1-实时流/2-文件流) int nErr = 0; m_playType = STREAME_REALTIME; BOOL bret = PlayM4_SetStreamOpenMode(m_index, m_playType); bret = PlayM4_OpenStream( m_index, (BYTE*)m_streamHeader, streamHeaderSize, 600*1024); if (!bret) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); return -nErr; } m_disconnection = false; if( ! PlayM4_RigisterDrawFun( m_index, MP4SDKDrawFun, (DWORD)this) ) { m_comSocket.Close(); nErr = PlayM4_GetLastError(m_index); //TRACE_SDK_ERROR("执行 CHKSeries::RegisterDrawFun 中 PlayM4_RigisterDrawFun 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } bret = PlayM4_Play(m_index, m_hWnd); if (!bret) { nErr = PlayM4_GetLastError(m_index); //string strErr = GetPlayMp4LastErrorStr( nErr ); //TRACE_SDK_ERROR("执行 CHKSeries::OpenStream 中 PlayM4_Play 函数 Fail nErr = %d strErr = %s\r\n\r\n", nErr, strErr.c_str() ); return -nErr; } m_hRenderWnd = m_hWnd; ResizeMonitorWindow(); //memcpy(&m_clientInfo, clientInfo, sizeof(UNISDK_CLIENT_INFO)); //开启线程, 接收视频流 m_exit = false; UINT threadid(0); m_Thread = (HANDLE)_beginthreadex( NULL, 4*1024*1024, DecoderRoutine, this, 0, &threadid ); if(m_Thread <= 0) { TRACE(_T("(MTVideo)!!!!!!开辟接受数据线程失败!m_Thread:%d errno:%d _doserrno:%d \r\n"), m_Thread, errno, _doserrno); SetEvent( m_hExitEvent ); } CloseHandle( m_Thread ); // // TRACE(_T("(MTVideo)监视成功结束 m_PlayHandle = %d dvrIP = %s channel = %d\r\n"), //m_PlayHandle, m_clientInfo.connInfo.ip, clientInfo->channel); return m_index; }
void CStrSafeTester::test_StringCchPrintfEx() { HRESULT hr = E_FAIL; LPTSTR pszDestEnd = NULL; size_t cchRemaining = 0; //包括结束符在内,未使用的字符数 DWORD dwFlags; //各种各样的参数 ///////////////////////////// 测试缓冲区不足时的情况 ///////////////////////////////// TCHAR bufMin[MIN_BUFFER_SIZE] = {0}; dwFlags = 0; //"abcd\0" -- 失败时和 StringCchPrintf 一样 ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); CPPUNIT_ASSERT(pszDestEnd == &bufMin[MIN_BUFFER_SIZE - 1]); CPPUNIT_ASSERT(cchRemaining == 1); dwFlags = STRSAFE_FILL_BEHIND_NULL; //"abcd\0" -- 失败时和 StringCchPrintf 一样 ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); CPPUNIT_ASSERT(pszDestEnd == &bufMin[MIN_BUFFER_SIZE - 1]); CPPUNIT_ASSERT(cchRemaining == 1); dwFlags = STRSAFE_IGNORE_NULLS; //"abcd\0" -- 失败时和 StringCchPrintf 一样 ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcscmp(bufMin,TEXT("abcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); CPPUNIT_ASSERT(pszDestEnd == &bufMin[MIN_BUFFER_SIZE - 1]); CPPUNIT_ASSERT(cchRemaining == 1); dwFlags = STRSAFE_FILL_ON_FAILURE; //"\0\0\0\0\0",失败时全部填充为 NULL ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); for (INT i = 0; i < _countof(bufMin); i++) { CPPUNIT_ASSERT(bufMin[i] == 0); } CPPUNIT_ASSERT(pszDestEnd == &bufMin[0]); CPPUNIT_ASSERT(cchRemaining == 5); dwFlags = STRSAFE_NULL_ON_FAILURE; //"\0bcd\0",失败时和 StringCchPrintf 一样填充后,将首字母变为NULL ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(bufMin[0] == 0); CPPUNIT_ASSERT(_tcslen(bufMin) == 0); CPPUNIT_ASSERT(_tcscmp(&bufMin[1],TEXT("bcd")) == 0); CPPUNIT_ASSERT(pszDestEnd == &bufMin[0]); CPPUNIT_ASSERT(cchRemaining == 5); dwFlags = STRSAFE_NO_TRUNCATION; //"\0bcd\0",失败时和 StringCchPrintf 一样填充后,将首字母变为NULL ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(_tcslen(bufMin) == 0); CPPUNIT_ASSERT(_tcscmp(&bufMin[1],TEXT("bcd")) == 0); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE - 1] == 0); CPPUNIT_ASSERT(pszDestEnd == &bufMin[0]); CPPUNIT_ASSERT(cchRemaining == 5); dwFlags = STRSAFE_FAILURE_BYTE('?'); //Unicode 时:0x3F3F 0x3F3F 0x3F3F 0x3F3F '\0',失败时前面填充为 0x3F,最后为NULL ResetBuf(bufMin,_countof(bufMin)); hr = StringCchPrintfEx(bufMin,_countof(bufMin),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == STRSAFE_E_INSUFFICIENT_BUFFER); CPPUNIT_ASSERT(bufMin[MIN_BUFFER_SIZE-1] == 0); for (INT i = 0; i < _countof(bufMin) - 1; i++) { #ifdef UNICODE CPPUNIT_ASSERT(bufMin[i] == 0x3F3F); #else CPPUNIT_ASSERT(bufMin[i] == 0x3F); #endif } CPPUNIT_ASSERT(pszDestEnd == &bufMin[MIN_BUFFER_SIZE-1]); CPPUNIT_ASSERT(cchRemaining == 1); ///////////////////////////// 测试缓冲区足够长的情况 ///////////////////////////////// TCHAR bufMax[MAX_BUFFER_SIZE] = {0}; dwFlags = 0; //"abcde12345\0****" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); #ifndef UNICODE //for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) //{ // CPPUNIT_ASSERT(bufMax[i] == TEXT('*')); //} #endif CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); dwFlags = STRSAFE_FILL_BEHIND_NULL; //"abcde12345\0\0\0\0\0" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) { CPPUNIT_ASSERT(bufMax[i] == 0); } CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); dwFlags = STRSAFE_IGNORE_NULLS; //"abcde12345\0****" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); #ifndef UNICODE //for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) //{ // CPPUNIT_ASSERT(bufMax[i] == TEXT('*')); //} #endif CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); dwFlags = STRSAFE_FILL_ON_FAILURE; //"abcde12345\0****" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); #ifndef UNICODE //for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) //{ // CPPUNIT_ASSERT(bufMax[i] == TEXT('*')); //} #endif CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); dwFlags = STRSAFE_NULL_ON_FAILURE; //"abcde12345\0****" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); #ifndef UNICODE //for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) //{ // CPPUNIT_ASSERT(bufMax[i] == TEXT('*')); //} #endif CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); dwFlags = STRSAFE_NO_TRUNCATION; //"abcde12345\0****" ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); #ifndef UNICODE //for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) //{ // CPPUNIT_ASSERT(bufMax[i] == TEXT('*')); //} #endif CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); //使用填充字符 -- '?' 对应 0x3F, 默认的填充字符为 NULL dwFlags = STRSAFE_FILL_BYTE('?'); //"abcde12345\0\" 0x3F3F 0x3F3F 0x3F3F 0x3F3F ResetBuf(bufMax,_countof(bufMax)); hr = StringCchPrintfEx(bufMax,_countof(bufMax),&pszDestEnd,&cchRemaining,dwFlags,TEXT("%s"),TEST_STRING); CPPUNIT_ASSERT(hr == S_OK); CPPUNIT_ASSERT(_tcscmp(bufMax,TEXT("abcde12345")) == 0); CPPUNIT_ASSERT(_tcslen(bufMax) == TEST_STRING_LENGTH); CPPUNIT_ASSERT(bufMax[TEST_STRING_LENGTH] == 0); for (INT i = TEST_STRING_LENGTH + 1; i < MAX_BUFFER_SIZE; i++) { #ifdef UNICODE CPPUNIT_ASSERT(bufMax[i] == 0x3F3F); #else CPPUNIT_ASSERT(bufMax[i] == 0x3F); #endif } CPPUNIT_ASSERT(pszDestEnd == &bufMax[TEST_STRING_LENGTH]); CPPUNIT_ASSERT(cchRemaining == MAX_BUFFER_SIZE - TEST_STRING_LENGTH); }
void CEgIStream::Assign( void* inSource, long inBytes ) { UtilStr::Assign( inSource, inBytes ); ResetBuf(); }