2002-03-27 [長年日記]

風邪が

直りません。こっちはウィルスも強いのか?

IMAPのリモートフォルダにローカルメッセージ

今のQMAILはIMAPのリモートフォルダにオフラインでメッセージをインポートしたりすると、次回同期するときにサーバに送られ、さらにその後サーバからメッセージリストを取得しないとフォルダのメッセージリストに追加されない。

これを、インポートしたら即メッセージリストに追加するようにする。そのときに、ローカルメッセージであることを示すフラグを立てておいて、次回そのフォルダを同期するときにサーバにアップロードし、ローカルメッセージは削除してサーバからメッセージリストを取得して更新する。

オフラインの間にやったことの処理

今のQMAILは、オフラインの間にやった処理でサーバ側に反映しなくちゃいけないことは全て.offlinejobというファイルに保存して、次にサーバに接続したときに最優先で処理している。今あるのは、

  • フラグ更新
  • メッセージ追加
  • メッセージコピー
  • 削除済みメッセージのクリア

の4種類。

フラグ更新はそのままで良い?。メッセージの追加は上に書いた方法に変更。メッセージコピーは、どうするのがいいかな。削除済みメッセージのクリアはそのままでも問題なさそう。

フラグの更新なんかの情報もフォルダごとに分けて、そのフォルダを更新した場合にだけアップデートした方が良いかも。

IMAPでの特殊フォルダ

IMAPでOutbox, Sentbox, Trashをサーバ上に置く方法。

☆オンライン

Trashは、普通にメッセージを他のフォルダに移動するのと変わらないので、それほど問題ないはず(QMAIL 2.xでも.foldersを書き換えれば対応できているし)。

Outboxは、同期(送受信)とフォルダからのメッセージの取得で複数のIMAPセッションを張るようにしたので、送信時にそれらのフォルダにアクセスできなくて送信メッセージが取得できないという問題は解決。

Sentboxも、基本的にはメッセージを移動するだけなので問題ないはず。

☆オフライン

Trashはたぶん問題ない。

Outboxは、サーバ上にしかメッセージがない場合にどうするかが問題。同期時にはオンラインにしてサーバからメッセージ本体を取得できるようにするのがよいかな?。

Sentboxも問題ないはず。

そもそも同期の種類

巡回同期
[Too]-[Connect]系で起動される一般的な巡回・同期。
フォルダ同期
オンラインでフォルダを開いたときに(設定により)自動的に起動される同期。[View]-[Refresh]でも起動される。
メッセージ同期
厳密には同期ではないけれど、メッセージを表示したり添付ファイルを取得するときに、ローカルにキャッシュがなければサーバから取得するために使う。メッセージリストは更新しない。

巡回同期

  • メインスレッドではないスレッドを使用する
  • 設定によっては複数のスレッドを使ってパラレルに処理できる
  • 送信処理も可能
  • オフライン時のフラグ変更をアップデート
     -> ローカルメッセージをアップロード
     -> 既存メッセージのフラグをサーバからアップデート
     -> 新規メッセージをダウンロード

フォルダ同期

  • メインスレッドではないスレッドを使用する
  • 他のフォルダの同期が起動した場合には、なるべく速やかにキャンセルする?
  • フォルダの同期処理自体は、巡回同期と一緒

メッセージ同期

  • メインスレッドを使用
  • SELECTしてVALIDITYをチェックして(変わっていたらエラー扱い)、その後すぐにUID FETCHしてメッセージ本体を取得
  • フラグのアップデートやオフライン時の操作のアップデートは行わない
  • オンライン時のフラグ変更やコピー、インポートなどの処理も同じセッションを使用する
  • 必要に応じて(たとえば、サーバ上のメッセージ数が変わったり、UIDVALIDITYが変わってしまった場合など)には、フォルダ同期を起動する必要があるかも

ローカルメッセージ

☆シナリオ1

オフラインで、リモートフォルダにメッセージをインポートした。もしくは、他のアカウントからメッセージをコピーした。結果的にローカルメッセージが作成された。

この場合、作成されたローカルメッセージはサーバにアップロードされる必要がある。

☆シナリオ2

オフラインで、同じアカウントの別のフォルダからメッセージをコピーした。この場合もローカルメッセージが作成される。

この場合、作成されたローカルメッセージをサーバにアップロードしてはいけない。

どうやって見分けようか。フラグでもいいけど、もうフラグは32bit使っちゃってるしな。.offlinejobにサーバにアップロードしなくちゃいけないローカルメッセージのUIDを記録しておくか?。もしくは今と同じように.offlinejobにメッセージごと放り込んでおいて、ローカルメッセージは、サーバと同期を取るまでの繋ぎとしてしか使わないという手もある。ストレージがちょっともったいないけど。


トップ «前の日記(2002-03-25) 最新 次の日記(2002-03-28)»