00001
00002
00003
00004 #include <Eina.h>
00005 #include <Eet.h>
00006 #include <stdio.h>
00007 #include <limits.h>
00008 #include <sys/types.h>
00009 #include <sys/stat.h>
00010 #include <unistd.h>
00011
00012
00013
00014
00015
00016
00017 typedef struct
00018 {
00019 unsigned int version;
00020 const char *name;
00021 int id;
00022 int not_saved_value;
00023 Eina_Bool enabled;
00024 } My_Conf_Type;
00025
00026
00027
00028
00029 static const char MY_CONF_FILE_ENTRY[] = "config";
00030
00031
00032
00033
00034 static Eet_Data_Descriptor *_my_conf_descriptor;
00035
00036 static void
00037 _my_conf_descriptor_init(void)
00038 {
00039 Eet_Data_Descriptor_Class eddc;
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, My_Conf_Type);
00054 _my_conf_descriptor = eet_data_descriptor_stream_new(&eddc);
00055
00056
00057
00058 #define MY_CONF_ADD_BASIC(member, eet_type) \
00059 EET_DATA_DESCRIPTOR_ADD_BASIC \
00060 (_my_conf_descriptor, My_Conf_Type, # member, member, eet_type)
00061
00062 MY_CONF_ADD_BASIC(version, EET_T_UINT);
00063 MY_CONF_ADD_BASIC(name, EET_T_STRING);
00064 MY_CONF_ADD_BASIC(id, EET_T_INT);
00065 MY_CONF_ADD_BASIC(enabled, EET_T_UCHAR);
00066
00067 #undef MY_CONF_ADD_BASIC
00068 }
00069
00070 static void
00071 _my_conf_descriptor_shutdown(void)
00072 {
00073 eet_data_descriptor_free(_my_conf_descriptor);
00074 }
00075
00076 static My_Conf_Type *
00077 _my_conf_new(void)
00078 {
00079 My_Conf_Type *my_conf = calloc(1, sizeof(My_Conf_Type));
00080 if (!my_conf)
00081 {
00082 fprintf(stderr, "ERROR: could not calloc My_Conf_Type\n");
00083 return NULL;
00084 }
00085
00086 my_conf->version = 0x112233;
00087 my_conf->enabled = EINA_TRUE;
00088 return my_conf;
00089 }
00090
00091 static void
00092 _my_conf_free(My_Conf_Type *my_conf)
00093 {
00094 eina_stringshare_del(my_conf->name);
00095 free(my_conf);
00096 }
00097
00098 static My_Conf_Type *
00099 _my_conf_load(const char *filename)
00100 {
00101 My_Conf_Type *my_conf;
00102 Eet_File *ef = eet_open(filename, EET_FILE_MODE_READ);
00103 if (!ef)
00104 {
00105 fprintf(stderr, "ERROR: could not open '%s' for read\n", filename);
00106 return NULL;
00107 }
00108
00109 my_conf = eet_data_read(ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY);
00110 if (!my_conf)
00111 goto end;
00112
00113 if (my_conf->version < 0x112233)
00114 {
00115 fprintf(stderr,
00116 "WARNING: version %#x was too old, upgrading it to %#x\n",
00117 my_conf->version, 0x112233);
00118
00119 my_conf->version = 0x112233;
00120 my_conf->enabled = EINA_TRUE;
00121 }
00122
00123 end:
00124 eet_close(ef);
00125 return my_conf;
00126 }
00127
00128 static Eina_Bool
00129 _my_conf_save(const My_Conf_Type *my_conf,
00130 const char *filename)
00131 {
00132 char tmp[PATH_MAX];
00133 Eet_File *ef;
00134 Eina_Bool ret;
00135 unsigned int i, len;
00136 struct stat st;
00137
00138 len = eina_strlcpy(tmp, filename, sizeof(tmp));
00139 if (len + 12 >= (int)sizeof(tmp))
00140 {
00141 fprintf(stderr, "ERROR: file name is too big: %s\n", filename);
00142 return EINA_FALSE;
00143 }
00144
00145 i = 0;
00146 do
00147 {
00148 snprintf(tmp + len, 12, ".%u", i);
00149 i++;
00150 }
00151 while (stat(tmp, &st) == 0);
00152
00153 ef = eet_open(tmp, EET_FILE_MODE_WRITE);
00154 if (!ef)
00155 {
00156 fprintf(stderr, "ERROR: could not open '%s' for write\n", tmp);
00157 return EINA_FALSE;
00158 }
00159
00160 ret = eet_data_write
00161 (ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf, EINA_TRUE);
00162 eet_close(ef);
00163
00164 if (ret)
00165 {
00166 unlink(filename);
00167 rename(tmp, filename);
00168 }
00169
00170 return ret;
00171 }
00172
00173 int
00174 main(int argc,
00175 char *argv[])
00176 {
00177 My_Conf_Type *my_conf;
00178 int ret = 0;
00179
00180 if (argc != 3)
00181 {
00182 fprintf(stderr, "Usage:\n\t%s <input> <output>\n\n", argv[0]);
00183 return -1;
00184 }
00185
00186 eina_init();
00187 eet_init();
00188 _my_conf_descriptor_init();
00189
00190 my_conf = _my_conf_load(argv[1]);
00191 if (!my_conf)
00192 {
00193 printf("creating new configuration.\n");
00194 my_conf = _my_conf_new();
00195 if (!my_conf)
00196 {
00197 ret = -2;
00198 goto end;
00199 }
00200 }
00201
00202 printf("My_Conf_Type:\n"
00203 "\tversion: %#x\n"
00204 "\tname...: '%s'\n"
00205 "\tid.....: %d\n"
00206 "\tenabled: %hhu\n",
00207 my_conf->version,
00208 my_conf->name ? my_conf->name : "",
00209 my_conf->id,
00210 my_conf->enabled);
00211
00212 if (!_my_conf_save(my_conf, argv[2]))
00213 ret = -3;
00214
00215 _my_conf_free(my_conf);
00216
00217 end:
00218 _my_conf_descriptor_shutdown();
00219 eet_shutdown();
00220 eina_shutdown();
00221
00222 return ret;
00223 }
00224