OSDN Git Service

b2a5a3370834ba4bf5fb0114d2c6d3d6b52cf5ac
[iptd/iPTd.git] / src / ry0 / iPTd / Controller.h
1 /**\r
2  * @file Controller.h\r
3  *\r
4  */\r
5 \r
6 #pragma once\r
7 \r
8 #include "Raym/Raym.h"\r
9 \r
10 #include "keys.h"\r
11 #include "ry0/device/TunerFactory.h"\r
12 \r
13 #include "net/HTTPDaemon.h"\r
14 \r
15 #define VERSION "0.03"\r
16 #define REVISION 34\r
17 \r
18 namespace ry0\r
19 {\r
20 namespace iPTd\r
21 {\r
22 \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
27 \r
28 class Controller : public Raym::Application,\r
29                    public Raym::TimerDelegate,\r
30                    public NET::HTTPDaemonDelegate\r
31 {\r
32 private:\r
33 \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
40 \r
41     /**\r
42      * EPGデータ\r
43      *\r
44      * Root                 - Dictionary\r
45      *   KEY_SERVICES       - Dictionary\r
46      *     <service_id>     - Array                 // ソート済み\r
47      *       [Item 0]       - Dictionary            // EPGデータ\r
48      *         :\r
49      *       [Item X]\r
50      *   <station_name>     - Number                // 局毎のEPG収集時間[秒]\r
51      *\r
52      *   KEY_TEMP_DATA      - Dictionary            // ここから下は保存前に削除し、保存後に再構築する\r
53      *     <service_id>     - Dictionary\r
54      *       KEY_CHANNELS   - Array\r
55      *         [Item 0]     - String\r
56      *           :\r
57      *         [Item X]\r
58      *       KEY_PROGRAMS   - String\r
59      */\r
60     Raym::Dictionary *      _epgs;\r
61 \r
62     Raym::String *          _store_path;            // 録画データ格納先\r
63 \r
64     Raym::Dictionary *      _reservations;          // 予約情報\r
65     Raym::String *          _reservations_path;     // 予約情報ファイルのパス\r
66     int                     _reservation_seq_id;    // 予約情報シーケンスID\r
67     int                     _idle_count;            // アイドルカウンタ\r
68 \r
69     bool                    _initialized;           // 初期化済み\r
70     HMODULE                 _multi2_dll;\r
71     bool                    _cancel_epg_collect;    // EPG収集キャンセル\r
72 \r
73     NET::HTTPDaemon *       _httpd;\r
74 \r
75     Raym::Dictionary *      _streaming_ctrls;       // ストリーミング制御情報格納用\r
76 \r
77     // 非同期処理用タイマ\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
83 \r
84     Raym::String *          _iptv_m3u8_local;\r
85     Raym::String *          _iptv_m3u8_remote;\r
86     std::string             _xmltv_channels;\r
87 \r
88     void scanChannel(int tuner);\r
89     void periodic();\r
90     void periodic_2();\r
91 \r
92     std::string createVideoPath(int tuner);\r
93 \r
94 public: // httpdからアクセス可能なように\r
95     int                             _tunerCount;\r
96     ry0::device::Tuner *            _tuners[ry0::device::MAX_TUNERS];\r
97 \r
98 protected:\r
99     Controller();\r
100     ~Controller();\r
101 \r
102 public:\r
103     static Controller *alloc();\r
104 \r
105     int restart();\r
106 #if 0\r
107     void suspend();\r
108 #endif\r
109     bool isIdleState(bool suspend);\r
110     bool canSuspend();\r
111 #if 0\r
112     void delaySuspend();\r
113 #endif\r
114     // misc\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
117 \r
118     // EPG & 予約録画関連\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
128 \r
129     // タイマ満了IF (from Timer)\r
130     void timerExpired(Raym::Timer *timer, void *userInfo);\r
131 \r
132     // チューナ制御用IF\r
133     int getChannel(int tuner);\r
134     bool setChannel(int tuner, int channel);\r
135 \r
136     // プロパティ取得関連\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
144 \r
145 \r
146     // HTTP制御関連\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
164 \r
165     // Windows用IF (from TrayApp)\r
166     int  start();    // エントリポイント\r
167     void systemWillSuspend();\r
168     void systemResumed();\r
169     void detectIdle();\r
170     void detectNonIdle();\r
171     bool canTerminate();\r
172     void debugLog(const char *message);\r
173 };\r
174 \r
175 } // iPTd\r
176 } // ry0\r