diff --git a/api/include/mk_common.h b/api/include/mk_common.h index 0ee50b66..845c30c0 100755 --- a/api/include/mk_common.h +++ b/api/include/mk_common.h @@ -117,6 +117,7 @@ API_EXPORT void API_CALL mk_set_log(int file_max_size, int file_max_count); /** * 设置配置项 + * @deprecated 请使用mk_ini_set_option替代 * @param key 配置项名 * @param val 配置项值 */ @@ -124,6 +125,7 @@ API_EXPORT void API_CALL mk_set_option(const char *key, const char *val); /** * 获取配置项的值 + * @deprecated 请使用mk_ini_get_option替代 * @param key 配置项名 */ API_EXPORT const char * API_CALL mk_get_option(const char *key); diff --git a/api/include/mk_util.h b/api/include/mk_util.h index f3976860..52a8d776 100644 --- a/api/include/mk_util.h +++ b/api/include/mk_util.h @@ -18,16 +18,21 @@ extern "C" { #endif +/** + * 释放mk api内部malloc的资源 + */ +API_EXPORT void API_CALL mk_free(void *ptr); + /** * 获取本程序可执行文件路径 - * @return 文件路径,使用完后需要自己free + * @return 文件路径,使用完后需要自己mk_free */ API_EXPORT char* API_CALL mk_util_get_exe_path(); /** * 获取本程序可执行文件相同目录下文件的绝对路径 * @param relative_path 同目录下文件的路径相对,可以为null - * @return 文件路径,使用完后需要自己free + * @return 文件路径,使用完后需要自己mk_free */ API_EXPORT char* API_CALL mk_util_get_exe_dir(const char *relative_path); @@ -40,7 +45,7 @@ API_EXPORT uint64_t API_CALL mk_util_get_current_millisecond(); /** * 获取时间字符串 * @param fmt 时间格式,譬如%Y-%m-%d %H:%M:%S - * @return 时间字符串,使用完后需要自己free + * @return 时间字符串,使用完后需要自己mk_free */ API_EXPORT char* API_CALL mk_util_get_current_time_string(const char *fmt); @@ -48,9 +53,82 @@ API_EXPORT char* API_CALL mk_util_get_current_time_string(const char *fmt); * 打印二进制为字符串 * @param buf 二进制数据 * @param len 数据长度 - * @return 可打印的调试信息,使用完后需要自己free + * @return 可打印的调试信息,使用完后需要自己mk_free */ API_EXPORT char* API_CALL mk_util_hex_dump(const void *buf, int len); + +///////////////////////////////////////////mk ini///////////////////////////////////////////// +typedef void* mk_ini; + +/** + * 创建ini配置对象 + */ +API_EXPORT mk_ini API_CALL mk_ini_create(); + +/** + * 返回全局默认ini配置 + * @return 全局默认ini配置,请勿用mk_ini_release释放它 + */ +API_EXPORT mk_ini API_CALL mk_ini_default(); + +/** + * 加载ini配置文件内容 + * @param ini ini对象 + * @param str 配置文件内容 + */ +API_EXPORT void API_CALL mk_ini_load_string(mk_ini ini, const char *str); + +/** + * 加载ini配置文件 + * @param ini ini对象 + * @param file 配置文件路径 + */ +API_EXPORT void API_CALL mk_ini_load_file(mk_ini ini, const char *file); + +/** + * 销毁ini配置对象 + */ +API_EXPORT void API_CALL mk_ini_release(mk_ini ini); + +/** + * 添加或覆盖配置项 + * @param ini 配置对象 + * @param key 配置名,两段式,如:field.key + * @param value 配置值 + */ +API_EXPORT void API_CALL mk_ini_set_option(mk_ini ini, const char *key, const char *value); +API_EXPORT void API_CALL mk_ini_set_option_int(mk_ini ini, const char *key, int value); + +/** + * 获取配置项 + * @param ini 配置对象 + * @param key 配置名,两段式,如:field.key + * @return 配置不存在返回NULL,否则返回配置值 + */ +API_EXPORT const char *API_CALL mk_ini_get_option(mk_ini ini, const char *key); + +/** + * 删除配置项 + * @param ini 配置对象 + * @param key 配置名,两段式,如:field.key + * @return 1: 成功,0: 该配置不存在 + */ +API_EXPORT int API_CALL mk_ini_del_option(mk_ini ini, const char *key); + +/** + * 导出为配置文件内容 + * @param ini 配置对象 + * @return 配置文件内容字符串,用完后需要自行mk_free + */ +API_EXPORT char *API_CALL mk_ini_dump_string(mk_ini ini); + +/** + * 导出配置文件到文件 + * @param ini 配置对象 + * @param file 配置文件路径 + */ +API_EXPORT void API_CALL mk_ini_dump_file(mk_ini ini, const char *file); + ///////////////////////////////////////////日志///////////////////////////////////////////// /** @@ -67,9 +145,9 @@ API_EXPORT void API_CALL mk_log_printf(int level, const char *file, const char * // 以下宏可以替换printf使用 #define log_printf(lev, ...) mk_log_printf(lev, __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__) #define log_trace(...) log_printf(0, ##__VA_ARGS__) -#define log_debug(...) log_printf(1, ##__VA_ARGS__) -#define log_info(...) log_printf(2, ##__VA_ARGS__) -#define log_warn(...) log_printf(3, ##__VA_ARGS__) +#define log_debug(...) log_printf(1, ##__VA_ARGS__) +#define log_info(...) log_printf(2, ##__VA_ARGS__) +#define log_warn(...) log_printf(3, ##__VA_ARGS__) #define log_error(...) log_printf(4, ##__VA_ARGS__) #ifdef __cplusplus diff --git a/api/source/mk_common.cpp b/api/source/mk_common.cpp index 87bea735..e427c23d 100644 --- a/api/source/mk_common.cpp +++ b/api/source/mk_common.cpp @@ -158,6 +158,8 @@ API_EXPORT void API_CALL mk_set_option(const char *key, const char *val) { return; } mINI::Instance()[key] = val; + //广播配置文件热加载 + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastReloadConfig); } API_EXPORT const char * API_CALL mk_get_option(const char *key) diff --git a/api/source/mk_util.cpp b/api/source/mk_util.cpp index a898b8f5..e6265000 100644 --- a/api/source/mk_util.cpp +++ b/api/source/mk_util.cpp @@ -13,15 +13,22 @@ #include "mk_util.h" #include "Util/util.h" +#include "Util/mini.h" #include "Util/logger.h" +#include "Common/config.h" using namespace std; using namespace toolkit; +using namespace mediakit; #ifndef _WIN32 #define _strdup strdup #endif +API_EXPORT void API_CALL mk_free(void *ptr) { + free(ptr); +} + API_EXPORT char* API_CALL mk_util_get_exe_path(){ return _strdup(exePath().data()); } @@ -47,6 +54,88 @@ API_EXPORT char* API_CALL mk_util_hex_dump(const void *buf, int len){ return _strdup(hexdump(buf,len).data()); } +API_EXPORT mk_ini API_CALL mk_ini_create() { + return new mINI; +} + +API_EXPORT mk_ini API_CALL mk_ini_default() { + return &(mINI::Instance()); +} + +static void emit_ini_file_reload(mk_ini ini) { + if (ini == mk_ini_default()) { + // 广播配置文件热加载 + NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastReloadConfig); + } +} + +API_EXPORT void API_CALL mk_ini_load_string(mk_ini ini, const char *str) { + assert(str); + auto ptr = (mINI *)ini; + ptr->parse(str); + emit_ini_file_reload(ini); +} + +API_EXPORT void API_CALL mk_ini_load_file(mk_ini ini, const char *file) { + assert(file); + auto ptr = (mINI *)ini; + ptr->parseFile(file); + emit_ini_file_reload(ini); +} + +API_EXPORT void API_CALL mk_ini_release(mk_ini ini) { + assert(ini); + delete (mINI *)ini; +} + +API_EXPORT void API_CALL mk_ini_set_option(mk_ini ini, const char *key, const char *value) { + assert(ini && key && value); + auto ptr = (mINI *)ini; + (*ptr)[key] = value; + emit_ini_file_reload(ini); +} + +API_EXPORT void API_CALL mk_ini_set_option_int(mk_ini ini, const char *key, int value) { + assert(ini && key); + auto ptr = (mINI *)ini; + (*ptr)[key] = value; + emit_ini_file_reload(ini); +} + +API_EXPORT const char *API_CALL mk_ini_get_option(mk_ini ini, const char *key) { + assert(ini && key); + auto ptr = (mINI *)ini; + auto it = ptr->find(key); + if (it == ptr->end()) { + return nullptr; + } + return it->second.data(); +} + +API_EXPORT int API_CALL mk_ini_del_option(mk_ini ini, const char *key) { + assert(ini && key); + auto ptr = (mINI *)ini; + auto it = ptr->find(key); + if (it == ptr->end()) { + return false; + } + ptr->erase(it); + emit_ini_file_reload(ini); + return true; +} + +API_EXPORT char *API_CALL mk_ini_dump_string(mk_ini ini) { + assert(ini); + auto ptr = (mINI *)ini; + return _strdup(ptr->dump().data()); +} + +API_EXPORT void API_CALL mk_ini_dump_file(mk_ini ini, const char *file) { + assert(ini && file); + auto ptr = (mINI *)ini; + ptr->dumpFile(file); +} + API_EXPORT void API_CALL mk_log_printf(int level, const char *file, const char *function, int line, const char *fmt, ...) { va_list ap; va_start(ap, fmt);