-
Notifications
You must be signed in to change notification settings - Fork 1
/
dsmcc_download.hpp
224 lines (192 loc) · 5.75 KB
/
dsmcc_download.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/* (c) Copyright 2011-2014 Felipe Magno de Almeida
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef GHTV_QT_DSMCC_DOWNLOAD_HPP
#define GHTV_QT_DSMCC_DOWNLOAD_HPP
#include <ghtv/qt/poll_thread.hpp>
#include <ghtv/qt/dsmcc.hpp>
#include <QWidget>
#include <QTableWidget>
#include <QProgressBar>
#include <QLabel>
#include <QPushButton>
#include <boost/shared_ptr.hpp>
#include <string>
#include <set>
#include <vector>
namespace ghtv { namespace qt {
namespace dsmcc_download_detail {
struct close_fd
{
close_fd() : fd(-1) {}
close_fd(int fd)
: fd(fd) {}
~close_fd()
{
if(fd != -1)
::close(fd);
}
int fd;
};
class tune_thread : public QThread
{
Q_OBJECT
public:
tune_thread(int frontendfd, unsigned int frequency);
void run();
int frontendfd;
unsigned int frequency;
Q_SIGNALS:
void tune_success();
void tune_failure();
void tune_increment();
};
class pmt_thread : public QThread
{
Q_OBJECT
public:
pmt_thread(int demuxfd);
void run();
void read_ait(int pid, bool&);
std::string base_directory, classpath, initial_class;
close_fd demuxfd;
boost::shared_ptr<qt::poll_thread> sections_poll_thread;
boost::shared_ptr<qt::poll_thread> dsmcc_poll_thread;
Q_SIGNALS:
void tune_success();
void ait_timeout();
void pmt_failure();
void pmt_read();
void ait_read();
void ait_not_found();
void association(unsigned int pid, unsigned int component_tag);
void signal_application(std::string name, std::string type
, std::string control_code
, std::string transport_protocol
, unsigned int component_id
, std::string base_directory
, std::string classpath
, std::string initial_class);
};
class download_thread : public QThread
{
Q_OBJECT
public:
download_thread(unsigned int pid
, std::vector<std::pair<unsigned int, unsigned int> > associations);
void run();
void filter(unsigned int pid, unsigned int table_id);
void stop_filter();
bool modules_finished()
{
for(std::map<unsigned int, boost::shared_ptr<module> >::const_iterator
first = modules.begin(), last = modules.end()
;first != last; ++first)
{
if(!first->second->finished())
return false;
}
return true;
}
unsigned int pid;
unsigned int dii_pid;
std::vector<std::pair<unsigned int, unsigned int> > associations;
close_fd demuxfd;
bool dsi_resolved, dii_resolved;
unsigned int transaction_identification;
unsigned int service_gateway_module_id, download_id;
unsigned int block_size;
unsigned int blocks_to_download;
std::auto_ptr<QMutex> mutex;
bool cancel;
std::map<unsigned int, boost::shared_ptr<module> > modules;
std::set<unsigned int> modules_downloaded;
Q_SIGNALS:
void waiting_dii();
void downloading(unsigned int blocks_to_download, unsigned int size);
void block_downloaded(unsigned int);
void downloaded();
};
}
class dsmcc_download : public QWidget
{
Q_OBJECT
public:
dsmcc_download(std::string const& name, unsigned int frequency
, unsigned int service_identifier);
~dsmcc_download();
void start();
std::string name;
unsigned int frequency;
unsigned int service_identifier;
unsigned int downloaded_size;
unsigned int download_in_sec;
QProgressBar* progress_bar;
QLabel* status_label, *size_label
, *downloaded_size_label, *speed_label;
QTableWidget* applications_widget;
int frontendfd;
dsmcc_download_detail::download_thread* download_thread_;
QThread* action_thread;
QPushButton *download_button, *cancel_button;
struct thread_destroy
{
typedef void result_type;
void operator () (QThread* thread) const;
};
struct application_info
{
unsigned int component_id;
std::string base_directory, classpath, initial_class;
};
std::vector<application_info> applications;
std::vector<std::pair<unsigned int, unsigned int> > associations;
std::string base_directory, classpath, initial_class;
void exit_download_thread();
Q_SIGNALS:
void download_success();
void download_failure();
void read_pat_signal (boost::shared_array<unsigned char> buf, unsigned int size);
void destroying_window_signal();
public Q_SLOTS:
void tune_success();
void tune_failure();
void tune_increment();
void read_pat (boost::shared_array<unsigned char> buf, unsigned int size);
void poll_timeout ();
void pmt_read();
void pmt_failure();
void ait_not_found();
void ait_read();
void ait_timeout();
void cancel();
void download();
void start_app();
void association(unsigned int pid, unsigned int component_tag);
void application(std::string name, std::string type
, std::string control_code
, std::string transport_protocol
, unsigned int component_id
, std::string base_directory
, std::string classpath
, std::string initial_class);
void waiting_dii();
void ddb_downloading(unsigned int blocks_to_download, unsigned int size);
void block_downloaded(unsigned int);
void ddb_downloaded();
void speed_measure();
};
} }
#endif