]> git.vomp.tv Git - vompclient-marten.git/blob - vconnect.cc
Detect mpeg audio frame header changes, and wait at least 4 packets after a change...
[vompclient-marten.git] / vconnect.cc
1 /*
2     Copyright 2004-2005 Chris Tallon
3
4     This file is part of VOMP.
5
6     VOMP is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     VOMP is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with VOMP; if not, write to the Free Software
18     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
19 */
20
21 #include "vconnect.h"
22
23 #include "video.h"
24 #include "colour.h"
25 #include "command.h"
26 #include "i18n.h"
27 #include "boxstack.h"
28 #include "message.h"
29 #include "log.h"
30 #include "wol.h"
31 #include "vserverselect.h"
32
33 VConnect::VConnect(char* tServer)
34 {
35   boxstack = BoxStack::getInstance();
36   vdr = VDR::getInstance();
37   logger = Log::getInstance();
38
39   setSize(400, 200);
40   createBuffer();
41   if (Video::getInstance()->getFormat() == Video::PAL)
42   {
43     setPosition(170, 200);
44   }
45   else
46   {
47     setPosition(160, 150);
48   }
49
50   exitable = 0;
51   irun = 0;
52   server = tServer;
53 }
54
55 VConnect::~VConnect()
56 {
57   irun = 0;
58   vdr->cancelFindingServer();
59   threadStop();
60 }
61
62 void VConnect::draw()
63 {
64   VInfo::draw();
65   logger->log("VConnect", Log::DEBUG, "Draw done");
66 }
67
68 int VConnect::handleCommand(int command)
69 {
70   return 1;
71 }
72
73 void VConnect::run()
74 {
75   threadStart();
76 }
77
78 void VConnect::threadMethod()
79 {
80   ULONG delay = 0;
81   int success;
82   irun = 1;
83
84   do
85   {
86     if (server) // Server is specified, fake a servers array
87     {
88       VDRServer vdrserver;
89       vdrserver.ip = new char[strlen(server)+1];
90       strcpy(vdrserver.ip, server);
91       vdrserver.name = new char[1];
92       vdrserver.name[0] = '\0';
93       vdrserver.port = 3024; // FIXME
94       servers.push_back(vdrserver);
95     }
96     else
97     {
98       setOneLiner(tr("Locating server"));
99       draw();
100       boxstack->update(this);
101
102       vdr->findServers(servers);
103       if (!irun)
104       {
105         for(UINT k = 0; k < servers.size(); k++)
106         {
107           delete[] servers[k].ip;
108           delete[] servers[k].name;
109         }
110         servers.clear();
111         return;
112       }
113     }
114
115     if (servers.size() == 1)
116     {
117       selectedServer = 0;
118     }
119     else
120     {
121       selectedServer = -1;
122       VServerSelect* vs = new VServerSelect(servers, this);
123       vs->draw();
124       boxstack->add(vs);
125       boxstack->update(vs);
126
127       threadLock();
128       threadWaitForSignal();
129       threadUnlock();
130     }
131
132     if (!irun)
133     {
134       for(UINT k = 0; k < servers.size(); k++)
135       {
136         delete[] servers[k].ip;
137         delete[] servers[k].name;
138       }
139       servers.clear();
140       return;
141     }
142
143     logger->log("VConnect", Log::NOTICE, "Connecting to server at %s %u", servers[selectedServer].ip, servers[selectedServer].port);
144     Wol::getInstance()->setWakeUpIP(servers[selectedServer].ip);
145     vdr->setServerIP(servers[selectedServer].ip);
146     vdr->setServerPort(servers[selectedServer].port);
147
148     // Clear the serverIPs vector
149     for(UINT k = 0; k < servers.size(); k++)
150     {
151       delete[] servers[k].ip;
152       delete[] servers[k].name;
153     }
154     servers.clear();
155
156
157     setOneLiner(tr("Connecting to VDR"));
158     draw();
159     boxstack->update(this);
160
161     success = vdr->connect();
162     if (success)
163     {
164       logger->log("VConnect", Log::DEBUG, "Connected ok, doing login");
165       unsigned int version_server,version_client;
166       success = vdr->doLogin(&version_server,&version_client);
167
168       if (!success)
169       {
170         vdr->disconnect();
171         if (version_server!=version_client) {
172                 char buffer[1024];
173                 sprintf(buffer,"Protocoll mismatch s: %x c: %x",version_server,version_client);
174                 setOneLiner(buffer);
175         } else {
176                 setOneLiner(tr("Login failed"));
177         }
178         delay = 3000;
179       }
180     }
181     else
182     {
183       setOneLiner(tr("Connection failed"));
184       delay = 3000;
185     }
186
187     draw();
188     boxstack->update(this);
189     MILLISLEEP(delay);
190
191   } while(!success);
192
193   logger->log("VConnect", Log::INFO, "Send VDR connected message");
194   Message* m = new Message(); // Must be done after this thread ends
195   m->from = this;
196   m->to = Command::getInstance();
197   m->message = Message::VDR_CONNECTED;
198   Command::getInstance()->postMessage(m);
199 }
200
201 void VConnect::processMessage(Message* m)
202 {
203   if (m->message == Message::SERVER_SELECTED)
204   {
205     selectedServer = m->parameter;
206     threadSignal();
207   }
208 }