Bitcasa API test app

Bitcasa APIをテストするモジュールとC#のテストアプリ

(改版履歴)
20131228 初版
20131230 いろいろと修正。教えてくれた人サンクス
	ダウンロードが壊れる問題を修正。
	ダウンロードとアップロードはできるだけやり直すように。
	進捗状況を表示するようにがんばってみた。
	ダウンロードは10GB、アップロードは4GB程度までならたぶんいけるはず。
	アップロードは失敗してもしばらくしたら出現する場合があるので気をつけてください。
20131231 ダウンロード中に受信に失敗するとファイルが壊れることがあるのを修正
20140102 I:\とBitcasa Infinite Drive\の下を比較する機能
	任意のBitcasaのリモートフォルダと、ローカルのフォルダの下のファイル一致を見る機能
20140103 サーバの応答状況によってダウンロードが壊れる可能性を修正
	APIの応答が変更されていたので表示内容を追加
20140105 x86コンパイルのバイナリをつけた
	コールバックの最中に落ちることがあるのを修正
	ダウンロードするときにサイズ不整合を見逃して多分壊れていたのを修正
	ダウンロードルーチンを書き換えて複数コネクション張るように
20140107 APIが追加されていたのでUserProfileを取れるようにした
	トークンが生きているかのチェックにProfileが取れるかどうかでテストするように
	コールバックで進捗状況を報告する辺りで落ちているのでGCに持って行かれないよう修正
	ダウンロードが走っているときに別のところをさわると固まるのに対処
	ダウンロード中に強制終了したとき、サブスレッドが残るのを修正
20140109 openssl-1.0.1fに更新
	右上のリストビューに表示されているファイル名と、ローカルのファイル名の比較ができるように
	右上のリストビューのソートができるように
20140111 クライアントキーを説明のあるものに差し替え
	既にトークンを取得している場合はそのまま使えます。
	新たにトークンを取得する場合、許可を求める画面が詳しくなりました。
	どっちみちURLで見えてるので、ClientSecretのみをソースから消すことに
	ダウンロードのサブスレッドが、エラー応答をもらったときにデッドロックする問題を修正
	ダウンロード時にサブスレッド群からの応答が180秒ないときに強制失敗させるよう修正
	通信断が起こったときもデッドロックしないようになったと思います。
	GUIのサイズを変えたときにちょっとましになるよう修正
20140111b ハッシュを計算できるように
	Checksumのところで、Download AutoやUpload Autoにチェックを入れると
	完了時に自動で計算してカレントにhash.logとして出力されます。

(実行に必要な環境)
Microsoft .NET Framework 4.5
Visual Studio 2013 の Visual C++ 再頒布可能パッケージ

(コンパイルに必要なもの)
Visual Studio 2013 pro(他のバージョンでは確かめていない)
openssl (dllコンパイルしてつけてある)

歴史的事情により、C++でAPIを叩くモジュールを作ってしまったので
C#ラッパーによりC#->C++/CLI->opensslでAPIを叩きに行きます。


(中身)
src\
 ssl\ opensslからコンパイルと実行に必要なものを持ってきた
 BitcasaDLL\ opensslによりBitcasaAPIを叩く足回り,C++/CLI C#ラッパー
 WebWindow\ はじめの認証をWeb表示するモジュール
 bitcasaViewer\ 本体
 bin\ コンパイルしたらここにコピーされます

x64_bin\ 64bitコンパイル実行ファイル(dllは全部要るはず)
x86_bin\ 32bitコンパイル実行ファイル(dllは全部要るはず)

(使い方)
このへんに図入りで書いてみた。
https://www.lithium03.info/product/bitcasaDLL/howtouse.html

あんまりに遅いときはBitcasa側の問題なので、ぽちっとなと強制終了してもう一度。
変なエラーが出た場合は、どこかで処理をミスっているので某スレで教えていただけると幸いです。

左上のログインボタンを押すと、トークン取ってきてカレントに書き出します。
以降はトークンがあれば同じアカウントは最終アクセスから7日間使えるようです。

左のツリーをクリックすると、その部分の詳細が右にでます。
右上の部分は右クリックメニューがでて、それぞれAPIの該当コマンドを発行します。
確認は出ませんので気をつけて。

moveとcopyは、対象ファイルを選択->右クリックからmoveまたはcopy
右上の部分に移動/コピー先を表示->移動先右クリック->move/copy hereです。

reloadを押すと、鯖まで取り直しに行きますがそれ以外は初回に取りにいったデータを
内部で保持します。
削除やリネーム、移動コピーでツリーが変わった場合、できるだけ追従しますが
エラーとかの時はどっかに行くかもしれません。
本来ある場所の親ディレクトリでreloadすると、サーバ側のデータに更新されます。
ゴーストのある場所の親ディレクトリでreloadして、幽霊側を消してください。

Scan ALLをすると、下位ディレクトリも含めてすべての構造を取ってきます。
ファイルがいっぱいある場合はものすごく遅いですので、ネットの転送グラフを見て動いているか
チェックしてください。
タイムアウトは50secくらいです。それ以上固まっている場合は、ぽちっとな

すべての構造を取ってきたらfindが使えます。
ファイルパス名の単純一致or正規表現一致と時間サイズで絞り込んで右上に表示します。
ここから右クリックメニューでAPIコールできるので、条件を絞り込んで移動とかに使えます。

Scan ALLをした後に、overlayメニューが使えます。

