mirror of
https://github.com/Team-Resurgent/xbmc4xbox-redux.git
synced 2026-08-15 20:18:49 -07:00
853 lines
21 KiB
C++
853 lines
21 KiB
C++
/*
|
|
* Copyright (C) 2005-2012 Team XBMC
|
|
* http://www.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
|
|
* <http://www.gnu.org/licenses/>.
|
|
*
|
|
*/
|
|
|
|
#include "NetworkServices.h"
|
|
#include "Application.h"
|
|
#include "messaging/ApplicationMessenger.h"
|
|
#include "messaging/helpers/DialogHelper.h"
|
|
#include "GUIInfoManager.h"
|
|
#include "Util.h"
|
|
#include "dialogs/GUIDialogKaiToast.h"
|
|
#include "dialogs/GUIDialogOK.h"
|
|
#include "guilib/LocalizeStrings.h"
|
|
#include "xbox/Network.h"
|
|
#include "xbox/IoSupport.h"
|
|
|
|
#ifdef HAS_EVENT_SERVER
|
|
#include "network/EventServer.h"
|
|
#endif // HAS_EVENT_SERVER
|
|
|
|
#ifdef HAS_UPNP
|
|
#include "network/upnp/UPnP.h"
|
|
#endif // HAS_UPNP
|
|
|
|
using namespace KODI::MESSAGING::HELPERS;
|
|
|
|
#ifdef HAS_WEB_SERVER
|
|
#include "libGoAhead/WebServer.h"
|
|
#include "libGoAhead/XBMChttp.h"
|
|
#endif // HAS_WEB_SERVER
|
|
|
|
#ifdef HAS_FTP_SERVER
|
|
#include "libFileZilla/XBFileZilla.h"
|
|
#endif
|
|
|
|
#ifdef HAS_TIME_SERVER
|
|
#include "utils/Sntp.h"
|
|
#endif
|
|
|
|
#include "filesystem/File.h"
|
|
#include "filesystem/SpecialProtocol.h"
|
|
#include "profiles/ProfilesManager.h"
|
|
#include "settings/AdvancedSettings.h"
|
|
#include "settings/lib/Setting.h"
|
|
#include "settings/Settings.h"
|
|
#include "utils/log.h"
|
|
#include "utils/RssManager.h"
|
|
#include "SectionLoader.h"
|
|
|
|
using namespace KODI::MESSAGING;
|
|
using namespace std;
|
|
#ifdef HAS_EVENT_SERVER
|
|
using namespace EVENTSERVER;
|
|
#endif // HAS_EVENT_SERVER
|
|
#ifdef HAS_UPNP
|
|
using namespace UPNP;
|
|
#endif // HAS_UPNP
|
|
|
|
CNetworkServices::CNetworkServices()
|
|
:
|
|
#ifdef HAS_WEB_SERVER
|
|
m_webserver(NULL),
|
|
#endif // HAS_WEB_SERVER
|
|
m_sntpclient(NULL),
|
|
m_filezilla(NULL)
|
|
{
|
|
}
|
|
|
|
CNetworkServices::~CNetworkServices()
|
|
{
|
|
#ifdef HAS_TIME_SERVER
|
|
delete m_sntpclient;
|
|
#endif
|
|
#ifdef HAS_WEB_SERVER
|
|
delete m_webserver;
|
|
#endif // HAS_WEB_SERVER
|
|
#ifdef HAS_FTP_SERVER
|
|
delete m_filezilla;
|
|
#endif
|
|
}
|
|
|
|
CNetworkServices& CNetworkServices::Get()
|
|
{
|
|
static CNetworkServices sNetworkServices;
|
|
return sNetworkServices;
|
|
}
|
|
|
|
bool CNetworkServices::OnSettingChanging(const CSetting *setting)
|
|
{
|
|
if (setting == NULL)
|
|
return false;
|
|
|
|
const std::string &settingId = setting->GetId();
|
|
#ifdef HAS_WEB_SERVER
|
|
if (settingId == "services.webserver" ||
|
|
settingId == "services.webserverport")
|
|
{
|
|
if (IsWebserverRunning() && !StopWebserver())
|
|
return false;
|
|
|
|
if (CSettings::GetInstance().GetBool("services.webserver"))
|
|
{
|
|
if (!StartWebserver())
|
|
{
|
|
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33101), "", g_localizeStrings.Get(33100), "");
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
else if (settingId == "services.esport" ||
|
|
settingId == "services.webserverport")
|
|
return ValidatePort(((CSettingInt*)setting)->GetValue());
|
|
else
|
|
#endif // HAS_WEB_SERVER
|
|
|
|
#ifdef HAS_FTP_SERVER
|
|
if (settingId == "services.ftpserveruser" || settingId == "services.ftpserverpassword")
|
|
return SetFTPServerUserPass();
|
|
else
|
|
#endif // HAS_FTP_SERVER
|
|
|
|
#ifdef HAS_UPNP
|
|
if (settingId == "services.upnpserver")
|
|
{
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
return StartUPnPServer();
|
|
else
|
|
return StopUPnPServer();
|
|
}
|
|
else if (settingId == "services.upnprenderer")
|
|
{
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
return StartUPnPRenderer();
|
|
else
|
|
return StopUPnPRenderer();
|
|
}
|
|
else if (settingId == "services.upnpcontroller")
|
|
{
|
|
// always stop and restart
|
|
StopUPnPClient();
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
return StartUPnPClient();
|
|
}
|
|
// else
|
|
#endif // HAS_UPNP
|
|
|
|
if (settingId == "services.esenabled")
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
{
|
|
if (!StartEventServer())
|
|
{
|
|
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
|
|
return false;
|
|
}
|
|
}
|
|
else
|
|
return StopEventServer(true, true);
|
|
#endif // HAS_EVENT_SERVER
|
|
}
|
|
else if (settingId == "services.esport")
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
// restart eventserver without asking user
|
|
if (!StopEventServer(true, false))
|
|
return false;
|
|
|
|
if (!StartEventServer())
|
|
{
|
|
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
|
|
return false;
|
|
}
|
|
#endif // HAS_EVENT_SERVER
|
|
}
|
|
else if (settingId == "services.esallinterfaces")
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
if (CSettings::GetInstance().GetBool("services.esenabled"))
|
|
{
|
|
if (!StopEventServer(true, true))
|
|
return false;
|
|
|
|
if (!StartEventServer())
|
|
{
|
|
CGUIDialogOK::ShowAndGetInput(g_localizeStrings.Get(33102), "", g_localizeStrings.Get(33100), "");
|
|
return false;
|
|
}
|
|
}
|
|
#endif // HAS_EVENT_SERVER
|
|
}
|
|
|
|
#ifdef HAS_EVENT_SERVER
|
|
else if (settingId == "services.esinitialdelay" ||
|
|
settingId == "services.escontinuousdelay")
|
|
{
|
|
if (CSettings::GetInstance().GetBool("services.esenabled"))
|
|
return RefreshEventServer();
|
|
}
|
|
#endif // HAS_EVENT_SERVER
|
|
|
|
return true;
|
|
}
|
|
|
|
void CNetworkServices::OnSettingChanged(const CSetting *setting)
|
|
{
|
|
if (setting == NULL)
|
|
return;
|
|
|
|
const std::string &settingId = setting->GetId();
|
|
#ifdef HAS_TIME_SERVER
|
|
if (settingId == "services.timeserver")
|
|
{
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
StartTimeServer();
|
|
else
|
|
StopTimeServer();
|
|
}
|
|
else if (settingId == "services.timeserveraddress")
|
|
{
|
|
StopTimeServer();
|
|
StartTimeServer();
|
|
}
|
|
else
|
|
#endif
|
|
#ifdef HAS_FTP_SERVER
|
|
if (settingId == "services.ftpserver")
|
|
{
|
|
if (((CSettingBool*)setting)->GetValue())
|
|
StartFtpServer();
|
|
else
|
|
StopFtpServer();
|
|
}
|
|
else
|
|
#endif
|
|
#ifdef HAS_WEB_SERVER
|
|
if (settingId == "services.webserverusername" ||
|
|
settingId == "services.webserverpassword")
|
|
{
|
|
if (settingId == "services.webserverusername")
|
|
m_webserver->SetUserName(((CSettingString*)setting)->GetValue().c_str());
|
|
else if(settingId == "services.webserverpassword")
|
|
m_webserver->SetPassword(((CSettingString*)setting)->GetValue().c_str());
|
|
}
|
|
else
|
|
#endif // HAS_WEB_SERVER
|
|
if (settingId == "smb.winsserver" ||
|
|
settingId == "smb.workgroup")
|
|
{
|
|
// okey we really don't need to restart, only deinit samba, but that could be damn hard if something is playing
|
|
// TODO - General way of handling setting changes that require restart
|
|
if (HELPERS::ShowYesNoDialogText(14038, 14039) == YES)
|
|
{
|
|
CSettings::GetInstance().Save();
|
|
CApplicationMessenger::Get().PostMsg(TMSG_RESTARTAPP);
|
|
}
|
|
}
|
|
}
|
|
|
|
void CNetworkServices::Start()
|
|
{
|
|
StartTimeServer();
|
|
if (CSettings::GetInstance().GetBool("services.webserver") && !StartWebserver())
|
|
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33101), g_localizeStrings.Get(33100));
|
|
StartFtpServer();
|
|
StartUPnP();
|
|
if (CSettings::GetInstance().GetBool("services.esenabled") && !StartEventServer())
|
|
CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100));
|
|
StartRss();
|
|
}
|
|
|
|
void CNetworkServices::Stop(bool bWait)
|
|
{
|
|
if (bWait)
|
|
{
|
|
StopTimeServer();
|
|
StopWebserver();
|
|
StopFtpServer();
|
|
StopRss();
|
|
}
|
|
|
|
StopEventServer(bWait, false);
|
|
}
|
|
|
|
bool CNetworkServices::StartTimeServer()
|
|
{
|
|
#ifdef HAS_TIME_SERVER
|
|
if (!g_application.getNetwork().IsAvailable())
|
|
return false;
|
|
|
|
if (!CSettings::GetInstance().GetBool("services.timeserver"))
|
|
return false;
|
|
|
|
if(!IsTimeServerRunning())
|
|
{
|
|
CSectionLoader::Load("SNTP");
|
|
CLog::Log(LOGNOTICE, "start timeserver client");
|
|
m_sntpclient = new CSNTPClient();
|
|
m_sntpclient->Update();
|
|
}
|
|
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsTimeServerRunning()
|
|
{
|
|
#ifdef HAS_TIME_SERVER
|
|
return m_sntpclient != NULL;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopTimeServer()
|
|
{
|
|
#ifdef HAS_TIME_SERVER
|
|
if (m_sntpclient)
|
|
{
|
|
CLog::Log(LOGNOTICE, "stop time server client");
|
|
SAFE_DELETE(m_sntpclient);
|
|
CSectionLoader::Unload("SNTP");
|
|
}
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsTimeServerUpdateNeeded()
|
|
{
|
|
return m_sntpclient->UpdateNeeded();
|
|
}
|
|
|
|
void CNetworkServices::UpdateTimeServer()
|
|
{
|
|
m_sntpclient->Update();
|
|
}
|
|
|
|
bool CNetworkServices::StartWebserver()
|
|
{
|
|
#ifdef HAS_WEB_SERVER
|
|
if (!g_application.getNetwork().IsAvailable())
|
|
return false;
|
|
|
|
if (!CSettings::GetInstance().GetBool("services.webserver"))
|
|
return false;
|
|
|
|
int webPort = CSettings::GetInstance().GetInt("services.webserverport");
|
|
if (!ValidatePort(webPort))
|
|
{
|
|
CLog::Log(LOGERROR, "Cannot start Web Server on port %i", webPort);
|
|
return false;
|
|
}
|
|
|
|
if (IsWebserverRunning())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "Webserver: Starting...");
|
|
CSectionLoader::Load("LIBHTTP");
|
|
m_webserver = new CWebServer();
|
|
if(!m_webserver->Start(webPort, false))
|
|
{
|
|
delete m_webserver;
|
|
m_webserver = NULL;
|
|
return false;
|
|
}
|
|
|
|
if (m_webserver)
|
|
{
|
|
m_webserver->SetUserName(CSettings::GetInstance().GetString("services.webserverusername").c_str());
|
|
m_webserver->SetPassword(CSettings::GetInstance().GetString("services.webserverpassword").c_str());
|
|
}
|
|
if (m_webserver && m_pXbmcHttp && CSettings::GetInstance().GetInt("services.httpapibroadcastlevel")>=1)
|
|
CApplicationMessenger::Get().HttpApi("broadcastlevel; StartUp;1");
|
|
return true;
|
|
#endif // HAS_WEB_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsWebserverRunning()
|
|
{
|
|
#ifdef HAS_WEB_SERVER
|
|
return m_webserver != NULL;
|
|
#endif // HAS_WEB_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopWebserver()
|
|
{
|
|
#ifdef HAS_WEB_SERVER
|
|
if (!IsWebserverRunning())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "Webserver: Stopping...");
|
|
m_webserver->Stop();
|
|
delete m_webserver;
|
|
m_webserver = NULL;
|
|
CSectionLoader::Unload("LIBHTTP");
|
|
CLog::Log(LOGNOTICE, "Webserver: Stopped...");
|
|
return true;
|
|
#endif // HAS_WEB_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartFtpServer()
|
|
{
|
|
#ifdef HAS_FTP_SERVER
|
|
if (!g_application.getNetwork().IsAvailable())
|
|
return false;
|
|
|
|
if (!CSettings::GetInstance().GetBool("services.ftpserver"))
|
|
return false;
|
|
|
|
CLog::Log(LOGNOTICE, "XBFileZilla: Starting...");
|
|
if (!IsFtpServerRunning())
|
|
{
|
|
CStdString xmlpath = "special://xbmc/system/";
|
|
// if user didn't upgrade properly,
|
|
// check whether UserData/FileZilla Server.xml exists
|
|
if (XFILE::CFile::Exists(CProfilesManager::Get().GetUserDataItem("FileZilla Server.xml")))
|
|
xmlpath = CProfilesManager::Get().GetUserDataFolder();
|
|
|
|
// check file size and presence
|
|
XFILE::CFile xml;
|
|
if (xml.Open(xmlpath+"FileZilla Server.xml") && xml.GetLength() > 0)
|
|
{
|
|
m_filezilla = new CXBFileZilla(CSpecialProtocol::TranslatePath(xmlpath));
|
|
m_filezilla->Start(false);
|
|
}
|
|
else
|
|
{
|
|
// 'FileZilla Server.xml' does not exist or is corrupt,
|
|
// falling back to ftp emergency recovery mode
|
|
CLog::Log(LOGNOTICE, "XBFileZilla: 'FileZilla Server.xml' is missing or is corrupt!");
|
|
CLog::Log(LOGNOTICE, "XBFileZilla: Starting ftp emergency recovery mode");
|
|
StartFtpEmergencyRecoveryMode();
|
|
}
|
|
xml.Close();
|
|
}
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartFtpEmergencyRecoveryMode()
|
|
{
|
|
#ifdef HAS_FTP_SERVER
|
|
m_filezilla = new CXBFileZilla(NULL);
|
|
m_filezilla->Start();
|
|
|
|
// Default settings
|
|
m_filezilla->mSettings.SetMaxUsers(0);
|
|
m_filezilla->mSettings.SetWelcomeMessage("XBMC emergency recovery console FTP.");
|
|
|
|
// default user
|
|
CXFUser* pUser;
|
|
m_filezilla->AddUser("xbox", pUser);
|
|
pUser->SetPassword("xbox");
|
|
pUser->SetShortcutsEnabled(false);
|
|
pUser->SetUseRelativePaths(false);
|
|
pUser->SetBypassUserLimit(false);
|
|
pUser->SetUserLimit(0);
|
|
pUser->SetIPLimit(0);
|
|
pUser->AddDirectory("/", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS | XBDIR_HOME);
|
|
pUser->AddDirectory("C:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
pUser->AddDirectory("D:\\", XBFILE_READ | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
pUser->AddDirectory("E:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
pUser->AddDirectory("Q:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
//Add existing extended partitions
|
|
if (CIoSupport::DriveExists('F')){
|
|
pUser->AddDirectory("F:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('G')){
|
|
pUser->AddDirectory("G:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('R')){
|
|
pUser->AddDirectory("R:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('S')){
|
|
pUser->AddDirectory("S:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('V')){
|
|
pUser->AddDirectory("V:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('W')){
|
|
pUser->AddDirectory("W:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('A')){
|
|
pUser->AddDirectory("A:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
if (CIoSupport::DriveExists('B')){
|
|
pUser->AddDirectory("B:\\", XBFILE_READ | XBFILE_WRITE | XBFILE_DELETE | XBFILE_APPEND | XBDIR_DELETE | XBDIR_CREATE | XBDIR_LIST | XBDIR_SUBDIRS);
|
|
}
|
|
pUser->CommitChanges();
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsFtpServerRunning()
|
|
{
|
|
#ifdef HAS_FTP_SERVER
|
|
return m_filezilla != NULL;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopFtpServer()
|
|
{
|
|
#ifdef HAS_FTP_SERVER
|
|
if (IsFtpServerRunning())
|
|
{
|
|
CLog::Log(LOGINFO, "XBFileZilla: Stopping...");
|
|
m_filezilla->Stop();
|
|
delete m_filezilla;
|
|
m_filezilla = NULL;
|
|
CLog::Log(LOGINFO, "XBFileZilla: Stopped");
|
|
}
|
|
return true;
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::SetFTPServerUserPass()
|
|
{
|
|
#ifdef HAS_FTP_SERVER
|
|
if(!m_filezilla)
|
|
return false;
|
|
|
|
// TODO: Read the FileZilla Server XML and Set it here!
|
|
// Get GUI USER and pass and set pass to FTP Server
|
|
CStdString strFtpUserName, strFtpUserPassword;
|
|
strFtpUserName = CSettings::GetInstance().GetString("services.ftpserveruser");
|
|
strFtpUserPassword = CSettings::GetInstance().GetString("services.ftpserverpassword");
|
|
|
|
if(strFtpUserPassword.size() == 0)
|
|
{ // PopUp OK and Display: FTP Server Password is empty! Try Again!
|
|
CGUIDialogOK::ShowAndGetInput(728, 0, 12358, 0);
|
|
return false;
|
|
}
|
|
|
|
CStdString strTempUserName;
|
|
class CXFUser* p_ftpUser;
|
|
vector<CXFUser*> v_ftpusers;
|
|
m_filezilla->GetAllUsers(v_ftpusers);
|
|
int iUserSize = v_ftpusers.size();
|
|
if (iUserSize > 0)
|
|
{
|
|
int i = 1 ;
|
|
while( i <= iUserSize)
|
|
{
|
|
p_ftpUser = v_ftpusers[i-1];
|
|
strTempUserName = p_ftpUser->GetName();
|
|
if (strTempUserName.Equals(strFtpUserName.c_str()) )
|
|
{
|
|
if (p_ftpUser->SetPassword(strFtpUserPassword.c_str()) != XFS_INVALID_PARAMETERS)
|
|
{
|
|
p_ftpUser->CommitChanges();
|
|
CSettings::GetInstance().SetString("services.ftpserverpassword",strFtpUserPassword.c_str());
|
|
CGUIDialogOK::ShowAndGetInput(728, 0, 1247, 0);
|
|
return true;
|
|
}
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
}
|
|
#endif
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::FtpHasActiveConnections()
|
|
{
|
|
if (IsFtpServerRunning())
|
|
return m_filezilla->GetNoConnections() != 0;
|
|
return false;
|
|
}
|
|
|
|
int CNetworkServices::GetFtpServerPort()
|
|
{
|
|
if (IsFtpServerRunning())
|
|
return m_filezilla->mSettings.GetServerPort();
|
|
return 0;
|
|
}
|
|
|
|
bool CNetworkServices::StartEventServer()
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
if (!CSettings::GetInstance().GetBool("services.esenabled"))
|
|
return false;
|
|
|
|
if (IsEventServerRunning())
|
|
return true;
|
|
|
|
CEventServer* server = CEventServer::GetInstance();
|
|
if (!server)
|
|
{
|
|
CLog::Log(LOGERROR, "ES: Out of memory");
|
|
return false;
|
|
}
|
|
|
|
CLog::Log(LOGNOTICE, "ES: Starting event server");
|
|
server->StartServer();
|
|
|
|
return true;
|
|
#endif // HAS_EVENT_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsEventServerRunning()
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
return CEventServer::GetInstance()->Running();
|
|
#endif // HAS_EVENT_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopEventServer(bool bWait, bool promptuser)
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
if (!IsEventServerRunning())
|
|
return true;
|
|
|
|
CEventServer* server = CEventServer::GetInstance();
|
|
if (!server)
|
|
{
|
|
CLog::Log(LOGERROR, "ES: Out of memory");
|
|
return false;
|
|
}
|
|
|
|
if (promptuser)
|
|
{
|
|
if (server->GetNumberOfClients() > 0)
|
|
{
|
|
if (HELPERS::ShowYesNoDialogText(13140, 13141, "", "", 10000) !=
|
|
YES)
|
|
{
|
|
CLog::Log(LOGNOTICE, "ES: Not stopping event server");
|
|
return false;
|
|
}
|
|
}
|
|
CLog::Log(LOGNOTICE, "ES: Stopping event server with confirmation");
|
|
|
|
CEventServer::GetInstance()->StopServer(true);
|
|
}
|
|
else
|
|
{
|
|
if (!bWait)
|
|
CLog::Log(LOGNOTICE, "ES: Stopping event server");
|
|
|
|
CEventServer::GetInstance()->StopServer(bWait);
|
|
}
|
|
|
|
return true;
|
|
#endif // HAS_EVENT_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::RefreshEventServer()
|
|
{
|
|
#ifdef HAS_EVENT_SERVER
|
|
if (!CSettings::GetInstance().GetBool("services.esenabled"))
|
|
return false;
|
|
|
|
if (!IsEventServerRunning())
|
|
return false;
|
|
|
|
CEventServer::GetInstance()->RefreshSettings();
|
|
return true;
|
|
#endif // HAS_EVENT_SERVER
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartUPnP()
|
|
{
|
|
bool ret = false;
|
|
#ifdef HAS_UPNP
|
|
ret |= StartUPnPClient();
|
|
ret |= StartUPnPServer();
|
|
ret |= StartUPnPRenderer();
|
|
#endif // HAS_UPNP
|
|
return ret;
|
|
}
|
|
|
|
bool CNetworkServices::StopUPnP(bool bWait)
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!CUPnP::IsInstantiated())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "stopping upnp");
|
|
CUPnP::ReleaseInstance(bWait);
|
|
|
|
return true;
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartUPnPClient()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!CSettings::GetInstance().GetBool("services.upnpcontroller"))
|
|
return false;
|
|
|
|
CLog::Log(LOGNOTICE, "starting upnp controller");
|
|
CUPnP::GetInstance()->StartClient();
|
|
return IsUPnPClientRunning();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsUPnPClientRunning()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
return CUPnP::GetInstance()->IsClientStarted();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopUPnPClient()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!IsUPnPRendererRunning())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "stopping upnp client");
|
|
CUPnP::GetInstance()->StopClient();
|
|
|
|
return true;
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartUPnPRenderer()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!CSettings::GetInstance().GetBool("services.upnprenderer"))
|
|
return false;
|
|
|
|
CLog::Log(LOGNOTICE, "starting upnp renderer");
|
|
return CUPnP::GetInstance()->StartRenderer();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsUPnPRendererRunning()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
return CUPnP::GetInstance()->IsInstantiated();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopUPnPRenderer()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!IsUPnPRendererRunning())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "stopping upnp renderer");
|
|
CUPnP::GetInstance()->StopRenderer();
|
|
|
|
return true;
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartUPnPServer()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!CSettings::GetInstance().GetBool("services.upnpserver"))
|
|
return false;
|
|
|
|
CLog::Log(LOGNOTICE, "starting upnp server");
|
|
return CUPnP::GetInstance()->StartServer();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::IsUPnPServerRunning()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
return CUPnP::GetInstance()->IsInstantiated();
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StopUPnPServer()
|
|
{
|
|
#ifdef HAS_UPNP
|
|
if (!IsUPnPRendererRunning())
|
|
return true;
|
|
|
|
CLog::Log(LOGNOTICE, "stopping upnp server");
|
|
CUPnP::GetInstance()->StopServer();
|
|
|
|
return true;
|
|
#endif // HAS_UPNP
|
|
return false;
|
|
}
|
|
|
|
bool CNetworkServices::StartRss()
|
|
{
|
|
if (IsRssRunning())
|
|
return true;
|
|
|
|
CRssManager::Get().Start();
|
|
return true;
|
|
}
|
|
|
|
bool CNetworkServices::IsRssRunning()
|
|
{
|
|
return CRssManager::Get().IsActive();
|
|
}
|
|
|
|
bool CNetworkServices::StopRss()
|
|
{
|
|
if (!IsRssRunning())
|
|
return true;
|
|
|
|
CRssManager::Get().Stop();
|
|
return true;
|
|
}
|
|
|
|
bool CNetworkServices::ValidatePort(int port)
|
|
{
|
|
if (port <= 0 || port > 65535)
|
|
return false;
|
|
|
|
#ifdef TARGET_LINUX
|
|
if (!CUtil::CanBindPrivileged() && (port < 1024 || port > 65535))
|
|
return false;
|
|
#endif
|
|
|
|
return true;
|
|
}
|