save2local.jsをflash側でデータ圧縮して格納するように改変(中途半端な出来…)

ネタがないので
http://d.hatena.ne.jp/ruby-U/20080908/1220865377
で試したことをしばらくは書いていこう!




Gearsを知る前だったので


http://labs.unoh.net/2007/01/pcjavascriptsave2localjs.html
ローカルPCへ大容量データを保存するJavaScriptライブラリ「save2local.js」


を使ってデータをテンポラリに保存させているのだけども、テキストデータをそのまま投げると文字数がある程度大きくなると保存できなくなる(標準で100KBまでだったか)


テストで使ってた「銀河鉄道の夜」が4万文字ちょい
たしかこれだとアウトだった気がする


そこでsave2local.as内でデータを圧縮して保存、これでOK!と行きたかったのだけども、AS3初めて触ったこともあって苦戦
具体的にいうとSharedObjectにバイナリデータを保存する方法がわからなかった
ググると出来る、みたいなソースも見かけたが再現できず…
仕方がないのでバイナリ→Base64にしてSharedObjectに書き込んでお茶を濁した


なおコンパイルにはas3crypto.swcが必要
rascutなら

set _JAVA_OPTIONS=-Duser.language=en
rascut save2local.as -c "-library-path+=aslib\as3crypto.swc"

みたいな感じで

/**
 * save2local
 */

package{
	import flash.display.Sprite;
	import flash.external.ExternalInterface;
	import flash.net.SharedObject;
	import flash.utils.ByteArray;
	import com.hurlant.util.Base64;


	public class save2local extends Sprite{
		function saveKeyData(name:String, key:String, dat:String):String{
			try{
				var so:SharedObject = SharedObject.getLocal(name);
				var b:ByteArray = new ByteArray();
				b.writeUTFBytes(dat);
				b.compress();
				so.data[key] = Base64.encodeByteArray(b);
				return so.flush();
			}catch(err){}
			return "error";
			//return error || pending || flushed
		}
		function loadKeyData(name:String, key:String):String{
			try{
				var so:SharedObject = SharedObject.getLocal(name);
				var b:ByteArray = new ByteArray();
				b = Base64.decodeToByteArray(so.data[key])
				b.uncompress();
				return b.toString();
			}catch(err){}
			return "";
		}
		function getSize(name:String):uint{
			try{
				var so:SharedObject = SharedObject.getLocal(name);
				return so.size;
			}catch(err){}
			return 0;
		}
		public function save2local(){
			ExternalInterface.addCallback("saveKeyData", saveKeyData);
			ExternalInterface.addCallback("loadKeyData", loadKeyData);
			ExternalInterface.addCallback("getSize", getSize);
		}
	}
}


追記
save2local.jsの改変箇所は以下の通り
Flashの中だと咄嗟に変更できなくて困ったりしそうだったので、jsの中でSharedObjectのハッシュ(?)保存ファイル名を指定できるようにしてたんだった 忘れてた
後はサイズ取得の関数の追加

    saveData:   function (key, dat) {
                    var f = this.getObj();
                    if (f && f.saveData) f.saveData(key, dat);
                },
    loadData:   function (key) {
                    var f = this.getObj();
                    if (f && f.loadData) return f.loadData(key);
                    return undefined;
                }

    saveData:   function (key, dat) {
                    var f = this.getObj();
                    if (f && f.saveKeyData) return f.saveKeyData("alteno", key, dat.toString());
                },
    loadData:   function (key) {
                    var f = this.getObj();
                    if (f && f.loadKeyData) return f.loadKeyData("alteno", key);
                    return "undefined";
                },
	getSize: function(){
				var f = this.getObj();
                    if (f && f.getSize) return f.getSize("alteno");
                    return "undefined";
	}

今回の例だとデータは
Documents and Settings\ 〜 \sorr.biz\sorrno_alpha\lib\save2local.swf\alteno.sol
に保存される