فهرست منبع

added checksum capabilities

ncannasse 8 سال پیش
والد
کامیت
1a62613465
1فایلهای تغییر یافته به همراه26 افزوده شده و 7 حذف شده
  1. 26 7
      hxd/Save.hx

+ 26 - 7
hxd/Save.hx

@@ -21,33 +21,52 @@ class Save {
 	}
 	#end
 
-	public static function load<T>( ?defValue : T, ?name = "save" ) : T {
+	static function makeCRC( data : String ) {
+		return haxe.crypto.Sha1.encode(data + haxe.crypto.Sha1.encode(data + "s*al!t")).substr(4, 32);
+	}
+
+	static function loadData( data : String, checkSum : Bool ) : Dynamic {
+		if( data.charCodeAt(data.length - 33) != '#'.code )
+			throw "Missing CRC";
+		var crc = data.substr(data.length - 32);
+		var data = data.substr(0, -33);
+		if( makeCRC(data) != crc )
+			throw "Invalid CRC";
+		return haxe.Unserializer.run(data);
+	}
+
+	static function saveData( value : Dynamic, checkSum : Bool ) : Dynamic {
+		var data = haxe.Serializer.run(value);
+		return checkSum ? data + "#" + makeCRC(data) : data;
+	}
+
+	public static function load<T>( ?defValue : T, ?name = "save", checkSum = false ) : T {
 		#if flash
 		try {
 			var data = Reflect.field(getObj(name).data, "data");
 			cur.set(name, data);
-			return haxe.Unserializer.run(data);
+			return loadData(data,checkSum);
 		} catch( e : Dynamic ) {
 			return defValue;
 		}
 		#elseif sys
-		return try haxe.Unserializer.run(sys.io.File.getContent(savePath(name))) catch( e : Dynamic ) defValue;
+		return try loadData(sys.io.File.getContent(savePath(name)),checkSum) catch( e : Dynamic ) defValue;
 		#else
 		return defValue;
 		#end
 	}
 
-	public static function save( val : Dynamic, ?name = "save", ?quick : Bool ) {
+	public static function save( val : Dynamic, ?name = "save", checkSum = false ) {
 		#if flash
-		var data = haxe.Serializer.run(val);
+		var data = saveData(val, checkSum);
 		if( data == cur.get(name) )
 			return false;
 		cur.set(name, data);
 		getObj(name).setProperty("data", data);
-		if( !quick ) try saveObj.flush() catch( e : Dynamic ) throw "Can't write save (disk full ?)";
+		try saveObj.flush() catch( e : Dynamic ) throw "Can't write save (disk full ?)";
 		return true;
 		#elseif sys
-		var data = haxe.Serializer.run(val);
+		var data = saveData(val,checkSum);
 		var file = savePath(name);
 		try if( sys.io.File.getContent(file) == data ) return false catch( e : Dynamic ) {};
 		sys.io.File.saveContent(file, data);