* eet: Add eet_data_node_decode_cipher and eet_data_node_read_cipher.

SVN revision: 45062
This commit is contained in:
Cedric BAIL 2010-01-12 16:50:18 +00:00
parent 793f9f2494
commit 08fd28bfa6
3 changed files with 66 additions and 7 deletions

View File

@ -300,3 +300,4 @@
* Rewrite Eet_Data. Now you can do list/hash/array of strings and all * Rewrite Eet_Data. Now you can do list/hash/array of strings and all
the test suite is passing. the test suite is passing.
* Add eet_data_node_decode_cipher and eet_data_node_read_cipher.

View File

@ -1502,6 +1502,9 @@ eet_dictionary_string_check * example: values), and @p type is the basic data
EAPI void eet_node_del(Eet_Node *n); EAPI void eet_node_del(Eet_Node *n);
EAPI void *eet_data_node_encode_cipher(Eet_Node *node, const char *key, int *size_ret); EAPI void *eet_data_node_encode_cipher(Eet_Node *node, const char *key, int *size_ret);
EAPI void *eet_data_node_decode_cipher(const void *data_in, const char *key, int size_in);
EAPI Eet_Node *eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *key);
EAPI int eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *key, Eet_Node *node, int compress); EAPI int eet_data_node_write_cipher(Eet_File *ef, const char *name, const char *key, Eet_Node *node, int compress);
/***************************************************************************/ /***************************************************************************/

View File

@ -1462,6 +1462,35 @@ eet_data_read_cipher(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name, c
return data_dec; return data_dec;
} }
EAPI Eet_Node *
eet_data_node_read_cipher(Eet_File *ef, const char *name, const char *key)
{
const Eet_Dictionary *ed = NULL;
const void *data = NULL;
Eet_Node *result;
Eet_Free_Context context;
int required_free = 0;
int size;
ed = eet_dictionary_get(ef);
if (!key)
data = eet_read_direct(ef, name, &size);
if (!data)
{
required_free = 1;
data = eet_read_cipher(ef, name, &size, key);
if (!data) return NULL;
}
memset(&context, 0, sizeof (context));
result = _eet_data_descriptor_decode(&context, ed, NULL, data, size);
if (required_free)
free((void*)data);
return result;
}
EAPI void * EAPI void *
eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name) eet_data_read(Eet_File *ef, Eet_Data_Descriptor *edd, const char *name)
{ {
@ -3177,10 +3206,10 @@ eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd,
const char *key, const char *key,
int size_in) int size_in)
{ {
void *deciphered = NULL; void *deciphered = (void*) data_in;
void *ret; void *ret;
Eet_Free_Context context; Eet_Free_Context context;
unsigned int deciphered_len = 0; unsigned int deciphered_len = size_in;
if (key && data_in) if (key && data_in)
{ {
@ -3189,13 +3218,14 @@ eet_data_descriptor_decode_cipher(Eet_Data_Descriptor *edd,
if (deciphered) free(deciphered); if (deciphered) free(deciphered);
return NULL; return NULL;
} }
memset(&context, 0, sizeof (context));
ret = _eet_data_descriptor_decode(&context, NULL, edd, deciphered, deciphered_len);
free(deciphered);
return ret;
} }
memset(&context, 0, sizeof (context)); memset(&context, 0, sizeof (context));
return _eet_data_descriptor_decode(&context, NULL, edd, data_in, size_in); ret = _eet_data_descriptor_decode(&context, NULL, edd, deciphered, deciphered_len);
if (data_in != deciphered) free(deciphered);
return ret;
} }
EAPI void * EAPI void *
@ -3206,6 +3236,31 @@ eet_data_descriptor_decode(Eet_Data_Descriptor *edd,
return eet_data_descriptor_decode_cipher(edd, data_in, NULL, size_in); return eet_data_descriptor_decode_cipher(edd, data_in, NULL, size_in);
} }
EAPI void *
eet_data_node_decode_cipher(const void *data_in, const char *key, int size_in)
{
void *deciphered = (void*) data_in;
Eet_Node *ret;
Eet_Free_Context context;
unsigned int deciphered_len = size_in;
if (key && data_in)
{
if (eet_decipher(data_in, size_in, key, strlen(key), &deciphered, &deciphered_len))
{
if (deciphered) free(deciphered);
return NULL;
}
}
memset(&context, 0, sizeof (context));
ret = _eet_data_descriptor_decode(&context, NULL, NULL, deciphered, deciphered_len);
if (data_in != deciphered) free(deciphered);
return ret;
}
static void * static void *
_eet_data_descriptor_encode(Eet_Dictionary *ed, _eet_data_descriptor_encode(Eet_Dictionary *ed,
Eet_Data_Descriptor *edd, Eet_Data_Descriptor *edd,