start an ecore_config overhaul - things will break, but overall we will be happy

step 1) start abstraction of read/write to eet file - this will be moved to handlers and [en|de]coders shortly - lists will follow this
this breaks current .eet config files, but the API remains the same


SVN revision: 15182
This commit is contained in:
handyande 2005-06-07 20:08:16 +00:00 committed by handyande
parent 990a827101
commit 2ccfb66cc7
4 changed files with 121 additions and 262 deletions

View File

@ -83,7 +83,7 @@ _ecore_config_db_keys_get(Ecore_Config_DB_File *db, int *num_ret)
return keys;
}
char *
Ecore_Config_Type
_ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key)
{
char *data;
@ -95,23 +95,25 @@ _ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key)
if (size <= 2)
{
free(data);
return NULL;
return PT_NIL;
}
if (data[size - 1] != 0)
{
free(data);
return NULL;
return PT_NIL;
}
return data;
return (Ecore_Config_Type) data[0];
}
return NULL;
return PT_NIL;
}
int
_ecore_config_db_key_int_get(Ecore_Config_DB_File *db, const char *key, int *dest)
_ecore_config_db_read(Ecore_Config_DB_File *db, const char *key)
{
char *data;
char *data, *value;
int size;
Ecore_Config_Prop *prop;
Ecore_Config_Type type;
data = eet_read(db->ef, (char*)key, &size);
if (data)
@ -137,90 +139,48 @@ _ecore_config_db_key_int_get(Ecore_Config_DB_File *db, const char *key, int *des
return 0;
}
prev_locale = setlocale(LC_NUMERIC, "C");
*dest = atoi(data + l + 1);
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
type = data[0];
value = data + l + 1;
prop = ecore_config_get(key);
switch (type)
{
case PT_INT:
case PT_BLN:
{
int tmp;
prev_locale = setlocale(LC_NUMERIC, "C");
tmp = atoi(value);
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
ecore_config_typed_set(key, (void *)&tmp, type);
break;
}
case PT_FLT:
{
float tmp;
prev_locale = setlocale(LC_NUMERIC, "C");
tmp = atof(value);
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
ecore_config_typed_set(key, (void *)&tmp, type);
break;
}
case PT_STR:
case PT_RGB:
case PT_THM:
ecore_config_typed_set(key, (void *)value, type);
break;
default:
E(0, "Type %d not handled\n", type);
}
free(data);
return 1;
}
return 0;
}
int
_ecore_config_db_key_float_get(Ecore_Config_DB_File *db, const char *key, double *dest)
{
char *data;
int size;
data = eet_read(db->ef, (char*)key, &size);
if (data)
{
int l;
char *prev_locale;
if (size <= 2)
{
free(data);
return 0;
}
if (data[size - 1] != 0)
{
free(data);
return 0;
}
/* "type" NIL "1242.4234" NIL */
l = strlen(data);
if (l >= (size - 1))
{
free(data);
return 0;
}
prev_locale = setlocale(LC_NUMERIC, "C");
*dest = atof(data + l + 1);
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
free(data);
return 1;
}
return 0;
}
char *
_ecore_config_db_key_str_get(Ecore_Config_DB_File *db, const char *key)
{
char *data;
int size;
data = eet_read(db->ef, (char*)key, &size);
if (data)
{
int l;
char *s;
if (size <= 2)
{
free(data);
return NULL;
}
if (data[size - 1] != 0)
{
free(data);
return NULL;
}
/* "type" NIL "string goes here" NIL */
l = strlen(data);
if (l >= (size - 1))
{
free(data);
return NULL;
}
s = strdup(data + l + 1);
free(data);
return s;
}
return NULL;
}
/*
void *
_ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *size_ret)
{
@ -243,7 +203,7 @@ _ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *si
free(data);
return NULL;
}
/* "type" NIL data_goes_here NIL */
* "type" NIL data_goes_here NIL *
l = strlen(data);
if (l >= (size - 1))
{
@ -257,65 +217,70 @@ _ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *si
return dat;
}
return NULL;
}
}*/
void
_ecore_config_db_key_int_set(Ecore_Config_DB_File *db, const char *key, int val)
_ecore_config_db_write(Ecore_Config_DB_File *db, const char *key)
{
char buf[256];
int num;
char *prev_locale;
Ecore_Config_Prop *prop;
Ecore_Config_Type type;
prev_locale = setlocale(LC_NUMERIC, "C");
num = snprintf(buf, sizeof(buf), "%s %i ", "int", val);
type = ecore_config_get(key)->type;
prev_locale = setlocale(LC_NUMERIC, "C");
switch (type)
{
case PT_INT:
num = snprintf(buf, sizeof(buf), "%c %i ", (char) type,
ecore_config_int_get(key));
break;
case PT_BLN:
num = snprintf(buf, sizeof(buf), "%c %i ", (char) type,
ecore_config_int_get(key));
break;
case PT_FLT:
num = snprintf(buf, sizeof(buf), "%c %16.16f ", (char) type,
ecore_config_float_get(key));
break;
case PT_STR:
num = snprintf(buf, sizeof(buf), "%c %s ", (char) type,
ecore_config_string_get(key));
break;
case PT_THM:
num = snprintf(buf, sizeof(buf), "%c %s ", (char) type,
ecore_config_theme_get(key));
break;
case PT_RGB:
num = snprintf(buf, sizeof(buf), "%c %s ", (char) type,
ecore_config_argbstr_get(key));
break;
default:
E(0, "Type %d not handled\n", type);
}
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
buf[3] = 0;
buf[1] = 0;
buf[num - 1] = 0;
eet_write(db->ef, (char*)key, buf, num, 1);
}
void
_ecore_config_db_key_float_set(Ecore_Config_DB_File *db, const char *key, double val)
{
char buf[256];
int num;
char *prev_locale;
prev_locale = setlocale(LC_NUMERIC, "C");
num = snprintf(buf, sizeof(buf), "%s %16.16f ", "float", val);
if (prev_locale) setlocale(LC_NUMERIC, prev_locale);
buf[5] = 0;
buf[num - 1] = 0;
eet_write(db->ef, (char*)key, buf, num, 1);
}
void
_ecore_config_db_key_str_set(Ecore_Config_DB_File *db, const char *key, char *str)
{
char *buf;
int num;
num = 3 + 1 + strlen(str) + 1;
buf = malloc(num);
if (!buf) return;
strcpy(buf, "str");
strcpy(buf + 4, str);
eet_write(db->ef, (char*)key, buf, num, 1);
free(buf);
}
/*
void
_ecore_config_db_key_data_set(Ecore_Config_DB_File *db, const char *key, void *data, int data_size)
{
char *buf;
int num;
num = 3 + 1 + data_size + 1;
num = 1 + 1 + data_size + 1;
buf = malloc(num);
if (!buf) return;
strcpy(buf, "data");
memcpy(buf + 5, data, data_size);
buf[0] = (char) PT_BIN;
buf[1] = 0;
memcpy(buf + 2, data, data_size);
buf[num - 1] = 0;
eet_write(db->ef, (char*)key, buf, num, 1);
free(buf);
}
}*/

