]> git.vomp.tv Git - vompclient.git/blob - vconnect.cc
Fix for possible crash when removing bar
[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 VConnect::VConnect()
24 {
25   viewman = ViewMan::getInstance();
26   vdr = VDR::getInstance();
27   logger = Log::getInstance();
28
29   create(400, 200);
30   if (Video::getInstance()->getFormat() == Video::PAL)
31   {
32     setScreenPos(170, 200);
33   }
34   else
35   {
36     setScreenPos(160, 150);
37   }
38
39   exitable = 0;
40   irun = 0;
41 }
42
43 VConnect::~VConnect()
44 {
45   irun = 0;
46   vdr->cancelFindingServer();
47   threadStop();
48 }
49
50 void VConnect::draw()
51 {
52   VInfo::draw();
53   logger->log("VConnect", Log::DEBUG, "Draw done");
54 }
55
56 int VConnect::handleCommand(int command)
57 {
58   return 1;
59 }
60
61 void VConnect::run()
62 {
63   threadStart();
64 }
65
66 void VConnect::threadMethod()
67 {
68   ULONG delay = 0;
69   int success;
70   irun = 1;
71
72   do
73   {
74     setOneLiner(tr("Locating server"));
75     draw();
76     viewman->updateView(this);
77
78     vdr->findServers(servers);
79     if (!irun)
80     {
81       for(UINT k = 0; k < servers.size(); k++)
82       {
83         delete[] servers[k].ip;
84         delete[] servers[k].name;
85       }
86       servers.clear();
87       return;
88     }
89
90     if (servers.size() == 1)
91     {
92       selectedServer = 0;
93     }
94     else
95     {
96       selectedServer = -1;
97       VServerSelect* vs = new VServerSelect(servers, this);
98       vs->draw();
99       viewman->add(vs);  // FIXME - do this better - perhaps post message to Command
100                          // Otherwise it will be using ViewMan without the Command mutex locked
101       viewman->updateView(vs);
102
103       threadLock();
104       threadWaitForSignal();
105       threadUnlock();
106     }
107
108     if (!irun)
109     {
110       for(UINT k = 0; k < servers.size(); k++)
111       {
112         delete[] servers[k].ip;
113         delete[] servers[k].name;
114       }
115       servers.clear();
116       return;
117     }
118
119     logger->log("VConnect", Log::NOTICE, "Connecting to server at %s", servers[selectedServer].ip);
120     vdr->setServerIP(servers[selectedServer].ip);
121
122     // Clear the serverIPs vector
123     for(UINT k = 0; k < servers.size(); k++)
124     {
125       delete[] servers[k].ip;
126       delete[] servers[k].name;
127     }
128     servers.clear();
129
130     setOneLiner(tr("Connecting to VDR"));
131     draw();
132     viewman->updateView(this);
133
134     success = vdr->connect();
135     if (success)
136     {
137       logger->log("Command", Log::DEBUG, "Connected ok, doing login");
138       success = vdr->doLogin();
139
140       if (!success)
141       {
142         vdr->disconnect();
143         setOneLiner(tr("Login failed"));
144         delay = 3000;
145       }
146     }
147     else
148     {
149       setOneLiner(tr("Connection failed"));
150       delay = 3000;
151     }
152
153     draw();
154     viewman->updateView(this);
155     MILLISLEEP(delay);
156
157   } while(!success);
158
159   Message* m = new Message(); // Must be done after this thread ends
160   m->from = this;
161   m->to = Command::getInstance();
162   m->message = Message::VDR_CONNECTED;
163   Command::getInstance()->postMessage(m);
164 }
165
166 void VConnect::processMessage(Message* m)
167 {
168   if (m->message == Message::SERVER_SELECTED)
169   {
170     selectedServer = m->parameter;
171     threadSignal();
172   }
173 }