OSDN Git Service

時間切れコミット
[tainavi/TinyBannavi.git] / TinyBannavi / src / tainavi / PlugIn_RecRD_E300.java
1 package tainavi;\r
2 \r
3 import java.io.File;\r
4 import java.io.UnsupportedEncodingException;\r
5 import java.net.Authenticator;\r
6 import java.net.URLEncoder;\r
7 import java.util.ArrayList;\r
8 import java.util.Hashtable;\r
9 import java.util.regex.Matcher;\r
10 import java.util.regex.Pattern;\r
11 \r
12 /*\r
13  * \r
14  */\r
15 \r
16 public class PlugIn_RecRD_E300 extends HDDRecorderUtils implements HDDRecorder,Cloneable {\r
17 \r
18         public PlugIn_RecRD_E300 clone() {\r
19                 return (PlugIn_RecRD_E300) super.clone();\r
20         }\r
21 \r
22         private static final String thisEncoding = "MS932";\r
23 \r
24         /* 必須コード  - ここから */\r
25         \r
26         // 種族の特性\r
27         public String getRecorderId() { return "VARDIA RD-E300"; }\r
28         public RecType getType() { return RecType.RECORDER; }\r
29         \r
30         // 個体の特性\r
31         private GetRDStatus gs = new GetRDStatus();\r
32         private ChannelCode cc = new ChannelCode(getRecorderId());\r
33         private String rsvedFile = "";\r
34         \r
35         private String errmsg = "";\r
36 \r
37         // 公開メソッド\r
38         \r
39         /*\r
40          * \r
41          */\r
42         public ChannelCode getChCode() {\r
43                 return cc;\r
44         }\r
45         \r
46         /*\r
47          * チャンネルリモコン機能\r
48          */\r
49         public boolean ChangeChannel(String Channel) {\r
50                 \r
51                 if (Channel == null) {\r
52                         return true;\r
53                 }\r
54                 \r
55                 int curBC;\r
56                 int newBC;\r
57                 String chNo;\r
58                 byte enc;\r
59                 \r
60                 errmsg = "";\r
61                 \r
62                 /*\r
63                  * 変更前の放送(地上波/BS/CS)\r
64                  */\r
65                 {\r
66                         String ch = null;\r
67                         for (int i=0; i<3 && (ch = gs.getCurChannel(getIPAddr())) == null; i++) {\r
68                                 CommonUtils.milSleep(500);\r
69                         }\r
70                         if (ch == null) {\r
71                                 errmsg = "レコーダへのアクセスに失敗しました(チャンネルリモコン)。";\r
72                                 System.err.println(errmsg);\r
73                                 return false;\r
74                         }\r
75                         \r
76                         byte[] ba = ch.getBytes();\r
77                         enc = ba[0];\r
78                         ch = ch.substring(1,5);\r
79                         \r
80                         if (ch.matches("^\\d.+")) {\r
81                                 curBC = 0;\r
82                         }\r
83                         else if (ch.startsWith("BS")) {\r
84                                 curBC = 1;\r
85                         }\r
86                         else if (ch.startsWith("CS")) {\r
87                                 curBC = 2;\r
88                         }\r
89                         else {\r
90                                 errmsg = "現在のチャンネルが認識できません("+ch+")。";\r
91                                 System.err.println(errmsg);\r
92                                 return false;\r
93                         }\r
94                 }\r
95                 \r
96                 /*\r
97                  * 変更後のCH\r
98                  */\r
99                 {\r
100                         // 放送(地上波/BS/CS)\r
101                         String cd = cc.getCH_WEB2CODE(Channel);\r
102                         String ch = cc.getCH_CODE2REC(cd);\r
103                         String typ = text2value(chtype, cd);\r
104                         if (typ == null) {\r
105                                 errmsg = "鯛ナビに情報が同期されていないチャンネルです("+Channel+", "+ch+")。";\r
106                                 System.err.println(errmsg);\r
107                                 return false;\r
108                         }\r
109                         else if (typ.matches("^l[123]$")) {\r
110                                 errmsg = "外部入力にアサインされているチャンネルには変更できません("+Channel+", "+ch+", "+typ+")。";\r
111                                 System.err.println(errmsg);\r
112                                 return false;\r
113                         }\r
114                         else if (typ.equals("uvd")) {\r
115                                 newBC = 0;\r
116                         }\r
117                         else if (typ.equals("bsd")) {\r
118                                 newBC = 1;\r
119                         }\r
120                         else if (typ.equals("csd")) {\r
121                                 newBC = 2;\r
122                         }\r
123                         else {\r
124                                 errmsg = "放送種別が識別できません。プログラム異常です("+Channel+", "+ch+")。";\r
125                                 System.err.println(errmsg);\r
126                                 return false;\r
127                         }\r
128                         \r
129                         // CH番号\r
130                         Matcher ma = Pattern.compile("(\\d\\d\\d)").matcher(ch);\r
131                         if (ma.find()) {\r
132                                 chNo = ma.group(1);\r
133                         }\r
134                         else {\r
135                                 errmsg = "CH番号が取得できません("+Channel+", "+ch+")。";\r
136                                 System.err.println(errmsg);\r
137                                 return false;\r
138                         }\r
139                 }\r
140                 \r
141                 /*\r
142                  * CH変更実行\r
143                  */\r
144                 \r
145                 // おまじない\r
146                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
147                 \r
148                 int cBC;\r
149                 for (int i=0; i<4 && newBC != (cBC = (curBC+i)%4); i++) {\r
150                         // 地上アナログ(3)が選択できるのはRE(0x06)だけ\r
151                         if (enc != 0x06 && cBC == 3) {\r
152                                 continue;\r
153                         }\r
154                         \r
155                         // 切り替え実行\r
156                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=21", null);\r
157                         \r
158                         // 地上波→BS・BS→CSは切り替え完了までに時間がかかる\r
159                         CommonUtils.milSleep((cBC == 0 || cBC == 1)?(3000):(1000));\r
160                 }\r
161                 \r
162                 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=25", null);\r
163                 CommonUtils.milSleep(1000);\r
164                 for (int i=0; i<3; i++) {\r
165                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=0"+chNo.substring(i,i+1), null);\r
166                         CommonUtils.milSleep(200);\r
167                 }\r
168                 reqGET("http://"+getIPAddr()+":"+getPortNo()+"/remote/remote.htm?key=44", null);\r
169                 \r
170                 return true;\r
171         }\r
172 \r
173         /*\r
174          *      レコーダーから予約一覧を取得する \r
175          */\r
176         public boolean GetRdReserve(boolean force)\r
177         {\r
178                 System.out.println("Run: GetRdReserve("+force+")");\r
179                 \r
180                 errmsg = "";\r
181                 \r
182                 //\r
183                 rsvedFile = "env/reserved."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
184                 String vrateTFile = "env/videorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
185                 String arateTFile = "env/audiorate."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
186                 String folderTFile = "env/folders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
187                 String encoderTFile = "env/encoders."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
188                 String dvdcompatTFile = "env/dvdcompat."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
189                 String deviceTFile = "env/device."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
190                 String xChapterTFile = "env/xchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
191                 String msChapterTFile = "env/mschapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
192                 String mvChapterTFile = "env/mvchapter."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
193                 String chValueTFile = "env/chvalue."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
194                 String chTypeTFile = "env/chtype."+getIPAddr()+"_"+getPortNo()+"_"+getRecorderId()+".xml";\r
195 \r
196                 File f = new File(rsvedFile);\r
197                 if ( force == false && f.exists()) {\r
198                         // キャッシュから読み出し(録画設定ほか)\r
199                         vrate = TVSload(vrateTFile);\r
200                         arate = TVSload(arateTFile);\r
201                         folder = TVSload(folderTFile);\r
202                         encoder = TVSload(encoderTFile);\r
203                         dvdcompat = TVSload(dvdcompatTFile);\r
204                         device = TVSload(deviceTFile);\r
205                         xchapter = TVSload(xChapterTFile);\r
206                         mschapter = TVSload(msChapterTFile);\r
207                         mvchapter = TVSload(mvChapterTFile);\r
208                         chvalue = TVSload(chValueTFile);\r
209                         chtype = TVSload(chTypeTFile);\r
210                         \r
211                         // キャッシュから読み出し(予約一覧)\r
212                         setReserves(ReservesFromFile(rsvedFile));\r
213                         \r
214                         // なぜか設定ファイルが空になっている場合があるので、その際は再取得する\r
215                         if (vrate.size()>0 && arate.size()>0 &&\r
216                                         folder.size()>0 && encoder.size()>0 && device.size()>0 &&\r
217                                         xchapter.size()>0 && mschapter.size()>0 && mvchapter.size()>0 &&\r
218                                         chvalue.size()>0 && chtype.size()>0) {\r
219                                 return(true);\r
220                         }\r
221                 }\r
222                 \r
223                 // おまじない\r
224                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
225 \r
226                 // RDから予約一覧を取り出す\r
227                 Matcher ma = null;\r
228                 String idx = "";\r
229                 String header="";\r
230                 String response="";\r
231                 {\r
232                         reportProgress("get reserved list(1/4).");\r
233                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
234                         header = d[0];\r
235                         response = d[1];\r
236                         \r
237                         if (response == null) {\r
238                                 errmsg = "レコーダーが反応しません";\r
239                                 return(false);\r
240                         }\r
241                 }\r
242                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
243                 if (ma.find()) {\r
244                         idx = ma.group(1);\r
245                         reportProgress("get reserved list(2/4).");\r
246                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
247                         header = d[0];\r
248                         response = d[1];\r
249                         \r
250                         if (response == null) {\r
251                                 errmsg = "レコーダーが反応しません";\r
252                                 return(false);\r
253                         }\r
254                 }\r
255                 \r
256                 // 予約エントリー数を取得する\r
257                 int RsvCnt = 0;\r
258                 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);\r
259                 if ( ! ma.find()) {\r
260                         errmsg = "レコーダーからの情報取得に失敗しました(予約一覧)";\r
261                         return false;\r
262                 }\r
263                 RsvCnt = Integer.valueOf(ma.group(1));\r
264                 \r
265                 // (1)録画設定の取得\r
266                 {\r
267                         // ハング防止のおまじない\r
268                         reportProgress("get reserved list(3/4).");\r
269                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);\r
270                 }\r
271                 {\r
272                         reportProgress("get reserved list(4/4).");\r
273                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
274                         String hdr = d[0];\r
275                         String res = d[1];\r
276                         Matcher mb = null;\r
277                         \r
278                         // 正常取得チェック\r
279                         if ( ! res.matches("[\\s\\S]*var hdd_folder_text[\\s\\S]*")) {\r
280                                 errmsg = "レコーダーからの情報取得に失敗しました(録画設定)";\r
281                                 return false;\r
282                         }\r
283                         \r
284                         // (1-1)画質設定\r
285                         setSettingEtc(vrate,"vrate",1,res);\r
286                         TVSsave(vrate, vrateTFile);\r
287                         \r
288                         // (1-2)音質設定\r
289                         setSettingEtc(arate,"amode",0,res);\r
290                         TVSsave(arate, arateTFile);\r
291                         \r
292                         // (1-3)フォルダ一覧\r
293                         setSettingEtc(folder,"hdd_folder",1,res);\r
294                         TVSsave(folder, folderTFile);\r
295                         \r
296                         // (1-4)エンコーダ\r
297                         encoder.clear();\r
298                         \r
299                         mb = Pattern.compile("var double_encode_flg = (\\d+?);").matcher(res);\r
300                         if (mb.find()) {\r
301                                 Matcher mc = Pattern.compile("\\n\\s*?switch \\( double_encode_flg \\) \\{([\\s\\S]+?default:)").matcher(res);\r
302                                 if (mc.find()) {\r
303                                         Matcher md = Pattern.compile("(case "+mb.group(1)+":[\\s\\S]+?break;)").matcher(mc.group(1));\r
304                                         if (md.find()) {\r
305                                                 Matcher me = Pattern.compile("name=enc_type value=.\"(\\d+?).\"[\\s\\S]+?act_(.+?)\\.gif").matcher(md.group(1));\r
306                                                 while (me.find()) {\r
307                                                         TextValueSet t = new TextValueSet();\r
308                                                         t.setText(me.group(2));\r
309                                                         t.setValue(me.group(1));\r
310                                                         encoder.add(t);\r
311                                                 }\r
312                                         }\r
313                                 }\r
314                         }\r
315                         \r
316                         TVSsave(encoder, encoderTFile);\r
317                         \r
318                         // (1-5)DVD互換モード\r
319                         setSettingEtc(dvdcompat,"dvdr",1,res);\r
320                         TVSsave(dvdcompat, dvdcompatTFile);\r
321                         \r
322                         // (1-6)記録先デバイス\r
323                         setSettingEtc(device,"media",0,res);\r
324                         TVSsave(device, deviceTFile);\r
325                         \r
326                         // (1-7)自動チャプター関連\r
327                         setSettingEtc(xchapter,"mutechapter",0,res);\r
328                         TVSsave(xchapter, xChapterTFile);\r
329                         \r
330                         setSettingEtc(mschapter,"magicchapter",0,res);\r
331                         TVSsave(mschapter, msChapterTFile);\r
332 \r
333                         setSettingEtc(mvchapter,"cmchapter",0,res);\r
334                         TVSsave(mvchapter, mvChapterTFile);\r
335                         \r
336                         // (1-8)チャンネルコードバリュー\r
337                         chvalue.clear();\r
338                         chtype.clear();\r
339                         for ( String typ : new String[] { "uvd","bsd","csd","uva","bsa","l1","l2","l3" } ) {\r
340                                 String txtkey = typ+"_ch_text";\r
341                                 String valkey = typ+"_ch_value";\r
342                                 Matcher mc = Pattern.compile("var "+txtkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
343                                 Matcher md = Pattern.compile("var "+valkey+"\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
344                                 if ( mc.find() && md.find() ) {\r
345                                         Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));\r
346                                         Matcher mf = null;\r
347                                         if ( typ.equals("uva") ) {\r
348                                                 mf = Pattern.compile("(\\d+),").matcher(md.group(1));\r
349                                         }\r
350                                         else {\r
351                                                 mf = Pattern.compile("\"([^\"]+?)\",").matcher(md.group(1));\r
352                                         }\r
353                                         while ( me.find() && mf.find() ) {\r
354                                                 TextValueSet t = new TextValueSet();\r
355                                                 t.setText(me.group(1));\r
356                                                 t.setValue(mf.group(1));\r
357                                                 chvalue.add(t);\r
358                                                 \r
359                                                 TextValueSet x = new TextValueSet();\r
360                                                 x.setText(mf.group(1));\r
361                                                 x.setValue(typ);\r
362                                                 chtype.add(x);\r
363                                         }\r
364                                 }\r
365                         }\r
366                         TVSsave(chvalue, chValueTFile);\r
367                         TVSsave(chtype, chTypeTFile);\r
368                 }\r
369                 \r
370                 // 予約一覧データの分析\r
371                 // 情報ブロックをとりだし…\r
372                 /*\r
373                         var     c1  = new Array(RsvCnt);                // 予約ID\r
374                         var     c2  = new Array(RsvCnt);                // 実行フラグ\r
375                         var     c3  = new Array(RsvCnt);                // 予約名\r
376                         var     c4  = new Array(RsvCnt);                // REC1/REC2\r
377                         var     c5  = new Array(RsvCnt);                // 表示CH\r
378                         var     c6  = new Array(RsvCnt);                // 録画日付\r
379                         var     c7  = new Array(RsvCnt);                // 録画開始時刻\r
380                         var     c8  = new Array(RsvCnt);                // 録画終了時刻\r
381                         var     c9  = new Array(RsvCnt);                // 記録先\r
382                         var     c10 = new Array(RsvCnt);                // 画質\r
383                         var     c11 = new Array(RsvCnt);                // 音質\r
384                         var     c12 = new Array(RsvCnt);                // 録画開始時刻の文字色\r
385                         var     c13 = new Array(RsvCnt);                // 録画終了時刻の文字色\r
386                         var     c14 = new Array(RsvCnt);                // おすすめ\r
387                         var     c15 = new Array(RsvCnt);                // 番組追っかけ\r
388                         var     c16 = new Array(RsvCnt);                // スポーツ延長\r
389                         var     c17 = new Array(RsvCnt);                // 優先度\r
390                  */\r
391                 {\r
392                         //int cnt = 0;\r
393                         ArrayList<ReserveList> newReserveList = new ArrayList<ReserveList>();\r
394                         \r
395                         ma = Pattern.compile("(c1\\[\\d+?\\]=[\\s\\S]+?\";)\\n").matcher(response);\r
396                         while ( ma.find() ) {\r
397                                 // 個々のデータを取り出す\r
398                                 ReserveList entry = new ReserveList();\r
399                                 \r
400                                 Matcher mb = null;\r
401                                         \r
402                                 String[] d = new String[17];\r
403                                 mb = Pattern.compile("c\\d+?\\[\\d+?\\]=\"(.*?)\";").matcher(ma.group(1));\r
404                                 for (int i=0; i<d.length; i++) {\r
405                                         if ( mb.find()) {\r
406                                                 d[i] = mb.group(1);\r
407                                         }\r
408                                 }\r
409                                 \r
410                                 // 予約ID\r
411                                 entry.setId(d[0]);\r
412                                 \r
413                                 // 実行フラグ\r
414                                 if ( ! d[1].equals("1")) {\r
415                                         entry.setExec(false);\r
416                                 }\r
417                                 \r
418                                 // 予約名\r
419                                 entry.setTitle(CommonUtils.unEscape(d[2]).replaceAll("<BR>", ""));\r
420                                 entry.setTitlePop(TraceProgram.replacePop(entry.getTitle()));\r
421                                 \r
422                                 // REC1/REC2\r
423                                 entry.setTuner(value2text(encoder, d[3]));\r
424                                 \r
425                                 // 表示CH\r
426                                 entry.setChannel(d[4]);\r
427                                 entry.setCh_name(cc.getCH_REC2WEB(d[4]));\r
428                                 \r
429                                 // 録画日付・開始時刻・終了時刻\r
430                                 entry.setRec_pattern(d[5]);\r
431                                 entry.setRec_pattern_id(getRec_pattern_Id(entry.getRec_pattern()));\r
432                                 mb = Pattern.compile("(\\d\\d):(\\d\\d).*?(\\d\\d):(\\d\\d)").matcher(d[6]+"-"+d[7]);\r
433                                 if (mb.find()) {\r
434                                         entry.setAhh(mb.group(1));\r
435                                         entry.setAmm(mb.group(2));\r
436                                         entry.setZhh(mb.group(3));\r
437                                         entry.setZmm(mb.group(4));\r
438                                 }\r
439                                 entry.setRec_nextdate(CommonUtils.getNextDate(entry));\r
440                                 entry.setRec_min(CommonUtils.getRecMin(entry.getAhh(), entry.getAmm(), entry.getZhh(), entry.getZmm()));\r
441                                 getStartEndDateTime(entry);\r
442                                 \r
443                                 // 記録先\r
444                                 entry.setRec_device(d[8]);\r
445                                 \r
446                                 // 画質・音質\r
447                                 entry.setRec_mode(d[9]);\r
448                                 entry.setRec_audio(d[10]);\r
449                                 \r
450                                 // タイトル自動補完フラグなど本体からは取得できない情報を引き継ぐ\r
451                                 copyAttributes(entry, getReserves());\r
452                                 \r
453                                 // 予約情報を保存\r
454                                 newReserveList.add(entry.clone());\r
455                         }\r
456                         setReserves(newReserveList);\r
457                 }\r
458                 \r
459                 // 取得した情報の表示\r
460                 System.out.println("---Reserved List Start---");\r
461                 for ( int i = 0; i<getReserves().size(); i++ ) {\r
462                         // 詳細情報の取得\r
463                         ReserveList e = getReserves().get(i);\r
464                         System.out.println(String.format("[%s] %s\t%s\t%s\t%s:%s\t%s:%s\t%sm\t%s\t%s\t%s\t%s",\r
465                                         (i+1), e.getId(), e.getRec_pattern(), e.getRec_nextdate(), e.getAhh(), e.getAmm(), e.getZhh(),  e.getZmm(),     e.getRec_min(), e.getRec_mode(), e.getTitle(), e.getChannel(), e.getCh_name()));\r
466                 }\r
467                 System.out.println("---Reserved List End---");\r
468                 \r
469                 // キャッシュに保存\r
470                 ReservesToFile(getReserves(), rsvedFile);\r
471                 \r
472                 return(true);\r
473         }\r
474         \r
475         /*\r
476          *      予約を実行する\r
477          */\r
478         public boolean PostRdEntry(ReserveList r)\r
479         {\r
480                 //\r
481                 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {\r
482                         errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
483                         System.out.println(errmsg);\r
484                         return(false);\r
485                 }\r
486                 \r
487                 System.out.println("Run: PostRdEntry("+r.getTitle()+")");\r
488                 \r
489                 errmsg = "";\r
490 \r
491                 // おまじない\r
492                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
493                 \r
494                 // RDから予約一覧を取り出す\r
495                 Matcher ma = null;\r
496                 String idx = "";\r
497                 String header;\r
498                 String response;\r
499                 {\r
500                         reportProgress("get reserved list(1/7).");\r
501                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
502                         header = d[0];\r
503                         response = d[1];\r
504                         \r
505                         if ( response == null ) {\r
506                                 errmsg = "レコーダーが反応しません。";\r
507                                 return(false);\r
508                         }\r
509                 }\r
510                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
511                 if (ma.find()) {\r
512                         reportProgress("get reserved list(2/7).");\r
513                         idx = ma.group(1);\r
514                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
515                         header = d[0];\r
516                         response = d[1];\r
517                         \r
518                         if ( response == null ) {\r
519                                 errmsg = "レコーダーが反応しません。";\r
520                                 return(false);\r
521                         }\r
522                 }\r
523                 \r
524                 // 予約エントリー数を取得する\r
525                 int RsvCnt = 0;\r
526                 ma = Pattern.compile("RsvCnt\\s*=\\s*(\\d+?);").matcher(response);\r
527                 if (ma.find()) {\r
528                         RsvCnt = Integer.valueOf(ma.group(1));\r
529                 }\r
530         \r
531                 // RDに新規登録要請\r
532                 {\r
533                         // ハング防止のおまじない\r
534                         reportProgress("get program(3/7).");\r
535                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?0&"+(RsvCnt+1),null);\r
536                         \r
537                         reportProgress("get program(4/7).");\r
538                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
539                 }\r
540 \r
541                 // POSTデータを変換する\r
542                 Hashtable<String, String> pdat = modPostdata(r);\r
543                 \r
544                 // RDへの情報作成\r
545                 String pstr = joinPoststr(pdat);\r
546 \r
547                 // RDへ情報送信\r
548                 {               \r
549                         reportProgress("send request.(5/7)");\r
550                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);\r
551                         header = d[0];\r
552                         response = d[1];\r
553                 }\r
554                 \r
555                 // 登録結果の確認\r
556                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
557                 if ( ma.find() ) {\r
558                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
559                         if (mb.find()) {\r
560                                 errmsg = mb.group(1);\r
561                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
562                                 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);\r
563                                 if ( ! mc.find() ) {\r
564                                         return(false);\r
565                                 }\r
566                         }                       \r
567                 }\r
568 \r
569 \r
570                 \r
571                 /*\r
572                  * 予約情報の調整 \r
573                  */\r
574                 \r
575                 // 予約ID番号を取得(キャッシュに存在しない番号が新番号)\r
576                 {\r
577                         reportProgress("get identifier(6/7).");\r
578                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
579                         header = d[0];\r
580                         response = d[1];\r
581                 }\r
582                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
583                 if (ma.find()) {\r
584                         idx = ma.group(1);\r
585                         reportProgress("get identifier(7/7).");\r
586                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
587                         header = d[0];\r
588                         response = d[1];\r
589                 }\r
590                 r.setId(getNewId(response));\r
591 \r
592                 // 予約パターンID\r
593                 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));\r
594 \r
595                 // 次回予定日\r
596                 r.setRec_nextdate(CommonUtils.getNextDate(r));\r
597                 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));\r
598                 \r
599                 // 録画長\r
600                 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));\r
601                 \r
602                 // 開始日時・終了日時\r
603                 getStartEndDateTime(r);\r
604                 \r
605                 // 予約リストを更新\r
606                 getReserves().add(r);\r
607                 \r
608                 // キャッシュに保存\r
609                 ReservesToFile(getReserves(), rsvedFile);\r
610                 \r
611                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に登録できました。");\r
612                 return(true);\r
613         }\r
614 \r
615         \r
616         /*\r
617          *      予約を更新する\r
618          */\r
619         public boolean UpdateRdEntry(ReserveList o, ReserveList r) {\r
620                 //\r
621                 if (cc.getCH_WEB2CODE(r.getCh_name()) == null) {\r
622                         errmsg = "【警告】Web番組表の放送局名「"+r.getCh_name()+"」をCHコードに変換できません。CHコード設定を修正してください。" ;\r
623                         System.out.println(errmsg);\r
624                         return(false);\r
625                 }\r
626                 \r
627                 System.out.println("Run: UpdateRdEntry()");\r
628                 \r
629                 errmsg = "";\r
630 \r
631                 // おまじない\r
632                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
633                 \r
634                 // 更新準備\r
635                 Matcher ma = null;\r
636                 String idx = "";\r
637                 int lineno = 0;\r
638                 String header;\r
639                 String response;\r
640                 {\r
641                         reportProgress("get identifier(1/5).");\r
642                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
643                         header = d[0];\r
644                         response = d[1];\r
645                 }\r
646                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
647                 if (ma.find()) {\r
648                         idx = ma.group(1);\r
649                         reportProgress("get identifier(2/5).");\r
650                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
651                         header = d[0];\r
652                         response = d[1];\r
653                 }\r
654                 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+r.getId()+"\";").matcher(response);\r
655                 if ( ma.find() ) {\r
656                         lineno = Integer.valueOf(ma.group(1))+1;\r
657                 }\r
658                 \r
659                 // RDに更新要請\r
660                 {\r
661                         // ハング防止のおまじない\r
662                         reportProgress("get program(3/5).");\r
663                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+r.getId()+"&"+lineno,null);\r
664                         \r
665                         reportProgress("get program(4/5).");\r
666                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
667                 }\r
668 \r
669                 // POSTデータを変換する\r
670                 Hashtable<String, String> pdat = modPostdata(r);\r
671                 \r
672                 // RDへの情報作成\r
673                 String pstr = joinPoststr(pdat);\r
674 \r
675                 // RDへ情報送信\r
676                 {               \r
677                         reportProgress("send request.(5/5)");\r
678                         String[] d = reqPOST("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/entry.htm", pstr, null);\r
679                         header = d[0];\r
680                         response = d[1];\r
681                 }\r
682 \r
683                 // 更新結果の確認\r
684                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
685                 if ( ma.find() ) {\r
686                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
687                         if (mb.find()) {\r
688                                 errmsg = mb.group(1);\r
689                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
690                                 Matcher mc = Pattern.compile("(予約時間が重複しています。|修正しました。)").matcher(errmsg);\r
691                                 if ( ! mc.find() ) {\r
692                                         return(false);\r
693                                 }\r
694                         }                       \r
695                 }\r
696 \r
697                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に更新できました。");\r
698 \r
699                 /*\r
700                  * 予約情報の調整 \r
701                  */\r
702 \r
703                 // 予約パターンID\r
704                 r.setRec_pattern_id(getRec_pattern_Id(r.getRec_pattern()));\r
705                 \r
706                 // 次回予定日\r
707                 r.setRec_nextdate(CommonUtils.getNextDate(r));\r
708                 //r.setRec_nextdate(getNextDate(r.getRec_pattern(), r.getZhh()+":"+r.getZmm()));\r
709                 \r
710                 // 録画長\r
711                 r.setRec_min(CommonUtils.getRecMin(r.getAhh(),r.getAmm(),r.getZhh(),r.getZmm()));\r
712                 \r
713                 // 開始日時・終了日時\r
714                 getStartEndDateTime(r);\r
715                 \r
716                 // 情報置き換え\r
717                 getReserves().remove(o);\r
718                 getReserves().add(r);\r
719 \r
720                 // キャッシュに保存\r
721                 ReservesToFile(getReserves(), rsvedFile);\r
722                 \r
723                 return(true);\r
724         }\r
725 \r
726         /*\r
727          *      予約を削除する\r
728          */\r
729         public ReserveList RemoveRdEntry(String delid) {\r
730                 System.out.println("Run: RemoveRdEntry()");\r
731                 \r
732                 errmsg = "";\r
733 \r
734                 // おまじない\r
735                 Authenticator.setDefault(new MyAuthenticator(getUser(), getPasswd()));\r
736 \r
737                 // 削除対象を探す\r
738                 ReserveList rx = null;\r
739                 for (  ReserveList reserve : getReserves() )  {\r
740                         if (reserve.getId().equals(delid)) {\r
741                                 rx = reserve;\r
742                                 break;\r
743                         }\r
744                 }\r
745                 if (rx == null) {\r
746                         return(null);\r
747                 }\r
748 \r
749                 // 予約行番号を取得\r
750                 Matcher ma = null;\r
751                 String idx = "";\r
752                 int lineno = 0;\r
753                 String header;\r
754                 String response;\r
755                 {\r
756                         reportProgress("get identifier(1/5).");\r
757                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/b_rsv.htm",null);\r
758                         header = d[0];\r
759                         response = d[1];\r
760                 }\r
761                 ma = Pattern.compile("/reserve/(\\d+?)/reserve.htm").matcher(response);\r
762                 if (ma.find()) {\r
763                         idx = ma.group(1);\r
764                         reportProgress("get identifier(2/5).");\r
765                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/reserve.htm",null);\r
766                         header = d[0];\r
767                         response = d[1];\r
768                 }\r
769                 ma = Pattern.compile("c1\\[(\\d+?)\\]=\""+rx.getId()+"\";").matcher(response);\r
770                 if ( ma.find() ) {\r
771                         lineno = Integer.valueOf(ma.group(1))+1;\r
772                 }\r
773 \r
774                 // RDに削除要請\r
775                 {\r
776                         // ハング防止のおまじない\r
777                         reportProgress("get program(3/5).");\r
778                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/b_rsvinfo.htm?"+rx.getId()+"&"+lineno,null);\r
779                         \r
780                         reportProgress("get program(4/5).");\r
781                         reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/rsvinfo.htm",null);\r
782                 }\r
783                 {               \r
784                         reportProgress("send request.(5/5)");\r
785                         String[] d = reqGET("http://"+getIPAddr()+":"+getPortNo()+"/reserve/"+idx+"/delete.htm", null);\r
786                         header = d[0];\r
787                         response = d[1];\r
788                 }\r
789 \r
790                 // 削除結果の確認\r
791                 ma = Pattern.compile("alert\\(msg\\)").matcher(response);\r
792                 if ( ma.find() ) {\r
793                         Matcher mb = Pattern.compile("\\bmsg=\"([\\s\\S]+?)\";").matcher(response);\r
794                         if (mb.find()) {\r
795                                 errmsg = mb.group(1);\r
796                                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", errmsg);\r
797                         }\r
798                         return(null);\r
799                 }\r
800                 \r
801                 // 予約リストを更新\r
802                 getReserves().remove(rx);\r
803                 \r
804                 // キャッシュに保存\r
805                 ReservesToFile(getReserves(), rsvedFile);\r
806                 \r
807                 System.out.printf("\n<<< Message from RD >>> \"%s\"\n\n", "正常に削除できました。");\r
808                 return(rx);\r
809         }\r
810         \r
811         /*\r
812          * \r
813          */\r
814         public String getErrmsg() {\r
815                 return(errmsg.replaceAll("\\\\r\\\\n", ""));\r
816         }\r
817         \r
818         \r
819         /* ここまで */\r
820         \r
821         \r
822         \r
823 \r
824         \r
825         \r
826         /* 個別コード-ここから最後まで */\r
827 \r
828         /*\r
829          * 非公開メソッド \r
830          */\r
831 \r
832         private String joinPoststr(Hashtable<String, String> pdat)\r
833         {\r
834                 String[] pkeys = {\r
835                         "bExec",\r
836                         "start_form",\r
837                         "title_name",\r
838                         "detail",\r
839                         "genre",\r
840                         "enc_type",\r
841                         "broadcast",\r
842                         "channel_list",\r
843                         "rec_priority",\r
844                         "maiyoubi_type",\r
845                         "date",\r
846                         "start_hour",\r
847                         "start_minute",\r
848                         "end_hour",\r
849                         "end_minute",\r
850                         "disc",\r
851                         "folder",\r
852                         "vrate",\r
853                         "amode",\r
854 //                      "title_link",\r
855                         "auto_delete",\r
856 //                      "video_es",\r
857 //                      "audio_es",\r
858                         "dvdr",\r
859                         "lVoice",\r
860                         "edge_left",\r
861                         "bAutoChapter",\r
862                         "MagicChapter",\r
863                         "CM_Chapter",\r
864                         "channel_no",\r
865                         "dtv_sid",\r
866                         "dtv_nid",\r
867                         "net_link",\r
868                         "add_ch_text",\r
869                         "add_ch_value",\r
870                         "sport_ext_submit",\r
871                         "title_link_submit",\r
872                         "end_form"\r
873                 };\r
874                 \r
875                 String pstr = "";\r
876                 for ( String key : pkeys ) {\r
877                         if (pdat.containsKey(key)) {\r
878                                 pstr += key+"="+pdat.get(key)+"&";\r
879                         }\r
880                 }\r
881                 pstr = pstr.substring(0, pstr.length()-1);\r
882                 \r
883                 return(pstr);\r
884         }\r
885         \r
886         private Hashtable<String, String> modPostdata(ReserveList r) {\r
887 \r
888                 Hashtable<String, String> newdat = new Hashtable<String, String>();\r
889                 \r
890                 // 実行するよ\r
891                 newdat.put("bExec", (r.getExec())?("ON"):("OFF"));\r
892                 if (r.getUpdateOnlyExec()) {\r
893                         return(newdat);\r
894                 }\r
895 \r
896                 // 予約名・予約詳細\r
897                 if ( r.getAutocomplete() ) {\r
898                         newdat.put("title_name", "");\r
899                         newdat.put("detail", "");\r
900                 }\r
901                 else {\r
902                         try {\r
903                                 newdat.put("title_name", URLEncoder.encode(r.getTitle(),thisEncoding));\r
904                         } catch (UnsupportedEncodingException e1) {\r
905                                 e1.printStackTrace();\r
906                         }\r
907         \r
908                         // 予約詳細\r
909                         try {\r
910                                 newdat.put("detail", URLEncoder.encode(r.getDetail().replaceAll("\n", Matcher.quoteReplacement("\r\n")), thisEncoding));\r
911                         } catch (UnsupportedEncodingException e) {\r
912                                 e.printStackTrace();\r
913                         }\r
914                 }\r
915                 \r
916                 // 保存先\r
917                 try {\r
918                         newdat.put("folder", URLEncoder.encode(text2value(folder, r.getRec_folder()),thisEncoding));\r
919                 } catch (UnsupportedEncodingException e) {\r
920                         e.printStackTrace();\r
921                 }\r
922                 \r
923                 // ジャンル\r
924                 newdat.put("genre", _recstr2genre(r.getRec_genre()));\r
925                 \r
926                 // DVD互換モード\r
927                 newdat.put("dvdr", text2value(dvdcompat, r.getRec_dvdcompat()));\r
928                 \r
929                 // 録画チャンネル\r
930                 String channel = cc.getCH_WEB2CODE(r.getCh_name());\r
931                 String ch_no = cc.getCH_CODE2REC(channel);\r
932                 if (chtype.size() > 0) {\r
933                         String typ = text2value(chtype, channel);\r
934                         if (typ.equals("uva")) {\r
935                                 newdat.put("broadcast","0");            // 地上アナログ\r
936                         }\r
937                         else if (typ.equals("bsa")) {\r
938                                 newdat.put("broadcast","1");            // BSアナログ\r
939                         }\r
940                         else if (typ.equals("l1")) {\r
941                                 newdat.put("broadcast","2");            // 外部入力(L1)\r
942                         }\r
943                         else if (typ.equals("l2")) {\r
944                                 newdat.put("broadcast","3");            // 外部入力(L2)\r
945                         }\r
946                         else if (typ.equals("l3")) {\r
947                                 newdat.put("broadcast","4");            // 外部入力(L3)\r
948                         }\r
949                         else if (typ.equals("bsd")) {\r
950                                 newdat.put("broadcast","10");           // BSデジタル\r
951                         }\r
952                         else if (typ.equals("csd")) {\r
953                                 newdat.put("broadcast","11");           // 110度CSデジタル\r
954                         }\r
955                         else if (typ.equals("uvd")) {\r
956                                 newdat.put("broadcast","12");           // 地上デジタル\r
957                         }\r
958                         else {\r
959                                 // 普通ここには落ちない\r
960                                 if (ch_no.startsWith("C")) {\r
961                                         newdat.put("broadcast","2");            // "C***"は外部入力(L1)\r
962                                 }\r
963                                 else if (ch_no.startsWith("SP")) {\r
964                                         newdat.put("broadcast","4");            // "SP***"は外部入力(L3)\r
965                                 }\r
966                                 else {\r
967                                         newdat.put("broadcast","3");            // 未定義は全部外部入力(L2)\r
968                                 }\r
969                         }\r
970                         \r
971                         newdat.put("channel_list", channel);\r
972                         newdat.put("channel_no", channel);\r
973                 }\r
974                 else {\r
975                         // 後方互換\r
976                         Matcher ma = Pattern.compile("^(.)(.)").matcher(ch_no);\r
977                         if (ma.find()) {\r
978                                 if ((ma.group(1)+ma.group(2)).equals("CH")) {\r
979                                         newdat.put("broadcast","0");            // 地上アナログ\r
980                                 }\r
981                                 else if ((ma.group(1)+ma.group(2)).equals("BS")) {\r
982                                         newdat.put("broadcast","10");           // BSデジタル\r
983                                 }\r
984                                 else if ((ma.group(1)+ma.group(2)).equals("CS")) {\r
985                                         newdat.put("broadcast","11");           // 110度CSデジタル\r
986                                 }\r
987                                 else if (ma.group(1).equals("L")) {\r
988                                         newdat.put("broadcast", String.valueOf(Integer.valueOf(ma.group(2))+1));        // ライン入力ABC\r
989                                 }\r
990                                 else {\r
991                                         newdat.put("broadcast","12");           // 地上デジタル\r
992                                 }\r
993                                 \r
994                                 newdat.put("channel_list", channel);\r
995                                 newdat.put("channel_no", channel);\r
996                         }\r
997                 }\r
998                 \r
999                 // 録画レート\r
1000                 newdat.put("enc_type", text2value(encoder, r.getTuner()));\r
1001                 newdat.put("vrate", text2value(vrate, r.getRec_mode()));\r
1002                 \r
1003                 // 録音レート\r
1004                 newdat.put("amode", text2value(arate, r.getRec_audio()));\r
1005 \r
1006                 // TS時の修正\r
1007                 if (r.getTuner().equals("TS")) {\r
1008                         r.setRec_mode("TS");\r
1009                         r.setRec_audio("");\r
1010                 }\r
1011 \r
1012                 // 繰り返し\r
1013                 Matcher ma = Pattern.compile("^\\d").matcher(r.getRec_pattern());\r
1014                 if (ma.find()) { \r
1015                         newdat.put("maiyoubi_type","0");\r
1016                         newdat.put("date", r.getRec_pattern());\r
1017                 }\r
1018                 else {\r
1019                         newdat.put("maiyoubi_type", "1");\r
1020                         int i = 1;\r
1021                         for ( String s : RPTPTN ) {\r
1022                                 if ( s.equals(r.getRec_pattern()) == true ) {\r
1023                                         newdat.put("date", String.valueOf(i));\r
1024                                 }\r
1025                                 i++;\r
1026                         }\r
1027                 }\r
1028 \r
1029 \r
1030                 newdat.put("start_hour", r.getAhh());\r
1031                 newdat.put("start_minute", r.getAmm());\r
1032                 newdat.put("end_hour", r.getZhh());\r
1033                 newdat.put("end_minute", r.getZmm());\r
1034 \r
1035                 // 記録先\r
1036                 newdat.put("disc", text2value(device, r.getRec_device()));\r
1037 \r
1038                 // 自動チャプター関連\r
1039                 newdat.put("bAutoChapter"               , text2value(xchapter, r.getRec_xchapter()));\r
1040                 newdat.put("MagicChapter"               , text2value(mschapter, r.getRec_mschapter()));\r
1041                 newdat.put("CM_Chapter"                 , text2value(mvchapter, r.getRec_mvchapter()));\r
1042                 \r
1043                 // 追加\r
1044                 newdat.put("start_form"                 , "");\r
1045                 newdat.put("rec_priority"               , "150");\r
1046                 newdat.put("title_link"                 , "0");\r
1047                 newdat.put("auto_delete"                , "0");\r
1048                 newdat.put("video_es"                   , "00");\r
1049                 newdat.put("audio_es"                   , "10");\r
1050                 newdat.put("edge_left"                  , "0");         // 録画のりしろ\r
1051                 //newdat.put("bAutoChapter"             , "0");\r
1052                 //newdat.put("MagicChapter"             , "0");\r
1053                 //newdat.put("CM_Chapter"                       , "0");\r
1054                 newdat.put("add_ch_text"                , "");\r
1055                 newdat.put("add_ch_value"               , "");\r
1056                 //newdat.put("sport_ext_submit" , "undefined");\r
1057                 //newdat.put("title_link_submit"        , "undefined");\r
1058                 newdat.put("end_form"                   , "0");\r
1059                 \r
1060                 return(newdat);\r
1061         }\r
1062 \r
1063         private String _recstr2genre(String genre)\r
1064         {\r
1065                 if (genre.equals(TVProgram.ProgGenre.MOVIE.toString())) {\r
1066                         return "0";\r
1067                 }\r
1068                 else if (genre.equals(TVProgram.ProgGenre.MUSIC.toString())) {\r
1069                         return "1";\r
1070                 }\r
1071                 else if (genre.equals(TVProgram.ProgGenre.DORAMA.toString())) {\r
1072                         return "2";\r
1073                 }\r
1074                 else if (genre.equals(TVProgram.ProgGenre.ANIME.toString())) {\r
1075                         return "3";\r
1076                 }\r
1077                 else if (genre.equals(TVProgram.ProgGenre.SPORTS.toString())) {\r
1078                         return "4";\r
1079                 }\r
1080                 else if (genre.equals(TVProgram.ProgGenre.DOCUMENTARY.toString())) {\r
1081                         return "5";\r
1082                 }\r
1083                 else if (genre.equals(TVProgram.ProgGenre.THEATER.toString())) {\r
1084                         return "6";\r
1085                 }\r
1086                 else if (genre.equals(TVProgram.ProgGenre.HOBBY.toString())) {\r
1087                         return "7";\r
1088                 }\r
1089                 else if (genre.equals(TVProgram.ProgGenre.VARIETY.toString())) {\r
1090                         return "8";\r
1091                 }\r
1092                 else {\r
1093                         return "10";\r
1094                 }\r
1095         }\r
1096 \r
1097         private void setSettingEtc(ArrayList<TextValueSet> tvs, String key, int typ, String res) {\r
1098                 tvs.clear();\r
1099                 String valExpr = "(\\d+),?";\r
1100                 if (typ == 1) {\r
1101                         valExpr = "\"(.+?)\",?";\r
1102                 }\r
1103                 Matcher mc = Pattern.compile("var "+key+"_text\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
1104                 Matcher md = Pattern.compile("var "+key+"_value\\s*= new Array\\(([\\s\\S]+?)\\);").matcher(res);\r
1105                 if (mc.find() && md.find()) {\r
1106                         Matcher me = Pattern.compile("\"(.+?)\",?").matcher(mc.group(1));\r
1107                         Matcher mf = Pattern.compile(valExpr).matcher(md.group(1));\r
1108                         while (me.find() && mf.find()) {\r
1109                                 TextValueSet t = new TextValueSet();\r
1110                                 t.setText(me.group(1));\r
1111                                 t.setValue(mf.group(1));\r
1112                                 tvs.add(t);\r
1113                         }\r
1114                 }\r
1115         }\r
1116 }\r