Merge pull request #7 from CNCSMonster/main
fix: fix style error and syntax error
This commit is contained in:
commit
38f09d3ff7
@ -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);
|
||||
|
@ -1,5 +1,6 @@
|
||||
#include "openimsdkcc.h"
|
||||
|
||||
#include "wrapp_cpp_function.inc"
|
||||
|
||||
namespace openim {
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
#pragma onces
|
||||
#pragma once
|
||||
|
||||
#include "openimsdk.h"
|
||||
#include <functional>
|
||||
@ -11,306 +11,6 @@
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
|
||||
#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<void(const std::string&)>* _cpp_function_cb_s=new std::function<void(const std::string&)>[MAX_NUM_OF_CB_S];
|
||||
std::function<void(int,const std::string&)>* _cpp_function_cb_i_s=new std::function<void(int,const std::string&)>[MAX_NUM_OF_CB_I_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&)>* _cpp_function_cb_s_i_s_s=new std::function<void(const std::string&,int,const std::string&,const std::string&)>[MAX_NUM_OF_CB_S_I_S_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&,int)>* _cpp_function_cb_s_i_s_s_i=new std::function<void(const std::string&,int,const std::string&,const std::string&,int)>[MAX_NUM_OF_CB_S_I_S_S_I];
|
||||
|
||||
template<int N>
|
||||
void _generate_cb_s(){
|
||||
_fps_cb_s[N]=[](char* c_str){
|
||||
_cpp_function_cb_s[N](std::string(c_str));
|
||||
};
|
||||
_generate_cb_s<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_s<0>(){
|
||||
_fps_cb_s[0]=[](char* c_str){
|
||||
_cpp_function_cb_s[0](std::string(c_str));
|
||||
};
|
||||
}
|
||||
|
||||
template<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<MAX_NUM_OF_CB_S-1>();
|
||||
_generate_cb_i_s<MAX_NUM_OF_CB_I_S-1>();
|
||||
_generate_cb_s_i_s_s<MAX_NUM_OF_CB_S_I_S_S-1>();
|
||||
_generate_cb_s_i_s_s_i<MAX_NUM_OF_CB_S_I_S_S_I-1>();
|
||||
}
|
||||
// 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<MAX_NUM_OF_CB_S> _cb_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_I_S> _cb_i_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S> _cb_s_i_s_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S_I> _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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<void(const std::string&)>& 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<void(int,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&,int)>& 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<void(const std::string&)>& 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<void(int,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&,int)>& 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{
|
||||
|
301
c_cpp_wrapper/wrapp_cpp_function.inc
Normal file
301
c_cpp_wrapper/wrapp_cpp_function.inc
Normal file
@ -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<void(const std::string&)>* _cpp_function_cb_s=new std::function<void(const std::string&)>[MAX_NUM_OF_CB_S];
|
||||
std::function<void(int,const std::string&)>* _cpp_function_cb_i_s=new std::function<void(int,const std::string&)>[MAX_NUM_OF_CB_I_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&)>* _cpp_function_cb_s_i_s_s=new std::function<void(const std::string&,int,const std::string&,const std::string&)>[MAX_NUM_OF_CB_S_I_S_S];
|
||||
std::function<void(const std::string&,int,const std::string&,const std::string&,int)>* _cpp_function_cb_s_i_s_s_i=new std::function<void(const std::string&,int,const std::string&,const std::string&,int)>[MAX_NUM_OF_CB_S_I_S_S_I];
|
||||
|
||||
template<int N>
|
||||
void _generate_cb_s(){
|
||||
_fps_cb_s[N]=[](char* c_str){
|
||||
_cpp_function_cb_s[N](std::string(c_str));
|
||||
};
|
||||
_generate_cb_s<N-1>();
|
||||
}
|
||||
template<>
|
||||
void _generate_cb_s<0>(){
|
||||
_fps_cb_s[0]=[](char* c_str){
|
||||
_cpp_function_cb_s[0](std::string(c_str));
|
||||
};
|
||||
}
|
||||
|
||||
template<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<int N>
|
||||
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<N-1>();
|
||||
}
|
||||
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<MAX_NUM_OF_CB_S-1>();
|
||||
_generate_cb_i_s<MAX_NUM_OF_CB_I_S-1>();
|
||||
_generate_cb_s_i_s_s<MAX_NUM_OF_CB_S_I_S_S-1>();
|
||||
_generate_cb_s_i_s_s_i<MAX_NUM_OF_CB_S_I_S_S_I-1>();
|
||||
}
|
||||
// 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<MAX_NUM_OF_CB_S> _cb_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_I_S> _cb_i_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S> _cb_s_i_s_s_bitmap;
|
||||
std::bitset<MAX_NUM_OF_CB_S_I_S_S_I> _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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<std::mutex> 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<void(const std::string&)>& 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<void(int,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&,int)>& 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<void(const std::string&)>& 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<void(int,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&)>& 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<void(const std::string&,int,const std::string&,const std::string&,int)>& 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];
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user