1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
|
/*
* Copyright (C) 2013-2018 Team Kodi
* This file is part of Kodi - https://kodi.tv
*
* SPDX-License-Identifier: GPL-2.0-or-later
* See LICENSES/README.md for more information.
*/
#include "UPnPSettings.h"
#include "ServiceBroker.h"
#include "utils/FileUtils.h"
#include "utils/StringUtils.h"
#include "utils/XBMCTinyXML.h"
#include "utils/XMLUtils.h"
#include "utils/log.h"
#include <mutex>
#define XML_UPNP "upnpserver"
#define XML_SERVER_UUID "UUID"
#define XML_SERVER_PORT "Port"
#define XML_MAX_ITEMS "MaxReturnedItems"
#define XML_RENDERER_UUID "UUIDRenderer"
#define XML_RENDERER_PORT "PortRenderer"
CUPnPSettings::CUPnPSettings() : m_logger(CServiceBroker::GetLogging().GetLogger("CUPnPSettings"))
{
Clear();
}
CUPnPSettings::~CUPnPSettings()
{
Clear();
}
CUPnPSettings& CUPnPSettings::GetInstance()
{
static CUPnPSettings sUPnPSettings;
return sUPnPSettings;
}
void CUPnPSettings::OnSettingsUnloaded()
{
Clear();
}
bool CUPnPSettings::Load(const std::string &file)
{
std::unique_lock<CCriticalSection> lock(m_critical);
Clear();
if (!CFileUtils::Exists(file))
return false;
CXBMCTinyXML doc;
if (!doc.LoadFile(file))
{
m_logger->error("error loading {}, Line {}\n{}", file, doc.ErrorRow(), doc.ErrorDesc());
return false;
}
TiXmlElement *pRootElement = doc.RootElement();
if (pRootElement == NULL || !StringUtils::EqualsNoCase(pRootElement->Value(), XML_UPNP))
{
m_logger->error("error loading {}, no <upnpserver> node", file);
return false;
}
// load settings
XMLUtils::GetString(pRootElement, XML_SERVER_UUID, m_serverUUID);
XMLUtils::GetInt(pRootElement, XML_SERVER_PORT, m_serverPort);
XMLUtils::GetInt(pRootElement, XML_MAX_ITEMS, m_maxReturnedItems);
XMLUtils::GetString(pRootElement, XML_RENDERER_UUID, m_rendererUUID);
XMLUtils::GetInt(pRootElement, XML_RENDERER_PORT, m_rendererPort);
return true;
}
bool CUPnPSettings::Save(const std::string &file) const
{
std::unique_lock<CCriticalSection> lock(m_critical);
CXBMCTinyXML doc;
TiXmlElement xmlRootElement(XML_UPNP);
TiXmlNode *pRoot = doc.InsertEndChild(xmlRootElement);
if (pRoot == NULL)
return false;
XMLUtils::SetString(pRoot, XML_SERVER_UUID, m_serverUUID);
XMLUtils::SetInt(pRoot, XML_SERVER_PORT, m_serverPort);
XMLUtils::SetInt(pRoot, XML_MAX_ITEMS, m_maxReturnedItems);
XMLUtils::SetString(pRoot, XML_RENDERER_UUID, m_rendererUUID);
XMLUtils::SetInt(pRoot, XML_RENDERER_PORT, m_rendererPort);
// save the file
return doc.SaveFile(file);
}
void CUPnPSettings::Clear()
{
std::unique_lock<CCriticalSection> lock(m_critical);
m_serverUUID.clear();
m_serverPort = 0;
m_maxReturnedItems = 0;
m_rendererUUID.clear();
m_rendererPort = 0;
}
|