void CPlayerPlaylistBar::Append(CStringW vdn, CStringW adn, int vinput, int vchannel, int ainput) { CPlaylistItem pli; pli.m_type = CPlaylistItem::device; pli.m_fns.AddTail(CString(vdn)); pli.m_fns.AddTail(CString(adn)); pli.m_vinput = vinput; pli.m_vchannel = vchannel; pli.m_ainput = ainput; CAtlList<CStringW> sl; CStringW vfn = GetFriendlyName(vdn); CStringW afn = GetFriendlyName(adn); if (!vfn.IsEmpty()) { sl.AddTail(vfn); } if (!afn.IsEmpty()) { sl.AddTail(afn); } CStringW label = Implode(sl, '|'); label.Replace(L"|", L" - "); pli.m_label = CString(label); m_pl.AddTail(pli); Refresh(); SavePlaylist(); }
void File::ParseTypes(InputStream& s, CAtlList<CStringW>& types) { types.RemoveAll(); CStringW str; for(int c = s.SkipWhiteSpace(); iswcsym(c) || c == '.' || c == '@'; c = s.PeekChar()) { c = s.GetChar(); if(c == '.') { if(str.IsEmpty()) s.ThrowError(_T("'type' cannot be an empty string")); if(!iswcsym(s.PeekChar())) s.ThrowError(_T("unexpected dot after type '%s'"), CString(str)); types.AddTail(str); str.Empty(); } else { if(str.IsEmpty() && iswdigit(c)) s.ThrowError(_T("'type' cannot start with a number")); if((!str.IsEmpty() || !types.IsEmpty()) && c == '@') s.ThrowError(_T("unexpected @ in 'type'")); str += (WCHAR)c; } } if(!str.IsEmpty()) { types.AddTail(str); } }
void Skein::UpdateAfterPlaying(const CStringW& transcript) { // Update the status of the last played node if (transcript.IsEmpty() == FALSE) m_played->NewTranscriptText(transcript); NotifyChange(NodeColourChanged); if (transcript.IsEmpty() == FALSE) NotifyShowNode(m_played,ShowNewTranscript); }
void EditFind::Create(SourceEdit* edit, bool findOnly) { if (m_dialog != NULL) { if (findOnly == m_findOnly) { m_dialog->SetActiveWindow(); m_dialog->ShowWindow(SW_SHOW); return; } Destroy(); } m_edit = edit; m_findOnly = findOnly; // Use the current selection or, if empty, the previous search text to // populate the find dialog. CHARRANGE sel = edit->GetSelect(); CStringW findText = edit->GetTextRange(sel.cpMin,sel.cpMax); if (findText.IsEmpty()) findText = m_lastFind; m_dialog = FindReplaceDialog::Create(findOnly ? TRUE : FALSE,findText, m_searchDown,m_matchCase,m_matchWholeWord,edit); m_dialog->SetActiveWindow(); m_dialog->ShowWindow(SW_SHOW); }
static void SaveMediaType(CStringW DisplayName, AM_MEDIA_TYPE* pmt) { if(DisplayName.IsEmpty() || !pmt) return; AfxGetApp()->WriteProfileBinary(_T("Capture\\") + CString(DisplayName), _T("MediaType"), (BYTE*)pmt, sizeof(AM_MEDIA_TYPE)); AfxGetApp()->WriteProfileBinary(_T("Capture\\") + CString(DisplayName), _T("Format"), pmt->pbFormat, pmt->cbFormat); }
STDMETHODIMP CSSFInputPinHepler::Receive( IMediaSample* pSample ) { REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; HRESULT hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); bool fInvalidate = false; if(m_mt.majortype == MEDIATYPE_Subtitle) { if(m_mt.subtype == MEDIASUBTYPE_SSF) { CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { m_pSSF->Append(tStart, tStop, str); } else { XY_LOG_WARN("Empty data"); } } } return S_OK; }
ATL_NOINLINE void ParseCommandLine( int argc, wchar_t *argvW[], CStringW & wszUrl, BOOL fHasInvalid) { for (int i=1; i<argc; i++) { if (argvW[i][0] != L'/') { if (wszUrl.IsEmpty()) { wszUrl = argvW[i]; } else { EmitCmdLineWarning(IDS_SDL_IGNORE_CMDITEM, argvW[i]); } } else if (fHasInvalid != FALSE) { DWORD dwOpt = GetOption(argvW[i]); if (dwOpt == 0) { EmitCmdLineWarning(IDS_SDL_IGNORE_CMDITEM, argvW[i]); } } } return; }
BOOL SetLanguageSpecifigHandles(LPCWSTR szAppPath) { CRegKey RegKey; CStringW LangFile; if (RegKey.OpenKey(HKCU,g_szRegKey, CRegKey::openExist|CRegKey::samRead)==ERROR_SUCCESS) { RegKey.QueryValue(L"Language",LangFile); RegKey.CloseKey(); } if (LangFile.IsEmpty()) LangFile=L"lan_en.dll"; CStringW Path(szAppPath,LastCharIndex(szAppPath,L'\\')+1); HINSTANCE hLib=FileSystem::LoadLibrary(Path+LangFile); if (hLib==NULL) { hLib=FileSystem::LoadLibrary(Path+"lan_en.dll"); if (hLib==NULL) { fwprintf(stderr,L"Cannot load language file '%s'\n",(LPCWSTR)Path); return FALSE; } fwprintf(stderr,L"Cannot load language file '%s', using 'lan_en.dll'\n",(LPCWSTR)LangFile); } SetResourceHandle(hLib,LanguageSpecificResource); return TRUE; }
void CCDecoder::SaveDisp(__int64 time) { CStringW str; for (size_t row = 0; row < 16; row++) { bool fNonEmptyRow = false; for (size_t col = 0; col < 32; col++) { if (m_disp[row][col]) { CStringW str2(&m_disp[row][col]); if (fNonEmptyRow) { str += ' '; } str += str2; col += str2.GetLength(); fNonEmptyRow = true; } } if (fNonEmptyRow) { str += '\n'; } } if (str.IsEmpty()) { return; } m_sts.Add(str, true, (int)m_time, (int)time); }
STDMETHODIMP CSubPicAllocatorPresenterImpl::GetString(LPCSTR field, LPWSTR* value, int* chars) { CheckPointer(value, E_POINTER); CheckPointer(chars, E_POINTER); CStringW ret = nullptr; if (!strcmp(field, "name")) { ret = L"MPC-HC"; } else if (!strcmp(field, "version")) { ret = VersionInfo::GetVersionString(); } else if (!strcmp(field, "yuvMatrix")) { ret = L"None"; if (m_inputMediaType.IsValid() && m_inputMediaType.formattype == FORMAT_VideoInfo2) { VIDEOINFOHEADER2* pVIH2 = (VIDEOINFOHEADER2*)m_inputMediaType.pbFormat; if (pVIH2->dwControlFlags & AMCONTROL_COLORINFO_PRESENT) { DXVA2_ExtendedFormat& flags = (DXVA2_ExtendedFormat&)pVIH2->dwControlFlags; ret = (flags.NominalRange == DXVA2_NominalRange_Normal) ? L"PC." : L"TV."; switch (flags.VideoTransferMatrix) { case DXVA2_VideoTransferMatrix_BT601: ret.Append(L"601"); break; case DXVA2_VideoTransferMatrix_BT709: ret.Append(L"709"); break; case DXVA2_VideoTransferMatrix_SMPTE240M: ret.Append(L"240M"); break; default: ret = L"None"; break; } } } } if (!ret.IsEmpty()) { int len = ret.GetLength(); size_t sz = (len + 1) * sizeof(WCHAR); LPWSTR buf = (LPWSTR)LocalAlloc(LPTR, sz); if (!buf) { return E_OUTOFMEMORY; } wcscpy_s(buf, len + 1, ret); *chars = len; *value = buf; return S_OK; } return E_INVALIDARG; }
STDMETHODIMP IDSMPropertyBagImpl::Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog* pErrorLog) { CheckPointer(pVar, E_POINTER); if(pVar->vt != VT_EMPTY) return E_INVALIDARG; CStringW value = Lookup(pszPropName); if(value.IsEmpty()) return E_FAIL; CComVariant(value).Detach(pVar); return S_OK; }
//选择保存目录 void CDlgFileConv::OnSelectDstDir() { CStringW strDir = SelectDirectory(_T("请选择保存目录:")); if (!strDir.IsEmpty()) m_strDstDir = strDir; else return; UpdateData(FALSE); }
void File::ParseName(InputStream& s, CStringW& name) { name.Empty(); for(int c = s.SkipWhiteSpace(); iswcsym(c); c = s.PeekChar()) { if(name.IsEmpty() && iswdigit(c)) s.ThrowError(_T("'name' cannot start with a number")); name += (WCHAR)s.GetChar(); } }
std::vector<CStringW> Unzip::Extract(LPCWSTR pszFilename, LPCWSTR pszFolder, std::function<bool(LPCWSTR filePath, DWORD& flagsAndAttributes)> predicate) { std::vector<CStringW> result; unzFile uf = NULL; try { uf = Unzip_Open(pszFilename); unz_global_info gi; if (UNZ_OK != unzGetGlobalInfo(uf, &gi)) throw runtime_error("failed to unzGetGlobalInfo"); for (uLong i = 0; i < gi.number_entry; ++i) { FILETIME ftLocal; CStringW path = CStringW(pszFolder) + L'\\' + Unzip_GetCurentFilePath(uf, ftLocal); CStringW filename = path.Mid(path.ReverseFind(L'\\') + 1); if (filename.IsEmpty()) { if (!CreateDirectoryW(path, NULL)) throw runtime_error("failed to CreateDirectory"); continue; } DWORD flagsAndAttributes = FILE_ATTRIBUTE_NORMAL; if (predicate(path, flagsAndAttributes)) { Unzip_ExtractFile(uf, path, flagsAndAttributes, ftLocal); result.push_back(path); } if (i + 1 < gi.number_entry && UNZ_OK != unzGoToNextFile(uf)) throw runtime_error("failed to unzGoToNextFile"); } unzClose(uf); return result; } catch (...) { if (uf != NULL) unzClose(uf); for each (auto file in result) DeleteFileW(file); throw; } }
CStringW CSilEncConverter::Convert(const CStringW& strInput) { // if it's connected (now) AND if the string isn't empty... CComBSTR strOutput; if( !!(*this) && !strInput.IsEmpty() ) { // then we're all set: call Convert if (IsSEC30()) ProcessHResult(m_aEC30->Convert(CComBSTR(strInput), &strOutput), m_aEC30, __uuidof(ECInterfaces::IEncConverter)); else if (IsSEC22()) ProcessHResult(m_aEC22->Convert(CComBSTR(strInput), &strOutput), m_aEC22, __uuidof(SilEncConverters22::IEncConverter)); } return CStringW(strOutput); }
void File::ParseDefs(InputStream& s, Reference* pParentRef) { while(s.SkipWhiteSpace(L";") != '}' && s.PeekChar() != Stream::EOS) { NodePriority priority = PNormal; CAtlList<CStringW> types; CStringW name; int c = s.SkipWhiteSpace(); if(c == '*') {s.GetChar(); priority = PLow;} else if(c == '!') {s.GetChar(); priority = PHigh;} ParseTypes(s, types); if(s.SkipWhiteSpace() == '#') { s.GetChar(); ParseName(s, name); } if(types.IsEmpty()) { if(name.IsEmpty()) s.ThrowError(_T("syntax error")); types.AddTail(L"?"); } Reference* pRef = pParentRef; while(types.GetCount() > 1) pRef = CreateRef(CreateDef(pRef, types.RemoveHead())); Definition* pDef = NULL; if(!types.IsEmpty()) pDef = CreateDef(pRef, types.RemoveHead(), name, priority); c = s.SkipWhiteSpace(L":="); if(c == '"' || c == '\'') ParseQuotedString(s, pDef); else if(iswdigit(c) || c == '+' || c == '-') ParseNumber(s, pDef); else if(pDef->IsType(L"@")) ParseBlock(s, pDef); else ParseRefs(s, pDef); } s.GetChar(); }
BOOL CFCacheImpl::AddFile( LPCWSTR lpFilePath, ULONGLONG qwFileSize ) { BOOL retval = FALSE; int nRetCode; char* szError = NULL; CStringA strSql; CStringW strFilePath; CStringW strExt; int nExt; if (!m_pDbConnect) goto clean0; if (!lpFilePath) goto clean0; strFilePath = lpFilePath; strFilePath.MakeLower(); nExt = strFilePath.ReverseFind(_T('.')); if (nExt != -1 && nExt > strFilePath.ReverseFind(_T('\\'))) { strExt = strFilePath.Right(strFilePath.GetLength() - nExt); } if (strExt.IsEmpty()) { strExt = _T(".n/a"); } strSql.Format("insert into files values('%s', '%s', %I64d)", KUTF16_To_UTF8(strFilePath), KUTF16_To_UTF8(strExt), qwFileSize); nRetCode = sqlite3_exec(m_pDbConnect, strSql, NULL, NULL, &szError); if (nRetCode) goto clean0; retval = TRUE; clean0: return retval; }
//转换源文件 void CDlgFileConv::OnSelectSrcFile() { CStringW strFile = SelectFile(_T("所有文件"), _T("")); if (!strFile.IsEmpty()) m_strSrcFile = strFile; else return; double prob; std::string charset = utils::GetFileCharset(CStringToUTF8string(strFile), prob, 1000); if (!charset.empty() && prob > 0.95) m_strSrcCharset = UTF8stringToCString(charset); else m_strSrcCharset = _T(""); UpdateData(FALSE); }
//##ModelId=474D3076032D bool CClip_ImportExport::Append_CF_TEXT_AND_CF_UNICODETEXT(CStringA &csCF_TEXT, CStringW &csCF_UNICODETEXT) { bool bRet = false; CClipFormat *pCF; int nCount = m_Formats.GetSize(); for(int i = 0; i < nCount; i++) { pCF = &m_Formats.ElementAt(i); switch(pCF->m_cfType) { case CF_TEXT: { const char *Data = (const char *)GlobalLock(pCF->m_hgData); if(Data) { if(csCF_TEXT.IsEmpty() == FALSE) csCF_TEXT += "\r\n"; csCF_TEXT += Data; bRet = true; GlobalUnlock(pCF->m_hgData); } } break; case CF_UNICODETEXT: { const wchar_t *Data = (const wchar_t *)GlobalLock(pCF->m_hgData); if(Data) { if(csCF_UNICODETEXT.IsEmpty() == FALSE) csCF_UNICODETEXT += _T("\r\n"); csCF_UNICODETEXT += Data; bRet = true; GlobalUnlock(pCF->m_hgData); } } break; } } return bRet; }
//加载字体信息 void CxResLibImgList::OnLoadTextFont() { if (m_pFont != NULL) { delete m_pFont; m_pFont = NULL; } CStringW strW; strW = m_strFontFamilyName; if (strW.IsEmpty()) strW = L"宋体"; FontFamily family((WCHAR *)(LPCWSTR)strW); m_pFont = new Gdiplus::Font(&family, 12, FontStyleRegular, UnitPixel); //m_FontFormat.SetAlignment(StringAlignmentNear); //m_FontFormat.SetLineAlignment(StringAlignmentFar); m_FontFormat.SetAlignment(StringAlignmentCenter); //水平方向 //m_FontFormat.SetLineAlignment(StringAlignmentCenter); //垂直方向 m_FontColor = Color::Black; }
BOOL CStubbornFiles::IsStubbornFile(const CStringW& strFilePath) { BOOL retval = FALSE; CStringW strTempPath = strFilePath; CAtlMap<CStringW, BOOL>::CPair* pPair = NULL; KAutoLock lock(klock); if (strFilePath.IsEmpty()) goto clean0; strTempPath.MakeLower(); // static bool btest = FALSE; // // if(!btest) // { // POSITION pos = m_fileList.GetHeadPosition(); // while (pos) // { // // // ::OutputDebugString(m_fileList.GetNext(pos)); // // } // // btest = true; // // } pPair = m_fileMap.Lookup(strTempPath); if (!pPair) goto clean0; retval = TRUE; clean0: return retval; }
//转换源目录 void CDlgFileConv::OnSelectSrcDir() { UpdateData(TRUE); CStringW strDir = SelectDirectory(_T("请选择一个要转换的目录:")); if (!strDir.IsEmpty()) m_strSrcDir = strDir; else return; std::string charset; foreach_file(CStringToUTF8string(strDir).c_str(), find_file_charset_of_src_dir, m_bRecurDir, 1, &charset); if (!charset.empty()) m_strSrcCharset = UTF8stringToCString(charset); else m_strSrcCharset = _T(""); UpdateData(FALSE); }
void CStubbornFiles::AddFile(const CStringW& strFilePath) { CStringW strTempPath = strFilePath; CAtlMap<CStringW, BOOL>::CPair* pPair = NULL; KAutoLock lock(klock); if (strFilePath.IsEmpty()) goto clean0; strTempPath.MakeLower(); pPair = m_fileMap.Lookup(strTempPath); if (pPair) goto clean0; m_fileMap[strTempPath] = TRUE; m_fileList.AddTail(strTempPath); clean0: return; }
BOOL CStubbornRegs::IsStubbornReg(const CStringW& strRegPath) { BOOL retval = FALSE; CStringW strTempPath = strRegPath; CAtlMap<CStringW, BOOL>::CPair* pPair = NULL; KAutoLock lock(klock); if (strRegPath.IsEmpty()) goto clean0; strTempPath.MakeLower(); pPair = m_regMap.Lookup(strTempPath); if (!pPair) goto clean0; retval = TRUE; clean0: return retval; }
//##ModelId=474D3076034C bool CClip_ImportExport::PlaceCF_TEXT_AND_CF_UNICODETEXT_OnClipboard(CStringA &csCF_TEXT, CStringW &csCF_UNICODETEXT) { bool bRet = false; if(OpenClipboard(theApp.m_MainhWnd)) { EmptyClipboard(); if(csCF_TEXT.IsEmpty() == FALSE) { long lLen = csCF_TEXT.GetLength(); HGLOBAL hGlobal = NewGlobalP(csCF_TEXT.GetBuffer(lLen), lLen+1); csCF_TEXT.ReleaseBuffer(); SetClipboardData(CF_TEXT, hGlobal); bRet = true; } if(csCF_UNICODETEXT.IsEmpty() == FALSE) { long lLen = csCF_UNICODETEXT.GetLength() * sizeof(wchar_t); HGLOBAL hGlobal = NewGlobalP(csCF_UNICODETEXT.GetBuffer(lLen), lLen+1); csCF_UNICODETEXT.ReleaseBuffer(); SetClipboardData(CF_UNICODETEXT, hGlobal); bRet = true; } CloseClipboard(); } else { Log(_T("Error opening clipboard")); } return bRet; }
REFERENCE_TIME CSubtitleInputPin::DecodeSample(const CAutoPtr<SubtitleSample>& pSample) { bool bInvalidate = false; if (m_mt.majortype == MEDIATYPE_Text) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; char* pData = (char*)pSample->data.data(); if (!strncmp(pData, __GAB1__, strlen(__GAB1__))) { char* ptr = &pData[strlen(__GAB1__) + 1]; char* end = &pData[pSample->data.size()]; while (ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if (tag == __GAB1_LANGUAGE__) { pRTS->m_name = CString(ptr); } else if (tag == __GAB1_ENTRY__) { pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr + 4)); bInvalidate = true; } else if (tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if (tag == __GAB1_ENTRY_UNICODE__) { pRTS->Add((WCHAR*)(ptr + 8), true, *(int*)ptr, *(int*)(ptr + 4)); bInvalidate = true; } ptr += size; } } else if (!strncmp(pData, __GAB2__, strlen(__GAB2__))) { char* ptr = &pData[strlen(__GAB2__) + 1]; char* end = &pData[pSample->data.size()]; while (ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if (tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if (tag == __GAB1_RAWTEXTSUBTITLE__) { pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, pRTS->m_name); bInvalidate = true; } ptr += size; } } else if (pSample->data.size() > 1 && *pData != '\0') { CStringA str(pData, (int)pSample->data.size()); str.Replace("\r\n", "\n"); str.Trim(); if (!str.IsEmpty()) { pRTS->Add(AToW(str), false, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000)); bInvalidate = true; } } } else if (m_mt.majortype == MEDIATYPE_Subtitle) { if (m_mt.subtype == MEDIASUBTYPE_UTF8) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pSample->data.data(), (int)pSample->data.size())).Trim(); if (!str.IsEmpty()) { pRTS->Add(str, true, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000)); bInvalidate = true; } } else if (m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pSample->data.data(), (int)pSample->data.size())).Trim(); if (!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if (sl.GetCount() == (size_t)fields) { stse.readorder = wcstol(sl.RemoveHead(), nullptr, 10); stse.layer = wcstol(sl.RemoveHead(), nullptr, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), nullptr, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), nullptr, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), nullptr, 10); if (fields == 10) { stse.marginRect.bottom = wcstol(sl.RemoveHead(), nullptr, 10); } stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if (!stse.str.IsEmpty()) { pRTS->Add(stse.str, true, (int)(pSample->rtStart / 10000), (int)(pSample->rtStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); bInvalidate = true; } } } else if (m_mt.subtype == MEDIASUBTYPE_VOBSUB) { CVobSubStream* pVSS = (CVobSubStream*)(ISubStream*)m_pSubStream; pVSS->Add(pSample->rtStart, pSample->rtStop, pSample->data.data(), (int)pSample->data.size()); } else if (IsRLECodedSub(&m_mt)) { CRLECodedSubtitle* pRLECodedSubtitle = (CRLECodedSubtitle*)(ISubStream*)m_pSubStream; pRLECodedSubtitle->ParseSample(pSample->rtStart, pSample->rtStop, pSample->data.data(), (int)pSample->data.size()); } } return bInvalidate ? pSample->rtStart : -1; }
HRESULT CStreamSwitcherInputPin::CompleteConnect(IPin* pReceivePin) { HRESULT hr = __super::CompleteConnect(pReceivePin); if(FAILED(hr)) return hr; ((CStreamSwitcherFilter*)m_pFilter)->CompleteConnect(PINDIR_INPUT, this, pReceivePin); m_fCanBlock = false; bool fForkedSomewhere = false; CStringW fileName; CStringW pinName; IPin* pPin = (IPin*)this; IBaseFilter* pBF = (IBaseFilter*)m_pFilter; while((pPin = GetUpStreamPin(pBF, pPin)) && (pBF = GetFilterFromPin(pPin))) { if(IsSplitter(pBF)) { pinName = GetPinName(pPin); } CLSID clsid = GetCLSID(pBF); if(clsid == CLSID_AviSplitter || clsid == CLSID_OggSplitter) m_fCanBlock = true; int nIn, nOut, nInC, nOutC; CountPins(pBF, nIn, nOut, nInC, nOutC); fForkedSomewhere = fForkedSomewhere || nIn > 1 || nOut > 1; if(CComQIPtr<IFileSourceFilter> pFSF = pBF) { WCHAR* pszName = NULL; AM_MEDIA_TYPE mt; if(SUCCEEDED(pFSF->GetCurFile(&pszName, &mt)) && pszName) { fileName = pszName; CoTaskMemFree(pszName); fileName.Replace('\\', '/'); CStringW fn = fileName.Mid(fileName.ReverseFind('/')+1); if(!fn.IsEmpty()) fileName = fn; if(!pinName.IsEmpty()) fileName += L" / " + pinName; WCHAR* pName = new WCHAR[fileName.GetLength()+1]; if(pName) { wcscpy(pName, fileName); if(m_pName) delete [] m_pName; m_pName = pName; } } break; } pPin = GetFirstPin(pBF); } if(!fForkedSomewhere) m_fCanBlock = true; m_hNotifyEvent = NULL; return S_OK; }
STDMETHODIMP CSubtitleInputPin::Receive(IMediaSample* pSample) { HRESULT hr; hr = __super::Receive(pSample); if(FAILED(hr)) return hr; CAutoLock cAutoLock(&m_csReceive); REFERENCE_TIME tStart, tStop; pSample->GetTime(&tStart, &tStop); tStart += m_tStart; tStop += m_tStart; BYTE* pData = NULL; hr = pSample->GetPointer(&pData); if(FAILED(hr) || pData == NULL) return hr; int len = pSample->GetActualDataLength(); bool fInvalidate = false; if(m_mt.majortype == MEDIATYPE_Text) { CAutoLock cAutoLock(m_pSubLock); CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; if(!strncmp((char*)pData, __GAB1__, strlen(__GAB1__))) { char* ptr = (char*)&pData[strlen(__GAB1__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; WORD size = *((WORD*)(ptr)); ptr += 2; if(tag == __GAB1_LANGUAGE__) { pRTS->m_name = CString(ptr); } else if(tag == __GAB1_ENTRY__) { pRTS->Add(AToW(&ptr[8]), false, *(int*)ptr, *(int*)(ptr+4)); fInvalidate = true; } else if(tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_ENTRY_UNICODE__) { pRTS->Add((WCHAR*)(ptr+8), true, *(int*)ptr, *(int*)(ptr+4)); fInvalidate = true; } ptr += size; } } else if(!strncmp((char*)pData, __GAB2__, strlen(__GAB2__))) { char* ptr = (char*)&pData[strlen(__GAB2__)+1]; char* end = (char*)&pData[len]; while(ptr < end) { WORD tag = *((WORD*)(ptr)); ptr += 2; DWORD size = *((DWORD*)(ptr)); ptr += 4; if(tag == __GAB1_LANGUAGE_UNICODE__) { pRTS->m_name = (WCHAR*)ptr; } else if(tag == __GAB1_RAWTEXTSUBTITLE__) { pRTS->Open((BYTE*)ptr, size, DEFAULT_CHARSET, pRTS->m_name); fInvalidate = true; } ptr += size; } } else if(pData != 0 && len > 1 && *pData != 0) { CStringA str((char*)pData, len); str.Replace("\r\n", "\n"); str.Trim(); if(!str.IsEmpty()) { pRTS->Add(AToW(str), false, (int)(tStart / 10000), (int)(tStop / 10000)); fInvalidate = true; } } } else if(m_mt.majortype == MEDIATYPE_Subtitle) { CAutoLock cAutoLock(m_pSubLock); if(m_mt.subtype == MEDIASUBTYPE_UTF8) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { pRTS->Add(str, true, (int)(tStart / 10000), (int)(tStop / 10000)); fInvalidate = true; } } else if(m_mt.subtype == MEDIASUBTYPE_SSA || m_mt.subtype == MEDIASUBTYPE_ASS || m_mt.subtype == MEDIASUBTYPE_ASS2) { CRenderedTextSubtitle* pRTS = (CRenderedTextSubtitle*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { STSEntry stse; int fields = m_mt.subtype == MEDIASUBTYPE_ASS2 ? 10 : 9; CAtlList<CStringW> sl; Explode(str, sl, ',', fields); if(sl.GetCount() == (size_t)fields) { stse.readorder = wcstol(sl.RemoveHead(), NULL, 10); stse.layer = wcstol(sl.RemoveHead(), NULL, 10); stse.style = sl.RemoveHead(); stse.actor = sl.RemoveHead(); stse.marginRect.left = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.right = wcstol(sl.RemoveHead(), NULL, 10); stse.marginRect.top = stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); if(fields == 10) stse.marginRect.bottom = wcstol(sl.RemoveHead(), NULL, 10); stse.effect = sl.RemoveHead(); stse.str = sl.RemoveHead(); } if(!stse.str.IsEmpty()) { pRTS->Add(stse.str, true, (int)(tStart / 10000), (int)(tStop / 10000), stse.style, stse.actor, stse.effect, stse.marginRect, stse.layer, stse.readorder); fInvalidate = true; } } } else if(m_mt.subtype == MEDIASUBTYPE_SSF) { ssf::CRenderer* pSSF = (ssf::CRenderer*)(ISubStream*)m_pSubStream; CStringW str = UTF8To16(CStringA((LPCSTR)pData, len)).Trim(); if(!str.IsEmpty()) { pSSF->Append(tStart, tStop, str); fInvalidate = true; } } else if(m_mt.subtype == MEDIASUBTYPE_VOBSUB) { CVobSubStream* pVSS = (CVobSubStream*)(ISubStream*)m_pSubStream; pVSS->Add(tStart, tStop, pData, len); } else if (IsHdmvSub(&m_mt)) { CAutoLock cAutoLock(m_pSubLock); CRenderedHdmvSubtitle* pHdmvSubtitle = (CRenderedHdmvSubtitle*)(ISubStream*)m_pSubStream; pHdmvSubtitle->ParseSample (pSample); } } if(fInvalidate) { TRACE(_T("InvalidateSubtitle(%I64d, ..)\n"), tStart); // IMPORTANT: m_pSubLock must not be locked when calling this InvalidateSubtitle(tStart, m_pSubStream); } hr = S_OK; return hr; }
int sproxy() { unsigned __int64 nFlags; BOOL bHasInvalid; CStringW wszUrl; CStringW wszOut; CStringA szNamespace; wchar_t **argvW = NULL ; int argc = 0 ; argvW = CommandLineToArgvW(GetCommandLineW(),&argc); if(argvW == NULL) { EmitError(IDS_SDL_CMDLINE_FAILURE, GetLastError()); return 1; } PreProcessCommandLine(argc, argvW, wszOut, szNamespace, &nFlags, &bHasInvalid); g_bUseWchar_t = ((nFlags & SPROXYFLAG_NOWCHAR_T) == 0); if ((nFlags & SPROXYFLAG_NOLOGO) == 0) { PrintHeader(); } if (nFlags & SPROXYFLAG_USAGE) { PrintUsage(true); GlobalFree(argvW); return 0; } ParseCommandLine(argc, argvW, wszUrl, bHasInvalid); GlobalFree(argvW); bHasInvalid = FALSE; if (wszUrl.IsEmpty()) { EmitCmdLineError(IDS_SDL_MISSING_OPTION, nFlags & SPROXYFLAG_WSDLINPUT ?"<wsdl_location>":"<discomap_location>"); bHasInvalid = TRUE; } if (bHasInvalid != FALSE) { printf("\r\n"); PrintUsage(); return 1; } if (nFlags & SPROXYFLAG_NOWARN) { SetEmitWarnings(false); } CHeapPtr<char> spSzNamespace; if (szNamespace && *szNamespace) { if (FAILED(CreateSafeCppName(&spSzNamespace, szNamespace))) { EmitErrorHr(E_OUTOFMEMORY); return 1; } } CoInitialize(NULL); HRESULT hr = S_OK; { CAutoPtr<CDiscoMapParser> dmParser; if(!(nFlags & SPROXYFLAG_WSDLINPUT)) { CComPtr<ISAXXMLReader> spDMReader; hr = CoCreateInstance(__uuidof(SAXXMLReader30), NULL, CLSCTX_ALL, __uuidof(ISAXXMLReader), (void **)&spDMReader); if (FAILED(hr)) { ATLTRACE( _T("CoCreateInstance failed!\n") ); return 1; } dmParser.Attach(new CDiscoMapParser(spDMReader, NULL, 0)); if(dmParser == NULL) { ATLTRACE(_T("Failed to create Discomap Parser : out of memory!\n")); return 1; } dmParser->SetDynamicAlloc(FALSE); hr = spDMReader->putContentHandler( dmParser ); if (FAILED(hr)) { ATLTRACE( _T("putContentHandler failed!\n") ); return 1; } CErrorHandler errDM; errDM.SetLocation(wszUrl); hr = spDMReader->putErrorHandler( &errDM); if (FAILED(hr)) { ATLTRACE( _T("putErrorHandler failed!\n") ); return 1; } g_pDMDoc = dmParser->GetDiscoMapDocument(); if (g_pDMDoc == NULL) { ATLTRACE( _T("failed to create document: out of memory!\n") ); return 1; } hr = g_pDMDoc->SetDocumentUri( wszUrl, wszUrl.GetLength()); if (FAILED(hr)) { ATLTRACE( _T("failed to set document uri: out of memory!\n") ); return 1; } g_wszFile = wszUrl; hr = spDMReader->parseURL( wszUrl ); if (FAILED(hr)) { ATLTRACE( _T("parseURL failed!\n") ); if ((hr == E_SAX_LOADFAILED) || (hr == E_SAX_FILENOTFOUND) || (hr == E_SAX_PATHNOTFOUND) || (hr == E_SAX_ACCESSDENIED)) { EmitError(IDS_SDL_FAILED_DM_OPEN, wszUrl); } EmitError(IDS_SDL_PROCESS_DM_FAILURE, wszUrl); return 1; } } if(nFlags & SPROXYFLAG_WSDLINPUT) g_wszFile = wszUrl; else g_wszFile = g_pDMDoc->GetWSDLFile(); CComPtr<ISAXXMLReader> spReader; hr = CoCreateInstance(__uuidof(SAXXMLReader30), NULL, CLSCTX_ALL, __uuidof(ISAXXMLReader), (void **)&spReader); if (FAILED(hr)) { ATLTRACE( _T("CoCreateInstance failed!\n") ); return 1; } CWSDLParser parser(spReader, NULL, 0); parser.SetDynamicAlloc(FALSE); hr = spReader->putContentHandler( &parser ); if (FAILED(hr)) { ATLTRACE( _T("putContentHandler failed!\n") ); return 1; } CErrorHandler err; err.SetLocation(g_wszFile); hr = spReader->putErrorHandler( &err ); if (FAILED(hr)) { ATLTRACE( _T("putErrorHandler failed!\n") ); return 1; } CWSDLDocument * pDoc = parser.GetWSDLDocument(); if (pDoc == NULL) { ATLTRACE( _T("failed to create document: out of memory!\n") ); return 1; } hr = pDoc->SetDocumentUri( g_wszFile, g_wszFile.GetLength()); if (FAILED(hr)) { ATLTRACE( _T("failed to set document uri: out of memory!\n") ); return 1; } wchar_t wszTmp[ATL_URL_MAX_URL_LENGTH]; if(g_wszFile.Find(L"://") != -1 && ((g_wszFile.Left(5)).MakeLower() != L"file:") ) { // The URL needs to be escaped only if it's not a local file if(AtlEscapeUrl(g_wszFile,wszTmp,0,ATL_URL_MAX_URL_LENGTH-1,ATL_URL_BROWSER_MODE) == FALSE) { ATLTRACE( _T("failed to escape uri!\n") ); return 1; } hr = spReader->parseURL( wszTmp ); } else { hr = spReader->parseURL( g_wszFile ); } if (FAILED(hr)) { ATLTRACE( _T("parseURL failed!\n") ); if ((hr == E_SAX_LOADFAILED) || (hr == E_SAX_FILENOTFOUND) || (hr == E_SAX_PATHNOTFOUND) || (hr == E_SAX_ACCESSDENIED)) { EmitError(IDS_SDL_FAILED_WSDL_OPEN, g_wszFile); } EmitError(IDS_SDL_PROCESS_FAILURE, g_wszFile); return 1; } CCodeTypeBuilder builder; CCodeProxy proxy; hr = builder.Initialize(parser.GetWSDLDocument(), &proxy); if (FAILED(hr)) { ATLTRACE( _T("builder.Initialize failed!\n") ); return PrintGenerateFailure(wszOut); } hr = builder.Build(); if (FAILED(hr)) { ATLTRACE( _T("builder.Build failed!\n") ); return PrintGenerateFailure(wszOut); } if (wszOut.IsEmpty()) { wszOut.Preallocate(proxy.GetServiceName().GetLength()+4); wszOut = (LPCSTR)proxy.GetServiceName(); wszOut.Append(L".h", 2); } Emit(IDS_SDL_SUCCESS, wszOut); CComObjectStack<CCppCodeGenerator> gen; hr = gen.Generate(wszOut, &proxy, (nFlags & SPROXYFLAG_NOPRAGMA) ? false : true, (nFlags & SPROXYFLAG_NOCLOBBER) ? true : false, (nFlags & SPROXYFLAG_NONAMESPACE) ? false : true, (nFlags & SPROXYFLAG_NOPROXY) ? false : true, spSzNamespace ? spSzNamespace : (szNamespace.IsEmpty() ? 0 : LPCSTR(szNamespace))); if (FAILED(hr)) { ATLTRACE( _T("gen.Generate failed!\n") ); return PrintGenerateFailure(wszOut); } } CoUninitialize(); return 0; }
HRESULT CStreamSwitcherInputPin::CompleteConnect(IPin* pReceivePin) { HRESULT hr = __super::CompleteConnect(pReceivePin); if (FAILED(hr)) { return hr; } (static_cast<CStreamSwitcherFilter*>(m_pFilter))->CompleteConnect(PINDIR_INPUT, this, pReceivePin); m_fCanBlock = false; bool fForkedSomewhere = false; CStringW fileName; CStringW pinName; IPin* pPin = (IPin*)this; IBaseFilter* pBF = (IBaseFilter*)m_pFilter; pPin = GetUpStreamPin(pBF, pPin); if (pPin) { pBF = GetFilterFromPin(pPin); } while (pPin && pBF) { if (IsSplitter(pBF)) { pinName = GetPinName(pPin); } CLSID clsid = GetCLSID(pBF); if (clsid == CLSID_AviSplitter || clsid == CLSID_OggSplitter) { m_fCanBlock = true; } int nIn, nOut, nInC, nOutC; CountPins(pBF, nIn, nOut, nInC, nOutC); fForkedSomewhere = fForkedSomewhere || nIn > 1 || nOut > 1; DWORD cStreams = 0; if (CComQIPtr<IAMStreamSelect> pSSF = pBF) { hr = pSSF->Count(&cStreams); if (SUCCEEDED(hr)) { for (int i = 0; i < (int)cStreams; i++) { AM_MEDIA_TYPE* pmt = nullptr; hr = pSSF->Info(i, &pmt, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); if (SUCCEEDED(hr) && pmt && pmt->majortype == MEDIATYPE_Audio) { m_pSSF = pSSF; DeleteMediaType(pmt); break; } DeleteMediaType(pmt); } } } if (CComQIPtr<IFileSourceFilter> pFSF = pBF) { WCHAR* pszName = nullptr; AM_MEDIA_TYPE mt; if (SUCCEEDED(pFSF->GetCurFile(&pszName, &mt)) && pszName) { fileName = pszName; CoTaskMemFree(pszName); fileName.Replace('\\', '/'); CStringW fn = fileName.Mid(fileName.ReverseFind('/') + 1); if (!fn.IsEmpty()) { fileName = fn; } // Haali & LAVFSplitter return only one "Audio" pin name, cause CMainFrame::OnInitMenuPopup lookup find the wrong popmenu, // add space at the end to prevent this, internal filter never return "Audio" only. if (!pinName.IsEmpty()) { fileName = pinName + L" "; } WCHAR* pName = DEBUG_NEW WCHAR[fileName.GetLength() + 1]; if (pName) { wcscpy_s(pName, fileName.GetLength() + 1, fileName); if (m_pName) { delete [] m_pName; } m_pName = pName; if (cStreams == 1) { // Simple external track, no need to use the info from IAMStreamSelect m_pSSF.Release(); } } } break; } pPin = GetFirstPin(pBF); pPin = GetUpStreamPin(pBF, pPin); if (pPin) { pBF = GetFilterFromPin(pPin); } } if (!fForkedSomewhere) { m_fCanBlock = true; } m_hNotifyEvent = nullptr; return S_OK; }