示例#1
0
CArchiveScanner::CArchiveScanner()
: isDirty(false)
{
	std::ostringstream file;

	// the "cache" dir is created in DataDirLocater
	file << FileSystem::GetCacheDir();
	file << FileSystem::GetNativePathSeparator();
	file << "ArchiveCache.lua";

	cachefile = file.str();
	ReadCacheData(dataDirLocater.GetWriteDirPath() + GetFilename());

	const std::vector<std::string>& datadirs = dataDirLocater.GetDataDirPaths();
	std::vector<std::string> scanDirs;
	for (std::vector<std::string>::const_reverse_iterator d = datadirs.rbegin(); d != datadirs.rend(); ++d) {
		scanDirs.push_back(*d + "maps");
		scanDirs.push_back(*d + "base");
		scanDirs.push_back(*d + "games");
		scanDirs.push_back(*d + "packages");
	}
	// ArchiveCache has been parsed at this point --> archiveInfos is populated
	ScanDirs(scanDirs, true);
	WriteCacheData(dataDirLocater.GetWriteDirPath() + GetFilename());
}
示例#2
0
int  CStreamParser::MpegStreamSync(  __int64 * checked )
{
	BYTE *ptr ;   
	FRAME_HEADER * head ;
    DWORD synced ;          
    int   count ;
	int   ret = 0;
    
    //Copy to temp buffer 
	if( m_DataLeft < 0 )
	{
		//TRACE( "CStreamParser::MpegStreamSync m_Dataleft = %d\r\n\r\n", m_DataLeft );
		return 0;
	}
    assert( m_DataLeft >= 0 );
    memcpy( m_synTempBuf ,  m_StreamData , m_DataLeft ) ;           
    head = ( FRAME_HEADER * ) m_StreamData ; 
    head->SyncFlag = SYN_HEADER ;
    
    count  = m_DataLeft   ;            
    //shift  = 0xFFFFFFFF   ;
    synced = 0            ;
	//DWORD	SyncFlag = SYN_HEADER;
    while(1)
    {
		ptr   = m_synTempBuf     ;  		    
        while( count > 4  )
		{
			if( *(DWORD*)ptr == SYN_HEADER )
			{
				assert( count >= 0 );
				memcpy( m_StreamData , ptr  ,  count ) ;
				m_DataLeft  =  count ;  
				
				//int test = ( synced - 4 );
				if( checked )
					*checked = ( synced ) ;
				return 1 ;
			}
			ptr++;
			count--;
			synced++ ;//同步掉的字节数,即从当前字节直到找到SYN_HEADER字节扔掉的字节数
		}
		//Copy剩下的四个字节
		memcpy( m_synTempBuf, ptr, count );
		ptr = m_synTempBuf + count;
		ret =  ReadCacheData( ptr , MAX_STREAM_BUFFER_LEN - count ) ; //同步时尽量多读点
        if( ret <= 0 )
			return ret;
		count += ret;
	}
	//return 0 ;
}
CArchiveScanner::CArchiveScanner()
: isDirty(false)
{
	// the "cache" dir is created in DataDirLocater
	const std:: string cacheFolder = dataDirLocater.GetWriteDirPath() + FileSystem::EnsurePathSepAtEnd(FileSystem::GetCacheBaseDir());
	cachefile = cacheFolder + IntToString(INTERNAL_VER, "ArchiveCache%i.lua");
	ReadCacheData(GetFilepath());
	if (archiveInfos.empty()) {
		// when versioned ArchiveCache%i.lua is missing or empty, try old unversioned filename
		ReadCacheData(cacheFolder + "ArchiveCache.lua");
	}

	const std::vector<std::string>& datadirs = dataDirLocater.GetDataDirPaths();
	std::vector<std::string> scanDirs;
	for (auto d = datadirs.rbegin(); d != datadirs.rend(); ++d) {
		scanDirs.push_back(*d + "maps");
		scanDirs.push_back(*d + "base");
		scanDirs.push_back(*d + "games");
		scanDirs.push_back(*d + "packages");
	}
	// ArchiveCache has been parsed at this point --> archiveInfos is populated
	ScanDirs(scanDirs, true);
	WriteCacheData(GetFilepath());
}
示例#4
0
void CArchiveScanner::Reload()
{
	// {Read,Write,Scan}* all grab this too but we need the entire reloading-sequence to appear atomic
	std::lock_guard<spring::recursive_mutex> lck(scannerMutex);

	// dtor
	if (isDirty)
		WriteCacheData(GetFilepath());

	archiveInfos.clear();
	brokenArchives.clear();
	cachefile.clear();

	// ctor
	ReadCacheData(cachefile = FileSystem::EnsurePathSepAtEnd(FileSystem::GetCacheDir()) + IntToString(INTERNAL_VER, "ArchiveCache%i.lua"));
	ScanAllDirs();
}
示例#5
0
void CSimRequest::RunL()
{
    TBool stop = EFalse;
    
    if (iStage == EUninitialized) {
        iStage = EInitialized;
        
        if (iType == EHistoryCache) {
            stop = CheckFile();
        }
        else if (iType == EFileCache) {
            iObserver->OnSimRequestData(MSimRequestObserver::ESimReqHeader);
        }
        else if (iType == ESimNoCacheError) {
            iObserver->OnSimRequestData(MSimRequestObserver::ESimReqNoCache);
            stop = ETrue;
        }
        else if (iType == ESimApError) {
            iObserver->OnSimRequestData(MSimRequestObserver::ESimReqError);
            stop = ETrue;
        }
        else
            stop = ETrue;
    }
    else if (iStage != EError) {
        
        if (iType == EHistoryCache)
            stop = ReadData();
        else if (iType == EFileCache)
            stop = ReadCacheData();
        else
            stop = ETrue;
    }
    
    if (stop) {
        iStage = EError;
    }
    else {
        iTimer.After(iStatus, 5);
        SetActive();
    }
}
示例#6
0
CArchiveScanner::CArchiveScanner()
: isDirty(false)
{
	std::ostringstream file;
	// the "cache" dir is created in DataDirLocater
	file << "cache" << (char)FileSystemHandler::GetNativePathSeparator() << "ArchiveCache.lua";
	cachefile = file.str();
	FileSystemHandler& fsh = FileSystemHandler::GetInstance();
	ReadCacheData(fsh.GetWriteDir() + GetFilename());

	const std::vector<std::string>& datadirs = fsh.GetDataDirectories();
	std::vector<std::string> scanDirs;
	for (std::vector<std::string>::const_reverse_iterator d = datadirs.rbegin(); d != datadirs.rend(); ++d) {
		scanDirs.push_back(*d + "maps");
		scanDirs.push_back(*d + "base");
		scanDirs.push_back(*d + "mods");
		scanDirs.push_back(*d + "packages");
	}
	ScanDirs(scanDirs, true);
	WriteCacheData(fsh.GetWriteDir() + GetFilename());
}
示例#7
0
//
//    GetOneFrame
//    从内部数据区解析一帧(包括4个字节的尾部),如果失去同步,则自动进行同步处理    
//
//int  CStreamParser::GetOneFrameAndTail( BYTE * dst , FRAME_HEADER  * frameHeader  )
//增加同步头,无同步尾
int  CStreamParser::GetOneFrame( BYTE * dst , FRAME_HEADER  * frameHeader  )
{   
    FRAME_HEADER * head ;
    BYTE *pBuf ;      
    int ret  ;
    int  len = 0 ;   
    int retval = 0;

    //先填充一个帧头长的数据
	if( m_DataLeft < sizeof(FRAME_HEADER) )
    {                            
        BYTE* pData = m_StreamData + m_DataLeft ; 
		
        ret = ReadCacheData( pData , sizeof(FRAME_HEADER) - m_DataLeft ) ;
        if( ret <= 0 )
		{
			//TRACE(_T("ReadCacheData return:%d  \r\n",ret);
			return ret;
		}
        m_DataLeft  +=  ret ;           
    }
	head = ( FRAME_HEADER * ) m_StreamData ; 
    pBuf = ( BYTE * )( head + 1 ) ;
	while(1)
	{	  
		if ( head->SyncFlag == SYN_HEADER )	
		{

			if( m_DataLeft < sizeof(FRAME_HEADER) )//缓冲中不够一个帧头的长度
			{
				ReadCacheData( m_StreamData + m_DataLeft, sizeof(FRAME_HEADER) - m_DataLeft );
				m_DataLeft = sizeof( FRAME_HEADER );
			}
			len = htonl( head->FrameLength) ; 
			ret         = len ; 

			memcpy( frameHeader, head, sizeof(FRAME_HEADER) );
			m_DataLeft -= sizeof( FRAME_HEADER );
			if( ret <= 0 )
			{
			  //TRACE(_T("帧长度异常为负数 ret = %d\r\n", ret );
			  return ret;
			}
			if( ret > (MAX_FRAME_LENGTH - 1024 * 1024) )
			{
			  //TRACE(_T("帧太长 ret = %d\r\n", ret );
			  return -1;
			}	       

			if( len <= m_DataLeft )//如果缓冲中有数据
			{    
			  //最后的剩余数据
			  assert( len > 0 );
			  memcpy( dst , pBuf , len    ) ;
                
			  //Adjust the internal buffer
			  m_DataLeft   -=  len ;
			  pBuf         +=  len ;
			  assert( m_DataLeft >= 0 );
			  memmove( m_StreamData , pBuf , m_DataLeft ) ;
			  if( ret <= 0 )
			  {
				//TRACE(_T("GetOneFrame::ret = %d\r\n", ret);
			  }
			  return ret ;		  
			}				    

			//data is not enough, we should read more
			if(m_DataLeft < 0)
			  m_DataLeft = 0;
			assert( m_DataLeft >= 0 );
			if( m_DataLeft > 0 )
				memcpy( dst , pBuf , m_DataLeft ) ;				  

			len -= m_DataLeft ;
			dst += m_DataLeft ;                    
			m_DataLeft  = 0     ;
			while( len > 0 )//不可能死循环
			{
				//接下来从直接从Cache中读数据
				retval = ReadCacheData( dst, len );
				if( retval <= 0 )
					return retval;
				len -= retval;
				dst += retval;
			}
			return ret;
		}

		//帧没有同步上,开始进行同步搜索
        ret =  MpegStreamSync( NULL );
		if( ret <= 0 )
		{
			//TRACE(_T("GetOneFrame::MpegStreamSync return 0\r\n");
			return ret ;
		}

		head = ( FRAME_HEADER * ) m_StreamData ; 
		pBuf = ( BYTE * )( head + 1 ) ;		    		
	} 	
}
示例#8
0
CArchiveScanner::CArchiveScanner(): isDirty(false)
{
	// the "cache" dir is created in DataDirLocater
	ReadCacheData(cachefile = FileSystem::EnsurePathSepAtEnd(FileSystem::GetCacheDir()) + IntToString(INTERNAL_VER, "ArchiveCache%i.lua"));
	ScanAllDirs();
}