View File

@ -54,7 +54,8 @@ _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long se
int key_count, x;
estring *s;
int f;
char buf[PATH_MAX], *p, *type, *data;
char buf[PATH_MAX], *p, *data;
Ecore_Config_Type type;
db = NULL;
s = estring_new(8192);
@ -77,33 +78,30 @@ _ecore_config_ipc_global_prop_list(Ecore_Config_Server * srv __UNUSED__, long se
for (x = 0; x < key_count; x++)
{
type = _ecore_config_db_key_type_get(db, keys[x]);
if (!type) type = strdup("?");
if (!strcmp(type, "int"))
estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
else if (!strcmp(type, "float"))
estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
else if (!strcmp(type, "str"))
switch (type)
{
data = _ecore_config_db_key_str_get(db, keys[x]);
if (data)
{
if (ecore_config_type_guess(keys[x], data) == PT_RGB)
estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
else
estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
free(data);
}
else
{
estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
}
case PT_INT:
estring_appendf(s, "%s%s: integer", f ? "\n" : "", keys[x]);
break;
case PT_BLN:
estring_appendf(s, "%s%s: boolean", f ? "\n" : "", keys[x]);
break;
case PT_FLT:
estring_appendf(s, "%s%s: float", f ? "\n" : "", keys[x]);
break;
case PT_STR:
estring_appendf(s, "%s%s: string", f ? "\n" : "", keys[x]);
break;
case PT_RGB:
estring_appendf(s, "%s%s: colour", f ? "\n" : "", keys[x]);
break;
case PT_THM:
estring_appendf(s, "%s%s: theme", f ? "\n" : "", keys[x]);
break;
default:
estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
continue;
}
else
{
estring_appendf(s, "%s%s: unknown", f ? "\n" : "", keys[x]);
continue;
}
if (type) free(type);
f = 1;
}
}

View File

