Add love.data.encode() (#278)

* Add cppcodec
* Add love.data.encode(base64)
* Add love.data.encode(hex)
This commit is contained in:
Rob Loach 2018-09-02 18:43:07 -04:00 committed by GitHub
parent d6ca07eb25
commit 1b90e88d41
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 96 additions and 2 deletions

5
.gitmodules vendored
View File

@ -73,3 +73,8 @@
url = https://github.com/Didstopia/physfs.git
ignore = dirty
branch = master
[submodule "vendor/cppcodec"]
path = vendor/cppcodec
url = https://github.com/tplgy/cppcodec.git
ignore = dirty
branch = master

View File

@ -147,6 +147,9 @@ SOURCES_C += $(CORE_DIR)/vendor/libretro-common/utils/md5.c
# TinySHA1
FLAGS += -I$(CORE_DIR)/vendor/TinySHA1
# cppcodec
FLAGS += -I$(CORE_DIR)/vendor/cppcodec
# ChaiScript
ifeq ($(HAVE_CHAISCRIPT),)
FLAGS += -I$(CORE_DIR)/vendor/chaiscript/include

View File

@ -257,7 +257,8 @@ bool retro_serialize(void *data, size_t size) {
return false;
}
// Compress the JSON state data.
// Encode the JSON state data.
// state = app->data.encode("string", "base64", state);
state = app->data.compress(state);
// Save the information to the state data.
@ -269,7 +270,7 @@ bool retro_serialize(void *data, size_t size) {
* libretro callback; Unserialize the given data and load the state.
*/
bool retro_unserialize(const void *data, size_t size) {
if (!ChaiLove::hasInstance()) {
if (!ChaiLove::hasInstance() || size <= 0) {
return false;
}
std::cout << "[ChaiLove] retro_unserialize" << std::endl;
@ -286,6 +287,7 @@ bool retro_unserialize(const void *data, size_t size) {
ChaiLove* app = ChaiLove::getInstance();
// Decompress the state data.
// loadData = app->data.decode("string", "base64", loadData);
loadData = app->data.decompress(loadData);
// Finally, load the string.

View File

@ -5,9 +5,12 @@
#include <string>
#include <sstream>
#include <iostream>
#include <vector>
#include "compat/zlib.h"
#include "utils/md5.h"
#include "TinySHA1.hpp"
#include <cppcodec/base64_default_rfc4648.hpp>
#include <cppcodec/hex_default_lower.hpp>
namespace love {
@ -93,6 +96,38 @@ std::string data::decompress(const std::string& str) {
return outstring;
}
std::string data::encode(const std::string& containerType, const std::string& format, const std::string& sourceString) {
if (format == "base64") {
std::string encoded = base64::encode(sourceString);
return encoded;
}
if (format == "hex") {
std::string encoded = hex::encode(sourceString);
return encoded;
}
std::cout << "[ChaiLove] Warning: love.data.encode format not found: " << format << "." << std::endl;
return sourceString;
}
std::string data::decode(const std::string& containerType, const std::string& format, const std::string& sourceString) {
if (format == "base64") {
std::vector<unsigned char> decodedVector = base64::decode(sourceString);
std::string decoded(decodedVector.begin(), decodedVector.end());
return decoded;
}
if (format == "hex") {
std::vector<unsigned char> decodedVector = hex::decode(sourceString);
std::string decoded(decodedVector.begin(), decodedVector.end());
return decoded;
}
std::cout << "[ChaiLove] Warning: love.data.decode format not found: " << format << "." << std::endl;
return sourceString;
}
std::string data::hash(const std::string& hashFunction, const std::string& data) {
if (hashFunction == "md5") {
return hash_md5(data);

View File

@ -41,6 +41,32 @@ class data {
*/
std::string decompress(const std::string& str);
/**
* Encode Data or a string to a Data or string in one of the EncodeFormats.
*
* @param containerType What type to return the encoded data as. Only supports "string" currently.
* @param format The format of the output data. Can be "base64" or "hex".
* @param sourceString The raw data to encode.
*
* @return String which contains the encoded version of source.
*
* @see love.data.decode
*/
std::string encode(const std::string& containerType, const std::string& format, const std::string& sourceString);
/**
* Decode Data or a string to a Data or string in one of the EncodeFormats.
*
* @param containerType What type to return the decoded data as. Only supports "string" currently.
* @param format The format of the input data. Can be "base64" or "hex".
* @param sourceString The raw (encoded) data to decode.
*
* @return String which contains the decoded version of source.
*
* @see love.data.encode
*/
std::string decode(const std::string& containerType, const std::string& format, const std::string& sourceString);
/**
* Compute the message digest of specified string with specified algorithm.
*

View File

@ -344,6 +344,8 @@ script::script(const std::string& file) {
chai.add(fun<std::string, data, const std::string&, int>(&data::compress), "compress");
chai.add(fun(&data::decompress), "decompress");
chai.add(fun(&data::hash), "hash");
chai.add(fun(&data::encode), "encode");
chai.add(fun(&data::decode), "decode");
// Ensure the love namespace is imported and ready.
chai.import("love");

View File

@ -14,3 +14,23 @@ assert_equal(md5Hash, "b10a8db164e0754105b7a99be72e3fe5", "love.data.hash('md5')
// hash(sha1)
var sha1Hash = love.data.hash("sha1", "Hello World")
assert_equal(sha1Hash, "0a4d55a8d778e5022fab701977c5d840bbc486d0", "love.data.hash('sha1')")
// encode(base64)
var decodedString = "any carnal pleasure"
var encodedString = "YW55IGNhcm5hbCBwbGVhc3VyZQ=="
var encodeResult = love.data.encode("string", "base64", decodedString)
assert_equal(encodeResult, encodedString, "love.data.encode('base64')")
// decode(base64)
var decodeResult = love.data.decode("string", "base64", encodedString)
assert_equal(decodeResult, decodedString, "love.data.decode('base64')")
// encode(hex)
var dehexedString = "Hello World"
var hexedString = "48656c6c6f20576f726c64"
var hexResult = love.data.encode("string", "hex", dehexedString)
assert_equal(hexResult, hexedString, "love.data.encode('hex')")
// decode(hex)
var dedexResult = love.data.decode("string", "hex", hexedString)
assert_equal(dedexResult, dehexedString, "love.data.decode('hex')")

1
vendor/cppcodec vendored Submodule

@ -0,0 +1 @@
Subproject commit 302dc28f8fd5c8bf2ea8d7212aed3be884d5d166