bool ParseConversation() { const PClass *type = NULL; int dlgid = -1; unsigned int startpos = StrifeDialogues.Size(); while (!sc.CheckToken('}')) { bool block = false; FName key = ParseKey(true, &block); if (!block) { switch(key) { case NAME_Actor: type = CheckActorType(key); if (namespace_bits == St) { dlgid = CheckInt(key); } break; case NAME_Id: if (namespace_bits == Zd) { dlgid = CheckInt(key); } break; } } else { switch(key) { case NAME_Page: if (!ParsePage()) return false; break; default: sc.UnGet(); Skip(); } } } if (type == NULL && dlgid == 0) { sc.ScriptMessage("No valid actor type defined in conversation."); return false; } SetConversation(dlgid, type, startpos); for(;startpos < StrifeDialogues.Size(); startpos++) { StrifeDialogues[startpos]->SpeakerType = type; } return true; }
HRESULT CDVBSub::ParseSample(IMediaSample* pSample) { CheckPointer(pSample, E_POINTER); HRESULT hr; BYTE* pData = NULL; int nSize; DVB_SEGMENT_TYPE nCurSegment; hr = pSample->GetPointer(&pData); if (FAILED(hr) || pData == NULL) { return hr; } nSize = pSample->GetActualDataLength(); if (*((LONG*)pData) == 0xBD010000) { CGolombBuffer gb(pData, nSize); gb.SkipBytes(4); WORD wLength = (WORD)gb.BitRead(16); UNREFERENCED_PARAMETER(wLength); if (gb.BitRead(2) != 2) { return E_FAIL; // type } gb.BitRead(2); // scrambling gb.BitRead(1); // priority gb.BitRead(1); // alignment gb.BitRead(1); // copyright gb.BitRead(1); // original BYTE fpts = (BYTE)gb.BitRead(1); // fpts BYTE fdts = (BYTE)gb.BitRead(1); // fdts gb.BitRead(1); // escr gb.BitRead(1); // esrate gb.BitRead(1); // dsmtrickmode gb.BitRead(1); // morecopyright gb.BitRead(1); // crc gb.BitRead(1); // extension gb.BitRead(8); // hdrlen if (fpts) { BYTE b = (BYTE)gb.BitRead(4); if (!(fdts && b == 3 || !fdts && b == 2)) { ASSERT(0); return E_FAIL; } REFERENCE_TIME pts = 0; pts |= gb.BitRead(3) << 30; MARKER; // 32..30 pts |= gb.BitRead(15) << 15; MARKER; // 29..15 pts |= gb.BitRead(15); MARKER; // 14..0 pts = 10000 * pts / 90; m_rtStart = pts; m_rtStop = pts + 1; } else { m_rtStart = INVALID_TIME; m_rtStop = INVALID_TIME; } nSize -= 14; pData += 14; pSample->GetTime(&m_rtStart, &m_rtStop); pSample->GetMediaTime(&m_rtStart, &m_rtStop); } else if (SUCCEEDED(pSample->GetTime(&m_rtStart, &m_rtStop))) { pSample->SetTime(&m_rtStart, &m_rtStop); } //FILE* hFile = fopen("D:\\Sources\\mpc-hc\\A garder\\TestSubRip\\dvbsub.dat", "ab"); //if (hFile != NULL) //{ // //BYTE Buff[5] = {48}; // //*((DWORD*)(Buff+1)) = lSampleLen; // //fwrite(Buff, 1, sizeof(Buff), hFile); // fwrite(pData, 1, lSampleLen, hFile); // fclose(hFile); //} if (AddToBuffer(pData, nSize) == S_OK) { CGolombBuffer gb(m_pBuffer + m_nBufferReadPos, m_nBufferWritePos - m_nBufferReadPos); int nLastPos = 0; while (!gb.IsEOF()) { if (gb.ReadByte() == 0x0F) { TRACE_DVB("DVB - ParseSample\n"); WORD wPageId; WORD wSegLength; nCurSegment = (DVB_SEGMENT_TYPE) gb.ReadByte(); wPageId = gb.ReadShort(); wSegLength = gb.ReadShort(); if (gb.RemainingSize() < wSegLength) { hr = S_FALSE; break; } switch (nCurSegment) { case PAGE: { CAutoPtr<DVB_PAGE> pPage; ParsePage(gb, wSegLength, pPage); if (pPage->PageState == DPS_ACQUISITION) { if (m_pCurrentPage != NULL) { m_pCurrentPage->rtStop = max(m_pCurrentPage->rtStop, m_rtStart); m_Pages.AddTail(m_pCurrentPage.Detach()); } UpdateTimeStamp(m_rtStart); m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->PageTimeOut * 1000000; TRACE_DVB("DVB - Page started %S, TimeOut = %d\n", ReftimeToString(m_rtStart), m_pCurrentPage->PageTimeOut); } else { TRACE_DVB("DVB - Page update\n"); if (m_pCurrentPage && !m_pCurrentPage->RegionCount) { m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->PageTimeOut * 1000000; TRACE_DVB("DVB - Page started[update] %S, TimeOut = %d\n", ReftimeToString(m_rtStart), m_pCurrentPage->PageTimeOut); } } } break; case REGION: ParseRegion(gb, wSegLength); TRACE_DVB("DVB - Region\n"); break; case CLUT: ParseClut(gb, wSegLength); TRACE_DVB("DVB - Clut\n"); break; case OBJECT: ParseObject(gb, wSegLength); TRACE_DVB("DVB - Object\n"); break; case DISPLAY: ParseDisplay(gb, wSegLength); TRACE_DVB("DVB - Display\n"); break; case END_OF_DISPLAY: if (m_pCurrentPage != NULL && (m_pCurrentPage->rtStart != m_rtStart)) { m_pCurrentPage->rtStop = max(m_pCurrentPage->rtStop, m_rtStart); TRACE_DVB("DVB - End display %S - %S\n", ReftimeToString(m_pCurrentPage->rtStart), ReftimeToString(m_pCurrentPage->rtStop)); m_Pages.AddTail(m_pCurrentPage.Detach()); } break; default: break; } nLastPos = gb.GetPos(); } } m_nBufferReadPos += nLastPos; } return hr; }
bool CContentParser::ParseSite(const std::string& sURL, boost::property_tree::ptree& xmlResult) { bool bNotEmpty = false; xmlResult.clear(); boost::property_tree::ptree& xmlRoot = xmlResult.put("data", ""); std::size_t nPageCount = 1; std::size_t nEmptyPages = 0; while(1) { try { const std::string sPage = (boost::format(sURL) % nPageCount++).str(); std::cout << (boost::format("Processing page: [%s]...") % sPage).str(); CDownloader Dwnldr; Dwnldr.Open(sPage); std::string sBuffer; Dwnldr.Read(sBuffer); const std::string::size_type encoding = sBuffer.find("charset="); if (encoding != std::string::npos) { const std::string::size_type encodingEnd = sBuffer.find("\"", encoding); if (encodingEnd != std::string::npos) { const std::string encodingValue(sBuffer.substr(encoding + 8, encodingEnd - encoding - 8)); if (boost::algorithm::iequals(encodingValue, "utf-8")) { const std::wstring out = boost::locale::conv::utf_to_utf<wchar_t, char>(sBuffer); sBuffer = boost::locale::conv::from_utf<wchar_t>(out, "cp1251"); } } } std::vector< std::string > vecItems; ParsePage(sBuffer, vecItems); std::cout << (boost::format("\titems parsed: [%s]") % vecItems.size()).str() << std::endl; if (vecItems.empty()) ++nEmptyPages; else nEmptyPages = 0; if (nEmptyPages > 5) break; bNotEmpty = true; std::vector< std::string >::iterator it = vecItems.begin(); const std::vector< std::string >::iterator itEnd = vecItems.end(); BOOST_FOREACH(std::string& sCurrent, vecItems) { xmlRoot.push_back(std::pair< std::string, boost::property_tree::ptree > ("item", boost::property_tree::ptree())); boost::property_tree::ptree& xmlItem = xmlRoot.back().second; ParseItem(sCurrent, xmlItem); } } catch (std::exception& e) { std::cout << e.what() << std::endl; } } return bNotEmpty; }
HRESULT CDVBSub::ParseSample(IMediaSample* pSample) { CheckPointer(pSample, E_POINTER); HRESULT hr; BYTE* pData = nullptr; int nSize; DVB_SEGMENT_TYPE nCurSegment; hr = pSample->GetPointer(&pData); if (FAILED(hr) || pData == nullptr) { return hr; } nSize = pSample->GetActualDataLength(); if (*((LONG*)pData) == 0xBD010000) { CGolombBuffer gb(pData, nSize); gb.SkipBytes(4); WORD wLength = (WORD)gb.BitRead(16); UNREFERENCED_PARAMETER(wLength); if (gb.BitRead(2) != 2) { return E_FAIL; // type } gb.BitRead(2); // scrambling gb.BitRead(1); // priority gb.BitRead(1); // alignment gb.BitRead(1); // copyright gb.BitRead(1); // original BYTE fpts = (BYTE)gb.BitRead(1); // fpts BYTE fdts = (BYTE)gb.BitRead(1); // fdts gb.BitRead(1); // escr gb.BitRead(1); // esrate gb.BitRead(1); // dsmtrickmode gb.BitRead(1); // morecopyright gb.BitRead(1); // crc gb.BitRead(1); // extension gb.BitRead(8); // hdrlen if (fpts) { BYTE b = (BYTE)gb.BitRead(4); if (!(fdts && b == 3 || !fdts && b == 2)) { ASSERT(0); return E_FAIL; } REFERENCE_TIME pts = 0; pts |= gb.BitRead(3) << 30; MARKER; // 32..30 pts |= gb.BitRead(15) << 15; MARKER; // 29..15 pts |= gb.BitRead(15); MARKER; // 14..0 pts = 10000 * pts / 90; m_rtStart = pts; m_rtStop = pts + 1; } else { m_rtStart = INVALID_TIME; m_rtStop = INVALID_TIME; } nSize -= 14; pData += 14; pSample->GetTime(&m_rtStart, &m_rtStop); pSample->GetMediaTime(&m_rtStart, &m_rtStop); } else if (SUCCEEDED(pSample->GetTime(&m_rtStart, &m_rtStop))) { pSample->SetTime(&m_rtStart, &m_rtStop); } if (AddToBuffer(pData, nSize) == S_OK) { CGolombBuffer gb(m_pBuffer + m_nBufferReadPos, m_nBufferWritePos - m_nBufferReadPos); int nLastPos = 0; while (gb.RemainingSize() >= 6) { // Ensure there is enough data to parse the entire segment header if (gb.ReadByte() == 0x0F) { TRACE_DVB(_T("DVB - ParseSample\n")); WORD wPageId; WORD wSegLength; nCurSegment = (DVB_SEGMENT_TYPE)gb.ReadByte(); wPageId = gb.ReadShort(); wSegLength = gb.ReadShort(); if (gb.RemainingSize() < wSegLength) { hr = S_FALSE; break; } switch (nCurSegment) { case PAGE: { if (m_pCurrentPage != nullptr) { TRACE_DVB(_T("DVB - Force End display")); EnqueuePage(m_rtStart); } UpdateTimeStamp(m_rtStart); CAutoPtr<DVB_PAGE> pPage; ParsePage(gb, wSegLength, pPage); if (pPage->pageState == DPS_ACQUISITION || pPage->pageState == DPS_MODE_CHANGE) { m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->pageTimeOut * 10000000; TRACE_DVB(_T("DVB - Page started [pageState = %d] %s, TimeOut = %ds\n"), m_pCurrentPage->pageState, ReftimeToString(m_rtStart), m_pCurrentPage->pageTimeOut); } else if (!m_Pages.IsEmpty()) { m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->pageTimeOut * 10000000; // Copy data from the previous page DVB_PAGE* pPrevPage = m_Pages.GetTail(); memcpy(m_pCurrentPage->regions, pPrevPage->regions, sizeof(m_pCurrentPage->regions)); for (POSITION pos = pPrevPage->objects.GetHeadPosition(); pos;) { m_pCurrentPage->objects.AddTail(pPrevPage->objects.GetNext(pos)->Copy()); } for (POSITION pos = pPrevPage->CLUTs.GetHeadPosition(); pos;) { m_pCurrentPage->CLUTs.AddTail(DEBUG_NEW DVB_CLUT(*pPrevPage->CLUTs.GetNext(pos))); } TRACE_DVB(_T("DVB - Page started [update] %s, TimeOut = %ds\n"), ReftimeToString(m_rtStart), m_pCurrentPage->pageTimeOut); } else { TRACE_DVB(_T("DVB - Page update ignored %s\n"), ReftimeToString(m_rtStart)); } } break; case REGION: ParseRegion(gb, wSegLength); TRACE_DVB(_T("DVB - Region\n")); break; case CLUT: ParseClut(gb, wSegLength); TRACE_DVB(_T("DVB - Clut\n")); break; case OBJECT: ParseObject(gb, wSegLength); TRACE_DVB(_T("DVB - Object\n")); break; case DISPLAY: ParseDisplay(gb, wSegLength); TRACE_DVB(_T("DVB - Display\n")); break; case END_OF_DISPLAY: if (m_pCurrentPage == nullptr) { TRACE_DVB(_T("DVB - Ignored End display %s: no current page\n"), ReftimeToString(m_rtStart)); } else if (m_pCurrentPage->rtStart < m_rtStart) { TRACE_DVB(_T("DVB - End display")); EnqueuePage(m_rtStart); } else { TRACE_DVB(_T("DVB - Ignored End display %s: no information on page duration\n"), ReftimeToString(m_rtStart)); } break; default: break; } nLastPos = gb.GetPos(); } } m_nBufferReadPos += nLastPos; } return hr; }
void CheckMailInbox(Account *curAcc) { // internet connection handle // internet request handle HINTERNET hHTTPConnection = 0, hHTTPRequest = 0; DBVARIANT dbv; static char *contentType = "Content-Type: application/x-www-form-urlencoded"; char requestBuffer[256] = "continue=https%3A%2F%2Fmail.google.com%2Fa%2F"; char fileBuffer[_MAX_DOWN_BUFFER] = ""; char *tail; char str[64]; char temp[_MAX_DOWN_BUFFER] = ""; unsigned long bufferLength; if (curAcc->IsChecking) return; curAcc->IsChecking = TRUE; if (!db_get_s(curAcc->hContact, "CList", "MyHandle", &dbv)) { mir_strcpy(curAcc->results.content, dbv.pszVal); db_free(&dbv); } else mir_strcpy(curAcc->results.content, curAcc->name); tail = strstr(curAcc->results.content, " ["); if (tail) *tail = '\0'; mir_strcat(curAcc->results.content, " ["); mir_strcpy(str, curAcc->results.content); mir_strcat(str, Translate("Checking...")); mir_strcat(str, "]"); db_set_s(curAcc->hContact, "CList", "MyHandle", str); // internet open handle HINTERNET hHTTPOpen = InternetOpenA("", INTERNET_OPEN_TYPE_PRECONFIG, "", "", 0); if (!hHTTPOpen) { mir_strcat(curAcc->results.content, Translate("Can't open Internet!")); goto error_handle; } if (curAcc->hosted[0]) { hHTTPConnection = InternetConnectA(hHTTPOpen, "www.google.com", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (!hHTTPConnection) { mir_strcat(curAcc->results.content, Translate("Can't reach server!")); goto error_handle; } mir_strcpy(str, "/a/"); mir_strcat(str, curAcc->hosted); mir_strcat(str, "/LoginAction"); hHTTPRequest = HttpOpenRequestA(hHTTPConnection, "POST", str, HTTP_VERSIONA, NULL, NULL, INTERNET_FLAG_SECURE, 0); mir_strcat(requestBuffer, curAcc->hosted); mir_strcat(requestBuffer, "%2Ffeed%2Fatom&service=mail&userName="******"&password="******"Can't send account data!")); goto error_handle; } InternetCloseHandle(hHTTPConnection); InternetCloseHandle(hHTTPRequest); hHTTPRequest = 0; } hHTTPConnection = InternetConnectA(hHTTPOpen, "mail.google.com", INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0); if (!hHTTPConnection) { mir_strcat(curAcc->results.content, Translate("Can't reach server!")); goto error_handle; } if (curAcc->hosted[0]) { mir_strcpy(str, "/a/"); mir_strcat(str, curAcc->hosted); mir_strcat(str, "/feed/atom"); } else mir_strcpy(str, "/mail/feed/atom"); hHTTPRequest = HttpOpenRequest(hHTTPConnection, _T("GET"), _A2T(str), NULL, NULL, NULL, INTERNET_FLAG_SECURE | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD, 0); InternetSetOption(hHTTPRequest, INTERNET_OPTION_USERNAME, _A2T(curAcc->name), (int)mir_strlen(curAcc->name) + 1); InternetSetOption(hHTTPRequest, INTERNET_OPTION_PASSWORD, _A2T(curAcc->pass), (int)mir_strlen(curAcc->pass) + 1); if (!HttpSendRequest(hHTTPRequest, NULL, 0, NULL, 0)) { mir_strcat(curAcc->results.content, Translate("Can't get RSS feed!")); goto error_handle; } while (InternetReadFile(hHTTPRequest, temp, _MAX_DOWN_BUFFER, &bufferLength) && bufferLength > 0) { temp[bufferLength] = '\0'; mir_strcat(fileBuffer, temp); } fileBuffer[_MAX_DOWN_BUFFER - 1] = '\0'; curAcc->results_num = ParsePage(fileBuffer, &curAcc->results); if (curAcc->results_num == -1) { mir_strcat(curAcc->results.content, Translate("Wrong name or password!")); goto error_handle; } InternetCloseHandle(hHTTPOpen); InternetCloseHandle(hHTTPConnection); InternetCloseHandle(hHTTPRequest); mir_strcat(curAcc->results.content, _itoa(curAcc->results_num, str, 10)); mir_strcat(curAcc->results.content, "]"); curAcc->IsChecking = FALSE; return; error_handle: curAcc->results_num = -1; InternetCloseHandle(hHTTPOpen); InternetCloseHandle(hHTTPConnection); InternetCloseHandle(hHTTPRequest); mir_strcat(curAcc->results.content, "]"); curAcc->IsChecking = FALSE; }
void ReadCategoryXML(xmlNode * a_node) { xmlNode *cur_node=NULL; for (cur_node = a_node; cur_node; cur_node = cur_node->next) { if (cur_node->type==XML_ELEMENT_NODE){ //<Page> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"Page")){ if(numpage < MAX_ENC_PAGES-1){ numpage++; numtext=0; numimage=0; x=2; y=2; ParsePage(cur_node->properties); } else { LOG_ERROR("Too many Enc Pages, limit of %d hit", MAX_ENC_PAGES); return; } } //<Size> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"Size")) { if (cur_node->children != NULL) size = (xmlStrcasecmp ((xmlChar*)"Big", cur_node->children->content) == 0) ? 1 : 0; } //<Color> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"Color")){ ParseColor(cur_node->properties); if (cur_node->children != NULL) GetColorFromName (cur_node->children->content); } //<Text> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"Text")){ _Text *T=(_Text*)malloc(sizeof(_Text)); _Text *t=&Page[numpage].T; T->Next=NULL; ParseText(cur_node->properties); T->x=x; T->y=y; T->size=size; T->r=r; T->g=g; T->b=b; T->text=NULL; T->ref=NULL; lastextlen = 0; if (cur_node->children != NULL) { MY_XMLSTRCPY (&T->text, (char*)cur_node->children->content); lastextlen = strlen (T->text) * ((T->size) ? 11 : 8); x += lastextlen; } while (t->Next != NULL) t = t->Next; t->Next = T; } //<nl> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"nl")){ x=2; y+=(size)?18:15; } //<nlkx> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"nlkx")){ y+=(size)?18:15; x-=lastextlen; } //<Image> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"image")){ _Image *I=(_Image*)malloc(sizeof(_Image)); _Image *i=&Page[numpage].I; xposupdate=1; yposupdate=1; ParseImage(cur_node->properties); I->mouseover=mouseover; mouseover=0; while(i->Next!=NULL)i=i->Next; I->id=id; I->Next=NULL; if(!I->mouseover){ I->x=x; I->y=y; I->xend=x+xend; I->yend=y+yend; if(xposupdate) x+=xend; if(yposupdate) y+=yend-((size)?18:15); }else{ I->x=i->x; I->y=i->y; I->xend=i->xend; I->yend=i->yend; } I->u=u; I->v=v; I->uend=uend; I->vend=vend; i->Next=I; numimage++; } //<sImage> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"simage")){ _Image *I=(_Image*)malloc(sizeof(_Image)); _Image *i=&Page[numpage].I; int picsperrow,xtile,ytile; float ftsize; xposupdate=1; yposupdate=1; ParseSimage(cur_node->properties); picsperrow=isize/tsize; xtile=tid%picsperrow; ytile=tid/picsperrow; ftsize=(float)tsize/isize; #ifdef NEW_TEXTURES u = ftsize * xtile; v = ftsize * ytile; uend = u + ftsize; vend = v + ftsize; #else /* NEW_TEXTURES */ u=ftsize*xtile; v=-ftsize*ytile; uend=u+ftsize; vend=v-ftsize; #endif /* NEW_TEXTURES */ I->mouseover=mouseover; mouseover=0; while(i->Next!=NULL)i=i->Next; I->id=id; I->Next=NULL; if(!I->mouseover){ I->x=x; I->y=y; I->xend=x+(tsize*((float)ssize/100)); I->yend=y+(tsize*((float)ssize/100)); if(xposupdate) x+=(tsize*((float)ssize/100)); if(yposupdate) y+=(tsize*((float)ssize/100))-((size)?18:15); }else{ I->x=i->x; I->y=i->y; I->xend=i->xend; I->yend=i->yend; } I->u=u; I->v=v; I->uend=uend; I->vend=vend; i->Next=I; numimage++; } //<ddsImage> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"ddsimage")){ _Image *I=(_Image*)malloc(sizeof(_Image)); _Image *i=&Page[numpage].I; int picsperrow,xtile,ytile; float ftsize; xposupdate=1; yposupdate=1; ParseSimage(cur_node->properties); if(size==99) size=99; picsperrow=isize/tsize; xtile=tid%picsperrow; ytile=tid/picsperrow; ftsize=(float)tsize/isize; u=ftsize*xtile; v=ftsize*ytile; uend=u+ftsize; vend=v+ftsize; I->mouseover=mouseover; mouseover=0; while(i->Next!=NULL)i=i->Next; I->id=id; I->Next=NULL; if(!I->mouseover){ I->x=x; I->y=y; I->xend=x+(tsize*((float)ssize/100)); I->yend=y+(tsize*((float)ssize/100)); if(xposupdate) x+=(tsize*((float)ssize/100)); if(yposupdate) y+=(tsize*((float)ssize/100))-((size)?18:15); }else{ I->x=i->x; I->y=i->y; I->xend=i->xend; I->yend=i->yend; } I->u=u; I->v=v; I->uend=uend; I->vend=vend; i->Next=I; numimage++; } //<Pos> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"pos")){ ParsePos(cur_node->properties); } //<link> if(!xmlStrcasecmp(cur_node->name,(xmlChar*)"link")){ _Text *T=(_Text*)malloc(sizeof(_Text)); _Text *t=&Page[numpage].T; ParseLink(cur_node->properties); T->Next=NULL; T->x=x; T->y=y; T->size=size; T->r=r; T->g=g; T->b=b; T->text=NULL; T->ref=NULL; MY_XMLSTRCPY(&T->text, s); MY_XMLSTRCPY(&T->ref, ss); while(t->Next!=NULL)t=t->Next; t->Next=T; x+=strlen(T->text)*((T->size)?11:8); lastextlen=strlen(T->text)*((T->size)?11:8); #ifdef ENCYCL_NAVIGATION save_raw_page_link(T->ref, T->text, numpage); #endif } // See if this is the new maximum length. if(Page[numpage].max_y < y) { Page[numpage].max_y = y; } } ReadCategoryXML(cur_node->children); } }
/* ================ sdDeclRadialMenu::Parse ================ */ bool sdDeclRadialMenu::Parse( const char *text, const int textLength ) { idToken token; idParser src; src.SetFlags( DECL_LEXER_FLAGS ); // src.LoadMemory( text, textLength, GetFileName(), GetLineNum() ); // src.AddIncludes( GetFileLevelIncludeDependencies() ); //sdDeclParseHelper declHelper( this, text, textLength, src ); sdDeclParseHelper declHelper( this, text, textLength, src ); src.SkipUntilString( "{", &token ); bool hadError = false; while( true ) { if( !src.ReadToken( &token )) { src.Error( "sdDeclRadialMenu::Parse: unexpected end of file." ); hadError = true; break; } if( !token.Cmp( "}" )) { break; } if( !token.Icmp( "keys" )) { if( !ParseKeys( src, keys )) { src.Error( "sdDeclRadialMenu::Parse: failed to parse keys" ); hadError = true; break; } continue; } if( !token.Icmp( "title" )) { if( !src.ReadToken( &token )) { src.Error( "sdDeclRadialMenu::Parse: failed to title" ); hadError = true; break; } title = declHolder.FindLocStr( token.c_str() ); continue; } if( !token.Icmp( "page" )) { if( !ParsePage( src )) { src.Error( "sdDeclRadialMenu::Parse: failed to parse page" ); hadError = true; break; } continue; } if( !token.Icmp( "item" )) { if( !ParseItem( src )) { src.Error( "sdDeclRadialMenu::Parse: failed to parse item" ); hadError = true; break; } continue; } } return !hadError; }
HRESULT CDVBSub::ParseSample(IMediaSample* pSample) { CheckPointer (pSample, E_POINTER); HRESULT hr; BYTE* pData = NULL; int nSize; DVB_SEGMENT_TYPE nCurSegment; hr = pSample->GetPointer(&pData); if (FAILED(hr) || pData == NULL) { return hr; } nSize = pSample->GetActualDataLength(); if (*((LONG*)pData) == 0xBD010000) { CGolombBuffer gb (pData, nSize); gb.SkipBytes(4); WORD wLength = (WORD)gb.BitRead(16); UNREFERENCED_PARAMETER(wLength); if (gb.BitRead(2) != 2) { return E_FAIL; // type } gb.BitRead(2); // scrambling gb.BitRead(1); // priority gb.BitRead(1); // alignment gb.BitRead(1); // copyright gb.BitRead(1); // original BYTE fpts = (BYTE)gb.BitRead(1); // fpts BYTE fdts = (BYTE)gb.BitRead(1); // fdts gb.BitRead(1); // escr gb.BitRead(1); // esrate gb.BitRead(1); // dsmtrickmode gb.BitRead(1); // morecopyright gb.BitRead(1); // crc gb.BitRead(1); // extension gb.BitRead(8); // hdrlen if (fpts) { BYTE b = (BYTE)gb.BitRead(4); if (!(fdts && b == 3 || !fdts && b == 2)) { ASSERT(0); return(E_FAIL); } REFERENCE_TIME pts = 0; pts |= gb.BitRead(3) << 30; MARKER; // 32..30 pts |= gb.BitRead(15) << 15; MARKER; // 29..15 pts |= gb.BitRead(15); MARKER; // 14..0 pts = 10000*pts/90; m_rtStart = pts; m_rtStop = pts+1; } else { m_rtStart = INVALID_TIME; m_rtStop = INVALID_TIME; } nSize -= 14; pData += 14; pSample->GetTime(&m_rtStart, &m_rtStop); pSample->GetMediaTime(&m_rtStart, &m_rtStop); } else if (SUCCEEDED (pSample->GetTime(&m_rtStart, &m_rtStop))) { pSample->SetTime(&m_rtStart, &m_rtStop); } if (AddToBuffer (pData, nSize) == S_OK) { CGolombBuffer gb (m_pBuffer+m_nBufferReadPos, m_nBufferWritePos-m_nBufferReadPos); int nLastPos = 0; while (!gb.IsEOF()) { if (gb.ReadByte() == 0x0F) { WORD wPageId; WORD wSegLength; nCurSegment = (DVB_SEGMENT_TYPE) gb.ReadByte(); wPageId = gb.ReadShort(); wSegLength = gb.ReadShort(); if (gb.RemainingSize() < wSegLength) { hr = S_FALSE; break; } TRACE_DVB (_T("DVB - ParseSample, Segment = [%ws], PageId = [%d], SegLength/Buffer = [%d]/[%d]\n"), GetSegmentType(nCurSegment), wPageId, wSegLength, gb.RemainingSize()); switch (nCurSegment) { case PAGE : { CAutoPtr<DVB_PAGE> pPage; ParsePage(gb, wSegLength, pPage); if (pPage->PageState == DPS_ACQUISITION || pPage->PageState == DPS_MODE) { TRACE_DVB (_T("DVB - Page start\n")); if (m_pCurrentPage != NULL) { m_pCurrentPage->rtStop = min(m_pCurrentPage->rtStop, m_rtStart); TRACE_DVB (_T("DVB - store Page : %ws => %ws\n"), ReftimeToString(m_pCurrentPage->rtStart), ReftimeToString(m_pCurrentPage->rtStop)); m_Pages.AddTail (m_pCurrentPage.Detach()); } UpdateTimeStamp(m_rtStart); m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->PageTimeOut * UNITS; // TODO - need to limit the duration of the segment TRACE_DVB (_T("DVB - Page started : %ws, TimeOut = %d\n"), ReftimeToString(m_pCurrentPage->rtStart), m_pCurrentPage->PageTimeOut); } else if (pPage->PageState == DPS_NORMAL) { TRACE_DVB (_T("DVB - Page update\n")); if (m_pCurrentPage && !m_pCurrentPage->RegionCount && pPage->RegionCount) { m_pCurrentPage = pPage; m_pCurrentPage->rtStart = m_rtStart; m_pCurrentPage->rtStop = m_pCurrentPage->rtStart + m_pCurrentPage->PageTimeOut * UNITS; // TODO - need to limit the duration of the segment TRACE_DVB (_T("DVB - Page started[update] : %ws, TimeOut = %d\n"), ReftimeToString(m_pCurrentPage->rtStart), m_pCurrentPage->PageTimeOut); } } } break; case REGION : ParseRegion(gb, wSegLength); TRACE_DVB (_T("DVB - Region\n")); break; case CLUT : ParseClut(gb, wSegLength); TRACE_DVB (_T("DVB - Clut\n")); break; case OBJECT : ParseObject(gb, wSegLength); TRACE_DVB (_T("DVB - Object\n")); break; case DISPLAY : ParseDisplay(gb, wSegLength); TRACE_DVB (_T("DVB - Display\n")); break; case END_OF_DISPLAY : /* if (m_pCurrentPage != NULL && (m_pCurrentPage->rtStart != m_rtStart)) { m_pCurrentPage->rtStop = max(m_pCurrentPage->rtStop, m_rtStart); TRACE_DVB (_T("DVB - End display : %ws => %ws\n"), ReftimeToString(m_pCurrentPage->rtStart), ReftimeToString(m_pCurrentPage->rtStop)); m_Pages.AddTail (m_pCurrentPage.Detach()); } */ TRACE_DVB (_T("DVB - End display\n")); break; default : TRACE_DVB (_T("DVB - unknown Segment\n")); break; } nLastPos = gb.GetPos(); } } m_nBufferReadPos += nLastPos; } return hr; }