bool CXmlFile::IsFromFutureVersion() const { if (!m_element) { return false; } std::wstring const version = GetTextAttribute(m_element, "version"); return CBuildInfo::ConvertToVersionNumber(CBuildInfo::GetVersion().c_str()) < CBuildInfo::ConvertToVersionNumber(version.c_str()); }
void COptions::LoadGlobalDefaultOptions() { const wxString& defaultsDir = wxGetApp().GetDefaultsDir(); if (defaultsDir == _T("")) return; wxFileName name(defaultsDir, _T("fzdefaults.xml")); CXmlFile file(name); if (!file.Load()) return; TiXmlElement* pElement = file.GetElement(); if (!pElement) return; pElement = pElement->FirstChildElement("Settings"); if (!pElement) return; for (TiXmlElement* pSetting = pElement->FirstChildElement("Setting"); pSetting; pSetting = pSetting->NextSiblingElement("Setting")) { wxString name = GetTextAttribute(pSetting, "name"); for (int i = 0; i < DEFAULTS_NUM; i++) { if (name != default_options[i].name) continue; wxString value = GetTextElement(pSetting); if (default_options[i].type == string) default_options[i].value_str = value; else { long v = 0; if (!value.ToLong(&v)) v = 0; default_options[i].value_number = v; } } } }
bool CSiteManager::Load(TiXmlElement *pElement, CSiteManagerXmlHandler* pHandler) { wxASSERT(pElement); wxASSERT(pHandler); for (TiXmlElement* pChild = pElement->FirstChildElement(); pChild; pChild = pChild->NextSiblingElement()) { if (!strcmp(pChild->Value(), "Folder")) { wxString name = GetTextElement_Trimmed(pChild); if (name.empty()) continue; const bool expand = GetTextAttribute(pChild, "expanded") != _T("0"); if (!pHandler->AddFolder(name, expand)) return false; Load(pChild, pHandler); if (!pHandler->LevelUp()) return false; } else if (!strcmp(pChild->Value(), "Server")) { CSiteManagerItemData_Site* data = ReadServerElement(pChild); if (data) { pHandler->AddSite(data); // Bookmarks for (TiXmlElement* pBookmark = pChild->FirstChildElement("Bookmark"); pBookmark; pBookmark = pBookmark->NextSiblingElement("Bookmark")) { TiXmlHandle handle(pBookmark); wxString name = GetTextElement_Trimmed(pBookmark, "Name"); if (name.empty()) continue; CSiteManagerItemData* data = new CSiteManagerItemData(CSiteManagerItemData::BOOKMARK); TiXmlText* localDir = handle.FirstChildElement("LocalDir").FirstChild().Text(); if (localDir) data->m_localDir = GetTextElement(pBookmark, "LocalDir"); TiXmlText* remoteDir = handle.FirstChildElement("RemoteDir").FirstChild().Text(); if (remoteDir) data->m_remoteDir.SetSafePath(ConvLocal(remoteDir->Value())); if (data->m_localDir.empty() && data->m_remoteDir.IsEmpty()) { delete data; continue; } if (!data->m_localDir.empty() && !data->m_remoteDir.IsEmpty()) data->m_sync = GetTextElementBool(pBookmark, "SyncBrowsing", false); pHandler->AddBookmark(name, data); } if (!pHandler->LevelUp()) return false; } } } return true; }
bool GetServer(pugi::xml_node node, CServer& server) { wxASSERT(node); std::wstring host = GetTextElement(node, "Host"); if (host.empty()) { return false; } int port = GetTextElementInt(node, "Port"); if (port < 1 || port > 65535) { return false; } if (!server.SetHost(host, port)) { return false; } int const protocol = GetTextElementInt(node, "Protocol"); if (protocol < 0 || protocol > ServerProtocol::MAX_VALUE) { return false; } server.SetProtocol(static_cast<ServerProtocol>(protocol)); int type = GetTextElementInt(node, "Type"); if (type < 0 || type >= SERVERTYPE_MAX) { return false; } server.SetType(static_cast<ServerType>(type)); int logonType = GetTextElementInt(node, "Logontype"); if (logonType < 0 || logonType >= LOGONTYPE_MAX) { return false; } server.SetLogonType(static_cast<LogonType>(logonType)); if (server.GetLogonType() != ANONYMOUS) { std::wstring user = GetTextElement(node, "User"); std::wstring pass, key; if ((long)NORMAL == logonType || (long)ACCOUNT == logonType) { auto passElement = node.child("Pass"); if (passElement) { std::wstring encoding = GetTextAttribute(passElement, "encoding"); if (encoding == _T("base64")) { std::string decoded = fz::base64_decode(passElement.child_value()); pass = fz::to_wstring_from_utf8(decoded); } else if (!encoding.empty()) { server.SetLogonType(ASK); } else { pass = GetTextElement(passElement); } } } else if ((long)KEY == logonType) { key = GetTextElement(node, "Keyfile"); // password should be empty if we're using a key file pass.clear(); server.SetKeyFile(key); } if (!server.SetUser(user, pass)) { return false; } if ((long)ACCOUNT == logonType) { std::wstring account = GetTextElement(node, "Account"); if (account.empty()) { return false; } if (!server.SetAccount(account)) { return false; } } } int timezoneOffset = GetTextElementInt(node, "TimezoneOffset"); if (!server.SetTimezoneOffset(timezoneOffset)) { return false; } wxString pasvMode = GetTextElement(node, "PasvMode"); if (pasvMode == _T("MODE_PASSIVE")) server.SetPasvMode(MODE_PASSIVE); else if (pasvMode == _T("MODE_ACTIVE")) server.SetPasvMode(MODE_ACTIVE); else server.SetPasvMode(MODE_DEFAULT); int maximumMultipleConnections = GetTextElementInt(node, "MaximumMultipleConnections"); server.MaximumMultipleConnections(maximumMultipleConnections); wxString encodingType = GetTextElement(node, "EncodingType"); if (encodingType == _T("Auto")) { server.SetEncodingType(ENCODING_AUTO); } else if (encodingType == _T("UTF-8")) { server.SetEncodingType(ENCODING_UTF8); } else if (encodingType == _T("Custom")) { std::wstring customEncoding = GetTextElement(node, "CustomEncoding"); if (customEncoding.empty()) { return false; } if (!server.SetEncodingType(ENCODING_CUSTOM, customEncoding)) { return false; } } else { server.SetEncodingType(ENCODING_AUTO); } if (CServer::SupportsPostLoginCommands(server.GetProtocol())) { std::vector<std::wstring> postLoginCommands; auto element = node.child("PostLoginCommands"); if (element) { for (auto commandElement = element.child("Command"); commandElement; commandElement = commandElement.next_sibling("Command")) { std::wstring command = fz::to_wstring_from_utf8(commandElement.child_value()); if (!command.empty()) { postLoginCommands.emplace_back(std::move(command)); } } } if (!server.SetPostLoginCommands(postLoginCommands)) { return false; } } server.SetBypassProxy(GetTextElementInt(node, "BypassProxy", false) == 1); server.SetName(GetTextElement_Trimmed(node, "Name")); if (server.GetName().empty()) { server.SetName(GetTextElement_Trimmed(node)); } return true; }
void CFilterManager::LoadFilters() { if (m_loaded) { m_filters = m_globalFilters; m_filterSets = m_globalFilterSets; m_currentFilterSet = m_globalCurrentFilterSet; return; } m_loaded = true; CInterProcessMutex mutex(MUTEX_FILTERS); wxFileName file(wxGetApp().GetSettingsDir(), _T("filters.xml")); if (!file.FileExists()) { wxFileName defaults(wxGetApp().GetResourceDir(), _T("defaultfilters.xml")); if (defaults.FileExists()) { TiXmlElement* pDocument = GetXmlFile(defaults); if (pDocument) SaveXmlFile(file, pDocument); } } TiXmlElement* pDocument = GetXmlFile(file); if (!pDocument) { wxString msg = wxString::Format(_("Could not load \"%s\", please make sure the file is valid and can be accessed.\nAny changes made in the Site Manager could not be saved."), file.GetFullPath().c_str()); wxMessageBox(msg, _("Error loading xml file"), wxICON_ERROR); return; } TiXmlElement *pFilters = pDocument->FirstChildElement("Filters"); if (!pFilters) { delete pDocument->GetDocument(); return; } TiXmlElement *pFilter = pFilters->FirstChildElement("Filter"); while (pFilter) { CFilter filter; filter.name = GetTextElement(pFilter, "Name"); if (filter.name == _T("")) { pFilter = pFilter->NextSiblingElement("Filter"); continue; } filter.filterFiles = GetTextElement(pFilter, "ApplyToFiles") == _T("1"); filter.filterDirs = GetTextElement(pFilter, "ApplyToDirs") == _T("1"); wxString type = GetTextElement(pFilter, "MatchType"); if (type == _T("Any")) filter.matchType = CFilter::any; else if (type == _T("None")) filter.matchType = CFilter::none; else filter.matchType = CFilter::all; filter.matchCase = GetTextElement(pFilter, "MatchCase") == _T("1"); TiXmlElement *pConditions = pFilter->FirstChildElement("Conditions"); if (!pConditions) { pFilter = pFilter->NextSiblingElement("Filter"); continue; } TiXmlElement *pCondition = pConditions->FirstChildElement("Condition"); while (pCondition) { CFilterCondition condition; int type = GetTextElementInt(pCondition, "Type", 0); if (type < 0 || type >= filterType_size) { pCondition = pCondition->NextSiblingElement("Condition"); continue; } condition.type = (enum t_filterType)type; condition.condition = GetTextElementInt(pCondition, "Condition", 0); condition.strValue = GetTextElement(pCondition, "Value"); condition.matchCase = filter.matchCase; if (condition.strValue == _T("")) { pCondition = pCondition->NextSiblingElement("Condition"); continue; } // TODO: 64bit filesize if (condition.type == size) { unsigned long tmp; condition.strValue.ToULong(&tmp); condition.value = tmp; } else if (condition.type == attributes || condition.type == permissions) { if (condition.strValue == _T("0")) condition.value = 0; else condition.value = 1; } filter.filters.push_back(condition); pCondition = pCondition->NextSiblingElement("Condition"); } if (!filter.filters.empty()) m_globalFilters.push_back(filter); pFilter = pFilter->NextSiblingElement("Filter"); } m_filters = m_globalFilters; TiXmlElement* pSets = pDocument->FirstChildElement("Sets"); if (!pSets) { delete pDocument->GetDocument(); return; } for (TiXmlElement* pSet = pSets->FirstChildElement("Set"); pSet; pSet = pSet->NextSiblingElement("Set")) { CFilterSet set; TiXmlElement* pItem = pSet->FirstChildElement("Item"); while (pItem) { wxString local = GetTextElement(pItem, "Local"); wxString remote = GetTextElement(pItem, "Remote"); set.local.push_back(local == _T("1") ? true : false); set.remote.push_back(remote == _T("1") ? true : false); pItem = pItem->NextSiblingElement("Item"); } if (!m_globalFilterSets.empty()) { set.name = GetTextElement(pSet, "Name"); if (set.name == _T("")) continue; } if (set.local.size() == m_filters.size()) m_globalFilterSets.push_back(set); } m_filterSets = m_globalFilterSets; wxString attribute = GetTextAttribute(pSets, "Current"); unsigned long value; if (attribute.ToULong(&value)) { if (value < m_globalFilterSets.size()) m_globalCurrentFilterSet = value; } m_currentFilterSet = m_globalCurrentFilterSet; delete pDocument->GetDocument(); }
bool CImportDialog::ImportLegacySites(TiXmlElement* pSitesToImport, TiXmlElement* pExistingSites) { for (TiXmlElement* pImportFolder = pSitesToImport->FirstChildElement("Folder"); pImportFolder; pImportFolder = pImportFolder->NextSiblingElement("Folder")) { wxString name = GetTextAttribute(pImportFolder, "Name"); if (name == _T("")) continue; wxString newName = name; int i = 2; TiXmlElement* pFolder; while (!(pFolder = GetFolderWithName(pExistingSites, newName))) { newName = wxString::Format(_T("%s %d"), name.c_str(), i++); } ImportLegacySites(pImportFolder, pFolder); } for (TiXmlElement* pImportSite = pSitesToImport->FirstChildElement("Site"); pImportSite; pImportSite = pImportSite->NextSiblingElement("Site")) { wxString name = GetTextAttribute(pImportSite, "Name"); if (name == _T("")) continue; wxString host = GetTextAttribute(pImportSite, "Host"); if (host == _T("")) continue; int port = GetAttributeInt(pImportSite, "Port"); if (port < 1 || port > 65535) continue; int serverType = GetAttributeInt(pImportSite, "ServerType"); if (serverType < 0 || serverType > 4) continue; int protocol; switch (serverType) { default: case 0: protocol = 0; break; case 1: protocol = 3; break; case 2: case 4: protocol = 4; break; case 3: protocol = 1; break; } bool dontSavePass = GetAttributeInt(pImportSite, "DontSavePass") == 1; int logontype = GetAttributeInt(pImportSite, "Logontype"); if (logontype < 0 || logontype > 2) continue; if (logontype == 2) logontype = 4; if (logontype == 1 && dontSavePass) logontype = 2; wxString user = GetTextAttribute(pImportSite, "User"); wxString pass = DecodeLegacyPassword(GetTextAttribute(pImportSite, "Pass")); wxString account = GetTextAttribute(pImportSite, "Account"); if (logontype && user == _T("")) continue; // Find free name wxString newName = name; int i = 2; while (HasEntryWithName(pExistingSites, newName)) { newName = wxString::Format(_T("%s %d"), name.c_str(), i++); } TiXmlElement* pServer = pExistingSites->LinkEndChild(new TiXmlElement("Server"))->ToElement(); AddTextElement(pServer, newName); AddTextElement(pServer, "Host", host); AddTextElement(pServer, "Port", port); AddTextElement(pServer, "Protocol", protocol); AddTextElement(pServer, "Logontype", logontype); AddTextElement(pServer, "User", user); AddTextElement(pServer, "Pass", pass); AddTextElement(pServer, "Account", account); } return true; }
void CFilterManager::LoadFilters() { if (m_loaded) return; m_loaded = true; CInterProcessMutex mutex(MUTEX_FILTERS); wxFileName file(wxGetApp().GetSettingsDir(), _T("filters.xml")); if (!file.FileExists()) { wxFileName defaults(wxGetApp().GetResourceDir(), _T("defaultfilters.xml")); if (defaults.FileExists()) { TiXmlElement* pDocument = GetXmlFile(defaults); if (pDocument) { SaveXmlFile(file, pDocument); delete pDocument->GetDocument(); } } } CXmlFile xml(file); TiXmlElement* pDocument = xml.Load(); if (!pDocument) { wxString msg = xml.GetError() + _T("\n\n") + _("Any changes made to the filters will not be saved."); wxMessageBox(msg, _("Error loading xml file"), wxICON_ERROR); return; } TiXmlElement *pFilters = pDocument->FirstChildElement("Filters"); if (!pFilters) return; TiXmlElement *pFilter = pFilters->FirstChildElement("Filter"); while (pFilter) { CFilter filter; filter.name = GetTextElement(pFilter, "Name"); if (filter.name == _T("")) { pFilter = pFilter->NextSiblingElement("Filter"); continue; } filter.filterFiles = GetTextElement(pFilter, "ApplyToFiles") == _T("1"); filter.filterDirs = GetTextElement(pFilter, "ApplyToDirs") == _T("1"); wxString type = GetTextElement(pFilter, "MatchType"); if (type == _T("Any")) filter.matchType = CFilter::any; else if (type == _T("None")) filter.matchType = CFilter::none; else filter.matchType = CFilter::all; filter.matchCase = GetTextElement(pFilter, "MatchCase") == _T("1"); TiXmlElement *pConditions = pFilter->FirstChildElement("Conditions"); if (!pConditions) { pFilter = pFilter->NextSiblingElement("Filter"); continue; } TiXmlElement *pCondition = pConditions->FirstChildElement("Condition"); while (pCondition) { CFilterCondition condition; int type = GetTextElementInt(pCondition, "Type", 0); switch (type) { case 0: condition.type = filter_name; break; case 1: condition.type = filter_size; break; case 2: condition.type = filter_attributes; break; case 3: condition.type = filter_permissions; break; case 4: condition.type = filter_path; break; default: pCondition = pCondition->NextSiblingElement("Condition"); continue; } condition.condition = GetTextElementInt(pCondition, "Condition", 0); condition.strValue = GetTextElement(pCondition, "Value"); condition.matchCase = filter.matchCase; if (condition.strValue == _T("")) { pCondition = pCondition->NextSiblingElement("Condition"); continue; } // TODO: 64bit filesize if (condition.type == filter_size) { unsigned long tmp; condition.strValue.ToULong(&tmp); condition.value = tmp; } else if (condition.type == filter_attributes || condition.type == filter_permissions) { if (condition.strValue == _T("0")) condition.value = 0; else condition.value = 1; } filter.filters.push_back(condition); pCondition = pCondition->NextSiblingElement("Condition"); } if (!filter.filters.empty()) m_globalFilters.push_back(filter); pFilter = pFilter->NextSiblingElement("Filter"); } CompileRegexes(); TiXmlElement* pSets = pDocument->FirstChildElement("Sets"); if (!pSets) return; for (TiXmlElement* pSet = pSets->FirstChildElement("Set"); pSet; pSet = pSet->NextSiblingElement("Set")) { CFilterSet set; TiXmlElement* pItem = pSet->FirstChildElement("Item"); while (pItem) { wxString local = GetTextElement(pItem, "Local"); wxString remote = GetTextElement(pItem, "Remote"); set.local.push_back(local == _T("1") ? true : false); set.remote.push_back(remote == _T("1") ? true : false); pItem = pItem->NextSiblingElement("Item"); } if (!m_globalFilterSets.empty()) { set.name = GetTextElement(pSet, "Name"); if (set.name == _T("")) continue; } if (set.local.size() == m_globalFilters.size()) m_globalFilterSets.push_back(set); } wxString attribute = GetTextAttribute(pSets, "Current"); unsigned long value; if (attribute.ToULong(&value)) { if (value < m_globalFilterSets.size()) m_globalCurrentFilterSet = value; } }
void CFilterManager::LoadFilters() { if (m_loaded) return; m_loaded = true; CInterProcessMutex mutex(MUTEX_FILTERS); wxString file(wxGetApp().GetSettingsFile(_T("filters"))); if (CLocalFileSystem::GetSize(file) < 1) { file = wxGetApp().GetResourceDir().GetPath() + _T("defaultfilters.xml"); } CXmlFile xml(file); TiXmlElement* pDocument = xml.Load(); if (!pDocument) { wxString msg = xml.GetError() + _T("\n\n") + _("Any changes made to the filters will not be saved."); wxMessageBoxEx(msg, _("Error loading xml file"), wxICON_ERROR); return; } TiXmlElement *pFilters = pDocument->FirstChildElement("Filters"); if (!pFilters) return; TiXmlElement *pFilter = pFilters->FirstChildElement("Filter"); while (pFilter) { CFilter filter; bool loaded = LoadFilter(pFilter, filter); if (loaded && !filter.name.empty() && !filter.filters.empty()) m_globalFilters.push_back(filter); pFilter = pFilter->NextSiblingElement("Filter"); } CompileRegexes(); TiXmlElement* pSets = pDocument->FirstChildElement("Sets"); if (!pSets) return; for (TiXmlElement* pSet = pSets->FirstChildElement("Set"); pSet; pSet = pSet->NextSiblingElement("Set")) { CFilterSet set; TiXmlElement* pItem = pSet->FirstChildElement("Item"); while (pItem) { wxString local = GetTextElement(pItem, "Local"); wxString remote = GetTextElement(pItem, "Remote"); set.local.push_back(local == _T("1") ? true : false); set.remote.push_back(remote == _T("1") ? true : false); pItem = pItem->NextSiblingElement("Item"); } if (!m_globalFilterSets.empty()) { set.name = GetTextElement(pSet, "Name"); if (set.name.empty()) continue; } if (set.local.size() == m_globalFilters.size()) m_globalFilterSets.push_back(set); } wxString attribute = GetTextAttribute(pSets, "Current"); unsigned long value; if (attribute.ToULong(&value)) { if (value < m_globalFilterSets.size()) m_globalCurrentFilterSet = value; } }
bool CWrapEngine::LoadCache() { // We have to synchronize access to layout.xml so that multiple processed don't write // to the same file or one is reading while the other one writes. CInterProcessMutex mutex(MUTEX_LAYOUT); wxFileName file(COptions::Get()->GetOption(OPTION_DEFAULT_SETTINGSDIR), _T("layout.xml")); CXmlFile xml(file); TiXmlElement* pDocument = xml.Load(); if (!pDocument) { m_use_cache = false; wxMessageBox(xml.GetError(), _("Error loading xml file"), wxICON_ERROR); return false; } bool cacheValid = true; TiXmlElement* pElement = pDocument->FirstChildElement("Layout"); if (!pElement) pElement = pDocument->LinkEndChild(new TiXmlElement("Layout"))->ToElement(); const wxString buildDate = CBuildInfo::GetBuildDateString(); if (GetTextAttribute(pElement, "Builddate") != buildDate) { cacheValid = false; SetTextAttribute(pElement, "Builddate", buildDate); } const wxString buildTime = CBuildInfo::GetBuildTimeString(); if (GetTextAttribute(pElement, "Buildtime") != buildTime) { cacheValid = false; SetTextAttribute(pElement, "Buildtime", buildTime); } // Enumerate resource file names // ----------------------------- TiXmlElement* pResources = pElement->FirstChildElement("Resources"); if (!pResources) pResources = pElement->LinkEndChild(new TiXmlElement("Resources"))->ToElement(); wxString resourceDir = wxGetApp().GetResourceDir(); wxDir dir(resourceDir); wxLogNull log; wxString xrc; for (bool found = dir.GetFirst(&xrc, _T("*.xrc")); found; found = dir.GetNext(&xrc)) { if (!wxFileName::FileExists(resourceDir + xrc)) continue; wxFileName fn(resourceDir + xrc); wxDateTime date = fn.GetModificationTime(); wxLongLong ticks = date.GetTicks(); TiXmlElement* resourceElement = FindElementWithAttribute(pResources, "xrc", "file", xrc.mb_str()); if (!resourceElement) { resourceElement = pResources->LinkEndChild(new TiXmlElement("xrc"))->ToElement(); resourceElement->SetAttribute("file", xrc.mb_str()); resourceElement->SetAttribute("date", ticks.ToString().mb_str()); cacheValid = false; } else { const char* xrcNodeDate = resourceElement->Attribute("date"); if (!xrcNodeDate || strcmp(xrcNodeDate, ticks.ToString().mb_str())) { cacheValid = false; resourceElement->SetAttribute("date", ticks.ToString().mb_str()); } } } if (!cacheValid) { // Clear all languages TiXmlElement* pLanguage = pElement->FirstChildElement("Language"); while (pLanguage) { pElement->RemoveChild(pLanguage); pLanguage = pElement->FirstChildElement("Language"); } } // Get current language wxString language = wxGetApp().GetCurrentLanguageCode(); if (language == _T("")) language = _T("default"); TiXmlElement* languageElement = FindElementWithAttribute(pElement, "Language", "id", language.mb_str()); if (!languageElement) { languageElement = pElement->LinkEndChild(new TiXmlElement("Language"))->ToElement(); languageElement->SetAttribute("id", language.mb_str()); } // Get static text font and measure sample text wxFrame* pFrame = new wxFrame; pFrame->Create(0, -1, _T("Title"), wxDefaultPosition, wxDefaultSize, wxFRAME_TOOL_WINDOW); wxStaticText* pText = new wxStaticText(pFrame, -1, _T("foo")); wxFont font = pText->GetFont(); wxString fontDesc = font.GetNativeFontInfoDesc(); TiXmlElement* pFontElement = languageElement->FirstChildElement("Font"); if (!pFontElement) pFontElement = languageElement->LinkEndChild(new TiXmlElement("Font"))->ToElement(); if (GetTextAttribute(pFontElement, "font") != fontDesc) { SetTextAttribute(pFontElement, "font", fontDesc); cacheValid = false; } int width, height; pText->GetTextExtent(_T("Just some test string we are measuring. If width or heigh differ from the recorded values, invalidate cache. 1234567890MMWWII"), &width, &height); if (GetAttributeInt(pFontElement, "width") != width || GetAttributeInt(pFontElement, "height") != height) { cacheValid = false; SetAttributeInt(pFontElement, "width", width); SetAttributeInt(pFontElement, "height", height); } pFrame->Destroy(); // Get language file const wxString& localesDir = wxGetApp().GetLocalesDir(); wxString name = GetLocaleFile(localesDir, language); if (name != _T("")) { wxFileName fn(localesDir + name + _T("/filezilla.mo")); wxDateTime date = fn.GetModificationTime(); wxLongLong ticks = date.GetTicks(); const char* languageNodeDate = languageElement->Attribute("date"); if (!languageNodeDate || strcmp(languageNodeDate, ticks.ToString().mb_str())) { languageElement->SetAttribute("date", ticks.ToString().mb_str()); cacheValid = false; } } else languageElement->SetAttribute("date", ""); if (!cacheValid) { TiXmlElement* dialog; while ((dialog = languageElement->FirstChildElement("Dialog"))) languageElement->RemoveChild(dialog); } if (COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) == 2) { m_use_cache = cacheValid; return true; } wxString error; if (!xml.Save(&error)) { m_use_cache = false; wxString msg = wxString::Format(_("Could not write \"%s\": %s"), file.GetFullPath().c_str(), error.c_str()); wxMessageBox(msg, _("Error writing xml file"), wxICON_ERROR); } return true; }
bool GetServer(TiXmlElement *node, CServer& server) { wxASSERT(node); wxString host = GetTextElement(node, "Host"); if (host.empty()) return false; int port = GetTextElementInt(node, "Port"); if (port < 1 || port > 65535) return false; if (!server.SetHost(host, port)) return false; int const protocol = GetTextElementInt(node, "Protocol"); if (protocol < 0 || protocol > ServerProtocol::MAX_VALUE) { return false; } server.SetProtocol(static_cast<ServerProtocol>(protocol)); int type = GetTextElementInt(node, "Type"); if (type < 0 || type >= SERVERTYPE_MAX) return false; server.SetType((enum ServerType)type); int logonType = GetTextElementInt(node, "Logontype"); if (logonType < 0) return false; server.SetLogonType((enum LogonType)logonType); if (server.GetLogonType() != ANONYMOUS) { wxString user = GetTextElement(node, "User"); wxString pass; if ((long)NORMAL == logonType || (long)ACCOUNT == logonType) { TiXmlElement* passElement = node->FirstChildElement("Pass"); if (passElement) { pass = GetTextElement(passElement); wxString encoding = GetTextAttribute(passElement, "encoding"); if (encoding == _T("base64")) { wxMemoryBuffer buf = wxBase64Decode(pass); if (!buf.IsEmpty()) { pass = wxString::FromUTF8(static_cast<const char*>(buf.GetData()), buf.GetDataLen()); } else { pass.clear(); } } else if (!encoding.empty()) { pass.clear(); server.SetLogonType(ASK); } } } if (!server.SetUser(user, pass)) return false; if ((long)ACCOUNT == logonType) { wxString account = GetTextElement(node, "Account"); if (account.empty()) return false; if (!server.SetAccount(account)) return false; } } int timezoneOffset = GetTextElementInt(node, "TimezoneOffset"); if (!server.SetTimezoneOffset(timezoneOffset)) return false; wxString pasvMode = GetTextElement(node, "PasvMode"); if (pasvMode == _T("MODE_PASSIVE")) server.SetPasvMode(MODE_PASSIVE); else if (pasvMode == _T("MODE_ACTIVE")) server.SetPasvMode(MODE_ACTIVE); else server.SetPasvMode(MODE_DEFAULT); int maximumMultipleConnections = GetTextElementInt(node, "MaximumMultipleConnections"); server.MaximumMultipleConnections(maximumMultipleConnections); wxString encodingType = GetTextElement(node, "EncodingType"); if (encodingType == _T("Auto")) server.SetEncodingType(ENCODING_AUTO); else if (encodingType == _T("UTF-8")) server.SetEncodingType(ENCODING_UTF8); else if (encodingType == _T("Custom")) { wxString customEncoding = GetTextElement(node, "CustomEncoding"); if (customEncoding.empty()) return false; if (!server.SetEncodingType(ENCODING_CUSTOM, customEncoding)) return false; } else server.SetEncodingType(ENCODING_AUTO); if (CServer::SupportsPostLoginCommands(server.GetProtocol())) { std::vector<wxString> postLoginCommands; TiXmlElement* pElement = node->FirstChildElement("PostLoginCommands"); if (pElement) { TiXmlElement* pCommandElement = pElement->FirstChildElement("Command"); while (pCommandElement) { TiXmlNode* textNode = pCommandElement->FirstChild(); if (textNode && textNode->ToText()) { wxString command = ConvLocal(textNode->Value()); if (!command.empty()) postLoginCommands.push_back(command); } pCommandElement = pCommandElement->NextSiblingElement("Command"); } } if (!server.SetPostLoginCommands(postLoginCommands)) return false; } server.SetBypassProxy(GetTextElementInt(node, "BypassProxy", false) == 1); server.SetName(GetTextElement_Trimmed(node, "Name")); if (server.GetName().empty()) server.SetName(GetTextElement_Trimmed(node)); return true; }