Pilot-Link への誘い

#Counter


▼▼ 資料編: .PDB の構造など ▼▼

  1. Part I 【.PDB の全体的な構造
  2. Part II 【各種の .PDB の構造
  3. Part III 【pdbm.exe が扱うファイル

【.PDB の全体的な構造】

これは, 極秘に入手した秘密情報である。だれにもばらしちゃいけない。約束だよっ, ねっ。 (← 大ウソ)

↑ホンキにしないように(笑)。この情報は, Pilot-Link.0.8.13libsockにある pi-file.cに基づいている。 基礎編では, デスクトップに現れるプログラムを紹介してるけど, そこに現れないプログラムもけっこうあって, んで その中の pilot-file.exeとか使ってみると, こーゆー情報を詳しくみることができたりする。
ぜひみんなも動かしてみよー。あ, オフラインのプログラムなんで Palm/Pilotと通信したりはしないからクレードル持ち出しても無駄だよっ。

で, .PDB の全体は↓こんな風になっている。headerの構造は, pi-file.cにコメントとして詳しく載ってるんでみてみて。

項目名 1つ当たり
サイズ
header 78 Bytes x 1
record entry header 8 Bytes x record数
\0\0 2 Bytes
app_info いろいろ x 1 (無いこともあるらしい)
sort_info いろいろ x 0 か 1 (同上)
record いろいろ x record数
(↑)の, header の中の項目
PDBヘッダー 項目位置長さ
カテゴリー情報(app_info) の位置 52 4 Bytes
ソート情報(sort_info) の位置 56 4 Bytes
レコード件数 76 2 Bytes

それによると, レコード数は headerの最後 2バイトに入っている。そーそー, ドラゴンボールって, 68000系のMPUだったはずなんで, 数値のバイト順みたいなソレは インテルでのソレとは逆なので, 注意してくらはい。

app_infosort_infoは, ものによってあったりなかったりして, それは headerのオフセット 52からの 4バイトが app_infoの位置, sort_infoは オフセット 56からの 4バイトがソレの位置。 ここが 0x00000000 ならば, app_info (あるいは sort_info)は入っていないってこと。
そしてそれらのデータの長さは, その次に来るデータの手前までなのだ。
app_infoっつーのはカテゴリーとか入ってっとこ。

各々のレコードを取りだすには, レコードの先頭位置ってのが record entry headerに入ってる訳なので, その指し示している位置から次のレコードの先頭までが実際のアレってこと。 んで, record entry headerを眺めてみると, 位置情報以外にも いろいろ情報が入ってたりする。

その一つ一つの record entry headerは, 前 4バイトでそのレコードの位置, 次が属性, その後 3バイトでユニークIDってな具合。 で, この属性とゆーのは, さらに 上 4bitが色々なフラグで, 下 4bitにカテゴリーの番号が入っている。 フラグは, そのレコードがプライベートだの何だのってゆーヤツ。

record entry headerの構成: 全体で 8バイト (pi-dlp.h より)
項目名サイズ内容
位置 (offset)4 Bytesそのレコードの位置
属性
(record attributes)
1 Byte
bit 7 bit 6 bit 5 bit 4 bit 3〜0
Deleted Dirty Busy Secret カテゴリーの番号(0 - 15)
UID (unique id)3 Bytes他のレコードと重複しない番号 (ID)

で, app_info つまりカテゴリー。ソレは 1つにつき 16バイト(終端 0x00を除くと, 最大 15バイトまで)。それが最大 16個登録できる。っつっても Unfiledがあるので, 追加できるのは 15個。 ん, とゆーことは全部で 256バイト? ・・・ ではない。実はその先頭に 2バイト, それからうしろにもちょっとした情報が収められたりしているのだ。

app_info の構造
(適当に付けた)項目名サイズ
変更ビット (16ビット) 2 Bytes
カテゴリー名 category 0 (Unfiled) 16 Bytes
category 1 16 Bytes
category15 16 Bytes
カテゴリーID(UID?) x16 16 Bytes
ラスト UID 1 Byte
(不明) 3 Bytes
各種 .PDBによって異なる不定

