]> git.vomp.tv Git - vompclient.git/blob - vconnect.cc
Switch trunk code to new boxes
[vompclient.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  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()
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 }
53
54 VConnect::~VConnect()
55 {
56   irun = 0;
57   vdr->cancelFindingServer();
58   threadStop();
59 }
60
61 void VConnect::draw()
62 {
63   VInfo::draw();
64   logger->log("VConnect", Log::DEBUG, "Draw done");
65 }
66
67 int VConnect::handleCommand(int command)
68 {
69   return 1;
70 }
71
72 void VConnect::run()
73 {
74   threadStart();
75 }
76
77 void VConnect::threadMethod()
78 {
79   ULONG delay = 0;
80   int success;
81   irun = 1;
82
83   do
84   {
85     setOneLiner(tr("Locating server"));
86     draw();
87     boxstack->update(this);
88
89     vdr->findServers(servers);
90     if (!irun)
91     {
92       for(UINT k = 0; k < servers.size(); k++)
93       {
94         delete[] servers[k].ip;
95         delete[] servers[k].name;
96       }
97       servers.clear();
98       return;
99     }
100
101     if (servers.size() == 1)
102     {
103       selectedServer = 0;
104     }
105     else
106     {
107       selectedServer = -1;
108       VServerSelect* vs = new VServerSelect(servers, this);
109       vs->draw();
110       boxstack->add(vs);  // FIXME - do this better - perhaps post message to Command
111                           // Otherwise it will be using BoxStack without the Command mutex locked
112       boxstack->update(vs);
113
114       threadLock();
115       threadWaitForSignal();
116       threadUnlock();
117     }
118
119     if (!irun)
120     {
121       for(UINT k = 0; k < servers.size(); k++)
122       {
123         delete[] servers[k].ip;
124         delete[] servers[k].name;
125       }
126       servers.clear();
127       return;
128     }
129
130     logger->log("VConnect", Log::NOTICE, "Connecting to server at %s", servers[selectedServer].ip);
131     Wol::getInstance()->setWakeUpIP(servers[selectedServer].ip);
132     vdr->setServerIP(servers[selectedServer].ip);
133
134     // Clear the serverIPs vector
135     for(UINT k = 0; k < servers.size(); k++)
136     {
137       delete[] servers[k].ip;
138       delete[] servers[k].name;
139     }
140     servers.clear();
141
142     setOneLiner(tr("Connecting to VDR"));
143     draw();
144     boxstack->update(this);
145
146     success = vdr->connect();
147     if (success)
148     {
149       logger->log("Command", Log::DEBUG, "Connected ok, doing login");
150       success = vdr->doLogin();
151
152       if (!success)
153       {
154         vdr->disconnect();
155         setOneLiner(tr("Login failed"));
156         delay = 3000;
157       }
158     }
159     else
160     {
161       setOneLiner(tr("Connection failed"));
162       delay = 3000;
163     }
164
165     draw();
166     boxstack->update(this);
167     MILLISLEEP(delay);
168
169   } while(!success);
170
171   Message* m = new Message(); // Must be done after this thread ends
172   m->from = this;
173   m->to = Command::getInstance();
174   m->message = Message::VDR_CONNECTED;
175   Command::getInstance()->postMessage(m);
176 }
177
178 void VConnect::processMessage(Message* m)
179 {
180   if (m->message == Message::SERVER_SELECTED)
181   {
182     selectedServer = m->parameter;
183     threadSignal();
184   }
185 }