2006年02月03日

Symbian OS/C++プログラマのためのNokia Series 60アプリケーション開発ガイド

第1章 手始めに
Series 60 C++ SDK(Software Development Kits)
開発プロセスの概要
Series 60エミュレータ
エミュレータ用にビルドする
Microsoft Visual C++ IDEを使ってビルドする方法
Borland C++IDE Builder 6を使ってビルドする方法
Borland C++BuilderXを使ってビルドする方法
CodeWarrior IDEを使ってビルドする方法
エミュレータの実行
Series 60プラットフォームの実機用にビルドする
実機上に配置する
まとめ

第2章 開発リファレンス
SDKのバージョンと、その選択
Series 60 Version 1.xのSDK
Series 60 Version 2.xのSDK
HelloWorld GUIアプリケーション
HelloWorldのbid.inf
HelloWorld.mmp
ビルドと実行
HelloWorld GUIの実行部とランタイムファイル
HelloWorldのプロジェクトファイルとフォルダ
HelloWorld GUIのソースファイル
リソースコンパイラ
アプリケーションとリソースのローカライズ
AIFファイル
コンソールアプリケーション
Hello Worldコンソールアプリケーション
コンソールアプリケーションのビルドと実行
HelloWorldCon.mmp
HelloWorldConのエミュレータ実行ファイル
HelloWorldConのターゲット実行ファイル
Symbianインストレーションシステム
SISファイル用ビルドツール
.pkgファイルのフォーマット
SISファイルをビルドする
その他の開発ツール
マルチビッドマップとBmconv(ビットマップコンバータ)
Series 60用アプリケーションウィザード
その他のSDKツール
さらに、その他のツールとユーティリティ
Series 60のSDKとIDEをインストールする際のヒント
Microsoft Visual Studio .NET
エミュレータの設定
エミュレータにおけるアプリケーションのパニック
アプリケーションの配置とビルドに関する上級ガイドライン
プラットフォームUID
デバイス識別UID
リソースファイルのバージョンと圧縮方法
ARMターゲットのためののビルド
まとめ

第3章 Symbian OSの基礎
命名規約
Tクラス
Sクラス
Cクラス
Rクラス
Mクラス
名前空間
基本型
例外処理とリソース管理
例外、リーブ、パニック、トラップ
リーブの作法とクリーンアップスタック
2フェーズコンストラクション
Symbian OSにおけるコンストラクションの方法
クリーンアップスタックの応用
ディスクリプタ
階層構造
書き換え不可能API(Nonmodifiable API)
書き換え可能API(Modifiable API)
リテラル
ディスクリプタを使う
引数や戻り値の型としてのディスクリプタ
パッケージディスクリプタ
コレクションクラス
RArray型とRPointerArray型
CArray型
アクティブオブジェクトで非同期サービスを使う
アクティブスケジューラ
アクティブオブジェクト
アクティブオブジェクトを実装する
実装例
アクティブオブジェクトの落とし穴
ファイル、ストリーム、ストア
ファイル
RFs API
RFile API
ストリーム
ストア
クライアント/サーバアーキテクチャ
サーバセッション
サーバセッションとプロセス間通信
サーバ概説
サブセッション
まとめ

第4章 アプリケーション設計
アプリケーションフレームワーク
アプリケーションアーキテクチャ
中心的なアプリケーションクラス
アプリケーションの初期化
重要なAppUiメソッド
アプリケーションUIを設計する
コントロールを主体とするSymbian OSの伝統的なアーキテクチャ
ダイアログを主体とするアーキテクチャ
Avkonのビュー切替アーキテクチャ
適切なアプリケーションアーキテクチャを選ぶ
ファイル処理
UIとエンジンを分離する
ECom
EComの概要
EComインターフェース
ECom DDL
国際化
開発者のための一般的なガイドライン
OSによるローカライズのサポート
正しいアプリケーションのふるまい
疑い深く批判的なアプローチを開発に採用すること
Windowsサーバが生成するイベントを処理すること
いつでも優雅に終了すること
データを保存する前にディスク空間をチェックすること
その他のヒントとチップ
まとめ

