void AddTextElement(TiXmlElement* node, const char* name, const wxString& value, bool overwrite) { wxASSERT(node); wxScopedCharBuffer utf8 = value.utf8_str(); if (!utf8) return; AddTextElementRaw(node, name, utf8, overwrite); }
void AddTextElement(TiXmlElement* node, const wxString& value) { wxASSERT(node); wxASSERT(value); wxScopedCharBuffer utf8 = value.utf8_str(); if (!utf8) return; AddTextElementRaw(node, utf8); }
void AddTextElement(TiXmlElement* node, const char* name, const wxString& value, bool overwrite) { wxASSERT(node); char* utf8 = ConvUTF8(value); if (!utf8) return; AddTextElementRaw(node, name, utf8, overwrite); delete [] utf8; }
void CFileItem::SaveItem(TiXmlElement* pElement) const { if (m_edit != CEditHandler::none) return; TiXmlElement *file = pElement->LinkEndChild(new TiXmlElement("File"))->ToElement(); AddTextElement(file, "LocalFile", m_localFile); AddTextElement(file, "RemoteFile", m_remoteFile); AddTextElement(file, "RemotePath", m_remotePath.GetSafePath()); AddTextElementRaw(file, "Download", m_download ? "1" : "0"); if (m_size != -1) AddTextElement(file, "Size", m_size.ToString()); if (m_errorCount) AddTextElement(file, "ErrorCount", m_errorCount); if (m_priority != priority_normal) AddTextElement(file, "Priority", m_priority); AddTextElementRaw(file, "TransferMode", m_transferSettings.binary ? "1" : "0"); if (m_defaultFileExistsAction != CFileExistsNotification::unknown) AddTextElement(file, "OverwriteAction", m_defaultFileExistsAction); }
void AddTextElement(TiXmlElement* node, const wxString& value) { wxASSERT(node); wxASSERT(value); char* utf8 = ConvUTF8(value); if (!utf8) return; AddTextElementRaw(node, utf8); delete [] utf8; }
bool CBookmarksDialog::AddBookmark(const wxString &name, const wxString &local_dir, const CServerPath &remote_dir, bool sync) { if (local_dir.empty() && remote_dir.empty()) return false; if ((local_dir.empty() || remote_dir.empty()) && sync) return false; CInterProcessMutex mutex(MUTEX_GLOBALBOOKMARKS); CXmlFile file(wxGetApp().GetSettingsFile(_T("bookmarks"))); TiXmlElement* pDocument = file.Load(); if (!pDocument) { wxString msg = file.GetError() + _T("\n\n") + _("The bookmark could not be added."); wxMessageBoxEx(msg, _("Error loading xml file"), wxICON_ERROR); return false; } TiXmlElement *pInsertBefore = 0; TiXmlElement *pBookmark; for (pBookmark = pDocument->FirstChildElement("Bookmark"); pBookmark; pBookmark = pBookmark->NextSiblingElement("Bookmark")) { wxString remote_dir_raw; wxString old_name = GetTextElement(pBookmark, "Name"); if (!name.CmpNoCase(old_name)) { wxMessageBoxEx(_("Name of bookmark already exists."), _("New bookmark"), wxICON_EXCLAMATION); return false; } if (name < old_name && !pInsertBefore) pInsertBefore = pBookmark; } if (pInsertBefore) pBookmark = pDocument->InsertBeforeChild(pInsertBefore, TiXmlElement("Bookmark"))->ToElement(); else pBookmark = pDocument->LinkEndChild(new TiXmlElement("Bookmark"))->ToElement(); AddTextElement(pBookmark, "Name", name); if (!local_dir.empty()) AddTextElement(pBookmark, "LocalDir", local_dir); if (!remote_dir.empty()) AddTextElement(pBookmark, "RemoteDir", remote_dir.GetSafePath()); if (sync) AddTextElementRaw(pBookmark, "SyncBrowsing", "1"); if (!file.Save(false)) { wxString msg = wxString::Format(_("Could not write \"%s\", the bookmark could not be added: %s"), file.GetFileName(), file.GetError()); wxMessageBoxEx(msg, _("Error writing xml file"), wxICON_ERROR); return false; } return true; }
pugi::xml_node AddTextElement(pugi::xml_node node, const char* name, const wxString& value, bool overwrite) { pugi::xml_node ret; wxASSERT(node); wxScopedCharBuffer utf8 = value.utf8_str(); if (utf8) { ret = AddTextElementRaw(node, name, utf8, overwrite); } return ret; }
void CFolderItem::SaveItem(TiXmlElement* pElement) const { TiXmlElement file("Folder"); if (m_download) AddTextElement(&file, "LocalFile", m_localFile); else { AddTextElement(&file, "RemoteFile", m_remoteFile); AddTextElement(&file, "RemotePath", m_remotePath.GetSafePath()); } AddTextElementRaw(&file, "Download", m_download ? "1" : "0"); pElement->InsertEndChild(file); }
void CFolderItem::SaveItem(TiXmlElement* pElement) const { TiXmlElement *file = new TiXmlElement("Folder"); if (Download()) AddTextElement(file, "LocalFile", GetLocalPath().GetPath() + GetLocalFile()); else { AddTextElement(file, "RemoteFile", GetRemoteFile()); AddTextElement(file, "RemotePath", m_remotePath.GetSafePath()); } AddTextElementRaw(file, "Download", Download() ? "1" : "0"); pElement->LinkEndChild(file); }
void CBookmarksDialog::SaveGlobalBookmarks() { CInterProcessMutex mutex(MUTEX_GLOBALBOOKMARKS); CXmlFile file(wxGetApp().GetSettingsFile(_T("bookmarks"))); TiXmlElement* pDocument = file.Load(); if (!pDocument) { wxString msg = file.GetError() + _T("\n\n") + _("The global bookmarks could not be saved."); wxMessageBoxEx(msg, _("Error loading xml file"), wxICON_ERROR); return; } { TiXmlElement *pBookmark = pDocument->FirstChildElement("Bookmark"); while (pBookmark) { pDocument->RemoveChild(pBookmark); pBookmark = pDocument->FirstChildElement("Bookmark"); } } wxTreeItemIdValue cookie; for (wxTreeItemId child = m_pTree->GetFirstChild(m_bookmarks_global, cookie); child.IsOk(); child = m_pTree->GetNextChild(m_bookmarks_global, cookie)) { CBookmarkItemData *data = (CBookmarkItemData *)m_pTree->GetItemData(child); wxASSERT(data); TiXmlElement *pBookmark = pDocument->LinkEndChild(new TiXmlElement("Bookmark"))->ToElement(); AddTextElement(pBookmark, "Name", m_pTree->GetItemText(child)); if (!data->m_local_dir.empty()) AddTextElement(pBookmark, "LocalDir", data->m_local_dir); if (!data->m_remote_dir.empty()) AddTextElement(pBookmark, "RemoteDir", data->m_remote_dir.GetSafePath()); if (data->m_sync) AddTextElementRaw(pBookmark, "SyncBrowsing", "1"); } if (!file.Save(false)) { wxString msg = wxString::Format(_("Could not write \"%s\", the global bookmarks could no be saved: %s"), file.GetFileName(), file.GetError()); wxMessageBoxEx(msg, _("Error writing xml file"), wxICON_ERROR); } }
bool CSiteManager::AddBookmark(wxString sitePath, const wxString& name, const wxString &local_dir, const CServerPath &remote_dir, bool sync) { if (local_dir.empty() && remote_dir.IsEmpty()) return false; if (sitePath[0] != '0') return false; sitePath = sitePath.Mid(1); // We have to synchronize access to sitemanager.xml so that multiple processed don't write // to the same file or one is reading while the other one writes. CInterProcessMutex mutex(MUTEX_SITEMANAGER); CXmlFile file; TiXmlElement* pDocument = file.Load(_T("sitemanager")); if (!pDocument) { wxString msg = file.GetError() + _T("\n") + _("The bookmark could not be added."); wxMessageBox(msg, _("Error loading xml file"), wxICON_ERROR); return false; } TiXmlElement* pElement = pDocument->FirstChildElement("Servers"); if (!pElement) return false; std::list<wxString> segments; if (!UnescapeSitePath(sitePath, segments)) { wxMessageBox(_("Site path is malformed."), _("Invalid site path")); return 0; } TiXmlElement* pChild = GetElementByPath(pElement, segments); if (!pChild || strcmp(pChild->Value(), "Server")) { wxMessageBox(_("Site does not exist."), _("Invalid site path")); return 0; } // Bookmarks TiXmlElement *pInsertBefore = 0; TiXmlElement* pBookmark; for (pBookmark = pChild->FirstChildElement("Bookmark"); pBookmark; pBookmark = pBookmark->NextSiblingElement("Bookmark")) { TiXmlHandle handle(pBookmark); wxString old_name = GetTextElement_Trimmed(pBookmark, "Name"); if (old_name.empty()) continue; if (name == old_name) { wxMessageBox(_("Name of bookmark already exists."), _("New bookmark"), wxICON_EXCLAMATION); return false; } if (name < old_name && !pInsertBefore) pInsertBefore = pBookmark; } if (pInsertBefore) pBookmark = pChild->InsertBeforeChild(pInsertBefore, TiXmlElement("Bookmark"))->ToElement(); else pBookmark = pChild->LinkEndChild(new TiXmlElement("Bookmark"))->ToElement(); AddTextElement(pBookmark, "Name", name); if (!local_dir.empty()) AddTextElement(pBookmark, "LocalDir", local_dir); if (!remote_dir.IsEmpty()) AddTextElement(pBookmark, "RemoteDir", remote_dir.GetSafePath()); if (sync) AddTextElementRaw(pBookmark, "SyncBrowsing", "1"); wxString error; if (!file.Save(&error)) { if (COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) == 2) return true; wxString msg = wxString::Format(_("Could not write \"%s\", the selected sites could not be exported: %s"), file.GetFileName().GetFullPath().c_str(), error.c_str()); wxMessageBox(msg, _("Error writing xml file"), wxICON_ERROR); } return true; }
void SetServer(TiXmlElement *node, const CServer& server) { if (!node) return; bool kiosk_mode = COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) != 0; node->Clear(); AddTextElement(node, "Host", server.GetHost()); AddTextElement(node, "Port", server.GetPort()); AddTextElement(node, "Protocol", server.GetProtocol()); AddTextElement(node, "Type", server.GetType()); enum LogonType logonType = server.GetLogonType(); if (server.GetLogonType() != ANONYMOUS) { AddTextElement(node, "User", server.GetUser()); if (server.GetLogonType() == NORMAL || server.GetLogonType() == ACCOUNT) { if (kiosk_mode) logonType = ASK; else { AddTextElement(node, "Pass", server.GetPass()); if (server.GetLogonType() == ACCOUNT) AddTextElement(node, "Account", server.GetAccount()); } } } AddTextElement(node, "Logontype", logonType); AddTextElement(node, "TimezoneOffset", server.GetTimezoneOffset()); switch (server.GetPasvMode()) { case MODE_PASSIVE: AddTextElementRaw(node, "PasvMode", "MODE_PASSIVE"); break; case MODE_ACTIVE: AddTextElementRaw(node, "PasvMode", "MODE_ACTIVE"); break; default: AddTextElementRaw(node, "PasvMode", "MODE_DEFAULT"); break; } AddTextElement(node, "MaximumMultipleConnections", server.MaximumMultipleConnections()); switch (server.GetEncodingType()) { case ENCODING_AUTO: AddTextElementRaw(node, "EncodingType", "Auto"); break; case ENCODING_UTF8: AddTextElementRaw(node, "EncodingType", "UTF-8"); break; case ENCODING_CUSTOM: AddTextElementRaw(node, "EncodingType", "Custom"); AddTextElement(node, "CustomEncoding", server.GetCustomEncoding()); break; } if (CServer::SupportsPostLoginCommands(server.GetProtocol())) { std::vector<wxString> const& postLoginCommands = server.GetPostLoginCommands(); if (!postLoginCommands.empty()) { TiXmlElement* pElement = node->LinkEndChild(new TiXmlElement("PostLoginCommands"))->ToElement(); for (std::vector<wxString>::const_iterator iter = postLoginCommands.begin(); iter != postLoginCommands.end(); ++iter) AddTextElement(pElement, "Command", *iter); } } AddTextElementRaw(node, "BypassProxy", server.GetBypassProxy() ? "1" : "0"); const wxString& name = server.GetName(); if (!name.empty()) AddTextElement(node, "Name", name); }
void AddTextElement(TiXmlElement* node, int value) { char buffer[sizeof(int)]; // Always big enough sprintf(buffer, "%d", value); AddTextElementRaw(node, buffer); }
void AddTextElement(TiXmlElement* node, const char* name, int value, bool overwrite) { char buffer[sizeof(int) * 8]; // Always big enough sprintf(buffer, "%d", value); AddTextElementRaw(node, name, buffer, overwrite); }
void SetServer(TiXmlElement *node, const CServer& server) { if (!node) return; static bool initialized = false; static bool kiosk_mode = false; if (!initialized) { COptions* pOptions = COptions::Get(); if (pOptions) { initialized = true; if (pOptions->GetDefaultVal(DEFAULT_KIOSKMODE) != 0) kiosk_mode = true; } } node->Clear(); AddTextElement(node, "Host", server.GetHost()); AddTextElement(node, "Port", server.GetPort()); AddTextElement(node, "Protocol", server.GetProtocol()); AddTextElement(node, "Type", server.GetType()); enum LogonType logonType = server.GetLogonType(); if (server.GetLogonType() != ANONYMOUS) { AddTextElement(node, "User", server.GetUser()); if (server.GetLogonType() == NORMAL || server.GetLogonType() == ACCOUNT) { if (kiosk_mode) logonType = ASK; else { AddTextElement(node, "Pass", server.GetPass()); if (server.GetLogonType() == ACCOUNT) AddTextElement(node, "Account", server.GetAccount()); } } } AddTextElement(node, "Logontype", logonType); AddTextElement(node, "TimezoneOffset", server.GetTimezoneOffset()); switch (server.GetPasvMode()) { case MODE_PASSIVE: AddTextElementRaw(node, "PasvMode", "MODE_PASSIVE"); break; case MODE_ACTIVE: AddTextElementRaw(node, "PasvMode", "MODE_ACTIVE"); break; default: AddTextElementRaw(node, "PasvMode", "MODE_DEFAULT"); break; } AddTextElement(node, "MaximumMultipleConnections", server.MaximumMultipleConnections()); switch (server.GetEncodingType()) { case ENCODING_AUTO: AddTextElementRaw(node, "EncodingType", "Auto"); break; case ENCODING_UTF8: AddTextElementRaw(node, "EncodingType", "UTF-8"); break; case ENCODING_CUSTOM: AddTextElementRaw(node, "EncodingType", "Custom"); AddTextElement(node, "CustomEncoding", server.GetCustomEncoding()); break; } const enum ServerProtocol protocol = server.GetProtocol(); if (protocol == FTP || protocol == FTPS || protocol == FTPES) { const std::vector<wxString>& postLoginCommands = server.GetPostLoginCommands(); if (!postLoginCommands.empty()) { TiXmlElement* pElement = node->LinkEndChild(new TiXmlElement("PostLoginCommands"))->ToElement(); for (std::vector<wxString>::const_iterator iter = postLoginCommands.begin(); iter != postLoginCommands.end(); iter++) AddTextElement(pElement, "Command", *iter); } } AddTextElementRaw(node, "BypassProxy", server.GetBypassProxy() ? "1" : "0"); const wxString& name = server.GetName(); if (name != _T("")) AddTextElement(node, "Name", name); }
void SetServer(pugi::xml_node node, const CServer& server) { if (!node) return; bool kiosk_mode = COptions::Get()->GetOptionVal(OPTION_DEFAULT_KIOSKMODE) != 0; for (auto child = node.first_child(); child; child = node.first_child()) { node.remove_child(child); } AddTextElement(node, "Host", server.GetHost()); AddTextElement(node, "Port", server.GetPort()); AddTextElement(node, "Protocol", server.GetProtocol()); AddTextElement(node, "Type", server.GetType()); enum LogonType logonType = server.GetLogonType(); if (server.GetLogonType() != ANONYMOUS) { AddTextElement(node, "User", server.GetUser()); if (server.GetLogonType() == NORMAL || server.GetLogonType() == ACCOUNT) { if (kiosk_mode) logonType = ASK; else { wxString pass = server.GetPass(); auto const& buf = pass.utf8_str(); // wxWidgets has such an ugly string API.... std::string utf8(buf.data(), buf.length()); wxString base64 = wxBase64Encode(utf8.c_str(), utf8.size()); pugi::xml_node passElement = AddTextElement(node, "Pass", base64); if (passElement) { SetTextAttribute(passElement, "encoding", _T("base64")); } if (server.GetLogonType() == ACCOUNT) AddTextElement(node, "Account", server.GetAccount()); } } else if (server.GetLogonType() == KEY) { AddTextElement(node, "Keyfile", server.GetKeyFile()); } } AddTextElement(node, "Logontype", logonType); AddTextElement(node, "TimezoneOffset", server.GetTimezoneOffset()); switch (server.GetPasvMode()) { case MODE_PASSIVE: AddTextElementRaw(node, "PasvMode", "MODE_PASSIVE"); break; case MODE_ACTIVE: AddTextElementRaw(node, "PasvMode", "MODE_ACTIVE"); break; default: AddTextElementRaw(node, "PasvMode", "MODE_DEFAULT"); break; } AddTextElement(node, "MaximumMultipleConnections", server.MaximumMultipleConnections()); switch (server.GetEncodingType()) { case ENCODING_AUTO: AddTextElementRaw(node, "EncodingType", "Auto"); break; case ENCODING_UTF8: AddTextElementRaw(node, "EncodingType", "UTF-8"); break; case ENCODING_CUSTOM: AddTextElementRaw(node, "EncodingType", "Custom"); AddTextElement(node, "CustomEncoding", server.GetCustomEncoding()); break; } if (CServer::SupportsPostLoginCommands(server.GetProtocol())) { std::vector<wxString> const& postLoginCommands = server.GetPostLoginCommands(); if (!postLoginCommands.empty()) { auto element = node.append_child("PostLoginCommands"); for (std::vector<wxString>::const_iterator iter = postLoginCommands.begin(); iter != postLoginCommands.end(); ++iter) { AddTextElement(element, "Command", *iter); } } } AddTextElementRaw(node, "BypassProxy", server.GetBypassProxy() ? "1" : "0"); const wxString& name = server.GetName(); if (!name.empty()) AddTextElement(node, "Name", name); }