void CPlayerLoop::timerEvent(QTimerEvent *event)
{
    if (event->timerId() == m_FrameTimer.timerId()) //если сработал таймер кадров
    {

        if(!m_Log.is_open())
        {
            std::cerr << "Ошибка открытия файла журнала!!!" << std::endl << std::flush;
            m_FrameTimer.stop();
            return;
        }
        //читаем очередной блок из файла журнала
        //создаем объект - парсер файла жкрнала
        CLogParser logParser;

        //Читаем блок из входного потока, пока не встретится пустая строка, признак конца файла или ошибка в данных

        if(!ReadBlockFromStream(m_Log, &logParser) && !m_Log.eof())
        {
            if(logParser.IsError())
            {
                std::cerr << "Ошибка в CLogParser: " << logParser.GetErrorMessage().c_str() << std::endl << std::flush;
            }
            else
            {
                std::cerr << "Ошибка чтения файла!!!" << std::endl << std::flush;
            }

            m_FrameTimer.stop();
            return;
        }
        else
        {
            // отладочный вывод на консоль прочитанных из файла данных
            // ShowMapInText(logParser.GetFrame());

            if (m_Log.eof())
            {
                std::cerr << "Файл успешно прочитан!!!\n";
                m_FrameTimer.stop();
                return;
            }

            UpdatePlayer(logParser);
            ShowFrame();
        }
    }
}
void CWordBinaryMetadataDiscoveryWorker::GetReviewers() 
{
	if(NULL == m_pStreamTable)
		throw Workshare::Exception(_T("NULL pointer encountered (m_pStreamTable)"));

	if(0 == m_FIB.FIBH.nFib)
		throw Workshare::Exception(_T("FIB was not loaded."));

	if (NULL == m_pStrategy)
		throw Workshare::Exception(_T("Encountered NULL pointer (m_pStrategy)"));

	__raise m_pStrategy->OnReviewersBegin();

	//ensure the table of associated strings of reviewers is present
	if(0 == m_FIB.rgfclcb.SttbfRMark.lcb)
	{
		__raise m_pStrategy->OnReviewersEnd();
		return;
	}

	//allocate buffer for associated strings and read them in
	char *pSttbfRMark = new char[m_FIB.rgfclcb.SttbfRMark.lcb];
	ASSERT(pSttbfRMark);
	try
	{
        ReadBlockFromStream(m_pStreamTable, m_FIB.rgfclcb.SttbfRMark, pSttbfRMark);
	}
	catch (std::exception&)
	{
		delete [] pSttbfRMark;
		throw;
	}

	STTBFASSOCHdr* pSttbfAssocHdr = (STTBFASSOCHdr*)pSttbfRMark;
	unsigned short usStringCount = 0;

	bool bExtended = (-1 == pSttbfAssocHdr->extended.sExtended);
	if(bExtended)
		usStringCount = pSttbfAssocHdr->extended.usStringCount;
	else
		usStringCount = pSttbfAssocHdr->normal.usStringCount;

	if(0 < usStringCount)
	{
		char *pStrings = NULL;
		unsigned short usExtraData = 0;

		if(bExtended)
		{
			pStrings = (char*)&(pSttbfAssocHdr->extended.XstzHdr);
			usExtraData = pSttbfAssocHdr->extended.cbExtraData;
		}
		else
		{
			pStrings = (char*)&(pSttbfAssocHdr->normal.CharHdr);
			usExtraData = pSttbfAssocHdr->normal.cbExtraData;
		}

		_bstr_t bstrNextReviewer;
		for(unsigned short usStringIndex = 0; usStringIndex < usStringCount; usStringIndex++)
		{
			bstrNextReviewer = GetStringInSTTBF(bExtended, pStrings, usExtraData).c_str();
			__raise m_pStrategy->OnReviewer(bstrNextReviewer);
		}
	}
	delete [] pSttbfRMark;
		
	__raise m_pStrategy->OnReviewersEnd();
}
void CWordBinaryMetadataDiscoveryWorker::GetLastTenAuthors() 
{
	if(NULL == m_pStreamTable)
		throw Workshare::Exception(_T("NULL pointer encountered (m_pStreamTable)"));

	if(0 == m_FIB.FIBH.nFib)
		throw Workshare::Exception(_T("FIB was not loaded."));

	if (NULL == m_pStrategy)
		throw Workshare::Exception(_T("Encountered NULL pointer (m_pStrategy)"));

	__raise m_pStrategy->OnAuthorsBegin();

	//ensure the table of associated strings of authors is present
	if(0 >= m_FIB.rgpgdbkd.SttbSavedBy.lcb)
	{
		__raise m_pStrategy->OnAuthorsEnd();
		return;
	}

	//allocate buffer for associated strings and read them in
	char *pSttbSavedBy = new char[m_FIB.rgpgdbkd.SttbSavedBy.lcb];
	ASSERT(pSttbSavedBy);

	try
	{
		ReadBlockFromStream(m_pStreamTable, m_FIB.rgpgdbkd.SttbSavedBy, pSttbSavedBy);
	}
	catch (std::exception&)
	{
		delete [] pSttbSavedBy;
		throw;
	}

	STTBFASSOCHdr* pSttbfAssocHdr = (STTBFASSOCHdr*)pSttbSavedBy;
	unsigned short usStringCount = 0;

	bool bExtended = (-1 == pSttbfAssocHdr->extended.sExtended);
	if(bExtended)
		usStringCount = pSttbfAssocHdr->extended.usStringCount;
	else
		usStringCount = pSttbfAssocHdr->normal.usStringCount;

	if(0 < usStringCount)
	{
		char *pStrings = NULL;
		unsigned short usExtraData = 0;

		if(bExtended)
		{
			pStrings = (char*)&(pSttbfAssocHdr->extended.XstzHdr);
			usExtraData = pSttbfAssocHdr->extended.cbExtraData;
		}
		else
		{
			pStrings = (char*)&(pSttbfAssocHdr->normal.CharHdr);
			usExtraData = pSttbfAssocHdr->normal.cbExtraData;
		}

		_bstr_t bstrNextPath;
		_bstr_t bstrNextAuthor;
		for(unsigned short usStringIndex = 0; usStringIndex < usStringCount; usStringIndex += 2)
		{
			//Each author is optionally followed by the path to the saved file
			bstrNextAuthor = GetStringInSTTBF(bExtended, pStrings, usExtraData).c_str();
			bstrNextPath = GetStringInSTTBF(bExtended, pStrings, usExtraData).c_str();
			__raise m_pStrategy->OnAuthor(bstrNextPath, bstrNextAuthor);
		}
	}
	delete [] pSttbSavedBy;

	__raise m_pStrategy->OnAuthorsEnd();
}