サンプルプログラム2



// PC Watch dog watch
//
// 効果: PC Watchを監視し、更新されていた場合、ユーザーに知らせます。
// (更新から最大1時間15分以内)
//
// Usage: ダウンロードし、iアプリに登録。
// ネットワークには確認なしで接続するように設定してください。
// 一時機能を止めておきたい場合はiアプリメニューから
// 「タイマー動作を許可しない」設定にしてください。
// (あるいはiアプリメニューから削除してしまうか)

import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;
import java.util.Random;
import java.io.*;
import javax.microedition.io.*;
import com.nttdocomo.io.*;

//-- PcDogのメインクラス
public class PcDog extends IApplication
{
private PcDogCanvas canvas;

public void start(){
canvas=new PcDogCanvas(this);
Display.setCurrent(canvas);
}
}

//-- PcDogCanvasクラス
class PcDogCanvas extends Canvas implements TimerListener{
//-- このクラスで使う変数の定義

private IApplication application;
String szMes1,szMes2;
String url;

int loop;

private AudioPresenter[] audio;//オーディオプレゼンタ(効果音用)
private MediaSound sound;

InputStream in;
OutputStream out;
int currentvalue,storedvalue;//現在と過去のWebPageのバイト数

int resultcode = 0;//Webサーバーからのレスポンスコードが入る
boolean isPageModified = false;//Web Pageが更新されたかが入るフラグ

private Timer timer;//自動終了用のタイマ

//-- コンストラクタ
public PcDogCanvas(IApplication application)
{
this.application=application;

szMes1 = "PC Watch";
szMes2 = "更新されていません";

url = application.getSourceURL() + "pcdog.txt";

//-- オーディオ周りの初期設定
try {
audio = new AudioPresenter[1000];
sound = MediaManager.getSound("resource:///PcDog.mld");
sound.use();
audio[1] = AudioPresenter.getAudioPresenter();
audio[1].setSound(sound);
}
catch(ConnectionException e){ }

//サーバーとスクラッチパッドから値を取る
currentvalue = getDogBytes(url);
storedvalue = readPadValue();

//過去の値と現在の値が違ったいたらフラグを立てる
if(storedvalue != -1){
if(currentvalue != storedvalue){
isPageModified = true;
}
}

//もしサーバーからの回答があったなら
//スクラッチパッドに値を入れる
if(currentvalue != -1){
writeCurrentvalue(currentvalue);
}

//ソフトキーのラベルを設定
setSoftLabel(Frame.SOFT_KEY_2, "終了");

szMes1 = "PC Watch";
if(isPageModified == true){
//更新されていたらメッセージを設定
szMes2="が更新されました。";
//効果音を鳴らす
audio[1].play();

//タイマの設定
timer=new Timer();
timer.setTime(60000);
timer.setListener(this);
timer.start();

}else{
//更新されていなければ終了
szMes2="は更新されていません";
application.terminate();
}
}

//実行より60秒経過 … プログラムを終了
public void timerExpired(Timer source)
{
application.terminate();
}

// [イベント] ソフトキーが押された
public void processEvent(int type,int param){
if ((type==Display.KEY_PRESSED_EVENT) &&
(param==Display.KEY_SOFT2)){
application.terminate();
}
}

// paint メソッド
public void paint(Graphics g)
{
Font font;
int maxX=getWidth();
int maxY=getHeight();

font=Font.getDefaultFont();
g.setColor(g.getColorOfName(Graphics.WHITE));
g.fillRect(0,maxY/2-font.getHeight(),
maxX,font.getHeight()*3);
g.setColor(g.getColorOfName(Graphics.BLACK));
g.drawString(szMes1,
getWidth ()/2-font.stringWidth(szMes1)/2,
getHeight()/2-font.getHeight()/2+font.getAscent());
g.drawString(szMes2,
getWidth ()/2-font.stringWidth(szMes2)/2,
getHeight()/2+font.getHeight()/2+font.getAscent());
}

//--スクラッチパッドの値を見る
private int readPadValue() {
try{
DataInputStream in
= Connector.openDataInputStream("scratchpad:///0");
// データを読み取る。
int result;
result = in.read() <<16;
result |= (in.read() <<8);
result |= in.read() ;
// 入力ストリームをクローズする。
in.close();
return result;
} catch(IOException e) {
// ScratchPad 入出力の例外処理
return 0;
}
}

//--スクラッチパッドに新しい値を書く
private void writeCurrentvalue(int n) {
try{
OutputStream out
= Connector.openOutputStream("scratchpad:///0");
out.write((n>>16) & 0xff);
out.write((n>>8) & 0xff);
out.write(n & 0xff);
out.close();
}catch(IOException e) {
// ScratchPad 入出力の例外処理
}
}

//-- インターネットコネクションでデータを引き出す
private int getDogBytes(String url) {
try {
// 接続を設定する
HttpConnection conn
= (HttpConnection)Connector.open(
url,
Connector.READ,
true);

// 要求メソッドとコンテンツタイプを設定する。
conn.setRequestMethod(HttpConnection.GET);
conn.setRequestProperty("Content-Type","text/plain");

conn.connect();
resultcode = conn.getResponseCode();

int result=0;
// 入力ストリームを取り出す。
InputStream in = conn.openInputStream();
if (in == null) throw
new IOException();

// データを読み取る。
int i;
result = 0;
result += (in.read() - 48);
result *= 10;
result += (in.read() - 48);
result *= 10;
result += (in.read() - 48);
result *= 10;
result += (in.read() - 48);
result *= 10;
result += (in.read() - 48);

// 入力ストリームをクローズする。
in.close();
// http 接続をクローズする。
conn.close();
return result;
} catch (Exception x) {
return -1;
}
}
}

(2001年2月23日)

[Text by 大和哲]


【PC Watchホームページ】


ウォッチ編集部内PC Watch担当 pc-watch-info@impress.co.jp

Copyright (c) 2001 impress corporation All rights reserved.