forked from enlightenment/efl
* eet: MASSIV REWRITE OF EET_DATA !
Eet_Data now use more common code when doing dump/decode. This provide new functionnality, you can now do a list/array/hash of string. make test/coverage are now passing without problem with 79% of the code covered (mainly need to update test suite for fixed point). This rewrite is also a first for script langage to directly manipulate Eet_Data (more patch comming). It's also a cleanup of the Eet_Node API that could now be used just fine. Note: Previous dump will not be compatible with this update, but Eet_Data will. PS: I did some extensive test here with enlightenment, elementary_test, editje, elixir and eyelight. If you experience any weird behaviour that could be linked with eet_data (well almost anything that use the EFL), please report to me as soon as possible. SVN revision: 45059
This commit is contained in:
parent
61f893a3a0
commit
f0fd392e9f
|
@ -71,6 +71,8 @@ extern "C" {
|
|||
#define EET_G_HASH 104 /**< Hash table group type */
|
||||
#define EET_G_LAST 105 /**< Last group type */
|
||||
|
||||
#define EET_I_LIMIT 128 /**< Other type exist but are reserved for internal purpose. */
|
||||
|
||||
/***************************************************************************/
|
||||
|
||||
typedef enum _Eet_File_Mode
|
||||
|
@ -1491,6 +1493,12 @@ eet_dictionary_string_check * example: values), and @p type is the basic data
|
|||
EAPI Eet_Node *eet_node_hash_new(const char *name, const char *key, Eet_Node *node);
|
||||
EAPI Eet_Node *eet_node_struct_new(const char *name, Eina_List *nodes);
|
||||
EAPI Eet_Node *eet_node_struct_child_new(const char *parent, Eet_Node *child);
|
||||
|
||||
EAPI void eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child);
|
||||
EAPI void eet_node_struct_append(Eet_Node *parent, const char *name, Eet_Node *child);
|
||||
EAPI void eet_node_hash_add(Eet_Node *parent, const char *name, const char *key, Eet_Node *child);
|
||||
|
||||
EAPI void eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const char *str), void *dumpdata);
|
||||
EAPI void eet_node_del(Eet_Node *n);
|
||||
|
||||
EAPI void *eet_data_node_encode_cipher(Eet_Node *node, const char *key, int *size_ret);
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -185,12 +185,106 @@ eet_node_struct_child_new(const char *parent, Eet_Node *child)
|
|||
return n;
|
||||
}
|
||||
|
||||
void
|
||||
eet_node_list_append(Eet_Node *parent, const char *name, Eet_Node *child)
|
||||
{
|
||||
const char *tmp;
|
||||
Eet_Node *nn;
|
||||
|
||||
tmp = eina_stringshare_add(name);
|
||||
|
||||
for (nn = parent->values; nn; nn = nn->next)
|
||||
if (nn->name == tmp && nn->type == EET_G_LIST)
|
||||
{
|
||||
Eet_Node *n;
|
||||
|
||||
if (!nn->values) nn->values = child;
|
||||
else
|
||||
{
|
||||
for (n = nn->values; n->next; n = n->next)
|
||||
;
|
||||
n->next = child;
|
||||
}
|
||||
child->next = NULL;
|
||||
|
||||
eina_stringshare_del(tmp);
|
||||
|
||||
return ;
|
||||
}
|
||||
|
||||
/* No list found, so create it. */
|
||||
nn = eet_node_list_new(tmp, eina_list_append(NULL, child));
|
||||
|
||||
/* And add it to the parent. */
|
||||
nn->next = parent->values;
|
||||
parent->values = nn;
|
||||
|
||||
eina_stringshare_del(tmp);
|
||||
}
|
||||
|
||||
void
|
||||
eet_node_struct_append(Eet_Node *parent, const char *name, Eet_Node *child)
|
||||
{
|
||||
const char *tmp;
|
||||
Eet_Node *prev;
|
||||
Eet_Node *nn;
|
||||
|
||||
if (parent->type != EET_G_UNKNOWN)
|
||||
{
|
||||
ERR("[%s] is not a structure. Will not insert [%s] in it", parent->name, name);
|
||||
eet_node_del(child);
|
||||
return ;
|
||||
}
|
||||
|
||||
tmp = eina_stringshare_add(name);
|
||||
|
||||
for (prev = NULL, nn = parent->values; nn; prev = nn, nn = nn->next)
|
||||
if (nn->name == tmp && nn->type == child->type)
|
||||
{
|
||||
if (prev) prev->next = nn->next;
|
||||
else parent->values = nn->next;
|
||||
|
||||
nn->next = NULL;
|
||||
eet_node_del(nn);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if (prev)
|
||||
{
|
||||
prev->next = child;
|
||||
child->next = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
child->next = NULL;
|
||||
parent->values = child;
|
||||
}
|
||||
|
||||
eina_stringshare_del(tmp);
|
||||
}
|
||||
|
||||
void
|
||||
eet_node_hash_add(Eet_Node *parent, const char *name, const char *key, Eet_Node *child)
|
||||
{
|
||||
Eet_Node *nn;
|
||||
|
||||
/* No list found, so create it. */
|
||||
nn = eet_node_hash_new(name, key, child);
|
||||
|
||||
/* And add it to the parent. */
|
||||
nn->next = parent->values;
|
||||
parent->values = nn;
|
||||
}
|
||||
|
||||
void
|
||||
eet_node_del(Eet_Node *n)
|
||||
{
|
||||
Eet_Node *nn;
|
||||
Eet_Node *tmp;
|
||||
|
||||
if (!n) return ;
|
||||
|
||||
switch (n->type)
|
||||
{
|
||||
case EET_G_HASH:
|
||||
|
@ -226,7 +320,6 @@ eet_node_del(Eet_Node *n)
|
|||
free(n);
|
||||
}
|
||||
|
||||
|
||||
static const char *eet_node_dump_g_name[6] = {
|
||||
"struct",
|
||||
"array",
|
||||
|
@ -270,23 +363,22 @@ eet_node_string_escape(const char *str)
|
|||
{
|
||||
if (*strp == '\"') sz += 2;
|
||||
else if (*strp == '\\') sz += 2;
|
||||
else if (*strp == '\n') sz += 2;
|
||||
else sz += 1;
|
||||
}
|
||||
s = malloc(sz + 1);
|
||||
if (!s) return NULL;
|
||||
for (strp = str, sp = s; *strp; strp++, sp++)
|
||||
{
|
||||
if (*strp == '\"')
|
||||
if (*strp == '\"'
|
||||
|| *strp == '\\'
|
||||
|| *strp == '\n')
|
||||
{
|
||||
*sp = '\\';
|
||||
sp++;
|
||||
}
|
||||
else if (*strp == '\\')
|
||||
{
|
||||
*sp = '\\';
|
||||
sp++;
|
||||
}
|
||||
*sp = *strp;
|
||||
if (*strp == '\n') *sp = 'n';
|
||||
else *sp = *strp;
|
||||
}
|
||||
*sp = 0;
|
||||
return s;
|
||||
|
@ -312,7 +404,7 @@ eet_node_dump_simple_type(Eet_Node *n, int level,
|
|||
char tbuf[256];
|
||||
|
||||
eet_node_dump_level(level, dumpfunc, dumpdata);
|
||||
dumpfunc(dumpdata, " value \"");
|
||||
dumpfunc(dumpdata, "value \"");
|
||||
eet_node_dump_string_escape(dumpdata, dumpfunc, n->name);
|
||||
dumpfunc(dumpdata, "\" ");
|
||||
|
||||
|
@ -383,7 +475,7 @@ static void
|
|||
eet_node_dump_group_end(int level, void (*dumpfunc) (void *data, const char *str), void *dumpdata)
|
||||
{
|
||||
eet_node_dump_level(level, dumpfunc, dumpdata);
|
||||
dumpfunc(dumpdata, " }\n");
|
||||
dumpfunc(dumpdata, "}\n");
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -400,7 +492,7 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch
|
|||
case EET_G_UNKNOWN:
|
||||
case EET_G_HASH:
|
||||
case EET_G_LIST:
|
||||
eet_node_dump_group_start(dumplevel + 1, dumpfunc, dumpdata, n->type, n->name);
|
||||
eet_node_dump_group_start(dumplevel, dumpfunc, dumpdata, n->type, n->name);
|
||||
|
||||
if (n->type == EET_G_VAR_ARRAY
|
||||
|| n->type == EET_G_ARRAY)
|
||||
|
@ -437,6 +529,7 @@ eet_node_dump(Eet_Node *n, int dumplevel, void (*dumpfunc) (void *data, const ch
|
|||
case EET_T_UCHAR:
|
||||
case EET_T_USHORT:
|
||||
case EET_T_UINT:
|
||||
case EET_T_ULONG_LONG:
|
||||
eet_node_dump_simple_type(n, dumplevel, dumpfunc, dumpdata);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -18,9 +18,15 @@ _eet_str_direct_free(const char *str)
|
|||
(void) str;
|
||||
}
|
||||
|
||||
static void
|
||||
_eet_eina_hash_foreach(void *hash, Eina_Hash_Foreach cb, void *fdata)
|
||||
{
|
||||
if (hash) eina_hash_foreach(hash, cb, fdata);
|
||||
}
|
||||
|
||||
/* Internal wrapper for eina_hash */
|
||||
Eina_Hash*
|
||||
eet_eina_hash_add(Eina_Hash *hash, const char *key, const void *data)
|
||||
static Eina_Hash*
|
||||
_eet_eina_hash_add(Eina_Hash *hash, const char *key, const void *data)
|
||||
{
|
||||
if (!hash) hash = eina_hash_string_superfast_new(NULL);
|
||||
if (!hash) return NULL;
|
||||
|
@ -29,6 +35,12 @@ eet_eina_hash_add(Eina_Hash *hash, const char *key, const void *data)
|
|||
return hash;
|
||||
}
|
||||
|
||||
static void
|
||||
_eet_eina_hash_free(Eina_Hash *hash)
|
||||
{
|
||||
if (hash) eina_hash_free(hash);
|
||||
}
|
||||
|
||||
void
|
||||
eet_test_setup_eddc(Eet_Data_Descriptor_Class *eddc)
|
||||
{
|
||||
|
@ -41,9 +53,9 @@ eet_test_setup_eddc(Eet_Data_Descriptor_Class *eddc)
|
|||
eddc->func.list_append = (void*) eina_list_append;
|
||||
eddc->func.list_data = (void*) eina_list_data_get;
|
||||
eddc->func.list_free = (void*) eina_list_free;
|
||||
eddc->func.hash_foreach = (void*) eina_hash_foreach;
|
||||
eddc->func.hash_add = (void*) eet_eina_hash_add;
|
||||
eddc->func.hash_free = (void*) eina_hash_free;
|
||||
eddc->func.hash_foreach = (void*) _eet_eina_hash_foreach;
|
||||
eddc->func.hash_add = (void*) _eet_eina_hash_add;
|
||||
eddc->func.hash_free = (void*) _eet_eina_hash_free;
|
||||
eddc->func.str_direct_alloc = (void*) _eet_str_direct_alloc;
|
||||
eddc->func.str_direct_free = (void*) _eet_str_direct_free;
|
||||
}
|
||||
|
|
|
@ -238,7 +238,7 @@ START_TEST(eet_test_basic_data_type_encoding_decoding)
|
|||
eddc.name = "Eet_Test_Basic_Type";
|
||||
eddc.size = sizeof(Eet_Test_Basic_Type);
|
||||
|
||||
edd = eet_data_descriptor2_new(&eddc);
|
||||
edd = eet_data_descriptor_stream_new(&eddc);
|
||||
fail_if(!edd);
|
||||
|
||||
_eet_build_basic_descriptor(edd);
|
||||
|
@ -310,7 +310,7 @@ _eet_build_ex_descriptor(Eet_Data_Descriptor *edd)
|
|||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Basic_Type";
|
||||
eddc.size = sizeof(Eet_Test_Basic_Type);
|
||||
eddb = eet_data_descriptor3_new(&eddc);
|
||||
eddb = eet_data_descriptor_file_new(&eddc);
|
||||
fail_if(!eddb);
|
||||
|
||||
_eet_build_basic_descriptor(eddb);
|
||||
|
@ -517,7 +517,7 @@ START_TEST(eet_test_data_type_encoding_decoding)
|
|||
eddc.name = "Eet_Test_Ex_Type";
|
||||
eddc.size = sizeof(Eet_Test_Ex_Type);
|
||||
|
||||
edd = eet_data_descriptor3_new(&eddc);
|
||||
edd = eet_data_descriptor_file_new(&eddc);
|
||||
fail_if(!edd);
|
||||
|
||||
_eet_build_ex_descriptor(edd);
|
||||
|
@ -540,9 +540,9 @@ START_TEST(eet_test_data_type_encoding_decoding)
|
|||
fail_if(strcmp(result->charray[5], "plouf") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
if (result->hash) eina_hash_foreach(result->hash, func, &test);
|
||||
fail_if(test != 0);
|
||||
eina_hash_foreach(result->ihash, func7, &test);
|
||||
if (result->ihash) eina_hash_foreach(result->ihash, func7, &test);
|
||||
fail_if(test != 0);
|
||||
|
||||
eet_shutdown();
|
||||
|
@ -602,7 +602,7 @@ START_TEST(eet_test_data_type_dump_undump)
|
|||
eddc.name = "Eet_Test_Ex_Type";
|
||||
eddc.size = sizeof(Eet_Test_Ex_Type);
|
||||
|
||||
edd = eet_data_descriptor3_new(&eddc);
|
||||
edd = eet_data_descriptor_file_new(&eddc);
|
||||
fail_if(!edd);
|
||||
|
||||
_eet_build_ex_descriptor(edd);
|
||||
|
@ -614,15 +614,14 @@ START_TEST(eet_test_data_type_dump_undump)
|
|||
eet_data_text_dump(transfert1, size1, append_string, &string1);
|
||||
fail_if(!string1);
|
||||
|
||||
transfert2 = eet_data_text_undump(string1, strlen(string1), &size2);
|
||||
transfert2 = eet_data_text_undump(string1, string1 ? strlen(string1) : 0, &size2);
|
||||
fail_if(!transfert2 && size2 <= 0);
|
||||
fail_if(size1 != size2);
|
||||
|
||||
string2 = NULL;
|
||||
eet_data_text_dump(transfert2, size2, append_string, &string2);
|
||||
fail_if(!string2);
|
||||
|
||||
fail_if(memcmp(transfert1, transfert2, size1) != 0);
|
||||
fail_if(strlen(string2) != strlen(string1));
|
||||
|
||||
result = eet_data_descriptor_decode(edd, transfert2, size2);
|
||||
fail_if(!result);
|
||||
|
@ -638,9 +637,9 @@ START_TEST(eet_test_data_type_dump_undump)
|
|||
fail_if(strcmp(result->charray[0], "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
if (result->hash) eina_hash_foreach(result->hash, func, &test);
|
||||
fail_if(test != 0);
|
||||
eina_hash_foreach(result->ihash, func7, &test);
|
||||
if (result->ihash) eina_hash_foreach(result->ihash, func7, &test);
|
||||
fail_if(test != 0);
|
||||
|
||||
eet_shutdown();
|
||||
|
@ -657,7 +656,7 @@ START_TEST(eet_file_simple_write)
|
|||
|
||||
eet_init();
|
||||
|
||||
mktemp(file);
|
||||
fail_if(!mktemp(file));
|
||||
|
||||
fail_if(eet_mode_get(NULL) != EET_FILE_MODE_INVALID);
|
||||
|
||||
|
@ -744,12 +743,12 @@ START_TEST(eet_file_data_test)
|
|||
eddc.name = "Eet_Test_Ex_Type";
|
||||
eddc.size = sizeof(Eet_Test_Ex_Type);
|
||||
|
||||
edd = eet_data_descriptor3_new(&eddc);
|
||||
edd = eet_data_descriptor_file_new(&eddc);
|
||||
fail_if(!edd);
|
||||
|
||||
_eet_build_ex_descriptor(edd);
|
||||
|
||||
mktemp(file);
|
||||
fail_if(!mktemp(file));
|
||||
|
||||
/* Insert an error in etbt. */
|
||||
etbt.i = 0;
|
||||
|
@ -811,9 +810,9 @@ START_TEST(eet_file_data_test)
|
|||
fail_if(strcmp(result->charray[0], "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
if (result->hash) eina_hash_foreach(result->hash, func, &test);
|
||||
fail_if(test != 0);
|
||||
eina_hash_foreach(result->ihash, func7, &test);
|
||||
if (result->ihash) eina_hash_foreach(result->ihash, func7, &test);
|
||||
fail_if(test != 0);
|
||||
|
||||
list = eet_list(ef, "keys/*", &size);
|
||||
|
@ -878,16 +877,14 @@ START_TEST(eet_file_data_dump_test)
|
|||
memset(&etbt.charray, 0, sizeof(etbt.charray));
|
||||
etbt.charray[0] = "test";
|
||||
|
||||
eet_test_setup_eddc(&eddc);
|
||||
eddc.name = "Eet_Test_Ex_Type";
|
||||
eddc.size = sizeof(Eet_Test_Ex_Type);
|
||||
eet_eina_file_data_descriptor_class_set(&eddc, "Eet_Test_Ex_Type", sizeof(Eet_Test_Ex_Type));
|
||||
|
||||
edd = eet_data_descriptor3_new(&eddc);
|
||||
edd = eet_data_descriptor_file_new(&eddc);
|
||||
fail_if(!edd);
|
||||
|
||||
_eet_build_ex_descriptor(edd);
|
||||
|
||||
mktemp(file);
|
||||
fail_if(!mktemp(file));
|
||||
|
||||
/* Save the encoded data in a file. */
|
||||
ef = eet_open(file, EET_FILE_MODE_WRITE);
|
||||
|
@ -929,9 +926,9 @@ START_TEST(eet_file_data_dump_test)
|
|||
fail_if(strcmp(result->charray[0], "test") != 0);
|
||||
|
||||
test = 0;
|
||||
eina_hash_foreach(result->hash, func, &test);
|
||||
if (result->hash) eina_hash_foreach(result->hash, func, &test);
|
||||
fail_if(test != 0);
|
||||
eina_hash_foreach(result->ihash, func7, &test);
|
||||
if (result->ihash) eina_hash_foreach(result->ihash, func7, &test);
|
||||
fail_if(test != 0);
|
||||
|
||||
fail_if(unlink(file) != 0);
|
||||
|
@ -953,7 +950,7 @@ START_TEST(eet_image)
|
|||
unsigned int w;
|
||||
unsigned int h;
|
||||
|
||||
mktemp(file);
|
||||
fail_if(!mktemp(file));
|
||||
|
||||
/* Save the encoded data in a file. */
|
||||
ef = eet_open(file, EET_FILE_MODE_READ_WRITE);
|
||||
|
@ -1173,7 +1170,7 @@ START_TEST(eet_small_image)
|
|||
|
||||
eet_init();
|
||||
|
||||
mktemp(file);
|
||||
fail_if(!mktemp(file));
|
||||
|
||||
ef = eet_open(file, EET_FILE_MODE_WRITE);
|
||||
fail_if(!ef);
|
||||
|
@ -1215,8 +1212,8 @@ START_TEST(eet_identity_simple)
|
|||
|
||||
eet_init();
|
||||
|
||||
mktemp(file);
|
||||
chdir("src/tests");
|
||||
fail_if(!mktemp(file));
|
||||
fail_if(chdir("src/tests"));
|
||||
|
||||
/* Sign an eet file. */
|
||||
ef = eet_open(file, EET_FILE_MODE_WRITE);
|
||||
|
@ -1279,7 +1276,7 @@ START_TEST(eet_identity_open_simple)
|
|||
|
||||
eet_init();
|
||||
|
||||
chdir("src/tests");
|
||||
fail_if(chdir("src/tests"));
|
||||
|
||||
k = eet_identity_open("cert.pem", "key.pem", NULL);
|
||||
fail_if(!k);
|
||||
|
@ -1296,7 +1293,7 @@ START_TEST(eet_identity_open_pkcs8)
|
|||
|
||||
eet_init();
|
||||
|
||||
chdir("src/tests");
|
||||
fail_if(chdir("src/tests"));
|
||||
|
||||
k = eet_identity_open("cert.pem", "key_enc_none.pem", NULL);
|
||||
fail_if(!k);
|
||||
|
@ -1334,7 +1331,7 @@ START_TEST(eet_identity_open_pkcs8_enc)
|
|||
|
||||
eet_init();
|
||||
|
||||
chdir("src/tests");
|
||||
fail_if(chdir("src/tests"));
|
||||
|
||||
k = eet_identity_open("cert.pem", "key_enc.pem", NULL);
|
||||
fail_if(k);
|
||||
|
@ -1367,8 +1364,8 @@ START_TEST(eet_cipher_decipher_simple)
|
|||
|
||||
eet_init();
|
||||
|
||||
mktemp(file);
|
||||
chdir("src/tests");
|
||||
fail_if(!mktemp(file));
|
||||
fail_if(chdir("src/tests"));
|
||||
|
||||
/* Crypt an eet file. */
|
||||
ef = eet_open(file, EET_FILE_MODE_WRITE);
|
||||
|
|
Loading…
Reference in New Issue