EFL メモ(EFL memo)

EFL のメモ用、Tizen もあるよ。(Memo for EFL, Sometimes Tizen )

eet のシリアライズを試す

eet でデータのシリアライズを試します。

必要ライブラリ

  • eina
  • eet

ソースコード

ソースコードEet: Simple data example を参考にして以下のように作りました。全関数を main 内に移動しただけです。

/*
  LC_ALL=C gcc -o sample -O2 -g -Wall `pkg-config --cflags --libs eet` sample.c
 */
#include <stdio.h>
#include <Eet.h>

typedef struct {
    unsigned int version;
    const char *name;
    int id;
    int not_saved_value;
    Eina_Bool enabled;
} My_Conf_Type;

static const char MY_CONF_FILE_ENTRY[] = "config";

static Eet_Data_Descriptor * _my_conf_descriptor;

int main(int argc, char **argv) {
   int ret = 0;
   My_Conf_Type *my_conf;
   Eet_Data_Descriptor_Class eddc;   
   Eet_File *ef;

   if(argc != 3) {
      EINA_LOG_ERR("usage:%s input output\n", argv[0]);
      return 1;
   }

   eina_init();
   eet_init();

   /* set Descriptor */
   EET_EINA_STREAM_DATA_DESCRIPTOR_CLASS_SET(&eddc, My_Conf_Type);
   _my_conf_descriptor = eet_data_descriptor_stream_new(&eddc);
#define MY_CONF_ADD_BASIC(member, eet_type)                             \
   EET_DATA_DESCRIPTOR_ADD_BASIC                                        \
       (_my_conf_descriptor, My_Conf_Type, # member, member, eet_type)
   MY_CONF_ADD_BASIC(version, EET_T_UINT);
   MY_CONF_ADD_BASIC(name, EET_T_STRING);
   MY_CONF_ADD_BASIC(id, EET_T_INT);
   MY_CONF_ADD_BASIC(enabled, EET_T_UCHAR);
#undef MY_CONF_ADD_BASIC

   /* load eet file or create eet file */
   ef = eet_open(argv[1], EET_FILE_MODE_READ);
   if(ef) {
      my_conf = eet_data_read(ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY);
      if(my_conf->version < 0x112233) {
         my_conf->version = 0x112233;
         my_conf->enabled = EINA_TRUE;
      }
      eet_close(ef);
   } else {
      my_conf = calloc(1, sizeof(My_Conf_Type));
      my_conf->version = 0x112233;
      my_conf->enabled = EINA_TRUE;
   }

   printf("My_Conf_Type:\n"
          "\tversion: %#x\n"
          "\tname...: '%s'\n"
          "\tid.....: %d\n"
          "\tenabled: %hhu\n",
          my_conf->version,
          my_conf->name ? my_conf->name : "",
          my_conf->id,
          my_conf->enabled);

   /* write to eet file  */
   ef = eet_open(argv[2], EET_FILE_MODE_WRITE);
   if(!ef) {
      EINA_LOG_ERR("Could not open '%s' for write\n", argv[2]);
      return 3; 
   }
   ret = eet_data_write(ef, _my_conf_descriptor, MY_CONF_FILE_ENTRY, my_conf,
                        EINA_TRUE);
   eet_close(ef);
   if(ret) {
      ret = 4;
   }

   free(my_conf);

   eet_data_descriptor_free(_my_conf_descriptor);
   eet_shutdown();
   eina_shutdown();
   return ret;
}

コンパイル方法

上記ソースコードを sample.c で保存し、sample コマンドを作成します。

% gcc -o sample -O2 -g -Wall `pkg-config --cflags --libs eet` sampile.c

実行方法

sample コマンドは 第一引数の eet ファイルを 第二引数の eet ファイルへコピーするコマンドです。
第一引数の eet ファイルが sample ファイルで定めた eet ファイルではない場合、あるいはファイルが存在しない場合は新規に第二引数の eet ファイルを生成します。

sample コマンドで eet ファイルの新規作成

以下のように sample コマンドを実行すると sample0.eet ファイルが生成されます。

% ./sample /dev/null sample0.eet
My_Conf_Type:
	version: 0x112233
	name...: ''
	id.....: 0
	enabled: 1
% ls -l sample0.eet
-rw------- 1 naruto naruto 199 2010-08-08 00:15 sample0.eet
eet コマンドで eet ファイルの閲覧

eet ファイルの中身を eet コマンドで見てみましょう。 -l オプションでその eet ファイルが持っているキーの一覧を表示します。

% eet -l sample0.eet
config

sample0.eet は config という名の key しかもっていません。

value を見るには -d オプションで見ることができます。

% eet -d sample0.eet config /dev/stdout
group "My_Conf_Type" struct {
    value "version" uint: 1122867;
    value "id" int: 0;
    value "enabled" uchar: 1;
}

version には 0x11223344、id に 0, enable に 1 がはいっていることが分かります。

eet コマンドで eet ファイルの編集

eet ファイルを編集して sample コマンドの実行結果が変更するかかくにんします。

eet の -e オプションにてファイルの編集(正確には key,value の挿入、編集)が可能です。

value 値はテキストファイル経由でしか設定できないため、一旦 value をテキストファイルに落とします。

% eet -d sample0.eet config ./value.txt

value.txt を以下のように編集します。id を 12345 に変更、name を "eet test" として新規追加しました。

group "My_Conf_Type" struct {
    value "version" uint: 1122867;
    value "id" int: 12345;
    value "enabled" uchar: 1;
    value "name" string: "eet test";
}

config キーに value.txt の値を入れます。

% eet -e ./sample0.eet config ./value.txt 0

sample コマンドで sample1.eet を生成し、sample1.eet の config の value を見てみます。

% ./sample ./sample0.eet ./sample1.eet
My_Conf_Type:
	version: 0x112233
	name...: 'eet test'
	id.....: 12345
	enabled: 1
% eet -d sample1.eet config /dev/stdout
group "My_Conf_Type" struct {
    value "version" uint: 1122867;
    value "name" string: "eet test";
    value "id" int: 12345;
    value "enabled" uchar: 1;
}

id の変更と name の追加が確認できました。

その他

eet コマンドの Usage を載せておきます。

% eet -h
Usage:
  eet -l FILE.EET				     list all keys in FILE.EET
  eet -x FILE.EET KEY OUT-FILE [CRYPTO_KEY]          extract data stored in KEY in FILE.EET and write to OUT-FILE
  eet -d FILE.EET KEY OUT-FILE [CRYPTO_KEY]          extract and decode data stored in KEY in FILE.EET and write to OUT-FILE
  eet -i FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY]  insert data to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it
  eet -e FILE.EET KEY IN-FILE COMPRESS [CRYPTO_KEY]  insert and encode to KEY in FILE.EET from IN-FILE and if COMPRESS is 1, compress it
  eet -r FILE.EET KEY                                remove KEY in FILE.EET
  eet -c FILE.EET                                    report and check the signature information of an eet file
  eet -s FILE.EET PRIVATE_KEY PUBLIC_KEY             sign FILE.EET with PRIVATE_KEY and attach PUBLIC_KEY as it's certificate

次回予告

というわけで、簡単なデータのシリアライズ方法について記述しました。
次回は構造体内で構造体を宣言しているものや内部でリスト(Eina_List)を持った場合のシリアライズ方法について記述する予定です。

追記(2011-01-11)

eyelight(EFL でつくったプレゼンソフト)の作者が eet のデータのシリアライズについて書いていた人がいるので追記しておきます。

404 Not Found