8 #include "Raym/Raym.h"
\r
11 #include "ry0/device/TunerFactory.h"
\r
13 #include "net/HTTPDaemon.h"
\r
15 #define VERSION "0.03"
\r
23 typedef struct tm TM;
\r
24 typedef struct sockaddr SOCKADDR;
\r
25 typedef struct sockaddr_in SOCKADDR_IN;
\r
26 typedef struct _stat STAT;
\r
28 class Controller : public Raym::Application,
\r
29 public Raym::TimerDelegate,
\r
30 public NET::HTTPDaemonDelegate
\r
34 Raym::String * _system_path; // システムパス(実行ファイルが配置されているディレクトリ)
\r
35 Raym::String * _props_path; // プロパティファイルのパス
\r
36 Raym::Dictionary * _props; // プロパティ
\r
37 Raym::String * _status_path; // ステータスファイルのパス
\r
38 Raym::Dictionary * _status; // ステータス
\r
39 Raym::String * _epgs_path; // 番組データファイルのパス
\r
45 * KEY_SERVICES - Dictionary
\r
46 * <service_id> - Array // ソート済み
\r
47 * [Item 0] - Dictionary // EPGデータ
\r
50 * <station_name> - Number // 局毎のEPG収集時間[秒]
\r
52 * KEY_TEMP_DATA - Dictionary // ここから下は保存前に削除し、保存後に再構築する
\r
53 * <service_id> - Dictionary
\r
54 * KEY_CHANNELS - Array
\r
58 * KEY_PROGRAMS - String
\r
60 Raym::Dictionary * _epgs;
\r
62 Raym::String * _store_path; // 録画データ格納先
\r
64 Raym::Dictionary * _reservations; // 予約情報
\r
65 Raym::String * _reservations_path; // 予約情報ファイルのパス
\r
66 int _reservation_seq_id; // 予約情報シーケンスID
\r
67 int _idle_count; // アイドルカウンタ
\r
69 bool _initialized; // 初期化済み
\r
70 HMODULE _multi2_dll;
\r
71 bool _cancel_epg_collect; // EPG収集キャンセル
\r
73 NET::HTTPDaemon * _httpd;
\r
75 Raym::Dictionary * _streaming_ctrls; // ストリーミング制御情報格納用
\r
78 Raym::Timer * _timer_restart; // 再開処理用
\r
79 Raym::Timer * _timer_periodic; // 周期処理用
\r
80 Raym::Timer * _timer_periodic_2; // 周期処理用2
\r
81 Raym::Timer * _timer_epg_s; // EPG(ISDB-S)収集用
\r
82 Raym::Timer * _timer_epg_t; // EPG(ISDB-T)収集用
\r
84 Raym::String * _iptv_m3u8_local;
\r
85 Raym::String * _iptv_m3u8_remote;
\r
86 std::string _xmltv_channels;
\r
88 void scanChannel(int tuner);
\r
92 std::string createVideoPath(int tuner);
\r
94 public: // httpdからアクセス可能なように
\r
96 ry0::device::Tuner * _tuners[ry0::device::MAX_TUNERS];
\r
103 static Controller *alloc();
\r
109 bool isIdleState(bool suspend);
\r
112 void delaySuspend();
\r
115 static void getTimeWithString(Raym::String *str, time_t *time_var);
\r
116 static void getTimeWithEPG(Raym::Dictionary *epg, time_t *start, time_t *end);
\r
119 void collectEPGsForTuner(int tuner, time_t limit);
\r
120 bool collectEPGs(ry0::device::Tuner::Type type);
\r
121 void removePastEPGs();
\r
122 bool reserve(int service_id, int event_id);
\r
123 bool reserve(Raym::Dictionary *epg);
\r
124 bool reserve(int tuner, Raym::Dictionary *epg);
\r
125 bool cancel(int tuner, int reserve_id);
\r
126 void updateKeywordsReservation();
\r
127 void updateSchedule();
\r
129 // タイマ満了IF (from Timer)
\r
130 void timerExpired(Raym::Timer *timer, void *userInfo);
\r
133 int getChannel(int tuner);
\r
134 bool setChannel(int tuner, int channel);
\r
137 bool isTunerInitialized(int tuner);
\r
138 bool isTunerEnabled(int tuner);
\r
139 bool isChannelEnabled(int tuner, int channel);
\r
140 Raym::Array *stationInfos(ry0::device::Tuner::Type type);
\r
141 Raym::String *stationName(ry0::device::Tuner::Type type, int channel);
\r
142 Raym::Array *programsForServices(Raym::Array *services);
\r
143 Raym::String *Controller::stationNameForServiceID(Raym::String *service_id);
\r
147 NET::HTTPResponse *responseWithHTML(NET::HTTPRequest *request, Raym::String *html);
\r
148 NET::HTTPResponse *responseWithUTF8Text(NET::HTTPRequest *request, Raym::String *text);
\r
149 NET::HTTPResponse *responseByResultAndReferer(NET::HTTPRequest *request, bool result, const char *referer);
\r
150 NET::HTTPResponse *responseForMain(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
151 NET::HTTPResponse *responseForPrograms(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
152 NET::HTTPResponse *responseForReservation(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
153 NET::HTTPResponse *responseForStatus(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
154 NET::HTTPResponse *responseForRegistCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
155 NET::HTTPResponse *responseForCancelCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
156 NET::HTTPResponse *responseForAddKeywordsCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
157 NET::HTTPResponse *responseForModKeywordsCGI(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
158 NET::HTTPResponse *responseForReloadURI(NET::HTTPRequest *request, SOCKADDR_IN *client, const char *uri, int sec = 0);
\r
159 NET::HTTPResponse *responseForPlaylist(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
160 NET::HTTPResponse *responseForXmltv(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
161 NET::HTTPResponse *responseForHLSControl(NET::HTTPRequest *request, SOCKADDR_IN *client, int tuner, int service_id, Raym::String *preset);
\r
162 NET::HTTPResponse *requestTunerControl(NET::HTTPRequest *request, SOCKADDR_IN *client, int tuner);
\r
163 NET::HTTPResponse *request(NET::HTTPRequest *request, SOCKADDR_IN *client);
\r
165 // Windows用IF (from TrayApp)
\r
166 int start(); // エントリポイント
\r
167 void systemWillSuspend();
\r
168 void systemResumed();
\r
170 void detectNonIdle();
\r
171 bool canTerminate();
\r
172 void debugLog(const char *message);
\r