add data_reader_factory/data_writer_factory

This commit is contained in:
xianjimli 2020-03-01 17:44:10 +08:00
parent b1797f1aed
commit 7aa326d2ce
12 changed files with 619 additions and 2 deletions

View File

@ -1,5 +1,10 @@
# 最新动态
* 2020/03/01
* 增加data writer file
* 增加data reader factory
* 增加data writer factory
* 2020/02/29
* 完善 dialog 的layout 处理(感谢朝泽提供补丁)。
* 完善 fs stat 处理(感谢陈谭提供补丁)。

View File

@ -81,7 +81,7 @@ ret_t children_layouter_factory_register(children_layouter_factory_t* factory, c
* @param {children_layouter_factory_t*} factory
* @param {const char*} type
*
* @return {children_layouter_t*}
* @return {children_layouter_t*}
*/
children_layouter_t* children_layouter_factory_create_layouter(children_layouter_factory_t* factory,
const char* type);

View File

@ -81,7 +81,7 @@ ret_t self_layouter_factory_register(self_layouter_factory_t* factory, const cha
* @param {self_layouter_factory_t*} factory
* @param {const char*} type
*
* @return {self_layouter_t*}
* @return {self_layouter_t*}
*/
self_layouter_t* self_layouter_factory_create_layouter(self_layouter_factory_t* factory,
const char* type);

View File

@ -0,0 +1,127 @@
/**
* File: data_reader_factory.c
* Author: AWTK Develop Team
* Brief: data reader factory
*
* Copyright (c) 2020 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "tkc/mem.h"
#include "tkc/utils.h"
#include "tkc/data_reader_factory.h"
static data_reader_factory_t* data_reader_factory_init(data_reader_factory_t* factory);
static ret_t data_reader_factory_deinit(data_reader_factory_t* factory);
static data_reader_factory_t* s_data_reader_factory = NULL;
typedef struct _creator_item_t {
char protocol[TK_NAME_LEN + 1];
data_reader_create_t create;
} creator_item_t;
static int32_t creator_item_cmp(const creator_item_t* iter, const char* protocol) {
return strcmp(iter->protocol, protocol);
}
data_reader_factory_t* data_reader_factory(void) {
return s_data_reader_factory;
}
data_reader_factory_t* data_reader_factory_create(void) {
data_reader_factory_t* factory = TKMEM_ZALLOC(data_reader_factory_t);
return_value_if_fail(factory != NULL, NULL);
return data_reader_factory_init(factory);
}
static data_reader_factory_t* data_reader_factory_init(data_reader_factory_t* factory) {
return_value_if_fail(factory != NULL, NULL);
darray_init(&(factory->creators), 0, default_destroy, (tk_compare_t)creator_item_cmp);
return factory;
}
ret_t data_reader_factory_register(data_reader_factory_t* factory, const char* protocol,
data_reader_create_t create) {
creator_item_t* item = NULL;
return_value_if_fail(factory != NULL && protocol != NULL && create != NULL, RET_BAD_PARAMS);
item = TKMEM_ZALLOC(creator_item_t);
return_value_if_fail(item != NULL, RET_OOM);
item->create = create;
tk_strncpy(item->protocol, protocol, TK_NAME_LEN);
darray_push(&(factory->creators), item);
return RET_OK;
}
data_reader_t* data_reader_factory_create_reader(data_reader_factory_t* factory, const char* url) {
char protocol[TK_NAME_LEN + 1];
const char* p = NULL;
const creator_item_t* iter = NULL;
return_value_if_fail(factory != NULL && url != NULL, NULL);
p = strchr(url, ':');
memset(protocol, 0x00, sizeof(protocol));
if (p != NULL) {
return_value_if_fail((p - url) < TK_NAME_LEN, NULL);
strncpy(protocol, url, p - url);
} else {
strncpy(protocol, "file", 4);
}
iter = darray_find(&(factory->creators), (void*)protocol);
if (iter != NULL) {
p = strstr(url, "://");
if (p == NULL) {
p = url;
} else {
p += 3;
}
return iter->create(p);
}
return NULL;
}
ret_t data_reader_factory_set(data_reader_factory_t* factory) {
s_data_reader_factory = factory;
return RET_OK;
}
static ret_t data_reader_factory_deinit(data_reader_factory_t* factory) {
return_value_if_fail(factory != NULL, RET_BAD_PARAMS);
darray_deinit(&(factory->creators));
return RET_OK;
}
ret_t data_reader_factory_destroy(data_reader_factory_t* factory) {
return_value_if_fail(factory != NULL, RET_BAD_PARAMS);
data_reader_factory_deinit(factory);
TKMEM_FREE(factory);
return RET_OK;
}

View File

@ -0,0 +1,101 @@
/**
* File: data_reader_factory.h
* Author: AWTK Develop Team
* Brief: data reader factory
*
* Copyright (c) 2020 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_DATA_READER_FACTORY_H
#define TK_DATA_READER_FACTORY_H
#include "tkc/darray.h"
#include "tkc/data_reader.h"
BEGIN_C_DECLS
typedef data_reader_t* (*data_reader_create_t)(const char* args);
/**
* @class data_reader_factory_t
* data reader工厂
*
*/
typedef struct _data_reader_factory_t {
/*private*/
darray_t creators;
} data_reader_factory_t;
/**
* @method data_reader_factory
* data reader工厂对象
* @annotation ["constructor"]
* @return {data_reader_factory_t*} data reader工厂对象
*/
data_reader_factory_t* data_reader_factory(void);
/**
* @method data_reader_factory_set
* data reader工厂对象
* @param {data_reader_factory_t*} factory data reader工厂对象
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_reader_factory_set(data_reader_factory_t* factory);
/**
* @method data_reader_factory_create
* data reader工厂对象
* @annotation ["constructor"]
*
* @return {data_reader_factory_t*} data reader工厂对象
*/
data_reader_factory_t* data_reader_factory_create(void);
/**
* @method data_reader_factory_register
* data reader创建函数
* @param {data_reader_factory_t*} factory highlighter工厂对象
* @param {const char*} protocol (file)
* @param {data_reader_create_t} create data reader创建函数
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_reader_factory_register(data_reader_factory_t* factory, const char* protocol,
data_reader_create_t create);
/**
* @method data_reader_factory_create_reader
* data reader对象
* @annotation ["constructor"]
* @param {data_reader_factory_t*} factory data reader工厂对象
* @param {const char*} url URL
*
* @return {data_reader_t*} data reader对象
*/
data_reader_t* data_reader_factory_create_reader(data_reader_factory_t* factory, const char* url);
/**
* @method data_reader_factory_destroy
* data reader工厂对象
* @param {data_reader_factory_t*} factory data reader工厂对象
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_reader_factory_destroy(data_reader_factory_t* factory);
END_C_DECLS
#endif /*TK_DATA_READER_FACTORY_H*/

View File

@ -0,0 +1,127 @@
/**
* File: data_writer_factory.c
* Author: AWTK Develop Team
* Brief: data writer factory
*
* Copyright (c) 2020 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "tkc/mem.h"
#include "tkc/utils.h"
#include "tkc/data_writer_factory.h"
static data_writer_factory_t* data_writer_factory_init(data_writer_factory_t* factory);
static ret_t data_writer_factory_deinit(data_writer_factory_t* factory);
static data_writer_factory_t* s_data_writer_factory = NULL;
typedef struct _creator_item_t {
char protocol[TK_NAME_LEN + 1];
data_writer_create_t create;
} creator_item_t;
static int32_t creator_item_cmp(const creator_item_t* iter, const char* protocol) {
return strcmp(iter->protocol, protocol);
}
data_writer_factory_t* data_writer_factory(void) {
return s_data_writer_factory;
}
data_writer_factory_t* data_writer_factory_create(void) {
data_writer_factory_t* factory = TKMEM_ZALLOC(data_writer_factory_t);
return_value_if_fail(factory != NULL, NULL);
return data_writer_factory_init(factory);
}
static data_writer_factory_t* data_writer_factory_init(data_writer_factory_t* factory) {
return_value_if_fail(factory != NULL, NULL);
darray_init(&(factory->creators), 0, default_destroy, (tk_compare_t)creator_item_cmp);
return factory;
}
ret_t data_writer_factory_register(data_writer_factory_t* factory, const char* protocol,
data_writer_create_t create) {
creator_item_t* item = NULL;
return_value_if_fail(factory != NULL && protocol != NULL && create != NULL, RET_BAD_PARAMS);
item = TKMEM_ZALLOC(creator_item_t);
return_value_if_fail(item != NULL, RET_OOM);
item->create = create;
tk_strncpy(item->protocol, protocol, TK_NAME_LEN);
darray_push(&(factory->creators), item);
return RET_OK;
}
data_writer_t* data_writer_factory_create_writer(data_writer_factory_t* factory, const char* url) {
char protocol[TK_NAME_LEN + 1];
const char* p = NULL;
const creator_item_t* iter = NULL;
return_value_if_fail(factory != NULL && url != NULL, NULL);
p = strchr(url, ':');
memset(protocol, 0x00, sizeof(protocol));
if (p != NULL) {
return_value_if_fail((p - url) < TK_NAME_LEN, NULL);
strncpy(protocol, url, p - url);
} else {
strncpy(protocol, "file", 4);
}
iter = darray_find(&(factory->creators), (void*)protocol);
if (iter != NULL) {
p = strstr(url, "://");
if (p == NULL) {
p = url;
} else {
p += 3;
}
return iter->create(p);
}
return NULL;
}
ret_t data_writer_factory_set(data_writer_factory_t* factory) {
s_data_writer_factory = factory;
return RET_OK;
}
static ret_t data_writer_factory_deinit(data_writer_factory_t* factory) {
return_value_if_fail(factory != NULL, RET_BAD_PARAMS);
darray_deinit(&(factory->creators));
return RET_OK;
}
ret_t data_writer_factory_destroy(data_writer_factory_t* factory) {
return_value_if_fail(factory != NULL, RET_BAD_PARAMS);
data_writer_factory_deinit(factory);
TKMEM_FREE(factory);
return RET_OK;
}

View File

@ -0,0 +1,101 @@
/**
* File: data_writer_factory.h
* Author: AWTK Develop Team
* Brief: data writer factory
*
* Copyright (c) 2020 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_DATA_WRITER_FACTORY_H
#define TK_DATA_WRITER_FACTORY_H
#include "tkc/darray.h"
#include "tkc/data_writer.h"
BEGIN_C_DECLS
typedef data_writer_t* (*data_writer_create_t)(const char* args);
/**
* @class data_writer_factory_t
* data writer工厂
*
*/
typedef struct _data_writer_factory_t {
/*private*/
darray_t creators;
} data_writer_factory_t;
/**
* @method data_writer_factory
* data writer工厂对象
* @annotation ["constructor"]
* @return {data_writer_factory_t*} data writer工厂对象
*/
data_writer_factory_t* data_writer_factory(void);
/**
* @method data_writer_factory_set
* data writer工厂对象
* @param {data_writer_factory_t*} factory data writer工厂对象
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_writer_factory_set(data_writer_factory_t* factory);
/**
* @method data_writer_factory_create
* data writer工厂对象
* @annotation ["constructor"]
*
* @return {data_writer_factory_t*} data writer工厂对象
*/
data_writer_factory_t* data_writer_factory_create(void);
/**
* @method data_writer_factory_register
* data writer创建函数
* @param {data_writer_factory_t*} factory highlighter工厂对象
* @param {const char*} protocol (file)
* @param {data_writer_create_t} create data writer创建函数
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_writer_factory_register(data_writer_factory_t* factory, const char* protocol,
data_writer_create_t create);
/**
* @method data_writer_factory_create_writer
* data writer对象
* @annotation ["constructor"]
* @param {data_writer_factory_t*} factory data writer工厂对象
* @param {const char*} url URL
*
* @return {data_writer_t*} data writer对象
*/
data_writer_t* data_writer_factory_create_writer(data_writer_factory_t* factory, const char* url);
/**
* @method data_writer_factory_destroy
* data writer工厂对象
* @param {data_writer_factory_t*} factory data writer工厂对象
*
* @return {ret_t} RET_OK表示成功
*/
ret_t data_writer_factory_destroy(data_writer_factory_t* factory);
END_C_DECLS
#endif /*TK_DATA_WRITER_FACTORY_H*/

View File

@ -0,0 +1,68 @@
/**
* File: data_writer.c
* Author: AWTK Develop Team
* Brief: data_writer
*
* Copyright (c) 2019 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#include "tkc/mem.h"
#include "tkc/fs.h"
#include "tkc/data_writer_file.h"
typedef struct _data_writer_file_t {
data_writer_t data_writer;
fs_file_t* file;
} data_writer_file_t;
static int32_t data_writer_file_write(data_writer_t* writer, uint64_t offset, const void* data,
uint32_t size) {
data_writer_file_t* file = (data_writer_file_t*)writer;
return_value_if_fail(fs_file_seek(file->file, offset) == RET_OK, 0);
return fs_file_write(file->file, data, size);
}
static ret_t data_writer_file_destroy(data_writer_t* writer) {
data_writer_file_t* file = (data_writer_file_t*)writer;
fs_file_close(file->file);
TKMEM_FREE(file);
return RET_OK;
}
static data_writer_vtable_t s_data_writer_file_vtable = {
.write = data_writer_file_write,
.destroy = data_writer_file_destroy,
};
data_writer_t* data_writer_file_create(const char* filename) {
data_writer_file_t* file = NULL;
return_value_if_fail(filename != NULL, NULL);
file = TKMEM_ZALLOC(data_writer_file_t);
return_value_if_fail(file != NULL, NULL);
file->file = fs_open_file(os_fs(), filename, "wb+");
file->data_writer.vt = &s_data_writer_file_vtable;
if (file->file == NULL) {
TKMEM_FREE(file);
}
return (data_writer_t*)file;
}

View File

@ -0,0 +1,42 @@
/**
* File: data_writer_file.h
* Author: AWTK Develop Team
* Brief: data_writer file
*
* Copyright (c) 2019 - 2020 Guangzhou ZHIYUAN Electronics Co.,Ltd.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* License file for more details.
*
*/
/**
* History:
* ================================================================
* 2020-03-01 Li XianJing <xianjimli@hotmail.com> created
*
*/
#ifndef TK_DATA_WRITER_FILE_H
#define TK_DATA_WRITER_FILE_H
#include "tkc/data_writer.h"
BEGIN_C_DECLS
/**
* @method data_writer_file_create
* data writer
* @param {data_writer_t*} writer writer对象
*
* @return {ret_t} RET_OK表示成功
*/
data_writer_t* data_writer_file_create(const char* filename);
#define DATA_WRITER_FILE(writer) ((data_writer_t*)(writer))
END_C_DECLS
#endif /*TK_DATA_WRITER_FILE_H*/

View File

@ -0,0 +1,22 @@
#include "gtest/gtest.h"
#include "tkc/data_reader_factory.h"
#include "tkc/data_reader_file.h"
TEST(DataReaderFactory, basic) {
data_reader_t* reader = NULL;
data_reader_factory_t* f = data_reader_factory_create();
reader = data_reader_factory_create_reader(f, "file://./tests/testdata/main.xml");
ASSERT_EQ(reader == NULL, true);
ASSERT_EQ(data_reader_factory_register(f, "file", data_reader_file_create), RET_OK);
reader = data_reader_factory_create_reader(f, "file://./tests/testdata/main.xml");
ASSERT_EQ(reader != NULL, true);
data_reader_destroy(reader);
reader = data_reader_factory_create_reader(f, "./tests/testdata/main.xml");
ASSERT_EQ(reader != NULL, true);
data_reader_destroy(reader);
data_reader_factory_destroy(f);
}

View File

@ -0,0 +1,24 @@
#include "gtest/gtest.h"
#include "tkc/data_writer_factory.h"
#include "tkc/data_writer_file.h"
TEST(DataWriterFactory, basic) {
data_writer_t* writer = NULL;
data_writer_factory_t* f = data_writer_factory_create();
writer = data_writer_factory_create_writer(f, "file://./tests/testdata/test.xml");
ASSERT_EQ(writer == NULL, true);
ASSERT_EQ(data_writer_factory_register(f, "file", data_writer_file_create), RET_OK);
writer = data_writer_factory_create_writer(f, "file://./tests/testdata/test.xml");
ASSERT_EQ(writer != NULL, true);
data_writer_destroy(writer);
writer = data_writer_factory_create_writer(f, "./tests/testdata/test.xml");
ASSERT_EQ(writer != NULL, true);
data_writer_write(writer, 0, "hello ", 6);
data_writer_write(writer, 7, "world", 5);
data_writer_destroy(writer);
data_writer_factory_destroy(f);
}

BIN
tests/testdata/test.xml vendored Normal file

Binary file not shown.