file i/o

ひとまず dropbox から任意のファイルを読み出すことを考える。

dropbox の REST api を呼び出すには、OAuth が必要だ。そこでまず javascript 版の OAuth ライブラリをぐぐってみる。

あたりが有名? コードをざっとみた感じ、jsOAuth の方がよさそうなのでこっちを使ってみる。

OAuth に手をつける前に、wasavi 側の都合を考える。やはり同期・非同期の仕組みがここでも必要になる。読み込む処理はバックグラウンド側で行うためだ。そこで、コマンドを非同期で行うかどうかをレジスタ * を参照しているかだけではなく、それぞれのコマンドごとにフラグを持たせる。今回の場合は ex コマンド read を新設し、multiAsync フラグをつけておく。

読み込む処理の流れは以下のようになる:

  1. ex コマンド read が入力される
  2. コマンド エグゼキュータが非同期モードで開始する
  3. read コマンド本体が実行される
  4. バックグラウンドへ入力されたファイルパスを送信する。ex コマンドの実行はいったんここで中断する。しかしながら、依然として ex コマンドの実行中という状態には変わらない。この間 vi コマンドのキー入力がされても無視する
  5. ここからバックグラウンド側の処理: dropbox に対してリクエストトークンを要求する
  6. リクエストトークンを得たら、ブラウザの新しいタブで dropbox 上のapi 使用の認可ページを表示する。ユーザは wasavi に対して、dropbox 内のファイルのアクセスを許可する
  7. ページは指定したコールバックページにリダイレクトされる。コールバックページが表示された = ユーザが許可したことをバックグラウンド側で認識する
  8. dropbox に対してアクセストークンを要求する
  9. アクセストークンを得たら、dropbox に対してアカウント情報を要求する
  10. アカウント情報を得たら、確かに wasavi が使用する dropbox アカウントであることを確認する

  11. 確認が取れたら、dropbox に対して入力されたファイルパスの内容を要求する
  12. 内容を得たら、wasavi へ送信する
  13. ここから wasavi 側の処理: wasavi 側で内容を受信したら、バッファへ書き込む。これで read コマンドが完了
  14. 後続する ex コマンドを実行するため、コマンド エグゼキュータの実行を再開する
  15. 全てのコマンドを実行し終えたら、コマンド実行中のフラグを降ろす。通常の vi コマンドモードへ戻る

という感じ。

このほか、

  • バックグラウンド側で何らかのエラーが発生した場合も、wasavi 側への送信は行う。エラーメッセージを送信する
  • 取得したアクセストークンはバックグラウンドが保持するローカルストレージかセッションストレージに保存しておく。セッションのほうがいいかなあ?
  • アクセストークンを取得済みであれば、1. ~ 8. はスキップしてよい
  • アカウント情報の確認をどうするか? 各ユーザが dropbox へログインする際のアカウント名を wasavi のオプションで登録しておき、それと比較するということになるのだが、dropbox の場合送られてくるアカウント ID は謎の数字っぽいんだよなー。

なお javascript 版の dropbox api ラッパーというものもあるのだけど、これは使わない。最終的には dropbox だけでなく SkyDrive や Google Drive あたりにも対応させたいので、抽象化したクラスを自分で書いたほうがいいと思う。

Leave a Reply

Your email address will not be published. Required fields are marked *