* 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:
Cedric BAIL 2010-01-12 12:38:59 +00:00
parent 61f893a3a0
commit f0fd392e9f
5 changed files with 615 additions and 563 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);