summaryrefslogtreecommitdiff
path: root/common/setup.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'common/setup.cpp')
-rw-r--r--common/setup.cpp333
1 files changed, 333 insertions, 0 deletions
diff --git a/common/setup.cpp b/common/setup.cpp
new file mode 100644
index 0000000..b4704f3
--- /dev/null
+++ b/common/setup.cpp
@@ -0,0 +1,333 @@
+/*
+ * setup.cpp
+ *
+ * Created on: 21.09.2012
+ * Author: savop
+ */
+
+#include "../include/setup.h"
+#include "../include/server.h"
+#include "../include/tools.h"
+#include <vdr/osdbase.h>
+#include <vdr/menuitems.h>
+
+cMenuSetupUPnP::cMenuSetupUPnP()
+: switchExpertSettings(0)
+{
+ Load();
+ Update();
+}
+
+cMenuSetupUPnP::~cMenuSetupUPnP(){
+}
+
+void cMenuSetupUPnP::Update(){
+ int current = Current();
+ Clear();
+ // Add OSD menu item for enabling UPnP Server
+
+ Add(new cMenuEditBoolItem(tr("Enable UPnP server"),(int*)&config.enabled,tr("disabled"),tr("enabled")));
+ Add(new cMenuEditBoolItem(tr("Use expert settings"),&switchExpertSettings));
+ if(switchExpertSettings){
+
+ cOsdItem *wsCat = new cOsdItem("--- Webserver settings -------------------------------------------------------");
+ wsCat->SetSelectable(false);
+ Add(wsCat);
+
+ Add(new cMenuEditStrItem(tr("Webserver root directory"), webserverRoot, STRING_SIZE));
+ Add(new cMenuEditIntItem(tr("Webserver port (0=auto)"), &wsport, 0, 65536));
+
+ Add(new cMenuEditStrItem(tr("Presentation URL"), presentationUrl, STRING_SIZE));
+
+ Add(new cMenuEditBoolItem(tr("Use \"live\" plugin for presentation"),&switchLive));
+
+ if(switchLive){
+ Add(new cMenuEditIntItem(tr("Live webserver port (0=auto)"), &lvport, 0, 65536));
+ }
+
+ cOsdItem *usCat = new cOsdItem("--- UPnP server settings -----------------------------------------------------");
+ usCat->SetSelectable(false);
+ Add(usCat);
+
+ Add(ctrlGenerate = new cOsdItem(tr("Generate new device UUID")));
+
+ cMenuEditStrItem* devUUID = new cMenuEditStrItem(tr("Current device UUID"), deviceUUID, STRING_SIZE);
+ devUUID->SetSelectable(false);
+
+ Add(devUUID);
+ Add(new cMenuEditIntItem(tr("Max. content length of SOAP Messages"), (int*)&config.maxContentLength, KB(10), KB(200)));
+ Add(new cMenuEditIntItem(tr("Max. age of UPnP announcements"), &config.announceMaxAge, 0, 3600));
+
+ Add(new cMenuEditBoolItem(tr("Bind UPnP server to "),&switchBindAddress,tr("interface"),tr("address")));
+ if(switchBindAddress){
+ Add(new cMenuEditIpItem(tr("Set IP address"), address));
+ } else {
+ GetInterfaces();
+ Add(new cMenuEditStraItem(tr("Set network interface"), &interfaceIndex, ifaceCount, interfaces));
+ }
+ Add(new cMenuEditIntItem(tr("UPnP server port (0=auto)"), &upnpport, 0, 65536));
+
+ cOsdItem *dbCat = new cOsdItem("--- Database settings --------------------------------------------------------");
+ dbCat->SetSelectable(false);
+ Add(dbCat);
+
+ Add(new cMenuEditStrItem(tr("Path to database file"), databaseFile, STRING_SIZE));
+ }
+
+ SetCurrent(Get(current));
+ Display();
+}
+
+eOSState cMenuSetupUPnP::ProcessKey(enum eKeys key){
+ int oldExpertSettings = switchExpertSettings;
+ int oldInterfaceBind = switchBindAddress;
+ int oldUseLive = switchLive;
+
+ cOsdItem *item = this->Get(this->Current());
+
+ eOSState state = cMenuSetupPage::ProcessKey(key);
+
+ if(item == ctrlGenerate && key == kOk){
+ config.GenerateNewDeviceUUID();
+ strn0cpy(deviceUUID, config.deviceUUID.c_str(), STRING_SIZE);
+ Update();
+ state = osContinue;
+ }
+
+ if(key != kNone && (oldExpertSettings != switchExpertSettings ||
+ oldInterfaceBind != switchBindAddress ||
+ oldUseLive != switchLive)){
+ Update();
+ }
+
+ return state;
+}
+
+void cMenuSetupUPnP::GetInterfaces() {
+ ifaceVector = upnp::tools::GetNetworkInterfaces(true);
+
+ for(ifaceCount = 0; ifaceCount < (int)ifaceVector.size(); ++ifaceCount){
+ interfaces[ifaceCount] = ifaceVector[ifaceCount].c_str();
+ }
+
+}
+
+int cMenuSetupUPnP::GetIndexOfInterface(std::string interface) const {
+ for(int i = 0; i < (int)ifaceVector.size(); ++i){
+ if(ifaceVector[i].compare(interface) == 0) return i;
+ }
+
+ return 0;
+}
+
+void cMenuSetupUPnP::Load(){
+ config = upnp::cMediaServer::GetInstance()->GetConfiguration();
+
+ switchExpertSettings = config.expertSettings?1:0;
+ switchBindAddress = config.bindToAddress?1:0;
+ switchLive = config.useLive;
+ interfaceIndex = GetIndexOfInterface(config.interface);
+ wsport = config.webServerPort;
+ upnpport = config.port;
+ lvport = config.livePort;
+
+ strn0cpy(webserverRoot, config.webServerRoot.c_str(), STRING_SIZE);
+ strn0cpy(address, config.address.c_str(), 16);
+ strn0cpy(interface, config.interface.c_str(), 16);
+ strn0cpy(databaseFile, config.databaseFile.c_str(), STRING_SIZE);
+ strn0cpy(presentationUrl, config.presentationURL.c_str(), STRING_SIZE);
+ strn0cpy(deviceUUID, config.deviceUUID.c_str(), STRING_SIZE);
+}
+
+void cMenuSetupUPnP::Store(){
+
+ config.expertSettings = switchExpertSettings?true:false;
+ config.webServerRoot = webserverRoot;
+ config.address = address;
+ config.interface = interface;
+ config.databaseFile = databaseFile;
+ config.presentationURL = presentationUrl;
+
+ config.bindToAddress = switchBindAddress?true:false;
+ config.webServerPort = wsport;
+ config.port = upnpport;
+
+ config.useLive = switchLive?true:false;
+ config.livePort = lvport;
+
+ upnp::cMediaServer::GetInstance()->SetConfiguration(config);
+
+ SetupStore("enabled", config.enabled);
+ SetupStore("expertSettings", config.expertSettings);
+ SetupStore("webServerRoot", config.webServerRoot.c_str());
+ SetupStore("webServerPort", config.webServerPort);
+ SetupStore("presentationURL", config.presentationURL.c_str());
+ SetupStore("useLive", config.useLive);
+ SetupStore("livePort", config.livePort);
+ SetupStore("maxContentLength", config.maxContentLength);
+ SetupStore("announceMaxAge", config.announceMaxAge);
+ SetupStore("deviceUUID", config.deviceUUID.c_str());
+ SetupStore("bindToAddress", config.bindToAddress);
+ SetupStore("address", config.address.c_str());
+ SetupStore("interface", config.interface.c_str());
+ SetupStore("port", config.port);
+ SetupStore("databaseFile", config.databaseFile.c_str());
+}
+
+bool cMenuSetupUPnP::SetupParse(const char *name, const char *value, upnp::cConfig& config)
+{
+
+ if (strcasecmp(name, "enabled")==0) config.enabled = atoi(value)?true:false;
+ else if (strcasecmp(name, "expertSettings")==0) config.expertSettings = atoi(value)?true:false;
+ else if (strcasecmp(name, "webServerRoot")==0) config.webServerRoot = value;
+ else if (strcasecmp(name, "webServerPort")==0) config.webServerPort = (uint16_t)atoi(value);
+ else if (strcasecmp(name, "presentationURL")==0) config.presentationURL = value;
+ else if (strcasecmp(name, "useLive")==0) config.useLive = atoi(value)?true:false;
+ else if (strcasecmp(name, "livePort")==0) config.livePort = atoi(value);
+ else if (strcasecmp(name, "maxContentLength")==0) config.maxContentLength = atol(value);
+ else if (strcasecmp(name, "announceMaxAge")==0) config.announceMaxAge = atoi(value);
+ else if (strcasecmp(name, "deviceUUID")==0) config.deviceUUID = value;
+ else if (strcasecmp(name, "bindToAddress")==0) config.bindToAddress = atoi(value)?true:false;
+ else if (strcasecmp(name, "address")==0) config.address = value;
+ else if (strcasecmp(name, "interface")==0) config.interface = value;
+ else if (strcasecmp(name, "port")==0) config.port = (uint16_t)atoi(value);
+ else if (strcasecmp(name, "databaseFile")==0) config.databaseFile = value;
+ else return false;
+
+ return true;
+}
+
+cMenuEditIpItem::cMenuEditIpItem(const char *Name, char *Value):cMenuEditItem(Name) {
+ value = Value;
+ curNum = -1;
+ pos = -1;
+ step = false;
+ Set();
+}
+
+cMenuEditIpItem::~cMenuEditIpItem() {
+}
+
+void cMenuEditIpItem::Set(void) {
+ char buf[1000];
+ if (pos >= 0) {
+ in_addr_t addr = inet_addr(value);
+ if ((int)addr == -1)
+ addr = 0;
+ int p = 0;
+ for (int i = 0; i < 4; ++i) {
+ p += snprintf(buf + p, sizeof(buf) - p, pos == i ? "[%d]" : "%d",
+ pos == i ? curNum : (addr >> (i * 8)) & 0xff);
+ if (i < 3)
+ buf[p++] = '.';
+ }
+ SetValue(buf);
+ } else
+ SetValue(value);
+}
+
+eOSState cMenuEditIpItem::ProcessKey(eKeys Key) {
+ in_addr addr;
+ addr.s_addr = inet_addr(value);
+ if ((int)addr.s_addr == -1)
+ addr.s_addr = 0;
+
+ switch (Key) {
+ case kUp:
+ if (pos >= 0) {
+ if (curNum < 255) ++curNum;
+ } else
+ return cMenuEditItem::ProcessKey(Key);
+ break;
+
+ case kDown:
+ if (pos >= 0) {
+ if (curNum > 0) --curNum;
+ } else
+ return cMenuEditItem::ProcessKey(Key);
+ break;
+
+ case kOk:
+ if (pos >= 0) {
+ addr.s_addr = inet_addr(value);
+ if ((int)addr.s_addr == -1)
+ addr.s_addr = 0;
+ addr.s_addr &= ~(0xff << (pos * 8));
+ addr.s_addr |= curNum << (pos * 8);
+ strcpy(value, inet_ntoa(addr));
+ } else
+ return cMenuEditItem::ProcessKey(Key);
+ curNum = -1;
+ pos = -1;
+ break;
+
+ case kRight:
+ if (pos >= 0) {
+ addr.s_addr = inet_addr(value);
+ if ((int)addr.s_addr == -1)
+ addr.s_addr = 0;
+ addr.s_addr &= ~(0xff << (pos * 8));
+ addr.s_addr |= curNum << (pos * 8);
+ strcpy(value, inet_ntoa(addr));
+ }
+
+ if (pos == -1 || pos == 3)
+ pos = 0;
+ else
+ ++pos;
+
+ curNum = (addr.s_addr >> (pos * 8)) & 0xff;
+ step = true;
+ break;
+
+ case kLeft:
+ if (pos >= 0) {
+ addr.s_addr = inet_addr(value);
+ if ((int)addr.s_addr == -1)
+ addr.s_addr = 0;
+ addr.s_addr &= ~(0xff << (pos * 8));
+ addr.s_addr |= curNum << (pos * 8);
+ strcpy(value, inet_ntoa(addr));
+ }
+
+ if (pos <= 0)
+ pos = 3;
+ else
+ --pos;
+
+ curNum = (addr.s_addr >> (pos * 8)) & 0xff;
+ step = true;
+ break;
+
+ case k0 ... k9: /* Netbeans reports error with this line (.. is okay but wrong) */
+ if (pos == -1)
+ pos = 0;
+
+ if (curNum == -1 || step) {
+ curNum = Key - k0;
+ step = false;
+ } else
+ curNum = curNum * 10 + (Key - k0);
+
+ if ((curNum * 10 > 255) || (curNum == 0)) {
+ in_addr addr;
+ addr.s_addr = inet_addr(value);
+ if ((int)addr.s_addr == -1)
+ addr.s_addr = 0;
+ addr.s_addr &= ~(0xff << (pos * 8));
+ addr.s_addr |= curNum << (pos * 8);
+ strcpy(value, inet_ntoa(addr));
+ if (++pos == 4)
+ pos = 0;
+ curNum = (addr.s_addr >> (pos * 8)) & 0xff;
+ step = true;
+ }
+ break;
+
+ default:
+ return cMenuEditItem::ProcessKey(Key);
+ }
+
+ Set();
+ return osContinue;
+}