第6回: 実機対応と携帯電話の将来展望
001: package com.s_cradle.improve.client;
002:
003: import java.io.*;
004: import com.s_cradle.improve.Constants;
005: import java.util.*;
006: import javax.microedition.lcdui.Canvas;
007: import javax.microedition.lcdui.Displayable;
008:
009: /**
010: * Copyright (C) 2003 Sophia Cradle, Inc.
011: *
012: * オペレーション polling を使ったタスクを行うクラスです。
013: *
014: * @author Masaru Yoshimura
015: */
016: public class PollingTask extends Task{
017: private static final String TICKERMESSAGE_ATTACKED = "から攻撃されました!";
018: private static final String MESSAGE_ATTACKED = "攻撃されました。";
019:
020: private Vector newList;
021: private Vector messages;
022:
023: private static final String[] ITEMS = new String[]{
024: Constants.PARAMETER_ACCOUNT, Constants.PARAMETER_PASSWORD};
025:
026: /**
027: * コンストラクタ。タスクで使う値(アカウント,パスワード)を引数にとる。
028: */
029: public PollingTask(String[] strs) {
030: super(TASK_POLLING,ITEMS,new String[]{account,password});
031: newList = new Vector();
032: messages = new Vector();
033: }
034:
035: /**
036: * 失敗時の処理
037: */
038: protected void processFailed() {
039: }
040:
041: /**
042: * 返値を読んだ後の処理
043: */
044: protected void processAfterReturnValue(
int result, DataInputStream input) throws java.io.IOException {
045: Vector oldList = ImproveMIDlet.buddyList;
046:
047: short userNumber = (short)(result >> 16);
048: short messageNumber = (short)result;
049:
050: for (short i=0; i<userNumber; i++) {
051: if( i == 0 ){
052: Buddy buddy = new Buddy(input);
053: buddy.setAttribute(Buddy.ATTRIBUTE_HIM);
054: newList.addElement(buddy);
055: } else{
056: newList.addElement(new Buddy(input));
057: }
058: }
059:
060: for (short i=0; i<messageNumber; i++) {
061: messages.addElement(new Message(input));
062: }
063:
064: ImproveMIDlet.callSerially(new Runnable(){
065: public void run(){
066: Vector oldList = ImproveMIDlet.buddyList;
067: Vector buddyList = new Vector();
068: Hashtable hush = new Hashtable();
069:
070: for(Enumeration e=newList.elements();e.hasMoreElements();){
071: Buddy newBuddy = (Buddy)e.nextElement();
072: if( oldList.indexOf(newBuddy) >= 0 ){
073: Buddy oldBuddy = (Buddy)oldList.elementAt(
oldList.indexOf(newBuddy));
074: oldBuddy.update(newBuddy);
075: buddyList.addElement(oldBuddy);
076: hush.put(oldBuddy.getAccount(),oldBuddy);
077: } else{
078: buddyList.addElement(newBuddy);
079: hush.put(newBuddy.getAccount(),newBuddy);
080: }
081: }
082:
083: for(Enumeration e=messages.elements();e.hasMoreElements();){
084: Message m = (Message)e.nextElement();
085: Buddy buddy = (Buddy)hush.get(m.getAccount());
086: if( m.getFrom() == m.FROM_ME){
087: if(buddy != null){
088: if(buddy.getMessageBox() == null){
089: new MessagingCanvas(buddy);
090: }
091: buddy.getMessageBox().addMessage(
m.getContent(),MessageBox.MESSAGE_MINE);
092: }
093: } else if(m.getFrom() == m.FROM_OTHER){
094: if( m.getType() == Constants.MESSAGE_TYPE_NORMAL){
095: if( buddy != null){
096: if(buddy.getMessageBox() == null){
097: new MessagingCanvas(buddy);
098: }
099: buddy.getMessageBox().addMessage(
m.getContent(),MessageBox.MESSAGE_OTHER);
100: }
101: } else if(m.getType() == Constants.MESSAGE_TYPE_ATTACK){
102: ImproveMIDlet.listCanvas.ticker.insert(
Ticker.LEVEL_NORMAL,m.getAccount()+TICKERMESSAGE_ATTACKED);
103: if( buddy != null){
104: if(buddy.getMessageBox() == null){
105: new MessagingCanvas(buddy);
106: }
107: buddy.getMessageBox().addMessage(
MESSAGE_ATTACKED,MessageBox.MESSAGE_OTHER);
108: }
109: }
110: }
111: }
112:
113: ImproveMIDlet.buddyList = buddyList;
114: Displayable d = ImproveMIDlet.getCurrent();
115: if( d instanceof Canvas ){
116: ((Canvas)d).repaint();
117: }
118: newList = new Vector();
119: messages = new Vector();
120: }
121: });
122: }
123:
124: /**
125: * 自分の投げたメッセージを追加する。
126: */
127: public void addOwnMessage(String target,String content){
128: messages.addElement(new Message(target,content));
129: }
130: }