项目中经常会需要将service产生的数据结构提供给调用方。
但是数据结构又不想暴露出去,因此要将需要用到的数据结构的处理都封装为API,提供给调用方。
=======================================================================
/* Define EXPORT_API */
#ifndef EXPORT_API
#define EXPORT_API __attribute__((visibility("default")))
#endif
EXPORT_API
int test_record_create(test_record_h *record)
{
IFRET_VM(NULL == record, -1, "record is NULL");
test_record *data = calloc(1, sizeof(test_record));
IFRET_VM(NULL == data, -1, "calloc() Fail");
data->date = NULL;
data->key = NULL;
data->value = NULL;
*record = (test_record_h)data;
return 0;
}
EXPORT_API
int test_record_destroy(test_record_h record)
{
test_record *data = (test_record *)record;
IFRET_VM(NULL == data, -1, "data is NULL");
g_free(data->key);
data->key = NULL;
g_free(data->value);
data->value = NULL;
g_free(data->date);
data->date = NULL;
g_free(data);
return 0;
}
EXPORT_API
int test_list_create(test_list_h *record_list)
{
test_list *list_s = NULL;
IFRET_VM(NULL == record_list, -1, "record_list is NULL");
*record_list = NULL;
list_s = calloc(1, sizeof(test_list));
IFRET_VM(NULL == list_s, -1, "calloc() Fail");
*record_list = (test_list_h)list_s;
return 0;
}
EXPORT_API
int test_list_destroy(test_list_h record_list)
{
test_list *s_list = NULL;
GList *cursor = NULL;
IFRET_VM(NULL == record_list, -1, "record_list is NULL");
s_list = (test_list*)record_list;
for (cursor = s_list->records; cursor; cursor = cursor->next)
test_record_destroy((test_record_h)(cursor->data));
g_list_free(s_list->records);
g_free(s_list);
return 0;
}
EXPORT_API
int test_record_set_key(test_record_h record, const char *key)
{
test_record *data = (test_record *)record;
IFRET_VM(NULL == data, -1, "data is NULL");
IFRET_VM(NULL == key, -1, "key is NULL");
data->key = g_strdup(key);
return 0;
}
EXPORT_API
int test_record_get_key(test_record_h record, char **key)
{
test_error_e 0 = 0;
test_record *data = (test_record *)record;
IFRET_VM(NULL == data, -1, "data is NULL");
IFRET_VM(NULL == key, -1, "key is NULL");
*key = data->key;
return 0;
}
EXPORT_API
int test_list_add(test_list_h record_list, test_record_h record)
{
test_list *s_list = NULL;
test_record *s_record = NULL;
IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
s_list = (test_list*)record_list;
s_record = (test_record*)record;
s_list->records = g_list_append(s_list->records, s_record);
if (s_list->count == 0) {
s_list->cursor = s_list->records;
}
s_list->count++;
return 0;
}
EXPORT_API
int test_list_remove(test_list_h record_list, test_record_h record)
{
GList *cursor = NULL;
test_list *s_list = NULL;
test_record *s_record = NULL;
IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
s_list = (test_list*)record_list;
s_record = (test_record*)record;
for (cursor = s_list->records; cursor; cursor = cursor->next) {
test_record *data = cursor->data;
if (data == s_record) {
s_list->count--;
if (s_list->cursor == cursor) {
s_list->cursor = cursor->next;
}
s_list->records = g_list_remove(s_list->records, s_record);
return 0;
}
}
return 0;
}
EXPORT_API
int test_list_get_record_count(test_list_h record_list, int *count)
{
test_error_e 0 = 0;
test_list *list_s = NULL;
IFRET_VM(NULL == count, -1, "count is NULL");
*count = 0;
IFRET_VM(NULL == record_list, -1, "record_list is NULL");
list_s = (test_list*)record_list;
*count = list_s->count;
return 0;
}
EXPORT_API
int test_list_get_current_record(test_list_h record_list, test_record_h *record)
{
test_error_e 0 = 0;
test_list *list_s = NULL;
IFRET_VM(NULL == record, -1, "record is NULL");
*record = NULL;
IFRET_VM(NULL == record_list || NULL == record, -1, "record_list is NULL");
list_s = (test_list*)record_list;
if (NULL == list_s->cursor) {
*record = NULL;
return -2;
}
*record = list_s->cursor->data;
return 0;
}
EXPORT_API
int test_list_move_to_first(test_list_h record_list)
{
test_error_e 0 = 0;
test_list *list_s = NULL;
IFRET_VM(NULL == record_list, -1, "record_list is NULL");
list_s = (test_list*)record_list;
list_s->cursor = list_s->records;
if (NULL == list_s->cursor) {
return -2;
}
return 0;
}
EXPORT_API
int test_list_move_to_last(test_list_h record_list)
{
test_error_e 0 = 0;
test_list *list_s;
IFRET_VM(NULL == record_list, -1, "record_list is NULL");
list_s = (test_list*)record_list;
list_s->cursor = g_list_last(list_s->records);
if (NULL == list_s->cursor) {
return -2;
}
return 0;
}
static int __sc_list_move_cursor(test_list_h list, bool next)
{
test_list *list_s;
IFRET_VM(NULL == list, -1, "record_list is NULL");
list_s = (test_list*)list;
if (NULL == list_s->cursor)
return -2;
list_s->cursor = next ? list_s->cursor->next : list_s->cursor->prev ;
if (NULL == list_s->cursor)
return -2;
return 0;
}
EXPORT_API
int test_list_move_to_next(test_list_h record_list)
{
return __sc_list_move_cursor(record_list, true);
}
EXPORT_API
int test_list_move_to_prev(test_list_h record_list)
{
return __sc_list_move_cursor(record_list, false);
}