overlay->bitcasaは、I:\以下をスキャンして、Bitcasa Infinite Drive\の下位フォルダまたは
mount_pointが%%%HOME%%%/Bitcasa/ で始まるフォルダとの一致を見ます。
local側(left)のみにファイルフォルダがある場合は赤オレンジ色、
remote側(right)のみにある場合は緑色でマークされます。
Allを押すとLRで始まる両方で一致したファイルも表示されますが、いっぱいファイルがある場合は
めちゃくちゃ遅いので注意してください。
local(left)のみにリストアップされたということは、I:\にはファイルがあるのにWebにでていないファイル
つまり不完全ファイルや削除済みのファイルが未反映であることを示します。
そのほか、.(ドット)で始まる名前はapiやwebから見えないのでここにリストされます。
remote(right)のみにリストアップされたということは、WebUIにはあるのにローカルに存在していないファイル
ということです。
Mirrored Folders以下はシンボリックリンクになっていたりしてややこしいので
現時点では意味のないデータになっています。
どこかがバグっている可能性があるので、必ず目視によるクロスチェックをお願いします。
このコマンドを実行した後は、右下の詳細ビューに項目とI:\以下で一致したローカルファイルの
サイズと日時が表示されます。

overlay->other...は、任意のローカルフォルダを指定しスキャンし、任意のremoteのbitcasaドライブの
フォルダ以下との一致をチェックします。
bitcasaコマンドでは、I:ドライブとの一致しか見れませんが、こちらのコマンドは任意のローカルフォルダが
指定できます。
どこかのフォルダからファイルをBitcasaに投入しているときに、うまく上がったかチェックするのに使ったり
ミラーしているフォルダがちゃんと上がっているかのテストに使えます。
同じく.(ドット)始まりのファイルは見えません。現時点でちゃんとミラーされているかはapiからは確認する
方法はありません。

ダウンロード中にプログラムを終了させた場合、サブスレッドが裏で終了するまでの間プロセスが残ります。
64MiBのブロックの取得が終わり次第、スレッドが消えるはずですのでしばらくお待ちください。
また、180秒間応答がない場合、失敗するように変えましたのでこれ以上残らないはずです。
通信回線の速度などで、この時間では短すぎると感じられた場合は教えてください。

(技術的情報と注意)
IEコンポーネントのバージョン問題で、ログインできないのでレジストリに一カ所書きに行きます。
src\WebWindow\Form1.csのこのあたり
Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\" + feature))

ログインに必要な一時キーを取得するauthenticate APIコールにおいて
リダイレクト先をBitcasaに要求されています。
この目的のため、https://www.lithium03.info/login/login_success.html?authorization_code=xxx
のページにリダイレクトしています。
authorization_codeはログイン時にClientSecretと共にaccess_token APIに提示することで
アカウントにアクセスできるトークンを取得するのに使います。
302応答のLocationに入っているところで抽出すれば、うちのサイトへのGETアクセスはしなくてよいのですが、
IEコンポーネントで自動的にリダイレクトして飛び先から抽出した方が容易なので今の形にしています。
なお、開発者のアプリコンソールから各APIの呼び出し回数をログで確認することができます。(回数のみ)
さらに匿名性が必要な方は、自身のアプリキーとリダイレクト先を用意してご自分でコンパイルされることを
おすすめします。

初回ログイン時にパスワードを要求するウインドウは、WebWindowによってIEコンポーネントを使って出しています。
フォームのタイトルに、現在表示中のURLが出ています。
ログインが成功してauthorization_codeが提示されるまでの間のページは、すべてBitcasa側のサイトです。
ログインページ
https://developer.api.bitcasa.com/v1/oauth2/authenticate?client_id=77602235&redirect=https://www.lithium03.info/login/login_success.html

ログイン動作時の詳細なページ遷移については、\src\BitcasaDLL\BitcasaAPI.cppにある
int BitcasaAPI::authenticate() を参考にしてください。
この関数は、WebWindowと同等の動作をするCUIの関数ですが、現在のコードでは使用していません。
ここで行っているように、手パースすると余計な場所に一切アクセスしないでauthorization_codeを
取得できるのですが、ログイン時の遷移をBitcasaが予告なしに時々変更してしまうことと、
権限を要求する画面を加工してしまうのがまずいので、現在はWebWindowを使うことにしています。

いったん有効なトークンを取得できたら、移行の接続はすべてdeveloper.api.bitcasa.com:443への
SSL接続のみで行われます。
developer.api.bitcasa.comの名前はラウンドロビンで複数のIPアドレスが時間によって切り替わっている
模様です。opensslモジュールの自動接続により、よきにはからって切り替わります。
たまによくこの切り替えに失敗することがあり、応答なしで固まったり、出るはずの画面が出ないことがあります。
このときは、アプリを再起動するかReloadしてください。

(注意事項)
APIのテスト兼おまけ機能付きのテストプログラムです。
手元の環境では動いていますが、Bitcasaサーバの応答の具合によりバグが発生する場合があります。
変なことが起こる場合があるので注意してお使いください。

APIコールはBitcasaサイトの条件を読んで、用法用量を守ってください。
サーバーに高負荷をかける行為は規約で禁じられています。

APIキーはexeには入っていますがClientSecretをソースから消してあります。
これはキーの共有がまずいとの判断からです。

Bitcasa側の回答によると、ライブラリそれ自体としてのキーの発行はしないとのことです。
（ライブラリとしてキーを発行すると、回数制限などがライブラリ利用者全体で共有されてしまいます）
もし、私のライブラリを利用されることがありましたら、取り込んだ上で別個のアプリケーションとしての申請を
行っていただくようお願いします。

ソースコードのうち、私が書いている部分(openssl以外)はパブリックドメインです。