先頭の 2バイトってのは, カテゴリー1つにつき 1ビットで, 全部で 16ビットある訳。どーも変更ビットみたい。 うしろ側の情報はカテゴリーの ID (UID?)。こちらの情報は各々の .PDBで違うよーなので, また今度にしよー。 (^^;

【各種の .PDB の構造】

てとこで, 各種の .PDBの構造へとっとと説明が移る訳なんだな, これが。
で, それぞれ何が違うかっつーと, 一番の違いは(↑)の表での recordの部分。 そりでは, それぞれの record部分をみぃんなで見よー。

○ ● ◎

MemoPad

さて, まずは MemoPad。 でも安心し給へ。これってば一番簡単な構造なんだから。なにせ 1行目が表題になってるだけっつーんだから。他にこれといった情報もない, も〜 テキストだけ。 まぁ注意するのは改行コードかな。PCでは, よく復帰・改行になってっけど(つまり 0x0d, 0x0a ね), .PDBでのソレは改行(0x0a)だけ。 あっそれから, テキストの最後に nulコード(0x00)が付いていたりするよ。

▽ ▲ △

ToDoList

で, お次が ToDoList。 これには, 優先順位と期日と, そしてノートがある(それと完了チェックも)。では, どーゆー構造なのかさっそく見てみよう。

期日完了, 優先順位案件ノート
2 Bytes1 Byte文字列文字列

なんじゃそらってゆーくらい簡単な表になっちった。recordの先頭の 3バイトがそーゆー情報で, あとは 案件 0x00 ノート 0x00 とゆーふーになっておるのじゃ。 ノートがなかったら 0x00が 2つ続くだけ。それから 案件は最大 255バイトまで。

んで先頭の期日, これは 7bit, 4bit, 5bit でそれぞれ 年, 月, 日になっている。月と日は範囲内だからよいとして, 年は 1904〜2031 になってるんだよ。 でも, 期日の指定がなかったら 0xffff になるのさっ。 それから, 優先順位の先頭 1bitは, 完了チェックが付いているかどうかってヤツ。
あっそーそー, これらは libsockにある todo.cが参考になるかも知れない。

□ ◆ ◇

AddressBook

今度は AddressBook。これは, ちょいと構造が面倒かも。

phone contents offset 各項目の内容
4 Bytes 4 Bytes 1 Byte それぞれ文字列

AddressBook は項目数でゆーと 19個個。そりは ・・・ 姓, 名, 会社名, 5つ分の電話, 住所, 市町村, 都道府県, 郵便番号, 国, 役職, カスタム4つ分, ノートて感じ。 こーゆーのが nulコードターミネーター付きの文字列として連続して入っている訳。でも 19個すべてではなくて, 入力されているものだけってことに注意。 たとえば, 姓, 名と住所が入っているとすると 0x00 0x00 住所 0x00 ってことで, 他の項目はそもそも含まれていない。

では, どの項目が選択されているのか, それを知るには contents を調べる必要がR。 コレ 1項目 1bit。だからこの場合 0x00000103 とゆーことになるんだよっ。下位から数えて 2bit分と, それから 6項目分飛ばして 1bitとゆーことだねっ。 うじゃ残りの (32-19=) 13bit分は? ・・・ んーと たぶん未使用, かな (だから全項目なら 0x0007ffff)。
それから, (↑)にある 19項目の, それぞれの長さは最大 255バイト。んでも最後の項目「ノート」はそーゆー制限はなかったりする(無制限ちゅー訳じゃないだろうけどもさ)。

んで, phoneとゆーのは何か。それは 5つ分の電話が何の電話番号かを表すもの。中には電話と関係ないのもあるけどさ。だから, どっちかっつーと連絡先って感じかな?
この 5つ分の連絡先は, それぞれ 8つの中から選ぶことができるよーになってて, そりは 会社, 自宅, Fax, その他, E-mail, 代表(メイン), ポケベル(ペ-ジャ), 携帯。これらは 0から順に番号が割りふられている模様。 phoneの, 下位 2バイト半(5ニブル?分) には, この情報が入ってたりする。もしもすべて E-Mailなら 0x00044444 って感じな訳。
先頭の 1バイトは余分で, 次の 1バイトの上位 4bit は, 多分 一覧表を見た時に表示される電話項目を表している(よーなものだろー。けっこう適当)。わはは。
(ニブル(nibble) を, 1ニブルとか 2ニブルとかって数えたことないんで, ホントにそーゆー表現してよいか不明)

offsetは会社名の項目のオフセットを表しているらしいんだけど, ちょっち矛盾があるような無いような・・。

さて, WorkPad-J, つまり日本語版では新たに 3つほど項目が増えていたりする。 ソレらはすべてよみ (バビル二世ではない) 項目。 J-OS では, Lastnameを名前読み, Firstnameを名前 に扱ってたんだけど, それが日本語版 Palmデバイスでは, こんなバラバラになっちった。

  • よみ(姓)
  • よみ(名)

さらに会社名(Company)も, よみ(会社), 会社名 とゆー具合に分離。 で, 最終的に項目が 3つ増えて, 全部で 22項目になったのけ? とゆーと, それが違う。

つまり, Lastname だけで姓とその読み, Firstname で名とその読み, Company で会社名とその読み, となったのじゃ。 それぞれ 0x01のコードを境にして 二つずつに分かれた訳なのさっ。 だから日本語版 Palmデバイスでのソレを別の環境に取り込むと, 途中にトーフが出てきたりなんかするのだ。「よみ」は 0x01 の後ろ側で「よみ」が入ってなかったりした場合は 0x01そのものも入っていないっぽい。

それから, 項目名について, 実は app_infoの中に項目名がすべて入ってんだよね, コレが。だから J-OSのばやいでも, 日本語版 Palmデバイスのばやいでも, 同様になっている。ただし「よみ」の項目については入っていないみたい。

△ ▼ △

TealPaint

それでは, TealPaintのフォーマットを紹介しよう。 これは, 次のような順番でデータが並んでいる。

  • ヘッダー
  • 一覧時のイメージ
  • 通常時のイメージ
  • コメント

んで, ヘッダーは, (↓)のような構造をしている。この表では, 横は 4バイト分を表している。 こんなもんかな。なんだか簡単に済ませ過ぎているような気がしなくもない (^^;

ヘッダー長さ(A)
一覧時のイメージの長さ(B)
通常時のイメージのオフセット(A+B)
通常時のイメージの長さ(C)
コメントのオフセット(A+B+C)
0x00, 0x00横幅
高さ

◇ ◆ □

Q Paint

では次に, Q Paintのフォーマットを取り上げよう。 こちらも TealPaint同様, 一覧時のイメージとゆーのがあるんだけど, コメントとゆーのはない(と思う)。 一つの項目当たり 2バイトで, その後ろに 10バイトの不明項目が続いている。んで, イメージとゆーのは, 高さ×長さのサイズになってる。
ところで, 横幅長さの違いって何だっけ。ビット数とバイト数の違いか, それとも 8の倍数で繰り上げた感じのアレだったのか ・・・ 忘れちった。

(不明) 横幅 高さ 長さ (不明) 10 Bytes 一覧時のイメージ
2 Bytes2 Bytes2 Bytes2 Bytes10 Bytesイメージデータ

そして, この後ろに (↓)の形式が続く。見れば分かるかもだけど 形式は全く同じ。

(不明) 横幅 高さ 長さ (不明) 10 Bytes 通常時のイメージ
2 Bytes2 Bytes2 Bytes2 Bytes10 Bytesイメージデータ

◎ ○ ●

Mail

さてさて, Mailであ〜る。 これも, ほかの PDBと同じような感じになっている。すなわち, Inbox, Outbox, Deleted, Filed, Draft が, カテゴリーになってるってことさっ。 で, レコードの構造は とゆーと, メールヘッダの項目がいくつかと, 最後にメールボディ, そんな感じ。

項目名内容
日時とかいろいろ
日付 時, 分 フラグ 0x00
2 Bytes2 Bytes1 Byte1 Byte
7つのメールヘッダー項目7つ分の文字列
メールボディ (本文)文字列
不明1 Byte

最初は日付。この日付の構造は ToDoListのものと同じ。ただし 無効って場合は 0。 次に, 時間は , が 1バイトずつ。そして フラグ, 0x00 と続く, 計6バイト。
フラグはこんな感じ(↓)。 これって, たぶん readと addressing以外は, 新規にメールを作るときに設定できるもの(のはず)。

  • read (読んだかどうか?)
  • signature (サイン)
  • confirmRead (受信確認)
  • confirmDelivery (配送確認)
  • priority (優先順位:2bit 高い/普通/低い)
  • addressing (???:2bit)

この 6バイトの項目の次からは, 0x00を区切りとして幾つかの項目が並んでいて, そしてこの後に, (↑)でもゆったように 本文が続き, これも 0x00 で終わっている。 ・・・ はずなんだけど, 調べてみると 最後の最後に 余分に1バイト何かがくっついてくる感じ。しかも不定。何か意味がアルのか?

  1. Subject:
  2. From:
  3. To:
  4. Cc:
  5. Bcc:
  6. Reply-To:
  7. Sent-To:

うーむ, Sent-To:なんてあったっけ

■ ▽ ○

Decrio EMemo

んで, デクリオの 手書きメモ: EMemoについての構造。 実は, Mutoh の BBSで, コレの公開の確認取ろうとしたんだけっちょ, やっぱし返事がない。うーみゅ ・・・ かといって, なにも公開しないんじゃ その手のツールは出てこないと思うしぃ, まっ, フライングっつーことで構わないかな。(^^;
当然だけれど, ここで公開しているのは Mutoh からのものではない訳なので, そこに問い合わせたりしないよーに。 ついでにゆーと, σ(^^) も, そことは関係ないパンピー。

さて, とりあえず, EMemoを PCにバックアップしたとしよう。すると, 次の二つがソレらしきものだと分かる訳だよね。

  • EMXref-EM10.pdb
  • EMInk-EM10.pdb

もちろん, そのメモ帳 MemoDB.pdb にも特殊なマーカーみたいなのが入ることになーる。 てことで, まずは, コレ MemoDB.pdb の部分, そして その次には EMXref-EM10.pdb をアレしていこう。

MemoDB.pdb ... 通常の MemoPadでのソレと, EMemoでのソレは, どう違うのだろーか。 たいてい, そのままにしておくと 手書きのとこには, EMemo-00-1-25-22-52-5 なーんてのが入ることになる。コレってば, 見たまんまのアレで, その時の日付と時刻な訳だよね。 でもその内部には, も少し別なものも入ってたりする。

MemoDB.pdbの, 手書きが入っている場合のレコードの構造
文字列(最大 24Bytes)改行×2固定文字列 ( Use Ink Viewer)改行
25 Bytes2 Bytes15 Bytes1 Byte

でも, ここにはコレといった情報は含まれていない。トラブルかなんかで MemoDB.pdbがつぶれたとしても, 手書き情報は大丈夫。 (^^)v

んで, 次に EMXref-EM10.pdb。ここにも手書き画像は入ってなくって, 手書き画像とメモ(MemoDB.pdb)との橋渡しって感じになっている。
レコードは, カテゴリー 1つで 1レコードのよう。つまりカテゴリーごとに分類された (手書きメモの)UIDの集合ってことだね。 てことで, 少なければここには 1レコード, 多くても 16レコードしかない。でも, ま, 多少間違っちゃってるかもだけどね。てへっ (^^)

EMXref-EM10.pdb の 1レコード分の構造
項目名サイズ内容
カテゴリーに
ついての情報
20 Bytes
0x00レコード長カテゴリー名手書きメモ数
1 Byte2 Bytes16 Bytes1 Byte
手書きメモ UIDリンク
(メモの数分繰り返し)
一件あたり
47+α Bytes
下図参照

カテゴリーについての情報の中にある 手書きメモ数で, その後につづく 手書きメモ UIDリンクの数が表されていて, コレで手書き画像の数がわかる ・・・ て訳ではない。残念ながら。 とゆーのも, ひとつの手書きメモの中に, 複数のページが含まれることもあるから。
で, (↓)がメモ帳UIDと手書き画像UIDのリンク情報。

「手書きメモ UIDリンク情報」の詳細
項目名サイズ
メモレコードの UID 4 Bytes
メモのテキスト 25 Bytes
作成日時 8 Bytes
更新日時 8 Bytes
不明 1 Byte
対応する"手書き"のページ数 1 Byte
ページ数分の"手書き"レコード UID4 Byte × ページ数

1ページしか手書き画像がなければ全部で 51バイト。ページ数が増えるに従って 4バイトずつ増えるって訳だね。ページ数は最大 16ページのよーだから, それほど大きくなったりもしない。
それから, 作成日時と更新日時は 新しいバージョンではバイナリで入ってる模様。 そもそもこの日時, 作成だか更新だか, どっちなのか不明なんだよね。(^^)

さて, 画像DBである EMInk-EM10.pdb の構造を見てみよう。 コレって ほかの, たとえば 手書きアドレス帳とか, そーゆーのと同じかどうかは分かっていない。 なぜかって, ソレ動かしたことないから。でへへ。 ま, 似たようなもんだと思うんだけどさ。

コレのレコードってのは, ひとつひとつが手書き画像の情報になってて, レコード数=画像数+1 になっていたりする。 +1 っつーのは, 何か入っているらしいんだけど, まだ詳しく分かっている訳じゃない。(^^;
んで, 手書き画像レコードは? とゆーと ・・・

EMInk-EM10.pdb (手書き画像レコード)
項目名サイズ内容
画像情報7 Bytes
0xf0画像番号メモレコードのUID
1 Byte2 Bytes4 Bytes
線の情報線の数 ×
(最低でも)7 Bytes
0xa1座標の数開始座標相対座標・・・
1 Byte2 Bytes4 Bytes2 Bytes/座標・・・
終端1 Byte
0xf1
1 Byte

まずその先頭に, この手書き画像に対応するもの, 手書きメモならそのメモ帳レコードの UIDと, その中でのページ番号など, 画像の全体的な情報がある。 つぎに, 一筆書きで描くことができるよーな線があり, コレが並んでいる。一筆書きの線が何本か現れた後, 一番最後に終端 ってこと。 それぞれの先頭の 1バイトは固定の値なので, ソレで識別できたりする。

一筆書きは, 開始座標から始まって, まえの座標からの相対座標がいくつも続き, 座標の数までで一筆書きは終わる。 そしてその次の 1バイトが一筆書きを表すものならば, 次の一筆書きが始まるし, 終端ならばそこまで, ってこと。
てことで, それらの項目を少しばっかり解説してみよう。んじゃ 上から順番に ・・・

画像番号
えー, コレはドキュメントによると, ひとつのメモにつき最大 16画像のはずだったんで, 1.5バイトの余分な部分がある。 てことで, もしかしてビミョーに勘違いしてるかもしんない。あしからず。(^^)
メモレコードのUID
UIDって ホントは 3Bytesなんで, 頭 1Byteは余分。・・・ は, いいんだけど, この情報を持ってる訳だから, ここから EMXref-EM10.pdb を生成したりもできちゃうかも。
座標の数
座標の数を表している訳だから, 「1」が入ってたら 開始座標だけってことで『点』になるはず。 んで, 「3」とかだったら 開始座標と つづく相対座標が 2つ って感じだね。難しくはないよね。
開始座標
最初の 2 Bytesが X座標, あとが Y座標。んで, ビットで表すと 0b0xxxxxxx 0b0xxxxxxx て感じで, 上位 7ビットと下位7ビットに分れてるのだ。 値の範囲は, 解像度が 1016ライン/インチで, そのサイズが 5インチ × 7.1インチ。あとは勝手に計算してみよう。
相対座標
座標の数-1 個分 座標が繰り返し入っている。1つあたり 2 Bytes で, ソレは X座標, Y座標が それぞれ 1Byteずつ。 前の位置からの相対座標になっていて, 下位 7ビットは距離を, 最上位ビットで方向(符合)になる。てことで, どんなに長くても 127ドットまでな訳だよん。

他の情報源として, アプリケーションに対応するファイル名だとか, 手書き画像にテキストデータを添付できるかどーかとか, そーいった情報があるです。 はせがわ(あ)さんとこの edf2psのページれす。

○ ▼ □

Datebook

あ さて〜, 今度は, Datebook(予定表)なのら。 コレってゆーのが, 難しい使い方をしててもそーでなくても, 色々な使い方もできるよーに 構造はかなり複雑になってたりする。 コレを見れば, こんな使い方もできるのか? とか思うに違いない。 ・・・ のかも。
で, ソースファイルは libsock/datebook.cと それから include/pi-datebook.hだお。

まずは, 先頭の部分(↓)。よくみると項目数とバイト数が合わない ! と, 思うかもだけど, 年月日は 2バイトなのら。 それから, 開始時刻(の時と分)が 0xffffなら時間の指定はないってこと。

「予定表」の各レコードの先頭 8バイト
項目名開始時刻終了時刻年月日flagsgap
サイズ2 Bytes2 Bytes2 Bytes1 Byte1 Byte
flagsのビットの意味
bit位置意味
1*******?
*1******alarm
**1*****repeat
****1***except
*****1**desc
***1****note
******1*?
*******1?

んで, この 8バイトの後に数々のオプションがくっつく。ソレらは, flagsに示されてる通りのもので, もし flagsが 0x00なら, 後ろには何も付かないってことなのさっ。
で, まずは alarm。これは 2バイト。その値はとゆーと, たとえば 0x03 0x01 だったとすると, 3時間前にアラームを鳴らす ってこと。 って, アラームを予定時間の後に鳴らしても意味ないもんね。

alarm の部分
advanceadvanceUnits
値の数値0=分, 1=時, 2=日

で, repeat とゆーのは繰返し, つまり定期的な予定のこと。 先頭の repeatTypeNone, Daily, Weekly, MonthlyByDay, MonthlyByDate, Yearly のどれか(0〜5)。 コレによって, その後の構造も多少変化する。 ・・・ んだけど, 全体で 8バイトなのは変わらない。 あ, 終了日は 2バイトね。0xffffなら 終了日がないってこと。

repeat の部分 (repeatEndを除き, すべて 1 Byteずつ)
repeatType?repeatEndrepeatFrequencyrepeatOnrepeatWeekstart?
0〜5 の値不明終了日(年月日)間隔不明

repeatの項目, repeatOnrepeatTypeWeekly (2)の時だと, bitフィールドとして幾つかの曜日を記録することになーる。 ソレは下位から順に, 日曜・月曜・火曜 ・・ 土曜 になる訳だね。だから 例えば 0x41なら 土・日ってこと。

repeatTypeMonthlyByDay (3)の時だと, repeatOnの値で, その月の「ある日」を曜日でアレするって意味になるのだ。 つまり, その値を 7で割ると 余りが曜日を表していて, 答えがその週を表している ・・・ ってとこ。

       0:第一日曜 ......  6:第一土曜日
       7:第二日曜 ...... 13:第二土曜日
      14:第三日曜 ...... 20:第三土曜日
      21:第四日曜 ...... 27:第四土曜日
      28:最終日曜 ...... 34:最終土曜日

repeatWeekstartは, 普通は 0で「日曜始まり」。んで 1だと「月曜始まり」。 ただし, repeatTypeが指定されている場合のみ てことらしい。情報ありがと >宇野さん

それから, except は例外を表していて, 予定だけれど予定じゃないっつーか そんな感じ ・・・ なのかな? そんな画面見たことないので分からないんだけど。(^^)
ソレが 一つしかなかったら 2 + 2 × 1 = 4バイト, みっつあったら 2 + 2 × 3 = 8バイト。

except の部分
exceptionsその個数分
exception・・・
その数年月日 ・・・
2 Bytes2 Bytes

残るは, descnote。両方とも文字列で, だから 0x00で終わる構造。 descriptionってゆーのは, その予定のとこに書いた説明のこと。んで, noteはコメントとして書き込んだもの。
ま, どちらも単なる文字列なので図をアレする必要はないよね。だって, 図をアレするのって大変なんだもん。 (← ぉぃ)

◆ ○ ▲

PenPen, PenPenCol

今回は手書きメモの一つ PenPen のソレをアレしてみるにょ。 でも, だからって ペンギンが登場したり, 草が生えたりする訳じゃない。

PenPen の機能は どんなのかっつーと ・・・ 手書きメモが書ける。って, まんまだね。(^^)\(☆バキッ
で, そのほかに, 4 Sectionの手書きメモを まとめ表示もできたりする。実は, 1ページ(=1レコード) は, 4 Sectionで構成されているのら。 つっても 高解像度のばやいは分かんないけど。でも, たぶんコレと同じなのかも。 そのうえ, 4ページ(つまり 16 Section)をまとめての表示も可能なのら。そーゆーののどこがアレなのかっつーと, 位置をずらすことで, 隣のマスに表示して重ね合せることもできるんだよ。 ・・・ どんな利用法があるのかは謎だけど。 地図と道順? あ, ソレ よいかも。 ただ, 別のSection表示させたとこに 手書きメモを書き込むなんて出来ないんだけど。 (←じゃ, ダメじゃん)

基本的なこの構造は, ベクトルの集合。 てことで, コレを利用しての拡大縮小機能もついていたりするんだけど, ソレは置いといて ・・・。

PenNDB.pdb の 1ページ(=1レコード)分の構造
項目名位置長さ備考
ヘッダー 0x0000 13日, 月, Flag × 4 (以上, 各2バイト), 年(年-1998, 1バイト)
1 Section目0x000d3200最大 (800-1)本の線分
2 Section目0x0c8d3200同↑
3 Section目0x190d3200同↑
4 Section目0x258d3200同↑
不明 0x320d 30x00, 0x00, 0x00
各Sectionの件数0x3210 164バイト × 4
Section数?0x3220 20x04

「最大 約800本の線分」っつーのは, 始点(x,y) 〜 終点(x,y) の座標, コレが 1本の線(4バイト)として, 約 800本ってことなのら。 最後の 1本分(4バイトは)は空けてあるっぽい。 で, ソレが何本あるのかは「各Sectionの件数」のとこに入っていたりするのだ。

ジツをゆーと, すでに PenPenのカラー版が公開されていて, コレの構造とは異なってるっぽい。 んで PenPenColは, まずその用語からして違う。 1ページを構成するものはフレームなのだ。

PenXDB.pdb の 1ページ(=1レコード)分の構造
項目名長さ備考
ヘッダー 13日, 月, Flag × 4 (以上, 各2バイト), 年(年-1998, 1バイト)
なにか 68
1 Frame目7200 一本の線は (PenPenでは 4バイトだったけど) 6バイト。
そこには 色・線種の各 1バイトが含まれるよーになった。
Frameサイズも違うので, 線の最大数も違う。
2 Frame目7200
3 Frame目7200
4 Frame目7200
不明 30x00, 0x00, 0x00
各Frameの件数 164バイト × 4
Frame数? 20x04

でも基本的には同じ構造なので, コレを扱うプログラムは共通にできるかも。

○ ○ ○

【pdbm.exe が扱うファイル】

このプログラムは, PDBファイルのメンテナンスのためのものれす。 PDBファイルをアプリケーションから直接アレするんじゃなく, コレを介することによって一元化でき, トラブルを起きにくくしていた ・・・ つもりだったけど, 現在は使用していません。 アクセスする手順が煩わしいのと, 制限が多いためれす。 てなことで, この資料(↓)は 一応念のためにあるだけで, 参考にも何もならないかも。(^^;

pdbm.exe とゆーのは σ(^^) 作の幾つかのプログラムの中から, 内部から呼び出されるもの。なーにをやってるかっつーと .pdbの更新。 .pdb をダイレクトにゴリゴリと更新していては何かと大変なんで, 衝撃(?)を緩和するためにあったりする。 ・・・ んだけど, 欠点もいろいろあったりする。
今は Rexxですべてをあれこれできるようになったので, pdbmは使わないのがよいかも。

  1. Rexxでの PDB 読み込み &分解
  2. Rexxでの PDB 組み立て &書き込み

このプログラムには 3つのファイルを指定する。元の .pdb と, 新しく作る .pdb, そしてさらに変更内容を記したファイル。 ここで公開するのは, トランザクションファイルと呼んでいる, その変更内容のファイルであーる。

構造はいたって簡単。4バイトの長さレコード内容, これが連続しているだけ。そして, ファイルの先頭にはそーゆーIDが入っている。 "pdbTransaction" 0x1a 0x00 ・・・ 16Bytes。

レコード内容の最初の部分には, uidが入ることになっていて, それを元にレコードを更新したりする。 .pdb は, コレを元に管理されているので, .pdb の更新もこの単位で行う。
同じ uidのレコードがあれば置き換え, 存在しない uidがあったら追加とゆー具合。あ, でも uid == 0 は無条件に追加とゆー意味。 そのばやい, Palmデバイスに .pdbをインストールした時に, 正式に uidが割り振られることになる。

それから, 長さフィールドには, ちょいと注意することがあって, 先頭 4bitに幾つかの情報が入ってたりする。

これくらいかな。他に注意することと言えば, 長さ == 0 は EOFを表していることくらい。 まぁ, 詳しくは後で公開予定の pdbm.c (ソース)とか見てくらはい。 見にくくっても我慢するよーに。

構造は, (↑)でもアレしたように, そんなに大したものではない(と思う)。気を付けることは uid が 0のもの。と, ゆーよりソレを反映させた .pdbファイル。 そのままでは, その .pdbファイルの中の uid == 0 のレコードは 置き換えも削除もできないので, 早いとこ Palmデバイスにインストールして, すぐまた取り込むのがよいかも。 そのときには正式な uidが設定されているから。

おっと, ウィルス退治の時間だ。んじゃ, 行きまーすっ (^^)/~ (←こら)


Copyright (C) 1999-2003 Rexx使いの織華
email: ori@drive.co.jp