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