@ -21,14 +21,7 @@ Ecore_Config_DB_File *_ecore_config_db_open_read(const char *file);
Ecore_Config_DB_File *_ecore_config_db_open_write(const char *file);
void _ecore_config_db_close(Ecore_Config_DB_File *db);
char **_ecore_config_db_keys_get(Ecore_Config_DB_File *db, int *num_ret);
char *_ecore_config_db_key_type_get(Ecore_Config_DB_File *db, const char *key);
int _ecore_config_db_key_int_get(Ecore_Config_DB_File *db, const char *key, int *dest);
int _ecore_config_db_key_float_get(Ecore_Config_DB_File *db, const char *key, double *dest);
char *_ecore_config_db_key_str_get(Ecore_Config_DB_File *db, const char *key);
void *_ecore_config_db_key_data_get(Ecore_Config_DB_File *db, const char *key, int *size_ret);
void _ecore_config_db_key_int_set(Ecore_Config_DB_File *db, const char *key, int val);
void _ecore_config_db_key_float_set(Ecore_Config_DB_File *db, const char *key, double val);
void _ecore_config_db_key_str_set(Ecore_Config_DB_File *db, const char *key, char *str);
void _ecore_config_db_key_data_set(Ecore_Config_DB_File *db, const char *key, void *data, int data_size);
int _ecore_config_db_read(Ecore_Config_DB_File *db, const char *key);
void _ecore_config_db_write(Ecore_Config_DB_File *db, const char *key);
#endif

View File

@ -57,14 +57,13 @@ ecore_config_file_load(const char *file)
Ecore_Config_DB_File *db;
char **keys;
int key_count;
double ftmp;
int x, pt;
int itmp;
double ftmp;
char *type;
Ecore_Config_Type type;
char *data;
db = NULL;
type = NULL;
data = NULL;
db = _ecore_config_db_open_read(file);
@ -79,72 +78,7 @@ ecore_config_file_load(const char *file)
{
for (x = 0; x < key_count; x++)
{
type = _ecore_config_db_key_type_get(db, keys[x]);
if (!type) type = strdup("?");
if (!strcmp(type, "int"))
{
if (_ecore_config_db_key_int_get(db, keys[x], &itmp))
{
Ecore_Config_Prop *p;
pt = PT_INT;
if ((p = ecore_config_get(keys[x]))) pt = p->type;
switch (pt)
{
case PT_BLN:
ecore_config_boolean_set(keys[x], itmp);
break;
default:
ecore_config_int_set(keys[x], itmp);
break;
}
}
else
{
E(0, "Could not read key %s!\n", keys[x]);
}
}
else if (!strcmp(type, "float"))
{
if (_ecore_config_db_key_float_get(db, keys[x], &ftmp))
{
ecore_config_float_set(keys[x], ftmp);
}
else
{
E(0, "Could not read key %s!\n", keys[x]);
}
}
else if (!strcmp(type, "str"))
{
data = _ecore_config_db_key_str_get(db, keys[x]);
if (data)
{
pt = ecore_config_type_guess(keys[x], data);
switch (pt)
{
case PT_RGB:
ecore_config_argb_set(keys[x], data);
break;
case PT_THM:
ecore_config_theme_set(keys[x], data);
break;
default:
ecore_config_string_set(keys[x], data);
}
free(data);
}
else
{
E(0, "Could not read key %s!\n", keys[x]);
}
}
else
{
E(1, "Unexpected type: %s\n", type);
continue;
}
if (type) free(type);
_ecore_config_db_read(db, keys[x]);
}
}
_ecore_config_db_close(db);
@ -194,7 +128,6 @@ ecore_config_file_save(const char *file)
Ecore_Config_Prop *next;
Ecore_Config_DB_File *db;
struct stat status;
char *tmp;
next = __ecore_config_bundle_local->data;
db = NULL;
@ -222,37 +155,7 @@ ecore_config_file_save(const char *file)
continue;
}
tmp = NULL;
switch (next->type)
{
case PT_INT:
_ecore_config_db_key_int_set(db, next->key, ecore_config_int_get(next->key));
break;
case PT_BLN:
_ecore_config_db_key_int_set(db, next->key, ecore_config_boolean_get(next->key));
break;
case PT_FLT:
_ecore_config_db_key_float_set(db, next->key, ecore_config_float_get(next->key));
break;
case PT_RGB:
tmp = ecore_config_argbstr_get(next->key);
break;
case PT_STR:
tmp = ecore_config_string_get(next->key);
break;
case PT_THM:
tmp = ecore_config_theme_get(next->key);
break;
case PT_NIL:
/* currently we do nothing for undefined ojects */
break;
}
if (tmp) {
_ecore_config_db_key_str_set(db, next->key, tmp);
free(tmp);
}
_ecore_config_db_write(db, next->key);
next = next->next;
}