/* * Copyright (C) 2005-2013 Team XBMC * http://xbmc.org * * This Program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This Program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with XBMC; see the file COPYING. If not, see * . * */ #include "GUIDialogNetworkSetup.h" #include "dialogs/GUIDialogFileBrowser.h" #include "guilib/GUIWindowManager.h" #include "guilib/GUIEditControl.h" #include "utils/URIUtils.h" #include "utils/StringUtils.h" #include "URL.h" #include "guilib/LocalizeStrings.h" #define CONTROL_PROTOCOL 10 #define CONTROL_SERVER_ADDRESS 11 #define CONTROL_SERVER_BROWSE 12 #define CONTROL_PORT_NUMBER 13 #define CONTROL_USERNAME 14 #define CONTROL_PASSWORD 15 #define CONTROL_REMOTE_PATH 16 #define CONTROL_OK 18 #define CONTROL_CANCEL 19 CGUIDialogNetworkSetup::CGUIDialogNetworkSetup(void) : CGUIDialog(WINDOW_DIALOG_NETWORK_SETUP, "DialogNetworkSetup.xml") { m_protocol = NET_PROTOCOL_SMB; m_confirmed = false; m_loadType = KEEP_IN_MEMORY; } CGUIDialogNetworkSetup::~CGUIDialogNetworkSetup() { } bool CGUIDialogNetworkSetup::OnBack(int actionID) { m_confirmed = false; return CGUIDialog::OnBack(actionID); } bool CGUIDialogNetworkSetup::OnMessage(CGUIMessage& message) { switch ( message.GetMessage() ) { case GUI_MSG_CLICKED: { int iControl = message.GetSenderId(); if (iControl == CONTROL_PROTOCOL) { m_server.clear(); m_path.clear(); m_username.clear(); m_password.clear(); OnProtocolChange(); } else if (iControl == CONTROL_SERVER_BROWSE) OnServerBrowse(); else if (iControl == CONTROL_SERVER_ADDRESS) OnEditChanged(iControl, m_server); else if (iControl == CONTROL_REMOTE_PATH) OnEditChanged(iControl, m_path); else if (iControl == CONTROL_PORT_NUMBER) OnEditChanged(iControl, m_port); else if (iControl == CONTROL_USERNAME) OnEditChanged(iControl, m_username); else if (iControl == CONTROL_PASSWORD) OnEditChanged(iControl, m_password); else if (iControl == CONTROL_OK) OnOK(); else if (iControl == CONTROL_CANCEL) OnCancel(); return true; } break; } return CGUIDialog::OnMessage(message); } // \brief Show CGUIDialogNetworkSetup dialog and prompt for a new network address. // \return True if the network address is valid, false otherwise. bool CGUIDialogNetworkSetup::ShowAndGetNetworkAddress(std::string &path) { CGUIDialogNetworkSetup *dialog = (CGUIDialogNetworkSetup *)g_windowManager.GetWindow(WINDOW_DIALOG_NETWORK_SETUP); if (!dialog) return false; dialog->Initialize(); dialog->SetPath(path); dialog->DoModal(); path = dialog->ConstructPath(); return dialog->IsConfirmed(); } void CGUIDialogNetworkSetup::OnInitWindow() { // start as unconfirmed m_confirmed = false; CGUIDialog::OnInitWindow(); // Add our protocols std::vector< std::pair > labels; #ifdef HAS_FILESYSTEM_SMB labels.push_back(make_pair(g_localizeStrings.Get(20171), NET_PROTOCOL_SMB)); #endif labels.push_back(make_pair(g_localizeStrings.Get(20256), NET_PROTOCOL_HTSP)); labels.push_back(make_pair(g_localizeStrings.Get(20257), NET_PROTOCOL_VTP)); #ifdef HAS_MYSQL labels.push_back(make_pair(g_localizeStrings.Get(20258), NET_PROTOCOL_MYTH)); #endif labels.push_back(make_pair(g_localizeStrings.Get(21331), NET_PROTOCOL_TUXBOX)); labels.push_back(make_pair(g_localizeStrings.Get(20301), NET_PROTOCOL_HTTPS)); labels.push_back(make_pair(g_localizeStrings.Get(20300), NET_PROTOCOL_HTTP)); labels.push_back(make_pair(g_localizeStrings.Get(20254), NET_PROTOCOL_DAVS)); labels.push_back(make_pair(g_localizeStrings.Get(20253), NET_PROTOCOL_DAV)); labels.push_back(make_pair(g_localizeStrings.Get(20173), NET_PROTOCOL_FTP)); labels.push_back(make_pair(g_localizeStrings.Get(20174), NET_PROTOCOL_DAAP)); labels.push_back(make_pair(g_localizeStrings.Get(20175), NET_PROTOCOL_UPNP)); labels.push_back(make_pair(g_localizeStrings.Get(20304), NET_PROTOCOL_RSS)); #ifdef HAS_FILESYSTEM_NFS labels.push_back(make_pair(g_localizeStrings.Get(20259), NET_PROTOCOL_NFS)); #endif #ifdef HAS_FILESYSTEM_SFTP labels.push_back(make_pair(g_localizeStrings.Get(20260), NET_PROTOCOL_SFTP)); #endif #ifdef HAS_FILESYSTEM_AFP labels.push_back(make_pair(g_localizeStrings.Get(20261), NET_PROTOCOL_AFP)); #endif SET_CONTROL_LABELS(CONTROL_PROTOCOL, m_protocol, &labels); UpdateButtons(); } void CGUIDialogNetworkSetup::OnDeinitWindow(int nextWindowID) { // clear protocol spinner CGUIMessage msg(GUI_MSG_LABEL_RESET, GetID(), CONTROL_PROTOCOL); OnMessage(msg); CGUIDialog::OnDeinitWindow(nextWindowID); } void CGUIDialogNetworkSetup::OnServerBrowse() { // open a filebrowser dialog with the current address VECSOURCES shares; std::string path = ConstructPath(); // get the share as the base path CMediaSource share; std::string basePath = path; std::string tempPath; while (URIUtils::GetParentPath(basePath, tempPath)) basePath = tempPath; share.strPath = basePath; // don't include the user details in the share name CURL url(share.strPath); share.strName = url.GetWithoutUserDetails(); shares.push_back(share); if (CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(1015), path)) { SetPath(path); UpdateButtons(); } } void CGUIDialogNetworkSetup::OnOK() { m_confirmed = true; Close(); } void CGUIDialogNetworkSetup::OnCancel() { m_confirmed = false; Close(); } void CGUIDialogNetworkSetup::OnProtocolChange() { CGUIMessage msg(GUI_MSG_ITEM_SELECTED, GetID(), CONTROL_PROTOCOL); if (!OnMessage(msg)) return; m_protocol = (NET_PROTOCOL)msg.GetParam1(); // set defaults for the port if (m_protocol == NET_PROTOCOL_FTP) m_port = "21"; else if (m_protocol == NET_PROTOCOL_HTTP || m_protocol == NET_PROTOCOL_RSS || m_protocol == NET_PROTOCOL_TUXBOX || m_protocol == NET_PROTOCOL_DAV) m_port = "80"; else if (m_protocol == NET_PROTOCOL_HTTPS || m_protocol == NET_PROTOCOL_DAVS) m_port = "443"; else if (m_protocol == NET_PROTOCOL_DAAP) m_port = "3689"; else if (m_protocol == NET_PROTOCOL_HTSP) m_port = "9982"; else if (m_protocol == NET_PROTOCOL_VTP) m_port = "2004"; else if (m_protocol == NET_PROTOCOL_MYTH) m_port = "6543"; else if (m_protocol == NET_PROTOCOL_SFTP) m_port = "22"; else m_port = "0"; UpdateButtons(); } void CGUIDialogNetworkSetup::UpdateButtons() { // Address label SET_CONTROL_LABEL2(CONTROL_SERVER_ADDRESS, m_server); if (m_protocol == NET_PROTOCOL_SMB) { SET_CONTROL_LABEL(CONTROL_SERVER_ADDRESS, 1010); // Server name } else { SET_CONTROL_LABEL(CONTROL_SERVER_ADDRESS, 1009); // Server Address } if (m_protocol == NET_PROTOCOL_DAAP) SendMessage(GUI_MSG_SET_TYPE, CONTROL_SERVER_ADDRESS, CGUIEditControl::INPUT_TYPE_IPADDRESS, 1016); else SendMessage(GUI_MSG_SET_TYPE, CONTROL_SERVER_ADDRESS, CGUIEditControl::INPUT_TYPE_TEXT, 1016); // remote path SET_CONTROL_LABEL2(CONTROL_REMOTE_PATH, m_path); CONTROL_ENABLE_ON_CONDITION(CONTROL_REMOTE_PATH, m_protocol != NET_PROTOCOL_DAAP && m_protocol != NET_PROTOCOL_UPNP && m_protocol != NET_PROTOCOL_TUXBOX && m_protocol != NET_PROTOCOL_HTSP && m_protocol != NET_PROTOCOL_VTP && m_protocol != NET_PROTOCOL_MYTH); if (m_protocol == NET_PROTOCOL_FTP || m_protocol == NET_PROTOCOL_HTTP || m_protocol == NET_PROTOCOL_HTTPS || m_protocol == NET_PROTOCOL_RSS || m_protocol == NET_PROTOCOL_DAV || m_protocol == NET_PROTOCOL_DAVS|| m_protocol == NET_PROTOCOL_SFTP|| m_protocol == NET_PROTOCOL_NFS) { SET_CONTROL_LABEL(CONTROL_REMOTE_PATH, 1011); // Remote Path } else { SET_CONTROL_LABEL(CONTROL_REMOTE_PATH, 1012); // Shared Folder } SendMessage(GUI_MSG_SET_TYPE, CONTROL_REMOTE_PATH, CGUIEditControl::INPUT_TYPE_TEXT, 1017); // username SET_CONTROL_LABEL2(CONTROL_USERNAME, m_username); CONTROL_ENABLE_ON_CONDITION(CONTROL_USERNAME, m_protocol != NET_PROTOCOL_DAAP && m_protocol != NET_PROTOCOL_VTP && m_protocol != NET_PROTOCOL_UPNP && m_protocol != NET_PROTOCOL_NFS); SendMessage(GUI_MSG_SET_TYPE, CONTROL_USERNAME, CGUIEditControl::INPUT_TYPE_TEXT, 1019); // port SET_CONTROL_LABEL2(CONTROL_PORT_NUMBER, m_port); CONTROL_ENABLE_ON_CONDITION(CONTROL_PORT_NUMBER, m_protocol == NET_PROTOCOL_FTP || m_protocol == NET_PROTOCOL_HTTP || m_protocol == NET_PROTOCOL_HTTPS || m_protocol == NET_PROTOCOL_DAV || m_protocol == NET_PROTOCOL_DAVS || m_protocol == NET_PROTOCOL_TUXBOX || m_protocol == NET_PROTOCOL_HTSP || m_protocol == NET_PROTOCOL_VTP || m_protocol == NET_PROTOCOL_MYTH || m_protocol == NET_PROTOCOL_RSS || m_protocol == NET_PROTOCOL_DAAP || m_protocol == NET_PROTOCOL_SFTP); SendMessage(GUI_MSG_SET_TYPE, CONTROL_PORT_NUMBER, CGUIEditControl::INPUT_TYPE_NUMBER, 1018); // password SET_CONTROL_LABEL2(CONTROL_PASSWORD, m_password); CONTROL_ENABLE_ON_CONDITION(CONTROL_PASSWORD, m_protocol != NET_PROTOCOL_DAAP && m_protocol != NET_PROTOCOL_VTP && m_protocol != NET_PROTOCOL_UPNP && m_protocol != NET_PROTOCOL_NFS); SendMessage(GUI_MSG_SET_TYPE, CONTROL_PASSWORD, CGUIEditControl::INPUT_TYPE_PASSWORD, 12326); // TODO: FIX BETTER DAAP SUPPORT // server browse should be disabled if we are in DAAP, FTP, HTTP, HTTPS, RSS, HTSP, VTP, TUXBOX, DAV or DAVS CONTROL_ENABLE_ON_CONDITION(CONTROL_SERVER_BROWSE, !m_server.empty() || !(m_protocol == NET_PROTOCOL_FTP || m_protocol == NET_PROTOCOL_HTTP || m_protocol == NET_PROTOCOL_HTTPS || m_protocol == NET_PROTOCOL_DAV || m_protocol == NET_PROTOCOL_DAVS || m_protocol == NET_PROTOCOL_DAAP || m_protocol == NET_PROTOCOL_RSS || m_protocol == NET_PROTOCOL_HTSP || m_protocol == NET_PROTOCOL_VTP || m_protocol == NET_PROTOCOL_MYTH || m_protocol == NET_PROTOCOL_TUXBOX|| m_protocol == NET_PROTOCOL_SFTP || m_protocol == NET_PROTOCOL_AFP)); } std::string CGUIDialogNetworkSetup::ConstructPath() const { CURL url; if (m_protocol == NET_PROTOCOL_SMB) url.SetProtocol("smb"); else if (m_protocol == NET_PROTOCOL_FTP) url.SetProtocol("ftp"); else if (m_protocol == NET_PROTOCOL_HTTP) url.SetProtocol("http"); else if (m_protocol == NET_PROTOCOL_HTTPS) url.SetProtocol("https"); else if (m_protocol == NET_PROTOCOL_DAV) url.SetProtocol("dav"); else if (m_protocol == NET_PROTOCOL_DAVS) url.SetProtocol("davs"); else if (m_protocol == NET_PROTOCOL_DAAP) url.SetProtocol("daap"); else if (m_protocol == NET_PROTOCOL_UPNP) url.SetProtocol("upnp"); else if (m_protocol == NET_PROTOCOL_TUXBOX) url.SetProtocol("tuxbox"); else if (m_protocol == NET_PROTOCOL_RSS) url.SetProtocol("rss"); else if (m_protocol == NET_PROTOCOL_HTSP) url.SetProtocol("htsp"); else if (m_protocol == NET_PROTOCOL_VTP) url.SetProtocol("vtp"); else if (m_protocol == NET_PROTOCOL_MYTH) url.SetProtocol("myth"); else if (m_protocol == NET_PROTOCOL_NFS) url.SetProtocol("nfs"); else if (m_protocol == NET_PROTOCOL_SFTP) url.SetProtocol("sftp"); else if (m_protocol == NET_PROTOCOL_AFP) url.SetProtocol("afp"); if (!m_username.empty()) { url.SetUserName(m_username); if (!m_password.empty()) url.SetPassword(m_password); } if(!m_server.empty()) url.SetHostName(m_server); if (((m_protocol == NET_PROTOCOL_FTP) || (m_protocol == NET_PROTOCOL_HTTP) || (m_protocol == NET_PROTOCOL_HTTPS) || (m_protocol == NET_PROTOCOL_DAV) || (m_protocol == NET_PROTOCOL_DAVS) || (m_protocol == NET_PROTOCOL_RSS) || (m_protocol == NET_PROTOCOL_DAAP && !m_server.empty()) || (m_protocol == NET_PROTOCOL_HTSP) || (m_protocol == NET_PROTOCOL_VTP) || (m_protocol == NET_PROTOCOL_MYTH) || (m_protocol == NET_PROTOCOL_TUXBOX) || (m_protocol == NET_PROTOCOL_SFTP) || (m_protocol == NET_PROTOCOL_NFS)) && !m_port.empty() && atoi(m_port.c_str()) > 0) { url.SetPort(atoi(m_port.c_str())); } if (!m_path.empty()) url.SetFileName(m_path); return url.Get(); } void CGUIDialogNetworkSetup::SetPath(const std::string &path) { CURL url(path); if (url.IsProtocol("smb")) m_protocol = NET_PROTOCOL_SMB; else if (url.IsProtocol("ftp")) m_protocol = NET_PROTOCOL_FTP; else if (url.IsProtocol("http")) m_protocol = NET_PROTOCOL_HTTP; else if (url.IsProtocol("https")) m_protocol = NET_PROTOCOL_HTTPS; else if (url.IsProtocol("dav")) m_protocol = NET_PROTOCOL_DAV; else if (url.IsProtocol("davs")) m_protocol = NET_PROTOCOL_DAVS; else if (url.IsProtocol("daap")) m_protocol = NET_PROTOCOL_DAAP; else if (url.IsProtocol("upnp")) m_protocol = NET_PROTOCOL_UPNP; else if (url.IsProtocol("tuxbox")) m_protocol = NET_PROTOCOL_TUXBOX; else if (url.IsProtocol("htsp")) m_protocol = NET_PROTOCOL_HTSP; else if (url.IsProtocol("vtp")) m_protocol = NET_PROTOCOL_VTP; else if (url.IsProtocol("myth")) m_protocol = NET_PROTOCOL_MYTH; else if (url.IsProtocol("rss")) m_protocol = NET_PROTOCOL_RSS; else if (url.IsProtocol("nfs")) m_protocol = NET_PROTOCOL_NFS; else if (url.IsProtocol("sftp") || url.IsProtocol("ssh")) m_protocol = NET_PROTOCOL_SFTP; else if (url.IsProtocol("afp")) m_protocol = NET_PROTOCOL_AFP; else m_protocol = NET_PROTOCOL_SMB; // default to smb m_username = url.GetUserName(); m_password = url.GetPassWord(); m_port = StringUtils::Format("%i", url.GetPort()); m_server = url.GetHostName(); m_path = url.GetFileName(); URIUtils::RemoveSlashAtEnd(m_path); }