diff --git a/c_cpp_wrapper/openimsdk.h b/c_cpp_wrapper/openimsdk.h index af4d669..a63ab57 100644 --- a/c_cpp_wrapper/openimsdk.h +++ b/c_cpp_wrapper/openimsdk.h @@ -101,6 +101,7 @@ extern GoUint8 init_sdk(CB_I_S cCallback, char* operationID, char* config); extern void un_init_sdk(char* operationID); extern void login(CB_S_I_S_S cCallback, char* operationID, char* uid, char* token); extern void logout(CB_S_I_S_S cCallback, char* operationID); +extern void set_app_background_status(CB_S_I_S_S cCallback, char* operationID, int isBackground); extern void network_status_changed(CB_S_I_S_S cCallback, char* operationID); extern GoInt get_login_status(char* operationID); extern char* get_login_user(); @@ -117,7 +118,7 @@ extern char* create_image_message_from_full_path(char* operationID, char* imageF extern char* create_sound_message_from_full_path(char* operationID, char* soundPath, long long int duration); extern char* create_file_message_from_full_path(char* operationID, char* fileFullPath, char* fileName); extern char* create_image_message(char* operationID, char* imagePath); -extern char* create_image_message_by_url(char* operationID, char* sourcePicture, char* bigPicture, char* snapshotPicture); +extern char* create_image_message_by_url(char* operationID, char* sourcePath, char* sourcePicture, char* bigPicture, char* snapshotPicture); extern char* create_sound_message_by_url(char* operationID, char* soundBaseInfo); extern char* create_sound_message(char* operationID, char* soundPath, long long int duration); extern char* create_video_message_by_url(char* operationID, char* videoBaseInfo); @@ -128,14 +129,46 @@ extern char* create_merger_message(char* operationID, char* messageList, char* t extern char* create_face_message(char* operationID, int index, char* data); extern char* create_forward_message(char* operationID, char* m); extern void get_all_conversation_list(CB_S_I_S_S cCallback, char* operationID); -extern void get_advanced_history_message_list(CB_S_I_S_S cCallback, char* operationID, char* getMessageOptions); +extern void get_conversation_list_split(CB_S_I_S_S cCallback, char* operationID, int offset, int count); +extern void get_one_conversation(CB_S_I_S_S cCallback, char* operationID, int sessionType, char* sourceID); +extern void get_multiple_conversation(CB_S_I_S_S cCallback, char* operationID, char* conversationIDList); +extern void set_conversation_msg_destruct_time(CB_S_I_S_S cCallback, char* operationID, char* conversationID, long long int msgDestructTime); +extern void set_conversation_is_msg_destruct(CB_S_I_S_S cCallback, char* operationID, char* conversationID, int isMsgDestruct); +extern void hide_conversation(CB_S_I_S_S cCallback, char* operationID, char* conversationID); +extern void get_conversation_recv_message_opt(CB_S_I_S_S cCallback, char* operationID, char* conversationIDList); +extern void set_conversation_draft(CB_S_I_S_S cCallback, char* operationID, char* conversationID, char* draftText); +extern void reset_conversation_group_at_type(CB_S_I_S_S cCallback, char* operationID, char* conversationID); +extern void pin_conversation(CB_S_I_S_S cCallback, char* operationID, char* conversationID, int isPinned); +extern void set_conversation_private_chat(CB_S_I_S_S cCallback, char* operationID, char* conversationID, int isPrivate); +extern void set_conversation_burn_duration(CB_S_I_S_S cCallback, char* operationID, char* conversationID, int duration); +extern void set_conversation_recv_message_opt(CB_S_I_S_S cCallback, char* operationID, char* conversationID, int opt); +extern void get_total_unread_msg_count(CB_S_I_S_S cCallback, char* operationID); +extern char* get_at_all_tag(char* operationID); +extern char* get_conversation_id_by_session_type(char* operationID, char* sourceID, int sessionType); extern void send_message(CB_S_I_S_S_I cCallback, char* operationID, char* message, char* recvID, char* groupID, char* offlinePushInfo); - -// =====================================================user=============================================== -// +extern void send_message_not_oss(CB_S_I_S_S_I cCallback, char* operationID, char* message, char* recvID, char* groupID, char* offlinePushInfo); +extern void find_message_list(CB_S_I_S_S cCallback, char* operationID, char* findMessageOptions); +extern void get_advanced_history_message_list(CB_S_I_S_S cCallback, char* operationID, char* getMessageOptions); +extern void get_advanced_history_message_list_reverse(CB_S_I_S_S cCallback, char* operationID, char* getMessageOptions); +extern void revoke_message(CB_S_I_S_S cCallback, char* operationID, char* conversationID, char* clientMsgID); +extern void typing_status_update(CB_S_I_S_S cCallback, char* operationID, char* recvID, char* msgTip); +extern void mark_conversation_message_as_read(CB_S_I_S_S cCallback, char* operationID, char* conversationID); +extern void delete_message_from_local_storage(CB_S_I_S_S cCallback, char* operationID, char* conversationID, char* clientMsgID); +extern void delete_message(CB_S_I_S_S cCallback, char* operationID, char* conversationID, char* clientMsgID); +extern void hide_all_conversations(CB_S_I_S_S cCallback, char* operationID); +extern void delete_all_msg_from_local_and_svr(CB_S_I_S_S cCallback, char* operationID); +extern void delete_all_msg_from_local(CB_S_I_S_S cCallback, char* operationID); +extern void clear_conversation_and_delete_all_msg(CB_S_I_S_S cCallback, char* operationID, char* conversationID); +extern void delete_conversation_and_delete_all_msg(CB_S_I_S_S cCallback, char* operationID, char* conversationID); +extern void insert_single_message_to_local_storage(CB_S_I_S_S cCallback, char* operationID, char* message, char* recvID, char* sendID); +extern void insert_group_message_to_local_storage(CB_S_I_S_S cCallback, char* operationID, char* message, char* groupID, char* sendID); +extern void search_local_messages(CB_S_I_S_S cCallback, char* operationID, char* searchParam); +extern void set_message_local_ex(CB_S_I_S_S cCallback, char* operationID, char* conversationID, char* clientMsgID, char* localEx); extern void get_users_info(CB_S_I_S_S cCallback, char* operationID, char* userIDs); +extern void get_users_info_with_cache(CB_S_I_S_S cCallback, char* operationID, char* userIDs, char* groupID); extern void get_users_info_from_srv(CB_S_I_S_S cCallback, char* operationID, char* userIDs); extern void set_self_info(CB_S_I_S_S cCallback, char* operationID, char* userInfo); +extern void set_global_recv_message_opt(CB_S_I_S_S cCallback, char* operationID, int opt); extern void get_self_user_info(CB_S_I_S_S cCallback, char* operationID); extern void update_msg_sender_info(CB_S_I_S_S cCallback, char* operationID, char* nickname, char* faceURL); extern void subscribe_users_status(CB_S_I_S_S cCallback, char* operationID, char* userIDs); diff --git a/c_cpp_wrapper/openimsdkcc.cc b/c_cpp_wrapper/openimsdkcc.cc index dcbfd85..9d66546 100644 --- a/c_cpp_wrapper/openimsdkcc.cc +++ b/c_cpp_wrapper/openimsdkcc.cc @@ -1,5 +1,6 @@ #include "openimsdkcc.h" +#include "wrapp_cpp_function.inc" namespace openim { diff --git a/c_cpp_wrapper/openimsdkcc.h b/c_cpp_wrapper/openimsdkcc.h index f873f4b..12dcc89 100644 --- a/c_cpp_wrapper/openimsdkcc.h +++ b/c_cpp_wrapper/openimsdkcc.h @@ -1,4 +1,4 @@ -#pragma onces +#pragma once #include "openimsdk.h" #include @@ -11,306 +11,6 @@ #include #include -#define MAX_NUM_OF_CB_S 10 -#define MAX_NUM_OF_CB_I_S 10 -#define MAX_NUM_OF_CB_S_I_S_S 10 -#define MAX_NUM_OF_CB_S_I_S_S_I 10 -#define SLEEP_TIME_FOR_GET_INDEX 100 //ms - -// use recursive template to generate enough function pointer array -// and define c type function interface -// and define manager class to manage function pool -namespace { - CB_S* _fps_cb_s=new CB_S[MAX_NUM_OF_CB_S]; - CB_I_S* _fps_cb_i_s=new CB_I_S[MAX_NUM_OF_CB_I_S]; - CB_S_I_S_S* _fps_cb_s_i_s_s=new CB_S_I_S_S[MAX_NUM_OF_CB_S_I_S_S]; - CB_S_I_S_S_I* _fps_cb_s_i_s_s_i=new CB_S_I_S_S_I[MAX_NUM_OF_CB_S_I_S_S_I]; - // c type func interface call cpp function - std::function* _cpp_function_cb_s=new std::function[MAX_NUM_OF_CB_S]; - std::function* _cpp_function_cb_i_s=new std::function[MAX_NUM_OF_CB_I_S]; - std::function* _cpp_function_cb_s_i_s_s=new std::function[MAX_NUM_OF_CB_S_I_S_S]; - std::function* _cpp_function_cb_s_i_s_s_i=new std::function[MAX_NUM_OF_CB_S_I_S_S_I]; - - template - void _generate_cb_s(){ - _fps_cb_s[N]=[](char* c_str){ - _cpp_function_cb_s[N](std::string(c_str)); - }; - _generate_cb_s(); - } - template<> - void _generate_cb_s<0>(){ - _fps_cb_s[0]=[](char* c_str){ - _cpp_function_cb_s[0](std::string(c_str)); - }; - } - - template - void _generate_cb_i_s(){ - _fps_cb_i_s[N]=[](int code,char* c_str){ - _cpp_function_cb_i_s[N](code,std::string(c_str)); - }; - _generate_cb_i_s(); - } - template<> - void _generate_cb_i_s<0>(){ - _fps_cb_i_s[0]=[](int code,char* c_str){ - _cpp_function_cb_i_s[0](code,std::string(c_str)); - }; - } - template - void _generate_cb_s_i_s_s(){ - _fps_cb_s_i_s_s[N]=[](char* operationID,int code,char* c_str,char* c_str2){ - _cpp_function_cb_s_i_s_s[N](std::string(operationID),code,std::string(c_str),std::string(c_str2)); - }; - _generate_cb_s_i_s_s(); - } - template<> - void _generate_cb_s_i_s_s<0>(){ - _fps_cb_s_i_s_s[0]=[](char* operationID,int code,char* c_str,char* c_str2){ - _cpp_function_cb_s_i_s_s[0](std::string(operationID),code,std::string(c_str),std::string(c_str2)); - }; - } - template - void _generate_cb_s_i_s_s_i(){ - _fps_cb_s_i_s_s_i[N]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){ - _cpp_function_cb_s_i_s_s_i[N](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int); - }; - _generate_cb_s_i_s_s_i(); - } - template<> - void _generate_cb_s_i_s_s_i<0>(){ - _fps_cb_s_i_s_s_i[0]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){ - _cpp_function_cb_s_i_s_s_i[0](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int); - }; - } - - // init global function pointer array - void init(){ - _generate_cb_s(); - _generate_cb_i_s(); - _generate_cb_s_i_s_s(); - _generate_cb_s_i_s_s_i(); - } - // define sigle instance class to manage function pool - class FuncPoolManager{ - private: - // define a global bitmap, and support atomic operation, to manage cb_s pool - std::bitset _cb_s_bitmap; - std::bitset _cb_i_s_bitmap; - std::bitset _cb_s_i_s_s_bitmap; - std::bitset _cb_s_i_s_s_i_bitmap; - std::mutex _cb_s_mutex; - std::mutex _cb_i_s_mutex; - std::mutex _cb_s_i_s_s_mutex; - std::mutex _cb_s_i_s_s_i_mutex; - FuncPoolManager(){ - init(); - } - FuncPoolManager(const FuncPoolManager&){} - public: - static FuncPoolManager& get_instance(){ - static FuncPoolManager instance; - return instance; - } - // get a available cb_s function index - int get_cb_s_index(){ - std::lock_guard lock(_cb_s_mutex); - int index=-1; - for(int i=0;i<_cb_s_bitmap.size();i++){ - if(_cb_s_bitmap[i]==0){ - _cb_s_bitmap[i]=1; - index=i; - break; - } - } - return index; - } - // get a available cb_i_s function index - int get_cb_i_s_index(){ - std::lock_guard lock(_cb_i_s_mutex); - int index=-1; - for(int i=0;i<_cb_i_s_bitmap.size();i++){ - if(_cb_i_s_bitmap[i]==0){ - _cb_i_s_bitmap[i]=1; - index=i; - break; - } - } - return index; - } - // get a available cb_s_i_s_s function index - int get_cb_s_i_s_s_index(){ - std::lock_guard lock(_cb_s_i_s_s_mutex); - int index=-1; - for(int i=0;i<_cb_s_i_s_s_bitmap.size();i++){ - if(_cb_s_i_s_s_bitmap[i]==0){ - _cb_s_i_s_s_bitmap[i]=1; - index=i; - break; - } - } - return index; - } - // get a available cb_s_i_s_s_i function index - int get_cb_s_i_s_s_i_index(){ - std::lock_guard lock(_cb_s_i_s_s_i_mutex); - int index=-1; - for(int i=0;i<_cb_s_i_s_s_i_bitmap.size();i++){ - if(_cb_s_i_s_s_i_bitmap[i]==0){ - _cb_s_i_s_s_i_bitmap[i]=1; - index=i; - break; - } - } - return index; - } - // release a available cb_s function index - int release_cb_s_index(int index){ - std::lock_guard lock(_cb_s_mutex); - if(index<0||index>=_cb_s_bitmap.size()){ - return -1; - } - _cpp_function_cb_s[index]=nullptr; - _cb_s_bitmap[index]=0; - return 0; - } - // release a available cb_i_s function index - int release_cb_i_s_index(int index){ - std::lock_guard lock(_cb_i_s_mutex); - if(index<0||index>=_cb_i_s_bitmap.size()){ - return -1; - } - _cpp_function_cb_i_s[index]=nullptr; - _cb_i_s_bitmap[index]=0; - return 0; - } - // release a available cb_s_i_s_s function index - int release_cb_s_i_s_s_index(int index){ - std::lock_guard lock(_cb_s_i_s_s_mutex); - if(index<0||index>=_cb_s_i_s_s_bitmap.size()){ - return -1; - } - _cpp_function_cb_s_i_s_s[index]=nullptr; - _cb_s_i_s_s_bitmap[index]=0; - return 0; - } - // release a available cb_s_i_s_s_i function index - int release_cb_s_i_s_s_i_index(int index){ - std::lock_guard lock(_cb_s_i_s_s_i_mutex); - if(index<0||index>=_cb_s_i_s_s_i_bitmap.size()){ - return -1; - } - _cpp_function_cb_s_i_s_s_i[index]=nullptr; - _cb_s_i_s_s_i_bitmap[index]=0; - return 0; - } - }; - FuncPoolManager& instance=FuncPoolManager::get_instance(); - - // wrapper persistent function - // wrapp CB_S,if function pool is full,return nullptr - CB_S _wrapper_cpp_function(const std::function& cpp_function) { - int index=FuncPoolManager::get_instance().get_cb_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_index(); - } - _cpp_function_cb_s[index]=cpp_function; - return _fps_cb_s[index]; - } - // wrapp CB_I_S - CB_I_S _wrapper_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_i_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_i_s_index(); - } - _cpp_function_cb_i_s[index]=cpp_function; - return _fps_cb_i_s[index]; - } - // wrapp CB_S_I_S_S - CB_S_I_S_S _wrapper_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); - } - _cpp_function_cb_s_i_s_s[index]=cpp_function; - return _fps_cb_s_i_s_s[index]; - } - // wrapp CB_S_I_S_S_I - CB_S_I_S_S_I _wrapper_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); - } - _cpp_function_cb_s_i_s_s_i[index]=cpp_function; - return _fps_cb_s_i_s_s_i[index]; - } - - // wrapp function to onetime function - CB_S _wrapper_callonce_cpp_function(const std::function& cpp_function) { - int index=FuncPoolManager::get_instance().get_cb_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_index(); - } - _cpp_function_cb_s[index]=[cpp_function,index](const std::string& str)->void { - cpp_function(str); - FuncPoolManager::get_instance().release_cb_s_index(index); - }; - return _fps_cb_s[index]; - } - - CB_I_S _wrapper_callonce_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_i_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_i_s_index(); - } - _cpp_function_cb_i_s[index]=[cpp_function,index](int code,const std::string& str)->void { - cpp_function(code,str); - FuncPoolManager::get_instance().release_cb_i_s_index(index); - }; - return _fps_cb_i_s[index]; - } - - CB_S_I_S_S _wrapper_callonce_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); - } - _cpp_function_cb_s_i_s_s[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2)->void { - cpp_function(operationID,code,str,str2); - FuncPoolManager::get_instance().release_cb_s_i_s_s_index(index); - }; - return _fps_cb_s_i_s_s[index]; - } - - CB_S_I_S_S_I _wrapper_callonce_cpp_function(const std::function& cpp_function) - { - int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); - // while loop util get a available index - while(index<0){ - std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); - index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); - } - _cpp_function_cb_s_i_s_s_i[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2,int c_int)->void { - cpp_function(operationID,code,str,str2,c_int); - FuncPoolManager::get_instance().release_cb_s_i_s_s_i_index(index); - }; - return _fps_cb_s_i_s_s_i[index]; - } - -} namespace openim{ diff --git a/c_cpp_wrapper/wrapp_cpp_function.inc b/c_cpp_wrapper/wrapp_cpp_function.inc new file mode 100644 index 0000000..7a615b8 --- /dev/null +++ b/c_cpp_wrapper/wrapp_cpp_function.inc @@ -0,0 +1,301 @@ +#define MAX_NUM_OF_CB_S 10 +#define MAX_NUM_OF_CB_I_S 10 +#define MAX_NUM_OF_CB_S_I_S_S 10 +#define MAX_NUM_OF_CB_S_I_S_S_I 10 +#define SLEEP_TIME_FOR_GET_INDEX 100 //ms + +// use recursive template to generate enough function pointer array +// and define c type function interface +// and define manager class to manage function pool +namespace { + CB_S* _fps_cb_s=new CB_S[MAX_NUM_OF_CB_S]; + CB_I_S* _fps_cb_i_s=new CB_I_S[MAX_NUM_OF_CB_I_S]; + CB_S_I_S_S* _fps_cb_s_i_s_s=new CB_S_I_S_S[MAX_NUM_OF_CB_S_I_S_S]; + CB_S_I_S_S_I* _fps_cb_s_i_s_s_i=new CB_S_I_S_S_I[MAX_NUM_OF_CB_S_I_S_S_I]; + // c type func interface call cpp function + std::function* _cpp_function_cb_s=new std::function[MAX_NUM_OF_CB_S]; + std::function* _cpp_function_cb_i_s=new std::function[MAX_NUM_OF_CB_I_S]; + std::function* _cpp_function_cb_s_i_s_s=new std::function[MAX_NUM_OF_CB_S_I_S_S]; + std::function* _cpp_function_cb_s_i_s_s_i=new std::function[MAX_NUM_OF_CB_S_I_S_S_I]; + + template + void _generate_cb_s(){ + _fps_cb_s[N]=[](char* c_str){ + _cpp_function_cb_s[N](std::string(c_str)); + }; + _generate_cb_s(); + } + template<> + void _generate_cb_s<0>(){ + _fps_cb_s[0]=[](char* c_str){ + _cpp_function_cb_s[0](std::string(c_str)); + }; + } + + template + void _generate_cb_i_s(){ + _fps_cb_i_s[N]=[](int code,char* c_str){ + _cpp_function_cb_i_s[N](code,std::string(c_str)); + }; + _generate_cb_i_s(); + } + template<> + void _generate_cb_i_s<0>(){ + _fps_cb_i_s[0]=[](int code,char* c_str){ + _cpp_function_cb_i_s[0](code,std::string(c_str)); + }; + } + template + void _generate_cb_s_i_s_s(){ + _fps_cb_s_i_s_s[N]=[](char* operationID,int code,char* c_str,char* c_str2){ + _cpp_function_cb_s_i_s_s[N](std::string(operationID),code,std::string(c_str),std::string(c_str2)); + }; + _generate_cb_s_i_s_s(); + } + template<> + void _generate_cb_s_i_s_s<0>(){ + _fps_cb_s_i_s_s[0]=[](char* operationID,int code,char* c_str,char* c_str2){ + _cpp_function_cb_s_i_s_s[0](std::string(operationID),code,std::string(c_str),std::string(c_str2)); + }; + } + template + void _generate_cb_s_i_s_s_i(){ + _fps_cb_s_i_s_s_i[N]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){ + _cpp_function_cb_s_i_s_s_i[N](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int); + }; + _generate_cb_s_i_s_s_i(); + } + template<> + void _generate_cb_s_i_s_s_i<0>(){ + _fps_cb_s_i_s_s_i[0]=[](char* operationID,int code,char* c_str,char* c_str2,int c_int){ + _cpp_function_cb_s_i_s_s_i[0](std::string(operationID),code,std::string(c_str),std::string(c_str2),c_int); + }; + } + + // init global function pointer array + void init(){ + _generate_cb_s(); + _generate_cb_i_s(); + _generate_cb_s_i_s_s(); + _generate_cb_s_i_s_s_i(); + } + // define sigle instance class to manage function pool + class FuncPoolManager{ + private: + // define a global bitmap, and support atomic operation, to manage cb_s pool + std::bitset _cb_s_bitmap; + std::bitset _cb_i_s_bitmap; + std::bitset _cb_s_i_s_s_bitmap; + std::bitset _cb_s_i_s_s_i_bitmap; + std::mutex _cb_s_mutex; + std::mutex _cb_i_s_mutex; + std::mutex _cb_s_i_s_s_mutex; + std::mutex _cb_s_i_s_s_i_mutex; + FuncPoolManager(){ + init(); + } + FuncPoolManager(const FuncPoolManager&){} + public: + static FuncPoolManager& get_instance(){ + static FuncPoolManager instance; + return instance; + } + // get a available cb_s function index + int get_cb_s_index(){ + std::lock_guard lock(_cb_s_mutex); + int index=-1; + for(int i=0;i<_cb_s_bitmap.size();i++){ + if(_cb_s_bitmap[i]==0){ + _cb_s_bitmap[i]=1; + index=i; + break; + } + } + return index; + } + // get a available cb_i_s function index + int get_cb_i_s_index(){ + std::lock_guard lock(_cb_i_s_mutex); + int index=-1; + for(int i=0;i<_cb_i_s_bitmap.size();i++){ + if(_cb_i_s_bitmap[i]==0){ + _cb_i_s_bitmap[i]=1; + index=i; + break; + } + } + return index; + } + // get a available cb_s_i_s_s function index + int get_cb_s_i_s_s_index(){ + std::lock_guard lock(_cb_s_i_s_s_mutex); + int index=-1; + for(int i=0;i<_cb_s_i_s_s_bitmap.size();i++){ + if(_cb_s_i_s_s_bitmap[i]==0){ + _cb_s_i_s_s_bitmap[i]=1; + index=i; + break; + } + } + return index; + } + // get a available cb_s_i_s_s_i function index + int get_cb_s_i_s_s_i_index(){ + std::lock_guard lock(_cb_s_i_s_s_i_mutex); + int index=-1; + for(int i=0;i<_cb_s_i_s_s_i_bitmap.size();i++){ + if(_cb_s_i_s_s_i_bitmap[i]==0){ + _cb_s_i_s_s_i_bitmap[i]=1; + index=i; + break; + } + } + return index; + } + // release a available cb_s function index + int release_cb_s_index(int index){ + std::lock_guard lock(_cb_s_mutex); + if(index<0||index>=_cb_s_bitmap.size()){ + return -1; + } + _cpp_function_cb_s[index]=nullptr; + _cb_s_bitmap[index]=0; + return 0; + } + // release a available cb_i_s function index + int release_cb_i_s_index(int index){ + std::lock_guard lock(_cb_i_s_mutex); + if(index<0||index>=_cb_i_s_bitmap.size()){ + return -1; + } + _cpp_function_cb_i_s[index]=nullptr; + _cb_i_s_bitmap[index]=0; + return 0; + } + // release a available cb_s_i_s_s function index + int release_cb_s_i_s_s_index(int index){ + std::lock_guard lock(_cb_s_i_s_s_mutex); + if(index<0||index>=_cb_s_i_s_s_bitmap.size()){ + return -1; + } + _cpp_function_cb_s_i_s_s[index]=nullptr; + _cb_s_i_s_s_bitmap[index]=0; + return 0; + } + // release a available cb_s_i_s_s_i function index + int release_cb_s_i_s_s_i_index(int index){ + std::lock_guard lock(_cb_s_i_s_s_i_mutex); + if(index<0||index>=_cb_s_i_s_s_i_bitmap.size()){ + return -1; + } + _cpp_function_cb_s_i_s_s_i[index]=nullptr; + _cb_s_i_s_s_i_bitmap[index]=0; + return 0; + } + }; + FuncPoolManager& instance=FuncPoolManager::get_instance(); + + // wrapper persistent function + // wrapp CB_S,if function pool is full,return nullptr + CB_S _wrapper_cpp_function(const std::function& cpp_function) { + int index=FuncPoolManager::get_instance().get_cb_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_index(); + } + _cpp_function_cb_s[index]=cpp_function; + return _fps_cb_s[index]; + } + // wrapp CB_I_S + CB_I_S _wrapper_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_i_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_i_s_index(); + } + _cpp_function_cb_i_s[index]=cpp_function; + return _fps_cb_i_s[index]; + } + // wrapp CB_S_I_S_S + CB_S_I_S_S _wrapper_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); + } + _cpp_function_cb_s_i_s_s[index]=cpp_function; + return _fps_cb_s_i_s_s[index]; + } + // wrapp CB_S_I_S_S_I + CB_S_I_S_S_I _wrapper_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); + } + _cpp_function_cb_s_i_s_s_i[index]=cpp_function; + return _fps_cb_s_i_s_s_i[index]; + } + + // wrapp function to onetime function + CB_S _wrapper_callonce_cpp_function(const std::function& cpp_function) { + int index=FuncPoolManager::get_instance().get_cb_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_index(); + } + _cpp_function_cb_s[index]=[cpp_function,index](const std::string& str)->void { + cpp_function(str); + FuncPoolManager::get_instance().release_cb_s_index(index); + }; + return _fps_cb_s[index]; + } + + CB_I_S _wrapper_callonce_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_i_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_i_s_index(); + } + _cpp_function_cb_i_s[index]=[cpp_function,index](int code,const std::string& str)->void { + cpp_function(code,str); + FuncPoolManager::get_instance().release_cb_i_s_index(index); + }; + return _fps_cb_i_s[index]; + } + + CB_S_I_S_S _wrapper_callonce_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_i_s_s_index(); + } + _cpp_function_cb_s_i_s_s[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2)->void { + cpp_function(operationID,code,str,str2); + FuncPoolManager::get_instance().release_cb_s_i_s_s_index(index); + }; + return _fps_cb_s_i_s_s[index]; + } + + CB_S_I_S_S_I _wrapper_callonce_cpp_function(const std::function& cpp_function) + { + int index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); + // while loop util get a available index + while(index<0){ + std::this_thread::sleep_for(std::chrono::milliseconds(SLEEP_TIME_FOR_GET_INDEX)); + index=FuncPoolManager::get_instance().get_cb_s_i_s_s_i_index(); + } + _cpp_function_cb_s_i_s_s_i[index]=[cpp_function,index](const std::string& operationID,int code,const std::string& str,const std::string& str2,int c_int)->void { + cpp_function(operationID,code,str,str2,c_int); + FuncPoolManager::get_instance().release_cb_s_i_s_s_i_index(index); + }; + return _fps_cb_s_i_s_s_i[index]; + } + +} +