return instance;
}
-int Command::init(bool tcrashed, char* tServer)
+int Command::init(bool tcrashed)
{
if (initted) return 0;
initted = true;
crashed = tcrashed;
- server = tServer;
logger = Log::getInstance();
boxstack = BoxStack::getInstance();
}
else
{
- VConnect* vconnect = new VConnect(server);
+ VConnect* vconnect = new VConnect();
boxstack->add(vconnect);
vconnect->run();
}
InputMan::getInstance()->changePowerState(true);
isStandby = false;
- VConnect* vconnect = new VConnect(server);
+ VConnect* vconnect = new VConnect();
boxstack->add(vconnect);
vconnect->run();
}
// at this point, everything should be reset to first-go
- VConnect* vconnect = new VConnect(server);
+ VConnect* vconnect = new VConnect();
boxstack->add(vconnect);
vconnect->run();
}
boxstack->add(vi);
boxstack->update(vi);
+ // FIXME make config system
+
VDR* vdr = VDR::getInstance();
char* config;
#include <time.h>
#ifndef WIN32
-#include <pthread.h>
+#include <pthread.h> // why?
#endif
#include <string>
~Command();
static Command* getInstance();
- int init(bool crashed = false, char* server = NULL);
+ int init(bool crashed = false);
int shutdown();
void run();
void stop();
WJpeg* wallpaper_pict{};
VInfo* connLost{};
bool crashed{};
- char* server{};
bool advMenus{};
ASLPrefList langcodes;
int getClockRealTime(struct timespec *tp);
+const std::string& getCommandLineServer();
+
//#define WINDOWS_LEGACY
#ifdef WIN32
ULLONG htonll(ULLONG);
ULLONG ntohll(ULLONG);
void shutdown(int code);
+const std::string& getCommandLineServer();
// Global variables --------------------------------------------------------------------------------------------------
Log* logger;
Wol* wol;
Sleeptimer* sleeptimer;
+// Temporary, will move to Config system
+std::string argvServer;
+
#ifdef HANDLE_VT_SWITCHING
int fdtty;
struct vt_mode old_vtmode;
bool daemonize = true;
bool debugEnabled = false;
bool crashed = false;
- char* setServer = NULL;
int c;
while ((c = getopt(argc, argv, "cdns:")) != -1)
daemonize = false;
break;
case 's':
- setServer = optarg;
+ argvServer = optarg;
break;
case '?':
printf("Unknown option\n");
shutdown(1);
}
- success = command->init(crashed, setServer);
+ success = command->init(crashed);
if (success)
{
logger->log("Core", Log::INFO, "Command module initialised");
ss << std::put_time(stm, "%T") << "." << std::setfill('0') << std::setw(3) << ttm;
return ss.str();
}
+
+const std::string& getCommandLineServer()
+{
+ return argvServer;
+}
along with VOMP. If not, see <https://www.gnu.org/licenses/>.
*/
+#include "defines.h"
#include "video.h"
#include "colour.h"
#include "command.h"
#include "vconnect.h"
-VConnect::VConnect(char* tServer)
-: server(tServer)
+VConnect::VConnect()
{
boxstack = BoxStack::getInstance();
vdr = VDR::getInstance();
std::unique_lock<std::mutex> ul(threadMutex, std::defer_lock);
+ const std::string& commandLineServer = getCommandLineServer();
+
do
{
- if (server) // Server is specified, fake a servers array
+ if (!commandLineServer.empty()) // Server is specified, fake a servers array
{
- VDRServer vdrserver;
- vdrserver.ip = new char[strlen(server)+1];
- strcpy(vdrserver.ip, server);
- vdrserver.name = new char[1];
- vdrserver.name[0] = '\0';
- vdrserver.port = 3024; // FIXME
- servers.push_back(vdrserver);
+ servers.emplace_back(commandLineServer, "", 3024, 0);
}
else
{
setOneLiner(tr("Locating server"));
draw();
boxstack->update(this);
-
vdr->findServers(servers);
- if (threadReqQuit)
- {
- for(UINT k = 0; k < servers.size(); k++)
- {
- delete[] servers[k].ip;
- delete[] servers[k].name;
- }
- servers.clear();
- return;
- }
+ if (threadReqQuit) return;
}
if (servers.size() == 1)
ul.unlock();
}
- if (threadReqQuit)
- {
- for(UINT k = 0; k < servers.size(); k++)
- {
- delete[] servers[k].ip;
- delete[] servers[k].name;
- }
- servers.clear();
- return;
- }
+ if (threadReqQuit) return;
- logger->log("VConnect", Log::NOTICE, "Connecting to server at %s %u", servers[selectedServer].ip, servers[selectedServer].port);
- Wol::getInstance()->setWakeUpIP(servers[selectedServer].ip);
- vdr->setServerIP(servers[selectedServer].ip);
+ logger->log("VConnect", Log::NOTICE, "Connecting to server at %s %u", servers[selectedServer].ip.c_str(), servers[selectedServer].port);
+ Wol::getInstance()->setWakeUpIP(servers[selectedServer].ip.c_str());
+ vdr->setServerIP(servers[selectedServer].ip.c_str());
vdr->setServerPort(servers[selectedServer].port);
- // Clear the serverIPs vector
- for(UINT k = 0; k < servers.size(); k++)
- {
- delete[] servers[k].ip;
- delete[] servers[k].name;
- }
- servers.clear();
-
-
setOneLiner(tr("Connecting to VDR"));
draw();
boxstack->update(this);
if (success)
{
logger->log("VConnect", Log::DEBUG, "Connected ok, doing login");
- unsigned int version_server_min,version_server_max,version_client;
+ unsigned int version_server_min, version_server_max, version_client;
int subtitles;
- success = vdr->doLogin(&version_server_min,&version_server_max,&version_client, Command::getInstance()->getASLList(), subtitles);
+ success = vdr->doLogin(&version_server_min, &version_server_max, &version_client, Command::getInstance()->getASLList(), subtitles);
Command::getInstance()->setSubDefault(subtitles);
if (!success)
boxstack->update(this);
MILLISLEEP(delay);
+ servers.clear(); // In case we're going around
+
} while(!success);
logger->log("VConnect", Log::INFO, "Send VDR connected message");
#ifndef VCONNECT_H
#define VCONNECT_H
-#include <string.h>
#include <vector>
#include <mutex>
#include <thread>
class VConnect : public VInfo
{
public:
- VConnect(char* server);
+ VConnect();
~VConnect();
int handleCommand(int command);
Log* logger;
std::vector<VDRServer> servers;
int selectedServer;
- char* server;
std::thread connectThread;
std::mutex threadMutex;
logger->log("VDP6", Log::ERR, "recvfrom error");
break;
}
-
- VDRServer newServer;
+
// FIXME upgrade this to look for a return IP in the reply packet
- newServer.ip = new char[40];
- inet_ntop(AF_INET6, &theirAddr.sin6_addr, newServer.ip, sizeof(theirAddr));
+ char tempStringIP[40];
+ inet_ntop(AF_INET6, &theirAddr.sin6_addr, tempStringIP, sizeof(theirAddr));
USHORT tempPort;
memcpy(&tempPort, &vdpreply[26], 2);
- newServer.port = ntohs(tempPort);
ULONG newServerVersion;
memcpy(&newServerVersion, &vdpreply[28], 4);
- newServer.version = ntohl(newServerVersion);
-
- UINT newServerNameLength = static_cast<UINT>(mlength - 32);
- newServer.name = new char[newServerNameLength];
- strcpy(newServer.name, &vdpreply[32]);
- logger->log("VDP6", Log::INFO, "Got response: %s %u %s %lx", newServer.ip, newServer.port, newServer.name, newServer.version);
- servers.push_back(newServer);
+ //logger->log("VDP6", Log::INFO, "Got response: %s %u %s %lx", newServer.ip, newServer.port, newServer.name, newServer.version);
+ servers.emplace_back(tempStringIP, &vdpreply[32], ntohs(tempPort), ntohl(newServerVersion));
}
});
const char* vdpreply = static_cast<const char*>(ds.getData());
if ((ds.getDataLength() >= 24) && !strncmp(vdpreply, "VDP-0002", 8))
{
- VDRServer newServer;
// FIXME upgrade this to look for a return IP in the reply packet
- newServer.ip = new char[16];
- strcpy(newServer.ip, ds.getFromIPA());
USHORT newServerPort;
memcpy(&newServerPort, &vdpreply[26], 2);
- newServer.port = ntohs(newServerPort);
ULONG newServerVersion;
memcpy(&newServerVersion, &vdpreply[28], 4);
- newServer.version = ntohl(newServerVersion);
-
- int newServerNameLength = ds.getDataLength() - 32;
- newServer.name = new char[newServerNameLength];
- strcpy(newServer.name, &vdpreply[32]);
-
- servers.push_back(newServer);
haveAtLeastOne = 1;
+
+ // FIXME - packet length > 24 not checked, end NULL not checked!!
+ // FIXME mutex protection ?? Nope this is a separate vector currently
+ servers.emplace_back(ds.getFromIPA(), &vdpreply[32], ntohs(newServerPort), ntohl(newServerVersion));
}
}
else
waitType = 1;
firstloop = false;
-/* For DEBUGGING *
- { VDRServer newServer;
- newServer.ip = new char[16];
- strcpy(newServer.ip, "192.168.1.7");
- newServer.name = new char[6];
- strcpy(newServer.name,"debug");
- servers.push_back(newServer);
- waitType = 2;
- haveAtLeastOne = 1;}/ * */
}
}
logger->log("VDR", Log::NOTICE, "END loop");
std::vector<VDRServer>* servers6 = vdp6.getServers();
// Add IPv6 found servers to servers vector, if not in servers already
- // Free buffers from VDRServer objects if not taken. (Itching for that rewrite already).
for(auto i6 = servers6->begin(); i6 != servers6->end(); i6++)
{
bool found = false;
for(auto i4 = servers.begin(); i4 != servers.end(); i4++)
- {
- if (!strcmp(i4->name, i6->name)) { found = true; break; }
- }
+ if (i4->name == i6->name) { found = true; break; }
- if (found)
- {
- delete[] i6->name;
- delete[] i6->ip;
- }
- else
- {
- servers.push_back(*i6);
- }
+ if (found) continue; // Don't add
+
+ servers.push_back(std::move(*i6)); // VDP6 is stopped, the vector owner only goes out of scope after this method
}
#endif
findingServer = 0;
}
-void VDR::setServerIP(char* newIP)
+void VDR::setServerIP(const char* newIP)
{
strcpy(serverIP, newIP);
}
struct VDRServer
{
- char* ip;
- char* name;
+ std::string ip;
+ std::string name;
USHORT port;
ULONG version;
+
+ VDRServer(const std::string tip, const std::string tname, USHORT tport, ULONG tversion)
+ : ip(tip), name(tname), port(tport), version(tversion) {}
};
struct RecTimerSorter // : public binary_function<double, double, bool>
{
bool operator() (const VDRServer& a, const VDRServer& b)
{
- if (strcmp(b.name, a.name) > 0) return true;
- return false;
+ return a.name < b.name;
}
};
-class RecMan;
-
class StreamReceiver
{
public:
protected:
// ULONG requestTime;
ULONG receiverChannel;
-
+
// If receiverChannel == 1:
ULONG requestSerialNumber; // set by RequestResponse, used in ed_cb_find
VDR_ResponsePacket* save_vresp; // set by ed_cb_call, used in RequestResponse
-
+
// If receiverChannel == 2:
ULONG streamID;
StreamReceiver* streamReceiver;
};
+class RecMan;
+
class VDR : public Thread_TYPE,
public EventDispatcher,
#ifdef VOMP_MEDIAPLAYER
void findServers(std::vector<VDRServer>& servers);
void cancelFindingServer();
- void setServerIP(char*);
+ void setServerIP(const char*);
void setServerPort(USHORT);
void setReceiveWindow(size_t size);
int connect();
sl.setSize(area.w - 20, area.h - 30 - 15);
add(&sl);
- sl.addOption(servers[0].name, 0, 1);
+ sl.addOption(servers[0].name.c_str(), 0, 1);
for(UINT k = 1; k < servers.size(); k++)
{
- sl.addOption(servers[k].name, 0, 0);
+ sl.addOption(servers[k].name.c_str(), 0, 0);
}
replyTo = treplyTo;
}
#ifndef WIN32
/* Display the contents of the ARP cache in the kernel. */
-int Wol::find_ether(char *name)
+int Wol::find_ether(const char *name)
{
char ip[100];
char line[200];
return 0;
}
#else
-int Wol::find_ether(char *name)
+int Wol::find_ether(const char *name)
{
sockaddr_in sock_address;
int sockname_len=sizeof(sock_address);
return (0);
}
-void Wol::setWakeUpIP(char* ip_addr)
+void Wol::setWakeUpIP(const char* ip_addr)
{
if(find_ether(ip_addr))
{
~Wol();
static Wol* getInstance();
int doWakeUp();
- void setWakeUpIP(char* ip_addr);
+ void setWakeUpIP(const char* ip_addr);
void setEnabled(bool enabled);
private:
static Wol* instance;
- int find_ether(char *name);
+ int find_ether(const char *name);
int convertToBinary(char *bufp, unsigned char *addr);
char ether_addr[100];
bool bEtherKnown;