第5章 アプリケーションUIコンポネント
コントロール
コントロールとウィンドウ
単純コントロールと複合コントロール
ウィンドウ所有権
単純コントロールの作成
複合コントロールの作成
コントロール間の関係を確立する
スキン
必ずスキンを提供するコントロール
オプションでスキンを提供するコントロール
スキンに注目するコントロール
スキンを意識しないコントロール
スキンを意識するコントロールを定義する
イベント処理
キーイベント
再描画イベント
オブザーバ
リソースファイル
リソースファイルの構文
リソースファイルの構造
メニュー
サブメニュー
メニューの基本
動的メニュー
コンテクストメニュー
ペイン
ステータスペイン
タイトルペイン
コンテクストペイン
ナビゲーションペイン
メインペイン
ソフトキーペイン
まとめ

第6章 ダイアログ
ダイアログの一般的な特徴
標準ダイアログ
単純なダイアログの作成
マルチページダイアログ
ダイアログのためのメニューを定義する
ダイアログ内のカスタムコントロール
フォーム
フォームの行
フォームのソフトキー
アプリケーションの中でフォームを作成する
ノート
ラップノート
カスタムノート
ウェイトノート
プログレスノート
グローバルノート
クエリー
データクエリー
リストクエリー
グローバルクエリーを使う
リストダイアログ
マーク付け可能リストダイアログ
まとめ

第7章 リスト
リストの基本
垂直リスト
選択リスト
メニューリスト
マーク付け可能リスト
複数選択リスト
リストのアイテムとフィールド
リストからアイテムを探す
垂直リストを使う
基本的なリスト
動的リスト
マーク付け可能リスト
ポップアップメニューリスト
グリッド
月別カレンダーグリッド
ピンボードグリッド
GMSグリッド
グリッドを使う
グリッドの基本
マーク付け可能グリッド
設定リスト
設定リストを使う
設定リストの基本
まとめ

第8章 エディタ
テキストエディタ
寸法と入力容量
キーパッド入力のフィルタリング
追加文字へのマップを提供する
プロパティ
プレインテキストエディタの構成
リッチテキストエディタの構成
スタイルを使う
数値エディタ
数値エディタの構成
シークレットエディタ
シークレットエディタを使う
マルチフィールド数値エディタ(MFNE)
IPアドレスエディタ
番号エディタ
範囲エディタ
時刻エディタ
日付エディタ
日付時刻エディタ
時間エディタ
時差エディタ
MFNEを使う
まとめ

第9章 通信の基礎
シリアル通信
シリアル通信を使う
ソケット
Series 60のソケット
クライアントとサーバ
コネクションレスソケットとコネクティッドソケット
コネクティッドソケット
セキュアソケット
TCP/IP
IPv6
Series 60のためのTCP/IPプログラミング
CommDB
マルチホーミング
赤外線通信
IrDAスタック
Series 60機器上での赤外線通信プログラミング
Bluetooth
Bluetoothの概略
サンプルBluetoothアプリケーション
サービスの宣伝
Bluetoothのセキュリティ
デバイスとサービスの発見
Bluetoothソケット通信
まとめ

第10章 より高度な通信技術
HTTP
サンプルアプリケーション
WAP
WAPアーキテクチャ
Series 60における実装
メッセージング
メッセージングの主要概念
主なメッセージングクラスとデータ型
メッセージングAPI
クライアントMTM APIを使う
Send-As APIを使う
CSendAppUiクラスを使う
着信メッセージの監視
テレフォニー
Etel APIを使う
前処理
発呼
着呼
リダイアル処理
まとめ

