2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 #include <Ecore_File.h>
21 #define STORAGE_FILEPATH "/opt/var/.cbhm_data"
22 #define STORAGE_KEY_INDEX_FORMAT "<index%02d>"
23 #define STORAGE_KEY_ITEM_FORMAT "<item%02d%s>"
24 #define STORAGE_INDEX_ITEM_NONE 0.0
26 static Eina_Bool item_write(Eet_File *ef, int index, CNP_ITEM *item);
27 static Eina_Bool item_delete(Eet_File *ef, int index);
28 static Eina_Bool storage_index_write(StorageData *sd, int index);
29 static Eina_Bool storage_item_write(AppData *ad, CNP_ITEM *item);
30 static Eina_Bool storage_item_delete(AppData *ad, CNP_ITEM *item);
31 static Eina_Bool storage_item_update(AppData *ad, CNP_ITEM *item);
32 static CNP_ITEM *storage_item_load(StorageData *sd, int index);
33 //static void dump_items(StorageData *sd);
35 static int getMinIndex(indexType *indexTable, int len)
43 for (i = 1; i < len; i++)
45 if ((min > indexTable[i]))
54 static int getMaxIndex(indexType *indexTable, int len)
57 indexType max = indexTable[i];
59 for (i = 1; i < len; i++)
61 if (max < indexTable[i])
70 StorageData *init_storage(AppData *ad)
73 StorageData *sd = CALLOC(1, sizeof(StorageData));
74 if (!sd) return EINA_FALSE;
79 sd->ef = eet_open(STORAGE_FILEPATH, EET_FILE_MODE_READ_WRITE);
86 int index_order[ITEM_CNT_MAX];
89 indexType temp[ITEM_CNT_MAX];
91 // Initialize index data in file
92 for (i = 0; i < ITEM_CNT_MAX; i++)
94 sd->itemTable[i] = NULL;
95 sd->indexTable[i] = STORAGE_INDEX_ITEM_NONE;
98 // Load index data from file
99 for (i = 0; i < ITEM_CNT_MAX; i++)
101 snprintf(datakey, sizeof(datakey), STORAGE_KEY_INDEX_FORMAT, i);
102 read_data = eet_read(sd->ef, datakey, &read_size);
103 if (read_data && read_size > 0)
104 temp[i] = atol((char *)read_data);
106 temp[i] = STORAGE_INDEX_ITEM_NONE;
110 // Load item data from file
111 for (i = 0, index = 0; i < ITEM_CNT_MAX; i++)
113 int maxIndex = getMaxIndex(temp, ITEM_CNT_MAX);
114 if (temp[maxIndex] == STORAGE_INDEX_ITEM_NONE)
118 sd->itemTable[maxIndex] = storage_item_load(sd, maxIndex);
119 sd->indexTable[maxIndex] = temp[maxIndex];
120 temp[maxIndex] = STORAGE_INDEX_ITEM_NONE;
121 index_order[index] = maxIndex;
126 // Add loaded item to clipboard
129 for (i = index - 1; i >= 0; i--)
132 if (sd->itemTable[j])
133 item_add_by_CNP_ITEM(ad, sd->itemTable[j], EINA_FALSE, EINA_FALSE);
138 DBG("load storage index failed");
142 DBG("storage ef is NULL");
146 ad->storage_item_add = storage_item_write;
147 ad->storage_item_del = storage_item_delete;
148 ad->storage_item_load = storage_item_load;
149 ad->storage_item_update = storage_item_update;
154 void depose_storage(StorageData *sd)
162 ecore_file_shutdown();
165 static void dump_items(StorageData *sd)
169 for (i = 0; i < ITEM_CNT_MAX; i++)
171 CNP_ITEM *item = storage_item_load(sd, i);
173 DBG("item #%d type_index: 0x%x, gitem_style: 0x%x, data: %s\n, len: %d\n, file: %s\n, file_len: %d\n", i, item->type_index, item->gitem_style, (char *)item->data, item->len, (char *)item->file, item->file_len);
178 static Eina_Bool item_write(Eet_File *ef, int index, CNP_ITEM *item)
182 ERR("eet_file is NULL");
191 Eina_Bool ret = EINA_FALSE;
196 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "data");
197 ret = eet_write(ef, datakey, item->data, item->len, 1);
200 if (item->file_len > 0) {
201 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "file");
202 ret &= eet_write(ef, datakey, item->file, item->file_len, 1);
205 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "type_index");
206 snprintf(write_data, sizeof(write_data), "%d", item->type_index);
207 ret &= eet_write(ef, datakey, write_data, strlen(write_data) + 1, 1);
209 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "gitem_style");
210 snprintf(write_data, sizeof(write_data), "%d", item->gitem_style);
211 ret &= eet_write(ef, datakey, write_data, strlen(write_data) + 1, 1);
213 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "locked");
214 snprintf(write_data, sizeof(write_data), "%d", item->locked);
215 ret &= eet_write(ef, datakey, write_data, strlen(write_data) + 1, 1);
218 DBG("write result: %d, item index: %d", ret, index);
223 static Eina_Bool item_delete(Eet_File *ef, int index)
227 ERR("eet_file is NULL");
234 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "data");
235 ret = eet_delete(ef, datakey);
237 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "type_index");
238 ret &= eet_delete(ef, datakey);
240 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "gitem_style");
241 ret &= eet_delete(ef, datakey);
243 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "locked");
244 ret &= eet_delete(ef, datakey);
247 DBG("delete result: %d, item index: %d", ret, index);
252 static Eina_Bool storage_item_update(AppData *ad, CNP_ITEM *item)
255 StorageData *sd = ad->storage;
257 Eina_Bool ret = EINA_FALSE;
268 for (index = 0; index < ITEM_CNT_MAX; index++)
270 temp = sd->itemTable[index];
273 (item->type_index == temp->type_index) &&
274 (!SAFE_STRCMP(item->data, temp->data)))
277 //delete before value.
278 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "locked");
279 ret &= eet_delete(sd->ef, datakey);
282 //rewrite locked value.
283 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "locked");
284 snprintf(write_data, sizeof(write_data), "%d", item->locked);
285 ret &= eet_write(sd->ef, datakey, write_data, strlen(write_data) + 1, 1);
292 static Eina_Bool storage_item_write(AppData *ad, CNP_ITEM *item)
295 StorageData *sd = ad->storage;
297 Eina_Bool ret = EINA_TRUE;
306 for (index = 0; index < ITEM_CNT_MAX; index++)
308 temp = sd->itemTable[index];
311 (item->type_index == temp->type_index) &&
312 (!SAFE_STRCMP(item->data, temp->data)))
316 // Item does not exist in clipboard
317 if (index == ITEM_CNT_MAX)
319 index = getMinIndex(sd->indexTable, ITEM_CNT_MAX);
320 ret = item_write(sd->ef, index, item);
323 sd->indexTable[index] = ecore_time_unix_get();
324 sd->itemTable[index] = item;
325 ret &= storage_index_write(sd, index);
330 static Eina_Bool storage_item_delete(AppData *ad, CNP_ITEM *item)
333 StorageData *sd = ad->storage;
334 Eina_Bool ret = EINA_FALSE;
337 for (index = 0; index < ITEM_CNT_MAX; index++)
339 if (sd->itemTable[index] == item)
343 if (index < ITEM_CNT_MAX)
345 ret = item_delete(sd->ef, index);
346 sd->indexTable[index] = STORAGE_INDEX_ITEM_NONE;
347 sd->itemTable[index] = NULL;
348 ret &= storage_index_write(sd, index);
353 static CNP_ITEM *storage_item_load(StorageData *sd, int index)
357 ERR("eet_file is NULL");
360 if (index >= ITEM_CNT_MAX)
366 CNP_ITEM *item = CALLOC(1, sizeof(CNP_ITEM));
369 ERR("item CALLOC failed");
373 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "data");
374 read_data = eet_read(sd->ef, datakey, &read_size);
377 item->len = read_size;
378 item->data = CALLOC(1, read_size * sizeof(char));
380 memcpy(item->data, read_data, read_size);
391 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "file");
392 read_data = eet_read(sd->ef, datakey, &read_size);
395 item->file_len = read_size;
396 item->file = CALLOC(1, read_size * sizeof(char));
398 memcpy(item->file, read_data, read_size);
403 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "type_index");
404 read_data = eet_read(sd->ef, datakey, &read_size);
406 if ( read_size > 0) {
407 item->type_index = atoi(read_data);
412 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "gitem_style");
413 read_data = eet_read(sd->ef, datakey, &read_size);
415 if ( read_size > 0) {
416 item->gitem_style = atoi(read_data);
421 snprintf(datakey, sizeof(datakey), STORAGE_KEY_ITEM_FORMAT, index, "locked");
422 read_data = eet_read(sd->ef, datakey, &read_size);
425 item->locked = atoi(read_data);
433 static Eina_Bool storage_index_write(StorageData *sd, int index)
442 ERR("eet_file is NULL");
446 snprintf(datakey, sizeof(datakey), STORAGE_KEY_INDEX_FORMAT, index);
447 snprintf(write_data, sizeof(write_data), "%lf", sd->indexTable[index]);
448 ret = eet_write(sd->ef, datakey, write_data, strlen(write_data) + 1, 1);