3 import java.io.DataInputStream;
\r
4 import java.io.DataOutputStream;
\r
5 import java.io.IOException;
\r
6 import java.net.InetSocketAddress;
\r
7 import java.net.Socket;
\r
8 import java.net.SocketTimeoutException;
\r
9 import java.util.regex.Matcher;
\r
10 import java.util.regex.Pattern;
\r
15 public class GetRDStatus implements Cloneable {
\r
17 private byte[] bb = new byte[65536];
\r
18 private byte[] bb2 = new byte[231];
\r
20 public String title = "";
\r
21 public String enc = "";
\r
22 public String ch = "";
\r
23 public String mod = "";
\r
24 public String typ = "";
\r
25 public String okk = "";
\r
26 public String unk = "";
\r
27 public String dvd = "";
\r
28 public String opn = "";
\r
29 public String ply = "";
\r
30 public String dig = "";
\r
31 public int title_no = 0;
\r
32 public int title_len = 0;
\r
33 public String title_len_s = "";
\r
34 public int chapter = 0;
\r
35 public String chapter_name = "";
\r
36 public int time_all = 0;
\r
37 public String time_all_s = "";
\r
38 public int time_chap = 0;
\r
39 public String time_chap_s = "";
\r
40 public String title_chno = "";
\r
41 public String title_chname = "";
\r
42 public String title_date = "";
\r
43 public String title_time = "";
\r
44 public String title_gnr = "";
\r
45 public String title_chcode = "";
\r
47 private final int port = 1048;
\r
49 //byte[] dummy = {0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00};
\r
50 //byte[] init = {0x01,0x79,0x00,0x00,(byte) 0xff,(byte) 0xff,(byte) 0xff,(byte) 0xff};
\r
51 //byte[] init2 = {0x00,(byte) 0xe9,0x00,0x00,0x00,0x02,(byte) 0xbc,(byte) 0x81};
\r
52 //byte[] none = {0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00};
\r
53 //byte[] chgchA = {0x00,0x11,0x00,0x00,0x00,0x02,0x00,(byte) 0x80};
\r
54 //byte[] chgchB = {0x00,0x0D,0x00,0x00,0x00,0x02,0x00,0x00};
\r
55 //byte[] chgTit = {0x00,(byte) 0xE0,0x00,0x00,0x00,0x00,(byte) 0xBC,0x01};
\r
57 // 現在どのチャンネルを見ているのか確認する
\r
58 public String getCurChannel(String host) {
\r
61 DataOutputStream out = null;
\r
62 DataInputStream in = null;
\r
66 sock = new Socket();
\r
69 sock.setSoTimeout(1*1000);
\r
71 sock.connect(new InetSocketAddress(host,port),1000);
\r
73 out = new DataOutputStream(sock.getOutputStream());
\r
74 in = new DataInputStream(sock.getInputStream());
\r
76 } catch (SocketTimeoutException e) {
\r
77 System.err.println("ConnectException : Connection timeout");
\r
81 } catch (IOException e) {
\r
82 e.printStackTrace();
\r
92 out.writeByte(0x10);
\r
93 out.writeByte(0x48);
\r
97 byte[] hdr = new byte[2];
\r
100 int datlen = b2d(new byte[] { 0, 0, hdr[0],hdr[1] });
\r
108 byte[] b = new byte[datlen-2];
\r
109 in.read(b,0,datlen-2);
\r
113 System.out.println(" <-none");
\r
117 System.out.println(" <-dummy");
\r
121 System.out.println(" <-init2");
\r
123 for ( int x=6; x<231; x++ ) {
\r
124 if (bb2[x] != b[x]) {
\r
125 System.err.println(x+": "+Integer.valueOf(bb2[x])+" -> "+Integer.valueOf(b[x]));
\r
133 if (datlen >= 373) {
\r
136 System.out.println(" <-init");
\r
138 int typd = b2d(new byte[] { b[6],b[7],b[8],b[9] });
\r
142 else if (typd == 1) {
\r
146 typ = "UNKNOWN("+typd+")";
\r
149 int okkd = b2d(new byte[] { b[10],b[11],b[12],b[13] });
\r
153 else if (okkd == 1) {
\r
156 else if (okkd == 2) {
\r
160 okk = "UNKNOWN("+okkd+")";
\r
163 int unkd = b2d(new byte[] { b[14],b[15],b[16],b[17] });
\r
167 else if (unkd == 1) {
\r
170 else if (unkd == 2) {
\r
173 else if (unkd == 3) {
\r
177 unk = "UNKNOWN("+unkd+")";
\r
180 int dvdd = b2d(new byte[] { b[18],b[19],b[20],b[21] });
\r
184 else if (dvdd == 1) {
\r
187 else if (dvdd == 2) {
\r
190 else if (dvdd == 3) {
\r
194 dvd = "UNKNOWN("+dvdd+")";
\r
197 int plyd = b2d(new byte[] { b[22],b[23],b[24],b[25] });
\r
201 else if (plyd == 2) {
\r
204 else if (plyd == 3) {
\r
207 else if (plyd == 4) {
\r
210 else if (plyd == 5) {
\r
213 else if (plyd == 6) {
\r
216 else if (plyd == 7) {
\r
219 else if (plyd == 8) {
\r
222 else if (plyd == 9) {
\r
225 else if (plyd == 10) {
\r
228 else if (plyd == 11) {
\r
231 else if (plyd == 12) {
\r
234 else if (plyd == 13) {
\r
237 else if (plyd == 15) {
\r
240 else if (plyd == 24) {
\r
244 ply = "不明("+plyd+")";
\r
247 int opnd = b2d(new byte[] { b[26],b[27],b[28],b[29] });
\r
251 else if (opnd == 1) {
\r
254 else if (opnd == 7) {
\r
257 else if (opnd == 15) {
\r
261 opn = "UNKNOWN("+opnd+")";
\r
264 int modd = b2d(new byte[] { b[30],b[31],b[32],b[33] });
\r
265 if (modd == 0x00) {
\r
268 else if (modd == 1) {
\r
271 else if (modd == 3) {
\r
274 else if (modd == 5) {
\r
277 else if (modd == 6) {
\r
280 else if (modd == 7) {
\r
283 else if (modd == 8) {
\r
286 else if (modd == 9) {
\r
289 else if (modd == 10) {
\r
292 else if (modd == 11) {
\r
295 else if (modd == 13) {
\r
299 mod = "不明("+modd+")";
\r
302 time_all = b2d(new byte[] { b[46],b[47],b[48],b[49] });
\r
304 time_chap = b2d(new byte[] { b[50],b[51],b[52],b[53] });
\r
306 title_no = b2d(new byte[] { b[54],b[55],b[56],b[57] });
\r
308 title = new String(b,58,96,"MS932");
\r
309 int idx = title.indexOf('\0');
\r
311 title = title.substring(0,idx);
\r
314 chapter = b2d(new byte[] { b[154],b[155],b[156],b[157] });
\r
316 chapter_name = new String(b,158,96,"MS932");
\r
317 idx = chapter_name.indexOf('\0');
\r
319 chapter_name = chapter_name.substring(0,idx);
\r
322 title_len = b2d(new byte[] { b[354],b[355],b[356],b[357] });
\r
324 title_len_s = getHMS(title_len);
\r
325 time_all_s = getHMS(time_all);
\r
326 time_chap_s = getHMS(time_chap);
\r
328 int encd = b2d(new byte[] { b[358],b[359],b[360],b[361] });
\r
329 if (encd == 0x04) {
\r
332 else if (encd == 0x05) {
\r
335 else if (encd == 0x06) {
\r
339 enc = "不明("+encd+")";
\r
342 int digd = b2d(new byte[] { b[34],b[35],b[36],b[37] });
\r
345 ch = new String(b,362,5);
\r
346 idx = ch.indexOf('\0');
\r
348 ch = ch.substring(0,idx);
\r
351 else if (digd < 200) {
\r
352 ch = String.format("CH %d", digd);
\r
355 ch = String.format("L %d", digd%200);
\r
359 if (datlen >= 462) {
\r
362 title_chno = new String(b,371,5,"MS932");
\r
363 idx = title_chno.indexOf('\0');
\r
365 title_chno = title_chno.substring(0,idx);
\r
368 title_chname = new String(b,378,42,"MS932");
\r
369 idx = title_chname.indexOf('\0');
\r
371 title_chname = title_chname.substring(0,idx);
\r
374 title_date = new String(b,424,10);
\r
375 idx = title_date.indexOf('\0');
\r
377 title_date = title_date.substring(0,idx);
\r
380 title_time = new String(b,436,5);
\r
381 idx = title_time.indexOf('\0');
\r
383 title_time = title_time.substring(0,idx);
\r
386 int title_gnrd = b2d(new byte[] { 0,0,0,b[447] });
\r
387 if (title_gnrd == 0x00) {
\r
388 title_gnr = "ジャンルなし または ニュース報道";
\r
390 else if (title_gnrd == 1) {
\r
391 title_gnr = "スポーツ";
\r
393 else if (title_gnrd == 2) {
\r
394 title_gnr = "情報ワイドショー";
\r
396 else if (title_gnrd == 3) {
\r
399 else if (title_gnrd == 4) {
\r
402 else if (title_gnrd == 5) {
\r
403 title_gnr = "バラエティ";
\r
405 else if (title_gnrd == 6) {
\r
408 else if (title_gnrd == 7) {
\r
409 title_gnr = "アニメ/特撮";
\r
411 else if (title_gnrd == 8) {
\r
412 title_gnr = "ドキュメンタリー教養";
\r
414 else if (title_gnrd == 9) {
\r
415 title_gnr = "劇場公演";
\r
417 else if (title_gnrd == 10) {
\r
418 title_gnr = "趣味教育";
\r
420 else if (title_gnrd == 11) {
\r
423 else if (title_gnrd == 15) {
\r
427 title_gnr = "不明("+title_gnrd+")";
\r
431 ma = Pattern.compile("(\\d+)").matcher(title_chno);
\r
433 int code1 = b2d(new byte[] { 0,0,b[452],b[453] });
\r
434 int code2 = b2d(new byte[] { 0,0,b[454],b[455] });
\r
436 mb = Pattern.compile("^L").matcher(title_chno);
\r
438 title_chcode = String.format("%s:%08d:%03d", ma.group(1), code1, code2);
\r
440 if (code1 != 0 || code2 != 0) {
\r
441 title_chcode = String.format("%s:%d:%d", ma.group(1), code1, code2);
\r
443 title_chcode = "不明";
\r
447 title_chcode = "不明";
\r
451 // 項目の変化を見るための差分出力(デバッグ用)
\r
452 for ( int x=6; x<datlen-2; x++ ) {
\r
453 if ( x == 9 || x == 25 || x == 29 || x == 33 || x == 157 || x == 361 ||
\r
454 (x >= 34 && x <= 37) || (x >= 46 && x <= 49) || (x >= 50 && x <= 53) || (x >= 54 && x <= 57) || (x >= 154 && x <= 157) || (x >= 354 && x <= 357) ||
\r
455 (x >= 58 && x <= 58+95) || (x >= 362 && x <= 366)) {
\r
458 if (bb[x] != b[x]) {
\r
459 System.err.println(x+": "+Integer.valueOf(bb[x])+" -> "+Integer.valueOf(b[x]));
\r
467 return(new String(b,361,6));
\r
471 System.out.println(" <-unknown("+datlen+")");
\r
473 // 永久ループではなく、373バイト未満の未知のサイズのデータはエラーにしてしまうことにした
\r
480 catch (SocketTimeoutException e) {
\r
481 e.printStackTrace();
\r
484 catch (IOException e) {
\r
485 e.printStackTrace();
\r
489 CommonUtils.closing(sock);
\r
496 public String getHMS(int t) {
\r
504 int m = (t-s)/60 % 60;
\r
505 int h = (t - m * 60 - s)/3600;
\r
507 return String.format("%s%02d:%02d:%02d", flg,h,m,s);
\r
510 private int b2d(byte[] data) {
\r
511 return( (((data[0] & 0x80) == 0)?(1):(-1)) * (((data[0] & 0x7f) << 24) | ((data[1] & 0xff) << 16) | ((data[2] & 0xff) << 8) | (data[3] & 0xff)));
\r
515 public GetRDStatus clone() {
\r