第4回:実機に載せよう(ダウンサイズ)
001: //package com.s_cradle.improve.client;
002:
003: //import com.s_cradle.improve.Constants;
004: import java.util.Timer;
005: import java.util.TimerTask;
006: import java.io.*;
007: import java.util.*;
008: import javax.microedition.io.*;
009: import javax.microedition.lcdui.TextBox;
010: import javax.microedition.lcdui.TextField;
011: import javax.microedition.lcdui.Graphics;
012: import javax.microedition.lcdui.Canvas;
013: import javax.microedition.lcdui.Font;
014: import javax.microedition.lcdui.Command;
015:
016: /**
017: * Copyright (C) 2003 Sophia Cradle, Inc.
018: *
019: * Timer を持ち、TimerTask を継承するクラスです。
020: *
021: * @author Masaru Yoshimura
022: */
023: public abstract class Z/*Task*/ extends TimerTask {
024: //downsize 定数展開
025: /*
026: // タスクの状況
027: public static final int STATUS_NOT_YET = 0;
028: public static final int STATUS_PROCESSING = 1;
029: public static final int STATUS_SUCCEEDED = 2;
030: public static final int STATUS_FAILED = 3;
031:
032: // タスクID
033: public static final int TASK_CREATE = 0;
034: public static final int TASK_DELETE = 1;
035: public static final int TASK_ADD = 2;
036: public static final int TASK_REMOVE = 3;
037: public static final int TASK_SET = 4;
038: public static final int TASK_SEND = 5;
039: public static final int TASK_POLLING = 6;
040: public static final int TASK_TEST = 7;
041: public static final int TASK_CHECK = 8;
042:
043: // ポーリング間隔
044: public static final int POLLING_PERIOD = 5000;
045: */
046:
047: //downsize メソッドインライン化
048: protected static String[] D/*strs*/ = new String[2];
049: //downsize 配列化
050: //protected static String account;
051: //protected static String password;
052:
053: private static Timer OK/*timer*/ = new Timer();
054: private String[] SJIS/*operation*/ = new String[]{
055: "/create"/*Constants.OPERATION_CREATE*/,"/delete"/*
Constants.OPERATION_DELETE*/,
056: "/add"/*Constants.OPERATION_ADD*/,"/remove"/*Constants.OPERATION_REMOVE*/,
057: "/set"/*Constants.OPERATION_SET*/, "/send"/*Constants.OPERATION_SEND*/,
058: "/polling"/*Constants.OPERATION_POLLING*/, "/test"/*
Constants.OPERATION_TEST*/,
059: "/check"/*Constants.OPERATION_CHECK*/
060: };
061:
062: protected String[] B/*parameterValues*/;
063: protected String[] A/*parameterNames*/;
064:
065: //downsize 未使用field削除
066: //protected volatile int status;
067: //private volatile Object returnValue = null;
068:
069: protected int E/*task*/;
070:
071: protected Z/*Task*/(){ //初期化は子でしましょう。
072: }
073:
074: //protected Task(int task, String[] names, String[] values) {
075: protected void StackMap/*initializeTask*/(
int task, String[] names, String[] values) {
076: this.E/*task*/ = task;
077: this.A/*parameterNames*/ = names;
078: this.B/*parameterValues*/ = values;
079: //status = 0/*STATUS_NOT_YET*/;
080:
081: if (names.length != values.length) {
082: throw new IllegalArgumentException(
"number of argument names and values not match!");
083: }
084: }
085:
086: //downsize メソッドインライン化
087: /*
088: public static void setAccount(String account_){
089: account = account_;
090: }
091:
092: public static String getAccount(){
093: return account;
094: }
095:
096: public static void setPassword(String password_){
097: password = password_;
098: }
099:
100: public static String getPassword(){
101: return password;
102: }
103: */
104:
105: public static Z/*Task*/ Code/*getFirstTask*/(){
106: I/*ImproveMIDlet*//*ResourceManager*/.I/*
getAccountAndPasswordFromRecordStore*/();
107:
108: if(D/*strs*/[0]/*account*/ != null && D/*
strs*/[0]/*account*/.length() != 0 &&
109: D/*strs*/[1]/*password*/ != null && D/*
strs*/[1]/*password*/.length() != 0){
110: I/*ImproveMIDlet*/.Code/*setCurrent*/(
I/*ImproveMIDlet*/.StackMap/*listCanvas*/);
111: Z/*getTask*/(4/*Task.TASK_SET*/,new String[]{
112: String.valueOf(4/*Constants.ITEM_INDEX_STATUS*/),
113: String.valueOf(3/*Constants.STATUS_BLUE*/)})
114: .StackMap/*schedule*/(0);
115: return Z/*getTask*/(6/*TASK_POLLING*/,null);
116: }
117: else{
118: TextBox textBox = new TextBox(
"ログイン画面","",10/*Constants.ACCOUNT_MAX*/,TextField.EMAILADDR);
119: textBox.addCommand(I/*ImproveMIDlet*/.A/*okCommand*/);
120: textBox.setCommandListener(I/*ImproveMIDlet*/.I/*midlet*/);
121:
122: I/*ImproveMIDlet*/.Code/*setCurrent*/(textBox);
123: return null;
124: }
125: }
126:
127: public static Z/*Task*/ Z/*getTask*/(int task, String[] str){
128: switch(task){
129: case 0/*TASK_CREATE*/:
130: D/*CreateTask*/ createTask = new D/*CreateTask*/();
131: createTask.D/*initializeCreateTask*/(str);
132: return createTask;
133: case 1/*TASK_DELETE*/:
134: E/*DeleteTask*/ delete = new E/*DeleteTask*/();
135: delete.E/*initializeDeleteTask*/(str);
136: return delete;
137: case 2/*TASK_ADD*/:
138: return new F/*FollowedByPollingTask*/(
0/*FollowedByPollingTask.FBPT_ADD*/,str);
139: case 3/*TASK_REMOVE*/:
140: return new F/*FollowedByPollingTask*/(
1/*FollowedByPollingTask.FBPT_REMOVE*/,str);
141: case 4/*TASK_SET*/:
142: return new F/*FollowedByPollingTask*/(
2/*FollowedByPollingTask.FBPT_SET*/,str);
143: case 5/*TASK_SEND*/:
144: return new F/*FollowedByPollingTask*/(
3/*FollowedByPollingTask.FBPT_SEND*/,str);
145: case 6/*TASK_POLLING*/:
146: return new N/*PollingTask*/(str);
147: }
148:
149: return null;
150: }
151:
152: public void run(){
153: try{
154: System.out.println(">>run:"+E/*task*/);
155: HttpConnection http = null;
156: DataInputStream input = null;
157: int result;
158: //status = 1/*STATUS_PROCESSING*/;
159:
160: char sep = '?';
161: StringBuffer buf = new StringBuffer();
162: String temp = I/*ImproveMIDlet*/.I/*
midlet*/.getAppProperty("MIDlet-X-AllowURL-1"/*ImproveMIDlet.ALLOW_URL*/);
163: buf.append(temp.substring(0, temp.length()-1));
164: buf.append(SJIS/*operation*/[E/*task*/]);
165: for (int i=0; i<B/*parameterValues*/.length; i++) {
166: buf.append(sep).append(A/*parameterNames*/[i]).append('=').append(
D/*encode*/(B/*parameterValues*/[i]));
167: if (i==0) {
168: sep = '&';
169: }
170: }
171:
172: try {
173: http = (HttpConnection)Connector.open(buf.toString());
174: input = http.openDataInputStream();
175: result = input.readInt();
176: if (result > 0){
177: Code/*processAfterReturnValue*/(result, input);
178: }
179: } catch (IOException ioe) {
180: ioe.printStackTrace();
181: result = -1;
182: }
183:
184: try {
185: if (input != null) {
186: input.close();
187: }
188: if (http != null) {
189: http.close();
190: }
191:
192: } catch (IOException ioe) {
193: ioe.printStackTrace();
194: }
195:
196: //status = (result >=0) ? 2/*STATUS_SUCCEEDED*/ : 3/*STATUS_FAILED*/;
197: if(result < 0){
198: Z/*processFailed*/();
199: }
200:
201: System.out.println("<<run");
202: } catch(Throwable a){
203: I/*processThrowable*/();
204: a.printStackTrace();
205: }
206: return;
207: }
208:
209: /**
210: * URLエンコードします。エンコード時にShift-JISを用います。
211: *
212: * @param in エンコードして欲しい文字列
213: * @return エンコードされた文字列
214: */
215: public static String D/*encode*/(String in) {
216: StringBuffer inBuf = new StringBuffer(in);;
217: StringBuffer outBuf = new StringBuffer();
218: for (int i=0;i<inBuf.length(); i++) {
219: char temp = inBuf.charAt(i);
220: if (('a'<=temp && temp <='z')
221: || ('A'<=temp && temp <='Z')
222: || ('0'<=temp && temp <='9')
223: || temp == '.' || temp == '-' || temp == '*' || temp == '_') {
224: outBuf.append(temp);
225: } else if (temp == ' ') {
226: outBuf.append('+');
227: } else {
228: byte[] bytes;
229: try {
230: bytes = new String(new char[]{temp}).getBytes("SJIS");
231: for(int j=0;j<bytes.length;j++) {
232: int high = (bytes[j]>>>4)&0x0F;
233: int low = (bytes[j]&0x0F);
234: outBuf.append('%');
235: outBuf.append(Integer.toString(high, 16).toUpperCase());
236: outBuf.append(Integer.toString(low , 16).toUpperCase());
237: }
238: } catch (Exception e) {
239: }
240: }
241: }
242: return outBuf.toString();
243: }
244:
245: protected void I/*processThrowable*/(){
246: System.out.println("Task.processThrowable");
247: Z/*processFailed*/();
248: }
249:
250: /** 失敗時の処理 */
251: protected void Z/*processFailed*/(){
252: }
253:
254: /** 返値を読んだ後の処理 */
255: protected void Code/*processAfterReturnValue*/(
int result, DataInputStream input) throws IOException{
256: }
257:
258: /** 返り値の取得 */
259: //downsize 未使用メソッド
260: /*
261: public Object getReturnValue() {
262: return returnValue;
263: }*/
264:
265: /** スケジュール */
266: public void StackMap/*schedule*/(long delay) {
267: OK/*timer*/.schedule(this, delay);
268: }
269:
270: /** スケジュール */
271: public void StackMap/*schedule*/(long delay, long period) {
272: OK/*timer*/.schedule(this, delay, period);
273: }
274:
275: /** タイマのキャンセル */
276: //downsize 未使用メソッド
277: /*
278: public static void cancelTimer() {
279: timer.cancel();
280: }
281: */
282:
283: /* タスクの処理状況の取得 */
284: //downsize 未使用メソッド
285: /*
286: public int getProcessorStatus() {
287: return status;
288: }
289: */
290:
291: //downsize クラス融合 以下はMenu
292:
293: //downsize 定数展開
294: /*
295: protected static final int LIST_BG_COLOR = 0x00DDDDFF;
296: private static final int COLOR_FRAME = 0x000000;
297: private static final int COLOR_SHADOW = 0x444444;
298: private static final int LEFT_INTERVAL = 5;
299: private static final int RIGHT_INTERVAL = 5;
300: protected static final int COLUMN_HEIGHT = 17;
301: protected static final int STRING_MARGIN_HEIGHT = 3;
302: */
303:
304: protected static final Command StackMap/*okCommand*/ = new Command(
"OK",Command.OK,1);
305: protected static final Command Code/*cancelCommand*/ = new Command(
"キャンセル",Command.CANCEL,1);
306:
307: private String setColor/*title*/;
308: //downsize クラス融合 items>strs。
309: private String[] ログイン画面/*items*/;
310: //downsize 配列化
311: protected int[] Z/*idata*/ = new int[3];
312: /*
313: protected int cursor;
314: private int width;
315: private int height;
316: */
317: private boolean キャンセル/*containsTitleWidth*/;
318:
319: /**
320: * コンストラクタ
321: */
322: //public Menu(String title_, String[] items_, boolean containsTitleWidth_) {
323: public void E/*initializeMenu*/(
String title_, String[] items_, boolean containsTitleWidth_) {
324: Z/*idata*/[0]/*cursor*/ = 0;
325: キャンセル/*containsTitleWidth*/ = containsTitleWidth_;
326: if( title_ != null && items_ != null ){
327: OK/*setTitleAndItems*/(title_, items_);
328: }
329: }
330:
331: /**
332: * コンストラクタ
333: */
334: //public Menu(String title_, String[] items_) {
335: public void Z/*initializeMenu*/(String title_, String[] items_) {
336: E/*initializeMenu*/(title_, items_, false);
337: }
338:
339: /**
340: * タイトルと項目の設定
341: */
342: public void OK/*setTitleAndItems*/(String title_, String[] items_){
343: setColor/*title*/ = title_;
344: ログイン画面/*items*/ = items_;
345:
346: Font font = Font.getDefaultFont();
347: Z/*idata*/[1]/*width*/ = (
キャンセル/*containsTitleWidth*/) ? font.stringWidth(setColor/*title*/)+2 : 0;
348: for(int i=0;i<ログイン画面/*items*/.length;i++){
349: int temp = 5/*LEFT_INTERVAL*/+font.stringWidth(
ログイン画面/*items*/[i])+5/*RIGHT_INTERVAL*/;
350: if(Z/*idata*/[1]/*width*/< temp){
351: Z/*idata*/[1]/*width*/ = temp;
352: }
353: }
354: Z/*idata*/[2]/*height*/ = 17/*COLUMN_HEIGHT*/ *(
1+ログイン画面/*items*/.length)+1;
355: }
356:
357: /**
358: * キーハンドラ
359: */
360: public Z/*Task*//*Menu*/ A/*processKeyRelease*/(int gameAction, int keyCode){
361: switch( gameAction ){
362: case Canvas.FIRE:
363: return StackMap/*processFireKeyRelease*/();
364: case Canvas.DOWN:
365: Z/*idata*/[0]/*cursor*/++;
366: if( Z/*idata*/[0]/*cursor*/ >= ログイン画面/*items*/.length ){
367: Z/*idata*/[0]/*cursor*/ --;
368: }
369: break;
370: case Canvas.UP:
371: Z/*idata*/[0]/*cursor*/--;
372: if( Z/*idata*/[0]/*cursor*/ < 0 ){
373: Z/*idata*/[0]/*cursor*/ ++;
374: }
375: break;
376: default:
377: break;
378: }
379:
380: return this;
381: }
382:
383: /**
384: * キーハンドラ
385: */
386: protected Z/*Task*//*Menu*/ StackMap/*processFireKeyRelease*/(){
387: return null;
388: }
389:
390: /**
391: * 描画
392: */
393: public void I/*draw*/(Graphics g, int width_, int height_){
394: g.translate((width_-Z/*idata*/[1]/*width*/)/2, (
height_-Z/*idata*/[2]/*height*/)/2);
395:
396: StackMap/*draw3DRect*/(
g,0,0,Z/*idata*/[1]/*width*/,Z/*idata*/[2]/*
height*/,0x00DDDDFF/*LIST_BG_COLOR*/,0x00EEEEFF,0x00000080);
397: Code/*drawFrameShadow*/(
g,0,0,Z/*idata*/[1]/*width*/,Z/*idata*/[2]/*height*/,0x000000/*
COLOR_FRAME*/, 0x444444/*COLOR_SHADOW*/);
398:
399: g.setClip(1,1,Z/*idata*/[1]/*width*/-2,Z/*idata*/[2]/*height*/-2);
400:
401: g.setColor(0x00646464);
402: g.fillRect(1, 1, Z/*idata*/[1]/*width*/-2, 17/*COLUMN_HEIGHT*/);
403: g.setColor(0x00CCCCCC);
404: g.drawString(setColor/*title*/,2,4, Graphics.LEFT | Graphics.TOP);
405:
406: for(int i=0;i<ログイン画面/*items*/.length;i++){
407: if(Z/*idata*/[0]/*cursor*/ == i){
408: g.setColor(0x0000FF);
409: g.fillRect(1, 17/*COLUMN_HEIGHT*/ *(i+1), Z/*
idata*/[1]/*width*/-2, 17/*COLUMN_HEIGHT*/);
410: g.setColor(0xFFFFFF);
411: } else{
412: g.setColor(0x00000000);
413: }
414: g.drawString(ログイン画面/*items*/[i],5/*LEFT_INTERVAL*/,17/*
COLUMN_HEIGHT*/ *(i+1)+3/*STRING_MARGIN_HEIGHT*/, Graphics.LEFT | Graphics.TOP);
415: }
416: g.translate(-g.getTranslateX(), -g.getTranslateY());
417: g.setClip(0,0,width_,height_);
418: }
419:
420: /**
421: * 明暗付の矩形の描画
422: */
423: protected static void StackMap/*draw3DRect*/(
Graphics graph, int x,int y, int dx,int dy,
424: int base,int light, int shadow){
425: graph.setColor(base);
426: graph.fillRect(x,y,dx,dy);
427: graph.setColor(light);
428: graph.drawLine(x,y,x + dx - 2,y);
429: graph.drawLine(x,y,x,y + dy - 2);
430: graph.setColor(shadow);
431: graph.drawLine(x + dx - 1,y + 1,x + dx - 1,y + dy - 1);
432: graph.drawLine(x + 1,y + dy - 1,x + dx - 1,y + dy - 1);
433: return;
434: }
435:
436: /**
437: * 影の描画
438: */
439: protected static void Code/*drawFrameShadow*/(
Graphics g,int x, int y, int width,
440: int height, int frame, int shadow)
441: {
442: g.setColor(frame);
443: g.drawRect(x-1,y-1,width+1,height+1);
444: g.setColor(shadow);
445: g.drawLine(x,y + height + 1,x + width + 1,y + height + 1);
446: g.drawLine(x + width + 1,y,x + width + 1,y + height + 1);
447: }
448: }