bool CPDF_FileSpec::GetFileName(CFX_WideString* csFileName) const { if (CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { *csFileName = pDict->GetUnicodeTextBy("UF"); if (csFileName->IsEmpty()) { *csFileName = CFX_WideString::FromLocal(pDict->GetStringBy("F").AsStringC()); } if (pDict->GetStringBy("FS") == "URL") return true; if (csFileName->IsEmpty()) { if (pDict->KeyExist("DOS")) { *csFileName = CFX_WideString::FromLocal(pDict->GetStringBy("DOS").AsStringC()); } else if (pDict->KeyExist("Mac")) { *csFileName = CFX_WideString::FromLocal(pDict->GetStringBy("Mac").AsStringC()); } else if (pDict->KeyExist("Unix")) { *csFileName = CFX_WideString::FromLocal(pDict->GetStringBy("Unix").AsStringC()); } else { return false; } } } else if (m_pObj->IsString()) { *csFileName = CFX_WideString::FromLocal(m_pObj->GetString().AsStringC()); } else { return false; } *csFileName = DecodeFileName(csFileName->AsStringC()); return true; }
WideString CPDF_FileSpec::GetFileName() const { WideString csFileName; if (const CPDF_Dictionary* pDict = m_pObj->AsDictionary()) { csFileName = pDict->GetUnicodeTextFor("UF"); if (csFileName.IsEmpty()) { csFileName = WideString::FromDefANSI( pDict->GetStringFor(pdfium::stream::kF).AsStringView()); } if (pDict->GetStringFor("FS") == "URL") return csFileName; if (csFileName.IsEmpty()) { constexpr const char* keys[] = {"DOS", "Mac", "Unix"}; for (const auto* key : keys) { if (pDict->KeyExist(key)) { csFileName = WideString::FromDefANSI(pDict->GetStringFor(key).AsStringView()); break; } } } } else if (m_pObj->IsString()) { csFileName = WideString::FromDefANSI(m_pObj->GetString().AsStringView()); } return DecodeFileName(csFileName); }
wxString MapRemoteFileToLocalFile(const wxString& remoteFile) { // Check that a workspace is opened if(!PHPWorkspace::Get()->IsOpen()) return remoteFile; // Sanity PHPProject::Ptr_t pProject = PHPWorkspace::Get()->GetActiveProject(); if(!pProject) return remoteFile; // Map filename file attribute returned by xdebug to local filename wxString filename = remoteFile; // Remote the "file://" from the file path filename.StartsWith(FILE_SCHEME, &filename); CL_DEBUG("filename => %s", filename); // On Windows, the file is returned like (after removing the file://) // /C:/Http/htdocs/file.php - remote the leading "/" wxRegEx reMSWPrefix("/[a-zA-Z]{1}:/"); if(reMSWPrefix.IsValid() && reMSWPrefix.Matches(filename)) { // Windows file CL_DEBUG("filename => %s", filename); filename.Remove(0, 1); } // Remove URI encoding ("%20"=>" " etc) DecodeFileName(filename); CL_DEBUG("filename => %s", filename); // First check if the remote file exists locally if(wxFileName(filename).Exists()) { return wxFileName(filename).GetFullPath(); } // Use the active project file mapping const PHPProjectSettingsData& settings = pProject->GetSettings(); const JSONElement::wxStringMap_t& mapping = settings.GetFileMapping(); JSONElement::wxStringMap_t::const_iterator iter = mapping.begin(); for(; iter != mapping.end(); ++iter) { const wxString& localFolder = iter->first; const wxString& remoteFolder = iter->second; if(filename.StartsWith(remoteFolder)) { filename.Replace(remoteFolder, localFolder); return wxFileName(filename).GetFullPath(); } } // No matching was found return remoteFile; }