第11章 マルチメディア:グラフィックスとオーディオ
Series 60クラシックスアーキテクチャの概要
ウィンドウサーバ
フォントとビットマップのサーバ(FBS)
ウィンドウサーバとFBS
マルチメディアサーバ
基本描画
スクリーンの座標と幾何
グラフィックスデバイスとグラフィックスコンテクト
色と表示モード
ペンとブラシ
ウィンドウとCCoeControlの関係
フォントとテキスト
テキストとフォントの寸法
フォントの主なクラスと関数
主なフォントクラスを使い、利用可能なフォントをすべて列挙する
テキストの効果
図形
矩形
楕円形
円弧と扇型
多角形
ビットマップ
アプリケーションで使うためにビットマップを生成する
ビットマップをロードして描画する
ビットマップのマスク
ビットマップ関数
アニメーション
アニメーションアーキテクチャ
オフスクリーンビットマップとダブルバッファリング
「クライアント側」アプローチによるアニメーション
ダイレクトスクリーンアクセス(DSA)
アーキテクチャの概要
ダイレクトスクリーンアクセスのための主要なクラス
実装時に考慮すべきこと
画像の操作
画像の変換
画像の回転
画像のスケーリング
オーディオ
録音
トーン
オーディオデータ
ストリーミング
まとめ

第12章 アプリケーションのビューとエンジンや主なシステムのAPIの使い方
標準アプリケーションビューを使う
電話帳ビューの切替
カレンダービューの切替
カメラビューの切替
フォトアルバムビューの切替
プロファイルビューの切替
メッセージングビューの切替
切替できないアプリケーション
アプリケーションエンジン
ログエンジン
カメラAPI
電話帳エンジン
コンパクトビジネスカードとvCard
カレンダーエンジンのアクセス
フォトアルバムエンジン
システム機能をアクセスする
ハードウェア抽象レイヤ
システムエージェント
バイブレーションAPIのサポート
まとめ

第13章 テストとデバッグ
品質保証
コーディング規格
防衛的プログラミング
テスト
テストの戦略
テストのためのツールとテクニック
実機上とエミュレータ上のテストの違い
テストハーネス
デバッグ
エミュレータでアプリケーションをデバッグする
実機でアプリケーションをデバッグする
まとめ

付録 エミュレータのショートカット

用語集
リファレンス

Symbian OS/C++プログラマのためのNokia Series 60アプリケーション開発ガイド

Symbian OSは、音声通話以外にさまざまなデータ処理機能を持つハイエンド携帯電話(=スマートフォン)用の標準OSとして幅広く採用されていますが、そこで使用されるアプリケーションは、一般のPCソフトのようにインストールして利用できるOS固有のアプリケーション(ネイティブアプリケーション)の時代を迎えて、大きく変化しようとしています。
本書のテーマであるSymbian OS+ミドルウェア「Nokia Series 60」の環境は、その代表的な開発プラットフォームです。ヨーロッパをはじめとして海外ではすでにこの環境を実装したスマートフォンが市場を牽引していますが、日本でもノキア・ジャパンより端末の発売が発表されるなど、業界や開発者の注目を集めています。
基礎から設計、各種APIの活用、マルチメディアデータ処理、テスト・デバッグまでSymbian OS + Nokia Series 60環境での開発ノウハウのすべてを網羅した本書は、携帯電話用アプリ開発に関わるすべてのエンジニア必読の1冊です。

Symbian OS

Symbian OSではフレームワークと呼ばれるソフトウェアが走っていて、我々が作るアプリケーションはこのフレームワークにDLLとしてロードされます。つまり、アプリケーション開発ではそのDLLを開発していくことになります。

アプリケーションDLLではNewApplication()とE32Dll()がEXPORT_Cされている必要があります。E32DllはKErrNoneをリターンするだけのようです。NewApplication()ではCApaApplicationクラスのインスタンスを生成して返します。それがアプリケーションの実体です。
posted by シンビアン at 16:47| Comment(0) | TrackBack(0) | NOKIA SMARTPHONE HACKS | このブログの読者になる | 更新情報をチェックする

4種類の新しいキャスト

キャストは使わずに済ませられるならそれに越したとはないのですが、どうしても使わざるを得ないシチュエーションは少なからず存在します。

ならばせめて少しでも安全にキャストするために新たに定められたキャスト構文が、以下に挙げる static_cast / reinterpret_cast / const_cast / dynamic_cast です。

* static_cast

static_cast(expr)

static_castはexprの型からtypeへの暗黙の型変換、あるいはtypeからexprへの暗黙の型変換が存在する場合にだけキャストします。キャスト不可能であればコンパイルエラーとなります。

// int から long へ
int ival;
long lval = static_cast(ival);

reinterpret_cast

reinterpret_cast(expr)

reinterpret_castはtype(expr)が許されるなら、exprをtypeに単にキャストします。

// long から int* へ
long lval;
int* iptr = reinterpret_cast(lval);

reinterpret_castは単なる型変更であり、たとえ派生関係があったとしてもポインタのアドレス自体はキャスト前と変わりません。
その意味でreinterpret_castは非常に危険なキャストといえるでしょう。

const_cast

const_cast(expr)

const_castはconstおよびvolatile修飾子を無効にするだけのキャストを行ないます。そのほかのときはコンパイルエラーとします。

// const int* から int* へ
const int* ciptr;
int* iptr = const_cast(ciptr);

dynamic_cast

dynamic_cast(expr)

dynamic_castは基底クラスへのポインタ(or 参照)から派生クラスへのポインタ(or 参照)への型保証キャストを行ないます。
上記3種のキャストはコンパイル時にキャストしますが、dynamic_castは実行時に型の検査が行なわれ、変換不可能であれば0を返します。



class Base { ... };
class Derived : public Base { ... };

Base base;
Derived derived;

Derived* pd1 = dynamic_cast(&base); // 失敗 pd1 == 0
Derived* pd2 = dynamic_cast(&derived);


参照のキャストに失敗すると、std::bad_cast例外がthrowされます。

try {
Derived& rd1 = dynamic_cast(base);
} catch ( const std::bad_cast& e ) {
std::cout << e.what() << std::endl;
};

dynamic_castにより、従来のキャストでは不可能であった クロス・キャスト、そして抽象基底クラスからのダウン・キャストが可能になりました。

*
o クロス・キャスト

/*
* Shape と Drawable は派生関係にない
*/
class Shape {
...
};

class Drawable {
public:
virtual void draw() =0;
};

/*
* Circle は Drawable にキャスト可能
*/
class Circle : public Shape, public Drawable {
public:
virtual void draw();
};

Shape* shape = new Circle;
/* 従来のキャスト (Drawable*)shape では、
* 場合によっては暴走する */
Drawable* drawable = dynamic_cast(shape);
if ( drawable )
drawable->draw();


o 抽象基底クラスからのダウン・キャスト

class Machine {
...
};

class TV : virtual public Machine {
public:
void tune(int channel);
};

class VTR : virtual public Machine {
public:
void record();
};

class TeleVideo : public TV, public VTR {
...
};

Machine* machine = new TeleVideo;
/* 従来のキャスト (TeleVideo*)machine はコンパイルエラー */
TeleVideo* televideo = dynamic_cast(machine);
if ( televideo ) {
televideo->tune(8);
televideo->record();
}



※注意
dynamic_castが適用できるのはポリモルフィック・クラス、 すなわち少なくとも一つのメンバ関数が仮想関数でなくてはなりません。

struct non_polymorpic { ... }; // 仮想関数が存在しない
struct something : non_polumorphic { ... };
non_polymorphic* p;
something* q = dynamic_cast(p); // error!

新しいキャストは従来のキャストよりはるかに安全です。

また、grepなどで"_cast"をキーにすればキャストした個所を簡単に検索できるという副次的な効果もあります。
posted by シンビアン at 16:44| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

従来のキャストの問題点

異なる型への変換において、C/C++ではキャストが用いられます。

// intからlongへのキャスト
int ival;
int lval = (long)ival;

ご存知のとおり、キャストは非常に危険です。 本来ならば型の不一致によるコンパイルエラーをねじ伏せるのですから。

キャストの使われ方(意味)は、大きく3種(型変換/型変更/const外し)に分類されます。

1. 型変換

// int から double へ
int ival;
double dval = (double)ival;

2. 型変更

// long から int* へ
long lval;
int* iptr = (int*)lval;

3. const外し

// const int* から int* へ
const int* ciptr;
int* iptr = (int*)ciptr;

上記のどの目的でキャストしても、構文としてはどれも同じ

(型)式

です。つまりコードからは"何が目的でキャストしたのかはっきりしない"のですね。
posted by シンビアン at 16:38| Comment(0) | TrackBack(0) | Symbian OS C++ 実践開発技法 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。