diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..cd05334 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "files.associations": { + "ostream": "cpp", + "chrono": "cpp", + "thread": "cpp" + }, + "C_Cpp.errorSquiggles": "disabled" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..05054c5 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++ build active file", + "command": "/usr/bin/g++", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${file}", + "-o", + "${fileDirname}/${fileBasenameNoExtension}" + ], + "options": { + "cwd": "${fileDirname}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ], + "version": "2.0.0" +} \ No newline at end of file diff --git a/c_cpp_wrapper/build_dll.bat b/c_cpp_wrapper/build_dll.bat new file mode 100644 index 0000000..41fd9af --- /dev/null +++ b/c_cpp_wrapper/build_dll.bat @@ -0,0 +1,5 @@ +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o openimsdk.dll export.go constant.go protocol.go tools.go + + + +g++ -shared -fPIC -o openimsdkcc.dll openimsdkcc.cc openimsdk.dll \ No newline at end of file diff --git a/c_cpp_wrapper/build_run_test.bat b/c_cpp_wrapper/build_run_test.bat new file mode 100644 index 0000000..e8fdc3c --- /dev/null +++ b/c_cpp_wrapper/build_run_test.bat @@ -0,0 +1,2 @@ +gcc -o test.exe -L. openimsdk.dll test.c +test.exe \ No newline at end of file diff --git a/c_cpp_wrapper/build_so.sh b/c_cpp_wrapper/build_so.sh new file mode 100755 index 0000000..dc1c3e9 --- /dev/null +++ b/c_cpp_wrapper/build_so.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +rm ./openimsdk.so ./openimsdk.h +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o openimsdk.so export.go constant.go protocol.go tools.go + + +# build cpp sdk +rm ./openimsdkcc.so +g++ -fPIC -shared -o openimsdkcc.so openimsdkcc.cc ./openimsdk.so \ No newline at end of file diff --git a/c_cpp_wrapper/build_test.bat b/c_cpp_wrapper/build_test.bat new file mode 100644 index 0000000..3950e23 --- /dev/null +++ b/c_cpp_wrapper/build_test.bat @@ -0,0 +1 @@ +gcc -o test.exe -L. openimsdk.dll test.c \ No newline at end of file diff --git a/c_cpp_wrapper/constant.go b/c_cpp_wrapper/constant.go new file mode 100644 index 0000000..1798166 --- /dev/null +++ b/c_cpp_wrapper/constant.go @@ -0,0 +1,77 @@ +package main + +/* +#include +*/ +import "C" + +var ( + NO_ERR = C.int(0) + NO_ERR_MSG = C.CString("") + NO_DATA = C.CString("") + NO_PROGRESS = C.int(0) +) + +const ( + CONNECTING = iota + CONNECT_SUCCESS + CONNECT_FAILED + KICKED_OFFLINE + USER_TOKEN_EXPIRED + JOINED_GROUP_ADDED + JOINED_GROUP_DELETED + GROUP_MEMBER_ADDED + GROUP_MEMBER_DELETED + GROUP_APPLICATION_ADDED + GROUP_APPLICATION_DELETED + GROUP_INFO_CHANGED + GROUP_DISMISSED + GROUP_MEMBER_INFO_CHANGED + GROUP_APPLICATION_ACCEPTED + GROUP_APPLICATION_REJECTED + FRIEND_APPLICATION_ADDED + FRIEND_APPLICATION_DELETED + FRIEND_APPLICATION_ACCEPTED + FRIEND_APPLICATION_REJECTED + FRIEND_ADDED + FRIEND_DELETED + FRIEND_INFO_CHANGED + BLACK_ADDED + BLACK_DELETED + SYNC_SERVER_START + SYNC_SERVER_FINISH + SYNC_SERVER_PROGRESS + SYNC_SERVER_FAILED + NEW_CONVERSATION + CONVERSATION_CHANGED + TOTAL_UNREAD_MESSAGE_COUNT_CHANGED + RECV_NEW_MESSAGE + RECV_C2C_READ_RECEIPT + RECV_GROUP_READ_RECEIPT + NEW_RECV_MESSAGE_REVOKED + RECV_MESSAGE_EXTENSIONS_CHANGED + RECV_MESSAGE_EXTENSIONS_DELETED + RECV_MESSAGE_EXTENSIONS_ADDED + RECV_OFFLINE_NEW_MESSAGE + MSG_DELETED + + RECV_NEW_MESSAGES + RECV_OFFLINE_NEW_MESSAGES + + SELF_INFO_UPDATED + USER_STATUS_CHANGED + + RECV_CUSTOM_BUSINESS_MESSAGE + + + MESSAGE_KV_INFO_CHANGED + + UPLOAD_FILE_CALLBACK_OPEN + UPLOAD_FILE_CALLBACK_PART_SIZE + UPLOAD_FILE_CALLBACK_HASH_PART_PROGRESS + UPLOAD_FILE_CALLBACK_HASH_PART_COMPLETE + UPLOAD_FILE_CALLBACK_UPLOAD_ID + UPLOAD_FILE_CALLBACK_UPLOAD_PART_COMPLETE + UPLOAD_FILE_CALLBACK_UPLOAD_COMPLETE + UPLOAD_FILE_CALLBACK_COMPLETE +) diff --git a/c_cpp_wrapper/event_listener/listener.go b/c_cpp_wrapper/event_listener/listener.go new file mode 100644 index 0000000..0d2d4a9 --- /dev/null +++ b/c_cpp_wrapper/event_listener/listener.go @@ -0,0 +1 @@ +package event_listener diff --git a/c_cpp_wrapper/export.go b/c_cpp_wrapper/export.go new file mode 100644 index 0000000..635b4ca --- /dev/null +++ b/c_cpp_wrapper/export.go @@ -0,0 +1,960 @@ +package main + +/* +#include +typedef void (*CB_S)(char *); +typedef void (*CB_I_S)(int,char *); +typedef void (*CB_S_I_S_S)(char *,int,char *,char *); +typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int); +extern void Call_CB_S(CB_S func,char* data); +extern void Call_CB_I_S(CB_I_S func,int event,char* data); +extern void Call_CB_S_I_S_S(CB_S_I_S_S func,char *,int errCode,char* errMsg,char* data); +extern void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char *,int errCode,char* errMsg,char* data,int progress); +extern CB_S DebugPrint; + +*/ +import "C" + +import ( + "open_im_sdk/open_im_sdk" +) + +//export set_print +func set_print(print C.CB_S) { + C.DebugPrint = print +} + +func DebugPrint(info string) { + C.Call_CB_S(C.DebugPrint, C.CString("DLL:"+info)) +} + +type Base struct { + ErrCode int32 `json:"errCode"` + ErrMsg string `json:"errMsg"` +} + +// =====================================================listener=============================================== + +type ConnCallback struct { + cCallback C.CB_I_S +} + +func NewConnCallback(cCallback C.CB_I_S) *ConnCallback { + return &ConnCallback{cCallback: cCallback} +} + +func (c ConnCallback) OnConnecting() { + C.Call_CB_I_S(c.cCallback, CONNECTING, NO_DATA) +} + +func (c ConnCallback) OnConnectSuccess() { + C.Call_CB_I_S(c.cCallback, CONNECT_SUCCESS, NO_DATA) +} + +func (c ConnCallback) OnConnectFailed(errCode int32, errMsg string) { + + C.Call_CB_I_S(c.cCallback, CONNECT_FAILED, C.CString(StructToJsonString(Base{ErrCode: errCode, ErrMsg: errMsg}))) + +} + +func (c ConnCallback) OnKickedOffline() { + C.Call_CB_I_S(c.cCallback, KICKED_OFFLINE, NO_DATA) +} + +func (c ConnCallback) OnUserTokenExpired() { + C.Call_CB_I_S(c.cCallback, USER_TOKEN_EXPIRED, NO_DATA) +} + +type ConversationCallback struct { + cCallback C.CB_I_S +} + +func NewConversationCallback(cCallback C.CB_I_S) *ConversationCallback { + return &ConversationCallback{cCallback: cCallback} +} + +func (c ConversationCallback) OnSyncServerStart() { + C.Call_CB_I_S(c.cCallback, SYNC_SERVER_START, NO_DATA) +} + +func (c ConversationCallback) OnSyncServerFinish() { + C.Call_CB_I_S(c.cCallback, SYNC_SERVER_FINISH, NO_DATA) +} + +func (c ConversationCallback) OnSyncServerFailed() { + C.Call_CB_I_S(c.cCallback, SYNC_SERVER_FAILED, NO_DATA) +} + +func (c ConversationCallback) OnNewConversation(conversationList string) { + C.Call_CB_I_S(c.cCallback, NEW_CONVERSATION, C.CString(conversationList)) +} + +func (c ConversationCallback) OnConversationChanged(conversationList string) { + C.Call_CB_I_S(c.cCallback, CONVERSATION_CHANGED, C.CString(conversationList)) +} + +func (c ConversationCallback) OnTotalUnreadMessageCountChanged(totalUnreadCount int32) { + C.Call_CB_I_S(c.cCallback, TOTAL_UNREAD_MESSAGE_COUNT_CHANGED, C.CString(Int32ToString(totalUnreadCount))) +} + +type AdvancedMsgCallback struct { + cCallback C.CB_I_S +} + +func (a AdvancedMsgCallback) OnRecvNewMessage(message string) { + C.Call_CB_I_S(a.cCallback, RECV_NEW_MESSAGE, C.CString(message)) +} + +func (a AdvancedMsgCallback) OnRecvC2CReadReceipt(msgReceiptList string) { + C.Call_CB_I_S(a.cCallback, RECV_C2C_READ_RECEIPT, C.CString(msgReceiptList)) +} + +func (a AdvancedMsgCallback) OnRecvGroupReadReceipt(groupMsgReceiptList string) { + C.Call_CB_I_S(a.cCallback, RECV_GROUP_READ_RECEIPT, C.CString(groupMsgReceiptList)) +} + +func (a AdvancedMsgCallback) OnNewRecvMessageRevoked(messageRevoked string) { + C.Call_CB_I_S(a.cCallback, NEW_RECV_MESSAGE_REVOKED, C.CString(messageRevoked)) +} + +func (a AdvancedMsgCallback) OnRecvMessageExtensionsChanged(msgID string, reactionExtensionList string) { + m := make(map[string]string) + m["msgID"] = msgID + m["reactionExtensionList"] = reactionExtensionList + C.Call_CB_I_S(a.cCallback, RECV_MESSAGE_EXTENSIONS_CHANGED, C.CString(StructToJsonString(m))) +} + +func (a AdvancedMsgCallback) OnRecvMessageExtensionsDeleted(msgID string, reactionExtensionKeyList string) { + m := make(map[string]string) + m["msgID"] = msgID + m["reactionExtensionKeyList"] = reactionExtensionKeyList + C.Call_CB_I_S(a.cCallback, RECV_MESSAGE_EXTENSIONS_DELETED, C.CString(StructToJsonString(m))) +} + +func (a AdvancedMsgCallback) OnRecvMessageExtensionsAdded(msgID string, reactionExtensionList string) { + m := make(map[string]string) + m["msgID"] = msgID + m["reactionExtensionList"] = reactionExtensionList + C.Call_CB_I_S(a.cCallback, RECV_MESSAGE_EXTENSIONS_ADDED, C.CString(StructToJsonString(m))) +} + +func (a AdvancedMsgCallback) OnRecvOfflineNewMessage(message string) { + C.Call_CB_I_S(a.cCallback, RECV_OFFLINE_NEW_MESSAGE, C.CString(message)) +} + +func (a AdvancedMsgCallback) OnMsgDeleted(message string) { + C.Call_CB_I_S(a.cCallback, MSG_DELETED, C.CString(message)) +} + +func NewAdvancedMsgCallback(cCallback C.CB_I_S) *AdvancedMsgCallback { + return &AdvancedMsgCallback{cCallback: cCallback} +} + +type BatchMessageCallback struct { + cCallback C.CB_I_S +} + +func (b BatchMessageCallback) OnRecvNewMessages(messageList string) { + C.Call_CB_I_S(b.cCallback, RECV_NEW_MESSAGES, C.CString(messageList)) +} + +func (b BatchMessageCallback) OnRecvOfflineNewMessages(messageList string) { + C.Call_CB_I_S(b.cCallback, RECV_OFFLINE_NEW_MESSAGES, C.CString(messageList)) +} + +func NewBatchMessageCallback(cCallback C.CB_I_S) *BatchMessageCallback { + return &BatchMessageCallback{cCallback: cCallback} +} + +type FriendCallback struct { + cCallback C.CB_I_S +} + +func (f FriendCallback) OnFriendApplicationAdded(friendApplication string) { + C.Call_CB_I_S(f.cCallback, FRIEND_APPLICATION_ADDED, C.CString(friendApplication)) +} + +func (f FriendCallback) OnFriendApplicationDeleted(friendApplication string) { + C.Call_CB_I_S(f.cCallback, FRIEND_APPLICATION_DELETED, C.CString(friendApplication)) +} + +func (f FriendCallback) OnFriendApplicationAccepted(friendApplication string) { + C.Call_CB_I_S(f.cCallback, FRIEND_APPLICATION_ACCEPTED, C.CString(friendApplication)) +} + +func (f FriendCallback) OnFriendApplicationRejected(friendApplication string) { + C.Call_CB_I_S(f.cCallback, FRIEND_APPLICATION_REJECTED, C.CString(friendApplication)) +} + +func (f FriendCallback) OnFriendAdded(friendInfo string) { + C.Call_CB_I_S(f.cCallback, FRIEND_ADDED, C.CString(friendInfo)) +} + +func (f FriendCallback) OnFriendDeleted(friendInfo string) { + C.Call_CB_I_S(f.cCallback, FRIEND_DELETED, C.CString(friendInfo)) +} + +func (f FriendCallback) OnFriendInfoChanged(friendInfo string) { + C.Call_CB_I_S(f.cCallback, FRIEND_INFO_CHANGED, C.CString(friendInfo)) +} + +func (f FriendCallback) OnBlackAdded(blackInfo string) { + C.Call_CB_I_S(f.cCallback, BLACK_ADDED, C.CString(blackInfo)) +} + +func (f FriendCallback) OnBlackDeleted(blackInfo string) { + C.Call_CB_I_S(f.cCallback, BLACK_DELETED, C.CString(blackInfo)) +} + +func NewFriendCallback(cCallback C.CB_I_S) *FriendCallback { + return &FriendCallback{cCallback: cCallback} +} + +type GroupCallback struct { + cCallback C.CB_I_S +} + +func NewGroupCallback(cCallback C.CB_I_S) *GroupCallback { + return &GroupCallback{cCallback: cCallback} +} + +func (g GroupCallback) OnJoinedGroupAdded(groupInfo string) { + C.Call_CB_I_S(g.cCallback, JOINED_GROUP_ADDED, C.CString(groupInfo)) +} + +func (g GroupCallback) OnJoinedGroupDeleted(groupInfo string) { + C.Call_CB_I_S(g.cCallback, JOINED_GROUP_DELETED, C.CString(groupInfo)) +} + +func (g GroupCallback) OnGroupMemberAdded(groupMemberInfo string) { + C.Call_CB_I_S(g.cCallback, GROUP_MEMBER_ADDED, C.CString(groupMemberInfo)) +} + +func (g GroupCallback) OnGroupMemberDeleted(groupMemberInfo string) { + C.Call_CB_I_S(g.cCallback, GROUP_MEMBER_DELETED, C.CString(groupMemberInfo)) +} + +func (g GroupCallback) OnGroupApplicationAdded(groupApplication string) { + C.Call_CB_I_S(g.cCallback, GROUP_APPLICATION_ADDED, C.CString(groupApplication)) +} + +func (g GroupCallback) OnGroupApplicationDeleted(groupApplication string) { + C.Call_CB_I_S(g.cCallback, GROUP_APPLICATION_DELETED, C.CString(groupApplication)) +} + +func (g GroupCallback) OnGroupInfoChanged(groupInfo string) { + C.Call_CB_I_S(g.cCallback, GROUP_INFO_CHANGED, C.CString(groupInfo)) +} + +func (g GroupCallback) OnGroupDismissed(groupInfo string) { + C.Call_CB_I_S(g.cCallback, GROUP_DISMISSED, C.CString(groupInfo)) +} + +func (g GroupCallback) OnGroupMemberInfoChanged(groupMemberInfo string) { + C.Call_CB_I_S(g.cCallback, GROUP_MEMBER_INFO_CHANGED, C.CString(groupMemberInfo)) +} + +func (g GroupCallback) OnGroupApplicationAccepted(groupApplication string) { + C.Call_CB_I_S(g.cCallback, GROUP_APPLICATION_ACCEPTED, C.CString(groupApplication)) +} + +func (g GroupCallback) OnGroupApplicationRejected(groupApplication string) { + C.Call_CB_I_S(g.cCallback, GROUP_APPLICATION_REJECTED, C.CString(groupApplication)) +} + +type CustomBusinessCallback struct { + cCallback C.CB_I_S +} + +func (c CustomBusinessCallback) OnRecvCustomBusinessMessage(businessMessage string) { + C.Call_CB_I_S(c.cCallback, RECV_CUSTOM_BUSINESS_MESSAGE, C.CString(businessMessage)) +} + +func NewCustomBusinessCallback(cCallback C.CB_I_S) *CustomBusinessCallback { + return &CustomBusinessCallback{cCallback: cCallback} +} + +type UserCallback struct { + cCallback C.CB_I_S +} + +func (u UserCallback) OnSelfInfoUpdated(userInfo string) { + C.Call_CB_I_S(u.cCallback, SELF_INFO_UPDATED, C.CString(userInfo)) +} + +func (u UserCallback) OnUserStatusChanged(statusMap string) { + C.Call_CB_I_S(u.cCallback, USER_STATUS_CHANGED, C.CString(statusMap)) +} + +func NewUserCallback(cCallback C.CB_I_S) *UserCallback { + return &UserCallback{cCallback: cCallback} +} + +type SendMessageCallback struct { + cCallback C.CB_S_I_S_S_I + operationID string +} + +func NewSendMessageCallback(cCallback C.CB_S_I_S_S_I, operationID *C.char) *SendMessageCallback { + return &SendMessageCallback{cCallback: cCallback, operationID: C.GoString(operationID)} +} + +func (s SendMessageCallback) OnError(errCode int32, errMsg string) { + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS) +} + +func (s SendMessageCallback) OnSuccess(data string) { + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS) +} + +func (s SendMessageCallback) OnProgress(progress int) { + C.Call_CB_S_I_S_S_I(s.cCallback, C.CString(s.operationID), NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress)) +} + +type BaseCallback struct { + cCallback C.CB_S_I_S_S + operationID string +} + +func NewBaseCallback(cCallback C.CB_S_I_S_S, operationID *C.char) *BaseCallback { + return &BaseCallback{cCallback: cCallback, operationID: C.GoString(operationID)} +} + +func (b BaseCallback) OnError(errCode int32, errMsg string) { + C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), C.int(errCode), C.CString(errMsg), NO_DATA) +} + +func (b BaseCallback) OnSuccess(data string) { + C.Call_CB_S_I_S_S(b.cCallback, C.CString(b.operationID), NO_ERR, NO_ERR_MSG, C.CString(data)) +} + +// =====================================================global_callback=============================================== + +//export set_group_listener +func set_group_listener(cCallback C.CB_I_S) { + open_im_sdk.SetGroupListener(NewGroupCallback(cCallback)) +} + +//export set_conversation_listener +func set_conversation_listener(cCallback C.CB_I_S) { + open_im_sdk.SetConversationListener(NewConversationCallback(cCallback)) +} + +//export set_advanced_msg_listener +func set_advanced_msg_listener(cCallback C.CB_I_S) { + open_im_sdk.SetAdvancedMsgListener(NewAdvancedMsgCallback(cCallback)) +} + +//export set_batch_msg_listener +func set_batch_msg_listener(cCallback C.CB_I_S) { + open_im_sdk.SetBatchMsgListener(NewBatchMessageCallback(cCallback)) +} + +//export set_user_listener +func set_user_listener(cCallback C.CB_I_S) { + open_im_sdk.SetUserListener(NewUserCallback(cCallback)) +} + +//export set_friend_listener +func set_friend_listener(cCallback C.CB_I_S) { + open_im_sdk.SetFriendListener(NewFriendCallback(cCallback)) +} + +//export set_custom_business_listener +func set_custom_business_listener(cCallback C.CB_I_S) { + open_im_sdk.SetCustomBusinessListener(NewCustomBusinessCallback(cCallback)) +} + +////export set_messsage_kv_listener +//func set_messsage_kv_listener(cCallback C.CB_I_S) { +// open_im_sdk.SetMessageKvInfoListener(NewMessageKVCallback(cCallback)) +//} + +// =====================================================conversation_msg=============================================== + +//export init_sdk +func init_sdk( + cCallback C.CB_I_S, + operationID *C.char, config *C.char) bool { + callback := NewConnCallback(cCallback) + return open_im_sdk.InitSDK(callback, C.GoString(operationID), C.GoString(config)) +} + +//export un_init_sdk +func un_init_sdk(operationID *C.char) { + open_im_sdk.UnInitSDK(C.GoString(operationID)) +} + +//export login +func login(cCallback C.CB_S_I_S_S, operationID, uid, token *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.Login(baseCallback, C.GoString(operationID), C.GoString(uid), C.GoString(token)) +} + +//export logout +func logout(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.Logout(baseCallback, C.GoString(operationID)) +} + +//export network_status_changed +func network_status_changed(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.NetworkStatusChanged(baseCallback, C.GoString(operationID)) +} + +//export get_login_status +func get_login_status(operationID *C.char) int { + return open_im_sdk.GetLoginStatus(C.GoString(operationID)) +} + +//export get_login_user +func get_login_user() *C.char { + return C.CString(open_im_sdk.GetLoginUserID()) +} + +//export create_text_message +func create_text_message(operationID, text *C.char) *C.char { + message := C.CString(open_im_sdk.CreateTextMessage(C.GoString(operationID), C.GoString(text))) + return message +} + +//export create_advanced_text_message +func create_advanced_text_message(operationID, text, messageEntityList *C.char) *C.char { + return C.CString(open_im_sdk.CreateAdvancedTextMessage(C.GoString(operationID), C.GoString(text), + C.GoString(messageEntityList))) +} + +//export create_text_at_message +func create_text_at_message(operationID, text, atUserList, atUsersInfo, message *C.char) *C.char { + return C.CString(open_im_sdk.CreateTextAtMessage(C.GoString(operationID), C.GoString(text), C.GoString(atUserList), + C.GoString(atUsersInfo), C.GoString(message))) +} + +//export create_location_message +func create_location_message(operationID, description *C.char, longitude, latitude C.double) *C.char { + return C.CString(open_im_sdk.CreateLocationMessage(C.GoString(operationID), C.GoString(description), + float64(longitude), float64(latitude))) +} + +//export create_custom_message +func create_custom_message(operationID, data, extension, description *C.char) *C.char { + return C.CString(open_im_sdk.CreateCustomMessage(C.GoString(operationID), C.GoString(data), C.GoString(extension), + C.GoString(description))) +} + +//export create_quote_message +func create_quote_message(operationID, text, message *C.char) *C.char { + return C.CString(open_im_sdk.CreateQuoteMessage(C.GoString(operationID), C.GoString(text), C.GoString(message))) +} + +//export create_advanced_quote_message +func create_advanced_quote_message(operationID, text, message, messageEntityList *C.char) *C.char { + return C.CString(open_im_sdk.CreateAdvancedQuoteMessage(C.GoString(operationID), C.GoString(text), + C.GoString(message), C.GoString(messageEntityList))) +} + +//export create_card_message +func create_card_message(operationID, cardInfo *C.char) *C.char { + return C.CString(open_im_sdk.CreateCardMessage(C.GoString(operationID), C.GoString(cardInfo))) +} + +//export create_video_message_from_full_path +func create_video_message_from_full_path(operationID, videoFullPath, videoType *C.char, duration C.longlong, + snapshotFullPath *C.char) *C.char { + return C.CString(open_im_sdk.CreateVideoMessageFromFullPath(C.GoString(operationID), C.GoString(videoFullPath), + C.GoString(videoType), int64(duration), C.GoString(snapshotFullPath))) +} + +//export create_image_message_from_full_path +func create_image_message_from_full_path(operationID, imageFullPath *C.char) *C.char { + return C.CString(open_im_sdk.CreateImageMessageFromFullPath(C.GoString(operationID), C.GoString(imageFullPath))) +} + +//export create_sound_message_from_full_path +func create_sound_message_from_full_path(operationID, soundPath *C.char, duration C.longlong) *C.char { + return C.CString(open_im_sdk.CreateSoundMessageFromFullPath(C.GoString(operationID), C.GoString(soundPath), + int64(duration))) +} + +//export create_file_message_from_full_path +func create_file_message_from_full_path(operationID, fileFullPath, fileName *C.char) *C.char { + return C.CString(open_im_sdk.CreateFileMessageFromFullPath(C.GoString(operationID), C.GoString(fileFullPath), + C.GoString(fileName))) +} + +//export create_image_message +func create_image_message(operationID, imagePath *C.char) *C.char { + return C.CString(open_im_sdk.CreateImageMessage(C.GoString(operationID), C.GoString(imagePath))) +} + +//export create_image_message_by_url +func create_image_message_by_url(operationID, sourcePicture, bigPicture, snapshotPicture *C.char) *C.char { + return C.CString(open_im_sdk.CreateImageMessageByURL(C.GoString(operationID), C.GoString(sourcePicture), + C.GoString(bigPicture), C.GoString(snapshotPicture))) +} + +//export create_sound_message_by_url +func create_sound_message_by_url(operationID, soundBaseInfo *C.char) *C.char { + return C.CString(open_im_sdk.CreateSoundMessageByURL(C.GoString(operationID), C.GoString(soundBaseInfo))) +} + +//export create_sound_message +func create_sound_message(operationID, soundPath *C.char, duration C.longlong) *C.char { + return C.CString(open_im_sdk.CreateSoundMessage(C.GoString(operationID), C.GoString(soundPath), int64(duration))) +} + +//export create_video_message_by_url +func create_video_message_by_url(operationID, videoBaseInfo *C.char) *C.char { + return C.CString(open_im_sdk.CreateVideoMessageByURL(C.GoString(operationID), C.GoString(videoBaseInfo))) +} + +//export create_video_message +func create_video_message(operationID, videoPath *C.char, videoType *C.char, duration C.longlong, + snapshotPath *C.char) *C.char { + return C.CString(open_im_sdk.CreateVideoMessage(C.GoString(operationID), C.GoString(videoPath), + C.GoString(videoType), int64(duration), C.GoString(snapshotPath))) +} + +//export create_file_message_by_url +func create_file_message_by_url(operationID, fileBaseInfo *C.char) *C.char { + return C.CString(open_im_sdk.CreateFileMessageByURL(C.GoString(operationID), C.GoString(fileBaseInfo))) +} + +//export create_file_message +func create_file_message(operationID, filePath, fileName *C.char) *C.char { + return C.CString(open_im_sdk.CreateFileMessage(C.GoString(operationID), C.GoString(filePath), C.GoString(fileName))) +} + +//export create_merger_message +func create_merger_message(operationID, messageList, title, summaryList *C.char) *C.char { + return C.CString(open_im_sdk.CreateMergerMessage(C.GoString(operationID), C.GoString(messageList), + C.GoString(title), C.GoString(summaryList))) +} + +//export create_face_message +func create_face_message(operationID *C.char, index C.int, data *C.char) *C.char { + return C.CString(open_im_sdk.CreateFaceMessage(C.GoString(operationID), int(index), C.GoString(data))) +} + +//export create_forward_message +func create_forward_message(operationID, m *C.char) *C.char { + return C.CString(open_im_sdk.CreateForwardMessage(C.GoString(operationID), C.GoString(m))) +} + +//export get_all_conversation_list +func get_all_conversation_list(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetAllConversationList(baseCallback, C.GoString(operationID)) +} + +//export get_advanced_history_message_list +func get_advanced_history_message_list(cCallback C.CB_S_I_S_S, operationID, getMessageOptions *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetAdvancedHistoryMessageList(baseCallback, C.GoString(operationID), C.GoString(getMessageOptions)) +} + +//export send_message +func send_message(cCallback C.CB_S_I_S_S_I, operationID, message, recvID, groupID, offlinePushInfo *C.char) { + sendMsgCallback := NewSendMessageCallback(cCallback, operationID) + open_im_sdk.SendMessage(sendMsgCallback, C.GoString(operationID), C.GoString(message), C.GoString(recvID), + C.GoString(groupID), C.GoString(offlinePushInfo)) +} + +// =====================================================user=============================================== +// +//export get_users_info +func get_users_info(cCallback C.CB_S_I_S_S, operationID *C.char, userIDs *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetUsersInfo(baseCallback, C.GoString(operationID), C.GoString(userIDs)) +} + +//export get_users_info_from_srv +func get_users_info_from_srv(cCallback C.CB_S_I_S_S, operationID *C.char, userIDs *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetUsersInfoFromSrv(baseCallback, C.GoString(operationID), C.GoString(userIDs)) +} + +//export set_self_info +func set_self_info(cCallback C.CB_S_I_S_S, operationID *C.char, userInfo *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetSelfInfo(baseCallback, C.GoString(operationID), C.GoString(userInfo)) +} + +//export get_self_user_info +func get_self_user_info(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetSelfUserInfo(baseCallback, C.GoString(operationID)) +} + +//export update_msg_sender_info +func update_msg_sender_info(cCallback C.CB_S_I_S_S, operationID *C.char, nickname *C.char, faceURL *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.UpdateMsgSenderInfo(baseCallback, C.GoString(operationID), C.GoString(nickname), C.GoString(faceURL)) +} + +//export subscribe_users_status +func subscribe_users_status(cCallback C.CB_S_I_S_S, operationID *C.char, userIDs *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SubscribeUsersStatus(baseCallback, C.GoString(operationID), C.GoString(userIDs)) +} + +//export unsubscribe_users_status +func unsubscribe_users_status(cCallback C.CB_S_I_S_S, operationID *C.char, userIDs *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.UnsubscribeUsersStatus(baseCallback, C.GoString(operationID), C.GoString(userIDs)) +} + +//export get_subscribe_users_status +func get_subscribe_users_status(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetSubscribeUsersStatus(baseCallback, C.GoString(operationID)) +} + +//export get_user_status +func get_user_status(cCallback C.CB_S_I_S_S, operationID *C.char, userIDs *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetUserStatus(baseCallback, C.GoString(operationID), C.GoString(userIDs)) +} + +// =====================================================friend=============================================== +// +//export get_specified_friends_info +func get_specified_friends_info(cCallback C.CB_S_I_S_S, operationID *C.char, userIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetSpecifiedFriendsInfo(baseCallback, C.GoString(operationID), C.GoString(userIDList)) +} + +//export get_friend_list +func get_friend_list(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetFriendList(baseCallback, C.GoString(operationID)) +} + +//export get_friend_list_page +func get_friend_list_page(cCallback C.CB_S_I_S_S, operationID *C.char, offset C.int, count C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetFriendListPage(baseCallback, C.GoString(operationID), int32(offset), int32(count)) +} + +//export search_friends +func search_friends(cCallback C.CB_S_I_S_S, operationID *C.char, searchParam *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SearchFriends(baseCallback, C.GoString(operationID), C.GoString(searchParam)) +} + +//export check_friend +func check_friend(cCallback C.CB_S_I_S_S, operationID *C.char, userIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.CheckFriend(baseCallback, C.GoString(operationID), C.GoString(userIDList)) +} + +//export add_friend +func add_friend(cCallback C.CB_S_I_S_S, operationID *C.char, userIDReqMsg *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.AddFriend(baseCallback, C.GoString(operationID), C.GoString(userIDReqMsg)) +} + +//export set_friend_remark +func set_friend_remark(cCallback C.CB_S_I_S_S, operationID *C.char, userIDRemark *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetFriendRemark(baseCallback, C.GoString(operationID), C.GoString(userIDRemark)) +} + +//export delete_friend +func delete_friend(cCallback C.CB_S_I_S_S, operationID *C.char, friendUserID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.DeleteFriend(baseCallback, C.GoString(operationID), C.GoString(friendUserID)) +} + +//export get_friend_application_list_as_recipient +func get_friend_application_list_as_recipient(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetFriendApplicationListAsRecipient(baseCallback, C.GoString(operationID)) +} + +//export get_friend_application_list_as_applicant +func get_friend_application_list_as_applicant(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetFriendApplicationListAsApplicant(baseCallback, C.GoString(operationID)) +} + +//export accept_friend_application +func accept_friend_application(cCallback C.CB_S_I_S_S, operationID *C.char, userIDHandleMsg *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.AcceptFriendApplication(baseCallback, C.GoString(operationID), C.GoString(userIDHandleMsg)) +} + +//export refuse_friend_application +func refuse_friend_application(cCallback C.CB_S_I_S_S, operationID *C.char, userIDHandleMsg *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.RefuseFriendApplication(baseCallback, C.GoString(operationID), C.GoString(userIDHandleMsg)) +} + +//export add_black +func add_black(cCallback C.CB_S_I_S_S, operationID *C.char, blackUserID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.AddBlack(baseCallback, C.GoString(operationID), C.GoString(blackUserID)) +} + +//export get_black_list +func get_black_list(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetBlackList(baseCallback, C.GoString(operationID)) +} + +//export remove_black +func remove_black(cCallback C.CB_S_I_S_S, operationID *C.char, removeUserID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.RemoveBlack(baseCallback, C.GoString(operationID), C.GoString(removeUserID)) +} + +// =====================================================group=============================================== +// CreateGroup creates a group +// +//export create_group +func create_group(cCallback C.CB_S_I_S_S, operationID, cGroupReqInfo *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.CreateGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupReqInfo)) +} + +// JoinGroup joins a group +// +//export join_group +func join_group(cCallback C.CB_S_I_S_S, operationID, cGroupID, cReqMsg *C.char, cJoinSource C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.JoinGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupID), C.GoString(cReqMsg), + int32(cJoinSource)) +} + +// QuitGroup quits a group +// +//export quit_group +func quit_group(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.QuitGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupID)) +} + +// DismissGroup dismisses a group +// +//export dismiss_group +func dismiss_group(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.DismissGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupID)) +} + +// ChangeGroupMute changes the mute status of a group +// +//export change_group_mute +func change_group_mute(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cIsMute C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.ChangeGroupMute(baseCallback, C.GoString(operationID), C.GoString(cGroupID), parseBool(int(cIsMute))) +} + +// ChangeGroupMemberMute changes the mute status of a group member +// +//export change_group_member_mute +func change_group_member_mute(cCallback C.CB_S_I_S_S, operationID, cGroupID, cUserID *C.char, cMutedSeconds C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.ChangeGroupMemberMute(baseCallback, C.GoString(operationID), C.GoString(cGroupID), C.GoString(cUserID), + int(cMutedSeconds)) +} + +// SetGroupMemberRoleLevel sets the role level of a group member +// +//export set_group_member_role_level +func set_group_member_role_level(cCallback C.CB_S_I_S_S, operationID, cGroupID, cUserID *C.char, cRoleLevel C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupMemberRoleLevel(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cUserID), int(cRoleLevel)) +} + +// SetGroupMemberInfo sets the information of a group member +// +//export set_group_member_info +func set_group_member_info(cCallback C.CB_S_I_S_S, operationID *C.char, cGroupMemberInfo *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupMemberInfo(baseCallback, C.GoString(operationID), C.GoString(cGroupMemberInfo)) +} + +// GetJoinedGroupList retrieves the list of joined groups +// +//export get_joined_group_list +func get_joined_group_list(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetJoinedGroupList(baseCallback, C.GoString(operationID)) +} + +// GetSpecifiedGroupsInfo retrieves the information of specified groups +// +//export get_specified_groups_info +func get_specified_groups_info(cCallback C.CB_S_I_S_S, operationID, cGroupIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetSpecifiedGroupsInfo(baseCallback, C.GoString(operationID), C.GoString(cGroupIDList)) +} + +// SearchGroups searches for groups +// +//export search_groups +func search_groups(cCallback C.CB_S_I_S_S, operationID, cSearchParam *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SearchGroups(baseCallback, C.GoString(operationID), C.GoString(cSearchParam)) +} + +// SetGroupInfo sets the information of a group +// +//export set_group_info +func set_group_info(cCallback C.CB_S_I_S_S, operationID, cGroupInfo *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupInfo(baseCallback, C.GoString(operationID), C.GoString(cGroupInfo)) +} + +// SetGroupVerification sets the verification mode of a group +// +//export set_group_verification +func set_group_verification(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cVerification C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupVerification(baseCallback, C.GoString(operationID), C.GoString(cGroupID), int32(cVerification)) +} + +// SetGroupLookMemberInfo sets the member information visibility of a group +// +//export set_group_look_member_info +func set_group_look_member_info(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cRule C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupLookMemberInfo(baseCallback, C.GoString(operationID), C.GoString(cGroupID), int32(cRule)) +} + +// SetGroupApplyMemberFriend sets the friend rule for group applicants +// +//export set_group_apply_member_friend +func set_group_apply_member_friend(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cRule C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupApplyMemberFriend(baseCallback, C.GoString(operationID), C.GoString(cGroupID), int32(cRule)) +} + +// GetGroupMemberList retrieves the list of group members +// +//export get_group_member_list +func get_group_member_list(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cFilter, cOffset, cCount C.int) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetGroupMemberList(baseCallback, C.GoString(operationID), C.GoString(cGroupID), int32(cFilter), + int32(cOffset), int32(cCount)) +} + +// GetGroupMemberOwnerAndAdmin retrieves the owner and admin members of a group +// +//export get_group_member_owner_and_admin +func get_group_member_owner_and_admin(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetGroupMemberOwnerAndAdmin(baseCallback, C.GoString(operationID), C.GoString(cGroupID)) +} + +// GetGroupMemberListByJoinTimeFilter retrieves the list of group members filtered by join time +// +//export get_group_member_list_by_join_time_filter +func get_group_member_list_by_join_time_filter(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char, cOffset, + cCount C.int, cJoinTimeBegin, cJoinTimeEnd C.longlong, cFilterUserIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetGroupMemberListByJoinTimeFilter(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + int32(cOffset), int32(cCount), int64(cJoinTimeBegin), int64(cJoinTimeEnd), C.GoString(cFilterUserIDList)) +} + +// GetSpecifiedGroupMembersInfo retrieves the information of specified group members +// +//export get_specified_group_members_info +func get_specified_group_members_info(cCallback C.CB_S_I_S_S, operationID, cGroupID, cUserIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetSpecifiedGroupMembersInfo(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cUserIDList)) +} + +// KickGroupMember kicks group members +// +//export kick_group_member +func kick_group_member(cCallback C.CB_S_I_S_S, operationID, cGroupID, cReason, cUserIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.KickGroupMember(baseCallback, C.GoString(operationID), C.GoString(cGroupID), C.GoString(cReason), + C.GoString(cUserIDList)) +} + +// TransferGroupOwner transfers the ownership of a group +// +//export transfer_group_owner +func transfer_group_owner(cCallback C.CB_S_I_S_S, operationID, cGroupID, cNewOwnerUserID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.TransferGroupOwner(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cNewOwnerUserID)) +} + +// InviteUserToGroup invites users to a group +// +//export invite_user_to_group +func invite_user_to_group(cCallback C.CB_S_I_S_S, operationID, cGroupID, cReason, cUserIDList *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.InviteUserToGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupID), C.GoString(cReason), + C.GoString(cUserIDList)) +} + +// GetGroupApplicationListAsRecipient retrieves the group application list as a recipient +// +//export get_group_application_list_as_recipient +func get_group_application_list_as_recipient(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetGroupApplicationListAsRecipient(baseCallback, C.GoString(operationID)) +} + +// GetGroupApplicationListAsApplicant retrieves the group application list as an applicant +// +//export get_group_application_list_as_applicant +func get_group_application_list_as_applicant(cCallback C.CB_S_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.GetGroupApplicationListAsApplicant(baseCallback, C.GoString(operationID)) +} + +// AcceptGroupApplication accepts a group application +// +//export accept_group_application +func accept_group_application(cCallback C.CB_S_I_S_S, operationID, cGroupID, cFromUserID, cHandleMsg *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.AcceptGroupApplication(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cFromUserID), C.GoString(cHandleMsg)) +} + +// RefuseGroupApplication refuses a group application +// +//export refuse_group_application +func refuse_group_application(cCallback C.CB_S_I_S_S, operationID, cGroupID, cFromUserID, cHandleMsg *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.RefuseGroupApplication(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cFromUserID), C.GoString(cHandleMsg)) +} + +// SetGroupMemberNickname sets the nickname of a group member +// +//export set_group_member_nickname +func set_group_member_nickname(cCallback C.CB_S_I_S_S, operationID, cGroupID, cUserID, cGroupMemberNickname *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SetGroupMemberNickname(baseCallback, C.GoString(operationID), C.GoString(cGroupID), + C.GoString(cUserID), C.GoString(cGroupMemberNickname)) +} + +// SearchGroupMembers searches for group members +// +//export search_group_members +func search_group_members(cCallback C.CB_S_I_S_S, operationID, cSearchParam *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.SearchGroupMembers(baseCallback, C.GoString(operationID), C.GoString(cSearchParam)) +} + +// IsJoinGroup checks if the user has joined a group +// +//export is_join_group +func is_join_group(cCallback C.CB_S_I_S_S, operationID, cGroupID *C.char) { + baseCallback := NewBaseCallback(cCallback, operationID) + open_im_sdk.IsJoinGroup(baseCallback, C.GoString(operationID), C.GoString(cGroupID)) +} + +func main() { + +} diff --git a/c_cpp_wrapper/gen_android_so.bat b/c_cpp_wrapper/gen_android_so.bat new file mode 100644 index 0000000..49f426a --- /dev/null +++ b/c_cpp_wrapper/gen_android_so.bat @@ -0,0 +1,32 @@ +set NDK_PATH=D:\android_sdk\ndk-bundle +set SO_NAME=libopenimsdk +set OUT_PATH=android\ + +set CGO_ENABLED=1 + +REM 生成 armeabi-v7a +set GOOS=android +set GOARCH=arm +set CC=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\armv7a-linux-androideabi16-clang.cmd + +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o %OUT_PATH%armeabi-v7a\%SO_NAME%.so export.go constant.go protocol.go tools.go + +REM 生成 arm64-v8a +set GOARCH=arm64 +set CC=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\aarch64-linux-android21-clang.cmd + +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o %OUT_PATH%arm64-v8a\%SO_NAME%.so export.go constant.go protocol.go tools.go + +REM 生成 x86 +set GOARCH=386 +set CC=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\i686-linux-android16-clang.cmd + +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o %OUT_PATH%x86\%SO_NAME%.so export.go constant.go protocol.go tools.go + +REM 生成 x86_64 +set GOARCH=amd64 +set CC=%NDK_PATH%\toolchains\llvm\prebuilt\windows-x86_64\bin\x86_64-linux-android21-clang.cmd + +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o %OUT_PATH%x86_64\%SO_NAME%.so export.go constant.go protocol.go tools.go + + diff --git a/c_cpp_wrapper/gen_ios_dylib.sh b/c_cpp_wrapper/gen_ios_dylib.sh new file mode 100644 index 0000000..152773e --- /dev/null +++ b/c_cpp_wrapper/gen_ios_dylib.sh @@ -0,0 +1,8 @@ +export GOOS=darwin +export GOARCH=arm64 +export CGO_ENABLED=1 +export CC=clang + +go build -buildmode=c-shared -o libopenimsdk.dylib export.go constant.go protocol.go tools.go + + diff --git a/c_cpp_wrapper/openimsdk.h b/c_cpp_wrapper/openimsdk.h new file mode 100644 index 0000000..af4d669 --- /dev/null +++ b/c_cpp_wrapper/openimsdk.h @@ -0,0 +1,283 @@ +/* Code generated by cmd/cgo; DO NOT EDIT. */ + +/* package command-line-arguments */ + + +#line 1 "cgo-builtin-export-prolog" + +#include + +#ifndef GO_CGO_EXPORT_PROLOGUE_H +#define GO_CGO_EXPORT_PROLOGUE_H + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef struct { const char *p; ptrdiff_t n; } _GoString_; +#endif + +#endif + +/* Start of preamble from import "C" comments. */ + + +#line 3 "export.go" + +#include +typedef void (*CB_S)(char *); +typedef void (*CB_I_S)(int,char *); +typedef void (*CB_S_I_S_S)(char *,int,char *,char *); +typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int); +extern void Call_CB_S(CB_S func,char* data); +extern void Call_CB_I_S(CB_I_S func,int event,char* data); +extern void Call_CB_S_I_S_S(CB_S_I_S_S func,char *,int errCode,char* errMsg,char* data); +extern void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char *,int errCode,char* errMsg,char* data,int progress); +extern CB_S DebugPrint; + + +#line 1 "cgo-generated-wrapper" + + +/* End of preamble from import "C" comments. */ + + +/* Start of boilerplate cgo prologue. */ +#line 1 "cgo-gcc-export-header-prolog" + +#ifndef GO_CGO_PROLOGUE_H +#define GO_CGO_PROLOGUE_H + +typedef signed char GoInt8; +typedef unsigned char GoUint8; +typedef short GoInt16; +typedef unsigned short GoUint16; +typedef int GoInt32; +typedef unsigned int GoUint32; +typedef long long GoInt64; +typedef unsigned long long GoUint64; +typedef GoInt64 GoInt; +typedef GoUint64 GoUint; +typedef size_t GoUintptr; +typedef float GoFloat32; +typedef double GoFloat64; +#ifdef _MSC_VER +#include +typedef _Fcomplex GoComplex64; +typedef _Dcomplex GoComplex128; +#else +typedef float _Complex GoComplex64; +typedef double _Complex GoComplex128; +#endif + +/* + static assertion to make sure the file is being used on architecture + at least with matching size of GoInt. +*/ +typedef char _check_for_64_bit_pointer_matching_GoInt[sizeof(void*)==64/8 ? 1:-1]; + +#ifndef GO_CGO_GOSTRING_TYPEDEF +typedef _GoString_ GoString; +#endif +typedef void *GoMap; +typedef void *GoChan; +typedef struct { void *t; void *v; } GoInterface; +typedef struct { void *data; GoInt len; GoInt cap; } GoSlice; + +#endif + +/* End of boilerplate cgo prologue. */ + +#ifdef __cplusplus +extern "C" { +#endif + +extern void set_print(CB_S print); +extern void set_group_listener(CB_I_S cCallback); +extern void set_conversation_listener(CB_I_S cCallback); +extern void set_advanced_msg_listener(CB_I_S cCallback); +extern void set_batch_msg_listener(CB_I_S cCallback); +extern void set_user_listener(CB_I_S cCallback); +extern void set_friend_listener(CB_I_S cCallback); +extern void set_custom_business_listener(CB_I_S cCallback); +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 network_status_changed(CB_S_I_S_S cCallback, char* operationID); +extern GoInt get_login_status(char* operationID); +extern char* get_login_user(); +extern char* create_text_message(char* operationID, char* text); +extern char* create_advanced_text_message(char* operationID, char* text, char* messageEntityList); +extern char* create_text_at_message(char* operationID, char* text, char* atUserList, char* atUsersInfo, char* message); +extern char* create_location_message(char* operationID, char* description, double longitude, double latitude); +extern char* create_custom_message(char* operationID, char* data, char* extension, char* description); +extern char* create_quote_message(char* operationID, char* text, char* message); +extern char* create_advanced_quote_message(char* operationID, char* text, char* message, char* messageEntityList); +extern char* create_card_message(char* operationID, char* cardInfo); +extern char* create_video_message_from_full_path(char* operationID, char* videoFullPath, char* videoType, long long int duration, char* snapshotFullPath); +extern char* create_image_message_from_full_path(char* operationID, char* imageFullPath); +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_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); +extern char* create_video_message(char* operationID, char* videoPath, char* videoType, long long int duration, char* snapshotPath); +extern char* create_file_message_by_url(char* operationID, char* fileBaseInfo); +extern char* create_file_message(char* operationID, char* filePath, char* fileName); +extern char* create_merger_message(char* operationID, char* messageList, char* title, char* summaryList); +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 send_message(CB_S_I_S_S_I cCallback, char* operationID, char* message, char* recvID, char* groupID, char* offlinePushInfo); + +// =====================================================user=============================================== +// +extern void get_users_info(CB_S_I_S_S cCallback, char* operationID, char* userIDs); +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 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); +extern void unsubscribe_users_status(CB_S_I_S_S cCallback, char* operationID, char* userIDs); +extern void get_subscribe_users_status(CB_S_I_S_S cCallback, char* operationID); +extern void get_user_status(CB_S_I_S_S cCallback, char* operationID, char* userIDs); + +// =====================================================friend=============================================== +// +extern void get_specified_friends_info(CB_S_I_S_S cCallback, char* operationID, char* userIDList); +extern void get_friend_list(CB_S_I_S_S cCallback, char* operationID); +extern void get_friend_list_page(CB_S_I_S_S cCallback, char* operationID, int offset, int count); +extern void search_friends(CB_S_I_S_S cCallback, char* operationID, char* searchParam); +extern void check_friend(CB_S_I_S_S cCallback, char* operationID, char* userIDList); +extern void add_friend(CB_S_I_S_S cCallback, char* operationID, char* userIDReqMsg); +extern void set_friend_remark(CB_S_I_S_S cCallback, char* operationID, char* userIDRemark); +extern void delete_friend(CB_S_I_S_S cCallback, char* operationID, char* friendUserID); +extern void get_friend_application_list_as_recipient(CB_S_I_S_S cCallback, char* operationID); +extern void get_friend_application_list_as_applicant(CB_S_I_S_S cCallback, char* operationID); +extern void accept_friend_application(CB_S_I_S_S cCallback, char* operationID, char* userIDHandleMsg); +extern void refuse_friend_application(CB_S_I_S_S cCallback, char* operationID, char* userIDHandleMsg); +extern void add_black(CB_S_I_S_S cCallback, char* operationID, char* blackUserID); +extern void get_black_list(CB_S_I_S_S cCallback, char* operationID); +extern void remove_black(CB_S_I_S_S cCallback, char* operationID, char* removeUserID); + +// =====================================================group=============================================== +// CreateGroup creates a group +// +extern void create_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupReqInfo); + +// JoinGroup joins a group +// +extern void join_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cReqMsg, int cJoinSource); + +// QuitGroup quits a group +// +extern void quit_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupID); + +// DismissGroup dismisses a group +// +extern void dismiss_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupID); + +// ChangeGroupMute changes the mute status of a group +// +extern void change_group_mute(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cIsMute); + +// ChangeGroupMemberMute changes the mute status of a group member +// +extern void change_group_member_mute(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cUserID, int cMutedSeconds); + +// SetGroupMemberRoleLevel sets the role level of a group member +// +extern void set_group_member_role_level(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cUserID, int cRoleLevel); + +// SetGroupMemberInfo sets the information of a group member +// +extern void set_group_member_info(CB_S_I_S_S cCallback, char* operationID, char* cGroupMemberInfo); + +// GetJoinedGroupList retrieves the list of joined groups +// +extern void get_joined_group_list(CB_S_I_S_S cCallback, char* operationID); + +// GetSpecifiedGroupsInfo retrieves the information of specified groups +// +extern void get_specified_groups_info(CB_S_I_S_S cCallback, char* operationID, char* cGroupIDList); + +// SearchGroups searches for groups +// +extern void search_groups(CB_S_I_S_S cCallback, char* operationID, char* cSearchParam); + +// SetGroupInfo sets the information of a group +// +extern void set_group_info(CB_S_I_S_S cCallback, char* operationID, char* cGroupInfo); + +// SetGroupVerification sets the verification mode of a group +// +extern void set_group_verification(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cVerification); + +// SetGroupLookMemberInfo sets the member information visibility of a group +// +extern void set_group_look_member_info(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cRule); + +// SetGroupApplyMemberFriend sets the friend rule for group applicants +// +extern void set_group_apply_member_friend(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cRule); + +// GetGroupMemberList retrieves the list of group members +// +extern void get_group_member_list(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cFilter, int cOffset, int cCount); + +// GetGroupMemberOwnerAndAdmin retrieves the owner and admin members of a group +// +extern void get_group_member_owner_and_admin(CB_S_I_S_S cCallback, char* operationID, char* cGroupID); + +// GetGroupMemberListByJoinTimeFilter retrieves the list of group members filtered by join time +// +extern void get_group_member_list_by_join_time_filter(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, int cOffset, int cCount, long long int cJoinTimeBegin, long long int cJoinTimeEnd, char* cFilterUserIDList); + +// GetSpecifiedGroupMembersInfo retrieves the information of specified group members +// +extern void get_specified_group_members_info(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cUserIDList); + +// KickGroupMember kicks group members +// +extern void kick_group_member(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cReason, char* cUserIDList); + +// TransferGroupOwner transfers the ownership of a group +// +extern void transfer_group_owner(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cNewOwnerUserID); + +// InviteUserToGroup invites users to a group +// +extern void invite_user_to_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cReason, char* cUserIDList); + +// GetGroupApplicationListAsRecipient retrieves the group application list as a recipient +// +extern void get_group_application_list_as_recipient(CB_S_I_S_S cCallback, char* operationID); + +// GetGroupApplicationListAsApplicant retrieves the group application list as an applicant +// +extern void get_group_application_list_as_applicant(CB_S_I_S_S cCallback, char* operationID); + +// AcceptGroupApplication accepts a group application +// +extern void accept_group_application(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cFromUserID, char* cHandleMsg); + +// RefuseGroupApplication refuses a group application +// +extern void refuse_group_application(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cFromUserID, char* cHandleMsg); + +// SetGroupMemberNickname sets the nickname of a group member +// +extern void set_group_member_nickname(CB_S_I_S_S cCallback, char* operationID, char* cGroupID, char* cUserID, char* cGroupMemberNickname); + +// SearchGroupMembers searches for group members +// +extern void search_group_members(CB_S_I_S_S cCallback, char* operationID, char* cSearchParam); + +// IsJoinGroup checks if the user has joined a group +// +extern void is_join_group(CB_S_I_S_S cCallback, char* operationID, char* cGroupID); + +#ifdef __cplusplus +} +#endif diff --git a/c_cpp_wrapper/openimsdkcc.cc b/c_cpp_wrapper/openimsdkcc.cc new file mode 100644 index 0000000..2c3ffdb --- /dev/null +++ b/c_cpp_wrapper/openimsdkcc.cc @@ -0,0 +1,864 @@ +#include "openimsdkcc.h" + + +namespace openim { + +// // ===================================================== init =============================================== +// must be called before use sdk + +// instance pattern +OpenIMManager& OpenIMManager::GetInstance() +{ + static OpenIMManager instance; + return instance; +} + +// must be called before use sdk +bool OpenIMManager::InitSDK(const std::function& cCallback, const std::string &operationID, const std::string &config) +{ + char *operationID_cs = const_cast(operationID.c_str()); + char *config_cs = const_cast(config.c_str()); + int ret=init_sdk(_wrapper_cpp_function(cCallback), operationID_cs, config_cs); + return (ret&1)==1; +} + + + +// release resouces used by SDK +void OpenIMManager::UnInitSDK(const std::string &operationID) +{ + // TODO: free all functions in function pool + + char *operationID_cs = const_cast(operationID.c_str()); + return un_init_sdk(operationID_cs); +} + +// // ===================================================== set listener =============================================== +// impl for set listener, this callback function will be keep in memory,until call SetXXXListener again + +// for debug +// void OpenIMManager::SetPrint(const std::function& printCallBack) +// { +// this->printCallBack = _wrapper_cpp_function(printCallBack); +// set_print((CB_S)((this->printCallBack).target())); +// } + +void OpenIMManager::SetAdvancedMsgListener(const std::function& advancedMsgListenerCallback) +{ + set_advanced_msg_listener(_wrapper_cpp_function(advancedMsgListenerCallback)); +} +void OpenIMManager::SetBatchMsgListener(const std::function& batchMsgListenerCallback) +{ + set_batch_msg_listener(_wrapper_cpp_function(batchMsgListenerCallback)); +} +void OpenIMManager::SetConversationListener(const std::function& conversationListenerCallback) +{ + set_conversation_listener(_wrapper_cpp_function(conversationListenerCallback)); +} +void OpenIMManager::SetCustomBusinessListener(const std::function& customBusinessListenerCallback) +{ + set_custom_business_listener(_wrapper_cpp_function(customBusinessListenerCallback)); +} +void OpenIMManager::SetFriendListener(const std::function& friendListenerCallback) +{ + set_friend_listener(_wrapper_cpp_function(friendListenerCallback)); +} +void OpenIMManager::SetGroupListener(const std::function& groupListenerCallback) +{ + set_group_listener(_wrapper_cpp_function(groupListenerCallback)); +} +void OpenIMManager::SetUserListener(const std::function& userListenerCallback) +{ + set_user_listener(_wrapper_cpp_function(userListenerCallback)); +} + +// // ===================================================== CallOnce Callback =============================================== +// callback function arg below will be free after call once, so we need to wrapp it to onetime +// // ===================================================== message =============================================== + +// // ===================================================== login logout =============================================== +void OpenIMManager::Login(const std::function& loginCallback, const std::string& operationID, const std::string& uid, const std::string& token) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* uid_cs=const_cast(uid.c_str()); + char* token_cs=const_cast(token.c_str()); + login(_wrapper_callonce_cpp_function(loginCallback),operationID_cs,uid_cs,token_cs); +} + +void OpenIMManager::Logout(const std::function& logoutCallback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + logout(_wrapper_callonce_cpp_function(logoutCallback),operationID_cs); +} + +GoInt OpenIMManager::GetLoginStatus(const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + return get_login_status(operationID_cs); +} + +std::string OpenIMManager::GetLoginUser() +{ + char* user=get_login_user(); + std::string user_str(user); + free(user); + return get_login_user(); +} + +void OpenIMManager::NetworkStatusChanged(const std::function& networkStatusCallback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + network_status_changed(_wrapper_callonce_cpp_function(networkStatusCallback),operationID_cs); +} + + +// // ===================================================== message =============================================== +// // + +// create text message +std::string OpenIMManager::CreateTextMessage(const std::string& operationID, const std::string& text) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* text_cs=const_cast(text.c_str()); + char* result_cs=create_text_message(operationID_cs,text_cs); + std::string result(result_cs); + // release dynamic c string memory + free(result_cs); + return result; +} + +// create advanced text message +std::string OpenIMManager::CreateAdvancedTextMessage(const std::string& operationID, const std::string& text, const std::string& messageEntityList) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* text_cs=const_cast(text.c_str()); + char* messageEntityList_cs=const_cast(messageEntityList.c_str()); + char* result_cs=create_advanced_text_message(operationID_cs,text_cs,messageEntityList_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create text at message +std::string OpenIMManager::CreateTextAtMessage(const std::string& operationID, const std::string& text, const std::string& atUserList, const std::string& atUsersInfo, const std::string& message) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* text_cs=const_cast(text.c_str()); + char* atUserList_cs=const_cast(atUserList.c_str()); + char* atUsersInfo_cs=const_cast(atUsersInfo.c_str()); + char* message_cs=const_cast(message.c_str()); + char* result_cs=create_text_at_message(operationID_cs,text_cs,atUserList_cs,atUsersInfo_cs,message_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create location message +std::string OpenIMManager::CreateLocationMessage(const std::string& operationID, const std::string& description, double longitude, double latitude) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* description_cs=const_cast(description.c_str()); + char* result_cs=create_location_message(operationID_cs,description_cs,longitude,latitude); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create custom message +std::string OpenIMManager::CreateCustomMessage(const std::string& operationID, const std::string& data, const std::string& extension, const std::string& description) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* data_cs=const_cast(data.c_str()); + char* extension_cs=const_cast(extension.c_str()); + char* description_cs=const_cast(description.c_str()); + char* result_cs=create_custom_message(operationID_cs,data_cs,extension_cs,description_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create quote message +std::string OpenIMManager::CreateQuoteMessage(const std::string& operationID, const std::string& text, const std::string& message) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* text_cs=const_cast(text.c_str()); + char* message_cs=const_cast(message.c_str()); + char* result_cs=create_quote_message(operationID_cs,text_cs,message_cs); + std::string result(result_cs); + free(result_cs); + return result; + +} + +// create advanced quote message +std::string OpenIMManager::CreateAdvancedQuoteMessage(const std::string& operationID, const std::string& text, const std::string& message, const std::string& messageEntityList) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* text_cs=const_cast(text.c_str()); + char* message_cs=const_cast(message.c_str()); + char* messageEntityList_cs=const_cast(messageEntityList.c_str()); + char* result_cs=create_advanced_quote_message(operationID_cs,text_cs,message_cs,messageEntityList_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create card message +std::string OpenIMManager::CreateCardMessage(const std::string& operationID, const std::string& cardInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* cardInfo_cs=const_cast(cardInfo.c_str()); + char* result_cs=create_card_message(operationID_cs,cardInfo_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create video message from full path +std::string OpenIMManager::CreateVideoMessageFromFullPath(const std::string& operationID, const std::string& videoFullPath, const std::string& videoType, long long int duration, const std::string& snapshotFullPath) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* videoFullPath_cs=const_cast(videoFullPath.c_str()); + char* videoType_cs=const_cast(videoType.c_str()); + char* snapshotFullPath_cs=const_cast(snapshotFullPath.c_str()); + char* result_cs=create_video_message_from_full_path(operationID_cs,videoFullPath_cs,videoType_cs,duration,snapshotFullPath_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create image message from full path +std::string OpenIMManager::CreateImageMessageFromFullPath(const std::string& operationID, const std::string& imageFullPath) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* imageFullPath_cs=const_cast(imageFullPath.c_str()); + char* result_cs=create_image_message_from_full_path(operationID_cs,imageFullPath_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create sound message from full path +std::string OpenIMManager::CreateSoundMessageFromFullPath(const std::string& operationID, const std::string& soundPath, long long int duration) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* soundPath_cs=const_cast(soundPath.c_str()); + char* result_cs=create_sound_message_from_full_path(operationID_cs,soundPath_cs,duration); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create file message from full path +std::string OpenIMManager::CreateFileMessageFromFullPath(const std::string& operationID, const std::string& fileFullPath, const std::string& fileName) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* fileFullPath_cs=const_cast(fileFullPath.c_str()); + char* fileName_cs=const_cast(fileName.c_str()); + char* result_cs=create_file_message_from_full_path(operationID_cs,fileFullPath_cs,fileName_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create image message +std::string OpenIMManager::CreateImageMessage(const std::string& operationID, const std::string& imagePath) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* imagePath_cs=const_cast(imagePath.c_str()); + char* result_cs=create_image_message(operationID_cs,imagePath_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create image message by URL +std::string OpenIMManager::CreateImageMessageByURL(const std::string& operationID, const std::string& sourcePicture, const std::string& bigPicture, const std::string& snapshotPicture) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* sourcePicture_cs=const_cast(sourcePicture.c_str()); + char* bigPicture_cs=const_cast(bigPicture.c_str()); + char* snapshotPicture_cs=const_cast(snapshotPicture.c_str()); + char* result_cs=create_image_message_by_url(operationID_cs,sourcePicture_cs,bigPicture_cs,snapshotPicture_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create sound message by URL +std::string OpenIMManager::CreateSoundMessageByURL(const std::string& operationID, const std::string& soundBaseInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* soundBaseInfo_cs=const_cast(soundBaseInfo.c_str()); + char* result_cs=create_sound_message_by_url(operationID_cs,soundBaseInfo_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create sound message +std::string OpenIMManager::CreateSoundMessage(const std::string& operationID, const std::string& soundPath, long long int duration) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* soundPath_cs=const_cast(soundPath.c_str()); + char* result_cs=create_sound_message(operationID_cs,soundPath_cs,duration); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create video message by URL +std::string OpenIMManager::CreateVideoMessageByURL(const std::string& operationID, const std::string& videoBaseInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* videoBaseInfo_cs=const_cast(videoBaseInfo.c_str()); + char* result_cs=create_video_message_by_url(operationID_cs,videoBaseInfo_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create video message +std::string OpenIMManager::CreateVideoMessage(const std::string& operationID, const std::string& videoPath, const std::string& videoType, long long int duration, const std::string& snapshotPath) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* videoPath_cs=const_cast(videoPath.c_str()); + char* videoType_cs=const_cast(videoType.c_str()); + char* snapshotPath_cs=const_cast(snapshotPath.c_str()); + char* result_cs=create_video_message(operationID_cs,videoPath_cs,videoType_cs,duration,snapshotPath_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create file message by URL +std::string OpenIMManager::CreateFileMessageByURL(const std::string& operationID, const std::string& fileBaseInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* fileBaseInfo_cs=const_cast(fileBaseInfo.c_str()); + char* result_cs=create_file_message_by_url(operationID_cs,fileBaseInfo_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create file message +std::string OpenIMManager::CreateFileMessage(const std::string& operationID, const std::string& filePath, const std::string& fileName) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* filePath_cs=const_cast(filePath.c_str()); + char* fileName_cs=const_cast(fileName.c_str()); + char* result_cs=create_file_message(operationID_cs,filePath_cs,fileName_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create merger message +std::string OpenIMManager::CreateMergerMessage(const std::string& operationID, const std::string& messageList, const std::string& title, const std::string& summaryList) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* messageList_cs=const_cast(messageList.c_str()); + char* title_cs=const_cast(title.c_str()); + char* summaryList_cs=const_cast(summaryList.c_str()); + char* result_cs=create_merger_message(operationID_cs,messageList_cs,title_cs,summaryList_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create face message +std::string OpenIMManager::CreateFaceMessage(const std::string& operationID, int index, const std::string& data) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* data_cs=const_cast(data.c_str()); + char* result_cs=create_face_message(operationID_cs,index,data_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// create forward message +std::string OpenIMManager::CreateForwardMessage(const std::string& operationID, const std::string& m) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* m_cs=const_cast(m.c_str()); + char* result_cs=create_forward_message(operationID_cs,m_cs); + std::string result(result_cs); + free(result_cs); + return result; +} + +// get all conversation list +void OpenIMManager::GetAllConversationList(const std::function& getAllConversationListCallback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_all_conversation_list(_wrapper_callonce_cpp_function(getAllConversationListCallback),operationID_cs); +} + +// get advanced history message list +void OpenIMManager::GetAdvancedHistoryMessageList(const std::function& getAdvancedHistoryCallback , const std::string& operationID, const std::string& getMessageOptions) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* getMessageOptions_cs=const_cast(getMessageOptions.c_str()); + get_advanced_history_message_list(_wrapper_callonce_cpp_function(getAdvancedHistoryCallback),operationID_cs,getMessageOptions_cs); +} + +// send message +void SendMessage(const std::function& sendMessageCallback, const std::string& operationID, const std::string& message,const std::string& recvID,const std::string& groupID,const std::string& offlinePushInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* message_cs=const_cast(message.c_str()); + char* recvID_cs=const_cast(recvID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* offlinePushInfo_cs=const_cast(offlinePushInfo.c_str()); + send_message(_wrapper_callonce_cpp_function(sendMessageCallback),operationID_cs,message_cs,recvID_cs,groupID_cs,offlinePushInfo_cs); +} + +// // ===================================================== user =============================================== +// // + +// get users info +void OpenIMManager::GetUsersInfo(const std::function& callback, const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + get_users_info(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// get users info from server +void OpenIMManager::GetUsersInfoFromServer(const std::function& callback, const std::string& operationID,const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + get_users_info_from_srv(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// set self info +void OpenIMManager::SetSelfInfo(const std::function& callback,const std::string& operationID, const std::string& selfInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* selfInfo_cs=const_cast(selfInfo.c_str()); + set_self_info(_wrapper_callonce_cpp_function(callback),operationID_cs,selfInfo_cs); +} + +// get self user info +void OpenIMManager::GetSelfUserInfo(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_self_user_info(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// update message sender info +void OpenIMManager::UpdateMessageSenderInfo(const std::function& callback, const std::string& operationID, const std::string& nickname,const std::string& faceURL) +{ + //TODO + char* operationID_cs=const_cast(operationID.c_str()); + char* nickname_cs=const_cast(nickname.c_str()); + char* faceURL_cs=const_cast(faceURL.c_str()); + update_msg_sender_info(_wrapper_callonce_cpp_function(callback),operationID_cs,nickname_cs,faceURL_cs); +} + +// subscribe users status +void OpenIMManager::SubscribeUsersStatus(const std::function& callback,const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + subscribe_users_status(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// unsubscribe users status +void OpenIMManager::UnsubscribeUsersStatus(const std::function& callback,const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + unsubscribe_users_status(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// get subscribe users status +void OpenIMManager::GetSubscribeUsersStatus(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_subscribe_users_status(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// get user status +void OpenIMManager::GetUserStatus(const std::function& callback,const std::string& operationID, const std::string& userID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userID_cs=const_cast(userID.c_str()); + get_user_status(_wrapper_callonce_cpp_function(callback),operationID_cs,userID_cs); +} + +// // ===================================================== friend =============================================== +// // + +// get specified friends info +void OpenIMManager::GetSpecifiedFriendsInfo(const std::function& callback,const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + get_specified_friends_info(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// get friend list +void OpenIMManager::GetFriendList(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_friend_list(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// get friend list page +void OpenIMManager::GetFriendListPage(const std::function& callback, const std::string& operationID, int offset, int count) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_friend_list_page(_wrapper_callonce_cpp_function(callback),operationID_cs,offset,count); +} + +// search friends +void OpenIMManager::SearchFriends(const std::function& callback,const std::string& operationID, const std::string& searchParam) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* searchParam_cs=const_cast(searchParam.c_str()); + search_friends(_wrapper_callonce_cpp_function(callback),operationID_cs,searchParam_cs); +} + +// check friend +void OpenIMManager::CheckFriend(const std::function& callback,const std::string& operationID, const std::string& userID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userID_cs=const_cast(userID.c_str()); + check_friend(_wrapper_callonce_cpp_function(callback),operationID_cs,userID_cs); +} + +// add friend +void OpenIMManager::AddFriend(const std::function& callback, const std::string& friendInfo, const std::string& addFriendExtraInfo) +{ + char* friendInfo_cs=const_cast(friendInfo.c_str()); + char* addFriendExtraInfo_cs=const_cast(addFriendExtraInfo.c_str()); + add_friend(_wrapper_callonce_cpp_function(callback),friendInfo_cs,addFriendExtraInfo_cs); +} + +// set friend remark +void OpenIMManager::SetFriendRemark(const std::function& callback, const std::string& userID, const std::string& remark) +{ + char* userID_cs=const_cast(userID.c_str()); + char* remark_cs=const_cast(remark.c_str()); + set_friend_remark(_wrapper_callonce_cpp_function(callback),userID_cs,remark_cs); +} + +// delete friend +void OpenIMManager::DeleteFriend(const std::function& callback, const std::string& userID, const std::string& deleteFriendExtraInfo) +{ + char* userID_cs=const_cast(userID.c_str()); + char* deleteFriendExtraInfo_cs=const_cast(deleteFriendExtraInfo.c_str()); + delete_friend(_wrapper_callonce_cpp_function(callback),userID_cs,deleteFriendExtraInfo_cs); +} + +// get friend application list as recipant +void OpenIMManager::GetFriendApplicationListAsRecipant(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_friend_application_list_as_recipient(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// get friend application list as applicant +void OpenIMManager::GetFriendApplicationListAsApplicant(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_friend_application_list_as_applicant(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// accept friend application +void OpenIMManager::AcceptFriendApplication(const std::function& callback, const std::string& friendApplicationID, const std::string& extraInfo) +{ + char* friendApplicationID_cs=const_cast(friendApplicationID.c_str()); + char* extraInfo_cs=const_cast(extraInfo.c_str()); + accept_friend_application(_wrapper_callonce_cpp_function(callback),friendApplicationID_cs,extraInfo_cs); +} + +// refuse friend application +void OpenIMManager::RefuseFriendApplication(const std::function& callback, const std::string& friendApplicationID, const std::string& extraInfo) +{ + char* friendApplicationID_cs=const_cast(friendApplicationID.c_str()); + char* extraInfo_cs=const_cast(extraInfo.c_str()); + refuse_friend_application(_wrapper_callonce_cpp_function(callback),friendApplicationID_cs,extraInfo_cs); +} + +// add black +void OpenIMManager::AddBlack(const std::function& callback,const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + add_black(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// get black list +void OpenIMManager::GetBlackList(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_black_list(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// remove black +void OpenIMManager::RemoveBlack(const std::function& callback,const std::string& operationID, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + remove_black(_wrapper_callonce_cpp_function(callback),operationID_cs,userIDs_cs); +} + +// // ===================================================== group =============================================== +// // + +// create group +void OpenIMManager::CreateGroup(const std::function& callback, const std::string& operationID, const std::string& groupReqInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupReqInfo_cs=const_cast(groupReqInfo.c_str()); + create_group(_wrapper_callonce_cpp_function(callback),operationID_cs,groupReqInfo_cs); +} + +// join group +void OpenIMManager::JoinGroup(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reqMsg, int joinSource) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* reqMsg_cs=const_cast(reqMsg.c_str()); + join_group(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,reqMsg_cs,joinSource); +} + +// quit group +void OpenIMManager::QuitGroup(const std::function& callback, const std::string& groupID, const std::string& reqMsg) +{ + char* groupID_cs=const_cast(groupID.c_str()); + char* reqMsg_cs=const_cast(reqMsg.c_str()); + quit_group(_wrapper_callonce_cpp_function(callback),groupID_cs,reqMsg_cs); +} + +// dismiss group +void OpenIMManager::DismissGroup(const std::function& callback, const std::string& groupID, const std::string& reqMsg) +{ + char* groupID_cs=const_cast(groupID.c_str()); + char* reqMsg_cs=const_cast(reqMsg.c_str()); + dismiss_group(_wrapper_callonce_cpp_function(callback),groupID_cs,reqMsg_cs); +} + +// change group mute +void OpenIMManager::ChangeGroupMute(const std::function& callback,const std::string& operationID, const std::string& groupID, bool mute) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + change_group_mute(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,mute); +} + +// change group member mute +void OpenIMManager::ChangeGroupMemberMute(const std::function& callback,const std::string& operationID, const std::string& groupID, const std::string& memberID, int mutedSeconds) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* memberID_cs=const_cast(memberID.c_str()); + change_group_member_mute(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,memberID_cs,mutedSeconds); +} + + +// set the role level of a group member +void OpenIMManager::SetGroupMemberRoleLevel(const std::function& callback,const std::string& operationID, const std::string& groupID, const std::string& memberID, int roleLevel) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* memberID_cs=const_cast(memberID.c_str()); + set_group_member_role_level(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,memberID_cs,roleLevel); +} + +// set the information of a group member +void OpenIMManager::SetGroupMemberInfo(const std::function& callback, const std::string& operationID, const std::string& groupMemberInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupMemberInfo_cs=const_cast(groupMemberInfo.c_str()); + set_group_member_info(_wrapper_callonce_cpp_function(callback),operationID_cs,groupMemberInfo_cs); +} + +// get Joined Group List +void OpenIMManager::GetJoinedGroupList(const std::function& callback, const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_joined_group_list(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// get specified groups info +void OpenIMManager::GetSpecifiedGroupsInfo(const std::function& callback,const std::string& operationID, const std::string& groupIDList) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupIDList_cs=const_cast(groupIDList.c_str()); + get_specified_groups_info(_wrapper_callonce_cpp_function(callback),operationID_cs,groupIDList_cs); +} + +// search groups +void OpenIMManager::SearchGroups(const std::function& callback,const std::string& operationID, const std::string& searchParam) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* searchParam_cs=const_cast(searchParam.c_str()); + search_groups(_wrapper_callonce_cpp_function(callback),operationID_cs,searchParam_cs); +} + +// set group info +void OpenIMManager::SetGroupInfo(const std::function& callback,const std::string& operationID, const std::string& groupInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupInfo_cs=const_cast(groupInfo.c_str()); + set_group_info(_wrapper_callonce_cpp_function(callback),operationID_cs,groupInfo_cs); +} + +// set group verification +void OpenIMManager::SetGroupVerification(const std::function& callback,const std::string& operationID, const std::string& groupID, int verification) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + set_group_verification(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,verification); +} + +// set group look member info +void OpenIMManager::SetGroupLookMemberInfo(const std::function& callback,const std::string& operationID, const std::string& groupID, int lookInfo) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + set_group_look_member_info(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,lookInfo); +} + +// set group apply member friend +void OpenIMManager::SetGroupApplyMemberFriend(const std::function& callback,const std::string& operationID, const std::string& groupID, int rule) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + set_group_apply_member_friend(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,rule); +} + +// get group member list +void OpenIMManager::GetGroupMemberList(const std::function& callback,const std::string& operationID, const std::string& groupID,int filter,int offset,int count) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + get_group_member_list(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,filter,offset,count); +} + + +// get group member owner and admin +void OpenIMManager::GetGroupMemberOwnerAndAdmin(const std::function& callback, const std::string& operationID,const std::string& groupID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + get_group_member_owner_and_admin(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs); +} + +// get group application list +void OpenIMManager::GetGroupMemberListByJoinTimeFilter(const std::function& callback, const std::string& operationID, const std::string& groupID, int offset, int count, long long int joinTimeBegin, long long int joinTimeEnd, const std::string& filteruserIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* filteruserIDs_cs=const_cast(filteruserIDs.c_str()); + get_group_member_list_by_join_time_filter(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,offset,count,joinTimeBegin,joinTimeEnd,filteruserIDs_cs); +} + +// get specified group members info +void OpenIMManager::GetSpecifiedGroupMembersInfo(const std::function& callback, const std::string& operationID,const std::string& groupID, const std::string& memberIDList) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* memberIDList_cs=const_cast(memberIDList.c_str()); + get_specified_group_members_info(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,memberIDList_cs); +} + +// kick group members +void OpenIMManager::KickGroupMember(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reason, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* reason_cs=const_cast(reason.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + kick_group_member(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,reason_cs,userIDs_cs); +} + + +// transfers the ownership of a group +void OpenIMManager::TransferGroupOwner(const std::function& callback, const std::string& groupID, const std::string& memberID, const std::string& notifyMsg) +{ + char* groupID_cs=const_cast(groupID.c_str()); + char* memberID_cs=const_cast(memberID.c_str()); + char* notifyMsg_cs=const_cast(notifyMsg.c_str()); + transfer_group_owner(_wrapper_callonce_cpp_function(callback),groupID_cs,memberID_cs,notifyMsg_cs); +} + +// invites users to a group +void OpenIMManager::InviteUserToGroup(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reason, const std::string& userIDs) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* reason_cs=const_cast(reason.c_str()); + char* userIDs_cs=const_cast(userIDs.c_str()); + invite_user_to_group(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,reason_cs,userIDs_cs); +} + +// retrives the group application list as a recipient +void OpenIMManager::GetGroupApplicationListAsRecipient(const std::function& callback,const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_group_application_list_as_recipient(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// retrives the group application list as an applicant +void OpenIMManager::GetGroupApplicationListAsApplicant(const std::function& callback,const std::string& operationID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + get_group_application_list_as_applicant(_wrapper_callonce_cpp_function(callback),operationID_cs); +} + +// accept a group application +void OpenIMManager::AcceptGroupApplication(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& fromUserID, const std::string& handleMsg) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* fromUserID_cs=const_cast(fromUserID.c_str()); + char* handleMsg_cs=const_cast(handleMsg.c_str()); + accept_group_application(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,fromUserID_cs,handleMsg_cs); +} + + +// refuses a group application +void OpenIMManager::RefuseGroupApplication(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& fromUserID, const std::string& handleMsg) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* fromUserID_cs=const_cast(fromUserID.c_str()); + char* handleMsg_cs=const_cast(handleMsg.c_str()); + refuse_group_application(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,fromUserID_cs,handleMsg_cs); +} + +// set group member nickname +void OpenIMManager::SetGroupMemberNickname(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& userID, const std::string& groupMemberNickname) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + char* userID_cs=const_cast(userID.c_str()); + char* groupMemberNickname_cs=const_cast(groupMemberNickname.c_str()); + set_group_member_nickname(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs,userID_cs,groupMemberNickname_cs); +} + +// search group members +void OpenIMManager::SearchGroupMembers(const std::function& callback, const std::string& operationID, const std::string& searchParam) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* searchParam_cs=const_cast(searchParam.c_str()); + search_group_members(_wrapper_callonce_cpp_function(callback),operationID_cs,searchParam_cs); +} + +// check if the user has joined a certain group +void OpenIMManager::IsJoinGroup(const std::function& callback,const std::string& operationID, const std::string& groupID) +{ + char* operationID_cs=const_cast(operationID.c_str()); + char* groupID_cs=const_cast(groupID.c_str()); + is_join_group(_wrapper_callonce_cpp_function(callback),operationID_cs,groupID_cs); +} + + +} \ No newline at end of file diff --git a/c_cpp_wrapper/openimsdkcc.h b/c_cpp_wrapper/openimsdkcc.h new file mode 100644 index 0000000..029c4bc --- /dev/null +++ b/c_cpp_wrapper/openimsdkcc.h @@ -0,0 +1,623 @@ +#pragma onces + +#include "openimsdk.h" +#include +#include +#include +#include +#include +#include +#include +#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{ + +class OpenIMManager +{ +private: +OpenIMManager(){} +public: + // instance pattern + static OpenIMManager& GetInstance(); + + //must be called before use sdk + bool InitSDK(const std::function& cCallback,const std::string& operationID,const std::string& config); + + void UnInitSDK(const std::string& operationID); + + // // set print + // void SetPrint(const std::function& printCallBack); + + // set group listener + void SetGroupListener(const std::function& groupListenerCallBack); + + // set conversation listener + void SetConversationListener(const std::function& conversationListenerCallback); + + // set advanced msg listener + void SetAdvancedMsgListener(const std::function& advancedMsgListenerCallback); + + // set batch msg listener + void SetBatchMsgListener(const std::function& batchMsgListenerCallback); + + // set user listener + void SetUserListener(const std::function& userListenerCallback); + + // set friend listener + void SetFriendListener(const std::function& friendListenerCallback); + + // set custom business listener + void SetCustomBusinessListener(const std::function& customBusinessListenerCallback); + + // login + void Login(const std::function& loginCallback, const std::string& operationID, const std::string& uid, const std::string& token); + + // logout + void Logout(const std::function& logoutCallback, const std::string& operationID); + + // network status changed + void NetworkStatusChanged(const std::function& networkStatusCallback, const std::string& operationID); + + // get login status + GoInt GetLoginStatus(const std::string& operationID); + + // get login user + std::string GetLoginUser(); + + // create text message + std::string CreateTextMessage(const std::string& operationID, const std::string& text); + + // create advanced text message + std::string CreateAdvancedTextMessage(const std::string& operationID, const std::string& text, const std::string& messageEntityList); + + // create text at message + std::string CreateTextAtMessage(const std::string& operationID, const std::string& text, const std::string& atUserList, const std::string& atUsersInfo, const std::string& message); + + // create location message + std::string CreateLocationMessage(const std::string& operationID, const std::string& description, double longitude, double latitude); + + // create custom message + std::string CreateCustomMessage(const std::string& operationID, const std::string& data, const std::string& extension, const std::string& description); + + // create quote message + std::string CreateQuoteMessage(const std::string& operationID, const std::string& text, const std::string& message); + + + // create advanced quote message + std::string CreateAdvancedQuoteMessage(const std::string& operationID, const std::string& text, const std::string& message, const std::string& messageEntityList); + + // create card message + std::string CreateCardMessage(const std::string& operationID, const std::string& cardInfo); + + // create video message from full path + std::string CreateVideoMessageFromFullPath(const std::string& operationID, const std::string& videoFullPath, const std::string& videoType, long long int duration, const std::string& snapshotFullPath); + + // create image message from full path + std::string CreateImageMessageFromFullPath(const std::string& operationID, const std::string& imageFullPath); + + // create sound message from full path + std::string CreateSoundMessageFromFullPath(const std::string& operationID, const std::string& soundPath, long long int duration); + + // create file message from full path + std::string CreateFileMessageFromFullPath(const std::string& operationID, const std::string& fileFullPath, const std::string& fileName); + + // create image message + std::string CreateImageMessage(const std::string& operationID, const std::string& imagePath); + + + // create image message by URL + std::string CreateImageMessageByURL(const std::string& operationID, const std::string& sourcePicture, const std::string& bigPicture, const std::string& snapshotPicture); + + // create sound message by URL + std::string CreateSoundMessageByURL(const std::string& operationID, const std::string& soundBaseInfo); + + // create sound message + std::string CreateSoundMessage(const std::string& operationID, const std::string& soundPath, long long int duration); + + // create video message by URL + std::string CreateVideoMessageByURL(const std::string& operationID, const std::string& videoBaseInfo); + + // create video message + std::string CreateVideoMessage(const std::string& operationID, const std::string& videoPath, const std::string& videoType, long long int duration, const std::string& snapshotPath); + + // create file message by URL + std::string CreateFileMessageByURL(const std::string& operationID, const std::string& fileBaseInfo); + + // create file message + std::string CreateFileMessage(const std::string& operationID, const std::string& filePath, const std::string& fileName); + + // create merger message + std::string CreateMergerMessage(const std::string& operationID, const std::string& messageList, const std::string& title, const std::string& summaryList); + + // create face message + std::string CreateFaceMessage(const std::string& operationID, int index, const std::string& data); + + // create forward message + std::string CreateForwardMessage(const std::string& operationID, const std::string& m); + + // get all conversation list + void GetAllConversationList(const std::function& getAllConversationListCallback, const std::string& operationID); + + // get advanced history message list + void GetAdvancedHistoryMessageList(const std::function& getAdvancedHistoryCallback , const std::string& operationID, const std::string& getMessageOptions); + + // send message + void SendMessage(const std::function& callback, const std::string& operationID, const std::string& message, const std::string& recvID, const std::string& groupID, const std::string& offlinePushInfo); + + // // =====================================================user=============================================== + // // + + // get users info + void GetUsersInfo(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // get users info from server + void GetUsersInfoFromServer(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // set self info + void SetSelfInfo(const std::function& callback, const std::string& operationID, const std::string& userInfo); + + // get self user info + void GetSelfUserInfo(const std::function& callback, const std::string& operationID); + + // update message sender info + void UpdateMessageSenderInfo(const std::function& callback, const std::string& operationID, const std::string& nickname, const std::string& faceURL); + + // subscribe users status + void SubscribeUsersStatus(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + + // unsubscribe users status + void UnsubscribeUsersStatus(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // get subscribe users status + void GetSubscribeUsersStatus(const std::function& callback, const std::string& operationID); + + // get user status + void GetUserStatus(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // // =====================================================friend=============================================== + // // + + // get specified friends info + void GetSpecifiedFriendsInfo(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // get friend list + void GetFriendList(const std::function& callback, const std::string& operationID); + + // get friend list page + void GetFriendListPage(const std::function& callback, const std::string& operationID, int offset, int count); + + // search friends + void SearchFriends(const std::function& callback, const std::string& operationID, const std::string& searchParam); + + // check friend + void CheckFriend(const std::function& callback, const std::string& operationID, const std::string& userIDs); + + // add friend + void AddFriend(const std::function& callback, const std::string& operationID, const std::string& userIDReqMsg); + + // set friend remark + void SetFriendRemark(const std::function& callback, const std::string& operationID, const std::string& userIDRemark); + + // delete friend + void DeleteFriend(const std::function& callback, const std::string& operationID, const std::string& friendUserID); + + // get friend application list as recipient + void GetFriendApplicationListAsRecipant(const std::function& callback, const std::string& operationID); + + // get friend application list as applicant + void GetFriendApplicationListAsApplicant(const std::function& callback, const std::string& operationID); + + // accept friend application + void AcceptFriendApplication(const std::function& callback, const std::string& operationID, const std::string& userIDHandleMsg); + + // refuse friend application + void RefuseFriendApplication(const std::function& callback, const std::string& operationID, const std::string& userIDHandleMsg); + + // add black + void AddBlack(const std::function& callback, const std::string& operationID, const std::string& blackUserID); + + // get black list + void GetBlackList(const std::function& callback, const std::string& operationID); + + // remove black + void RemoveBlack(const std::function& callback, const std::string& operationID, const std::string& removeUserID); + + + // // =====================================================group=============================================== + // // + + // create group + void CreateGroup(const std::function& callback, const std::string& operationID, const std::string& groupReqInfo); + + // join group + void JoinGroup(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reqMsg, int joinSource); + + // quit group + void QuitGroup(const std::function& callback, const std::string& operationID, const std::string& groupID); + + // dismiss group + void DismissGroup(const std::function& callback, const std::string& operationID, const std::string& groupID); + + // change group mute + void ChangeGroupMute(const std::function& callback, const std::string& operationID, const std::string& groupID, bool isMute); + + // change group member mute + void ChangeGroupMemberMute(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& userID, int mutedSeconds); + + // SetGroupMemberRoleLevel sets the role level of a group member + void SetGroupMemberRoleLevel(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& userID, int roleLevel); + + // SetGroupMemberInfo sets the information of a group member + void SetGroupMemberInfo(const std::function& callback, const std::string& operationID, const std::string& groupMemberInfo); + + // GetJoinedGroupList retrieves the list of joined groups + void GetJoinedGroupList(const std::function& callback, const std::string& operationID); + + // GetSpecifiedGroupsInfo retrieves the information of specified groups + void GetSpecifiedGroupsInfo(const std::function& callback, const std::string& operationID, const std::string& groupIDList); + + // SearchGroups searches for groups + void SearchGroups(const std::function& callback, const std::string& operationID, const std::string& searchParam); + + // SetGroupInfo sets the information of a group + void SetGroupInfo(const std::function& callback, const std::string& operationID, const std::string& groupInfo); + + // SetGroupVerification sets the verification mode of a group + void SetGroupVerification(const std::function& callback, const std::string& operationID, const std::string& groupID, int verification); + + + // SetGroupLookMemberInfo sets the member information visibility of a group + void SetGroupLookMemberInfo(const std::function& callback, const std::string& operationID, const std::string& groupID, int rule); + + // SetGroupApplyMemberFriend sets the friend rule for group applicants + void SetGroupApplyMemberFriend(const std::function& callback, const std::string& operationID, const std::string& groupID, int rule); + + // GetGroupMemberList retrieves the list of group members + void GetGroupMemberList(const std::function& callback, const std::string& operationID, const std::string& groupID, int filter, int offset, int count); + + // GetGroupMemberOwnerAndAdmin retrieves the owner and admin members of a group + void GetGroupMemberOwnerAndAdmin(const std::function& callback, const std::string& operationID, const std::string& groupID); + + // GetGroupMemberListByJoinTimeFilter retrieves the list of group members filtered by join time + void GetGroupMemberListByJoinTimeFilter(const std::function& callback, const std::string& operationID, const std::string& groupID, int offset, int count, long long int joinTimeBegin, long long int joinTimeEnd, const std::string& filteruserIDs); + + // GetSpecifiedGroupMembersInfo retrieves the information of specified group members + void GetSpecifiedGroupMembersInfo(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& userIDs); + + // KickGroupMember kicks group members + void KickGroupMember(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reason, const std::string& userIDs); + + // TransferGroupOwner transfers the ownership of a group + void TransferGroupOwner(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& newOwnerUserID); + + // InviteUserToGroup invites users to a group + void InviteUserToGroup(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& reason, const std::string& userIDs); + + // GetGroupApplicationListAsRecipient retrieves the group application list as a recipient + void GetGroupApplicationListAsRecipient(const std::function& callback, const std::string& operationID); + + // GetGroupApplicationListAsApplicant retrieves the group application list as an applicant + void GetGroupApplicationListAsApplicant(const std::function& callback, const std::string& operationID); + + // AcceptGroupApplication accepts a group application + void AcceptGroupApplication(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& fromUserID, const std::string& handleMsg); + + // RefuseGroupApplication refuses a group application + void RefuseGroupApplication(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& fromUserID, const std::string& handleMsg); + + // SetGroupMemberNickname sets the nickname of a group member + void SetGroupMemberNickname(const std::function& callback, const std::string& operationID, const std::string& groupID, const std::string& userID, const std::string& groupMemberNickname); + + // SearchGroupMembers searches for group members + void SearchGroupMembers(const std::function& callback, const std::string& operationID, const std::string& searchParam); + + // IsJoinGroup checks if the user has joined a group + void IsJoinGroup(const std::function& callback, const std::string& operationID, const std::string& groupID); + +}; + +} \ No newline at end of file diff --git a/c_cpp_wrapper/protocol.go b/c_cpp_wrapper/protocol.go new file mode 100644 index 0000000..c9aa97e --- /dev/null +++ b/c_cpp_wrapper/protocol.go @@ -0,0 +1,92 @@ +package main + +/* +#include +#include +typedef void (*CB_S)(char *); +typedef void (*CB_I_S)(int,char *); +typedef void (*CB_S_I_S_S)(char *,int,char *,char *); +typedef void (*CB_S_I_S_S_I)(char *,int,char *,char *,int); + +CB_S DebugPrint; + +void Call_CB_S(CB_S func,char* data) +{ + if(func == NULL){ + printf("callback func is null\n"); + return; + } + func(data); +} + + +void Call_CB_I_S(CB_I_S func,int event,char* data) +{ + if(func == NULL){ + printf("callback func is null\n"); + return; + } + func(event,data); + if (data != NULL && data[0] != '\0') + { + printf("this is not null data event\n"); + free(data); + } +} +void Call_CB_S_I_S_S(CB_S_I_S_S func,char* operationID, int errCode,char* errMsg,char* data) +{ + if(func == NULL){ + printf("callback func is null\n"); + return; + } + func(operationID,errCode,errMsg,data); + if (errMsg != NULL && errMsg[0] != '\0') + { + printf("this is not null errmsg\n"); + free(errMsg); + } + if (data != NULL && data[0] != '\0') + { + printf("this is not null data base,opid:%s,data:%s\n",operationID,data); + free(data); + } + if (operationID != NULL) + { + printf("this is not null operationID:%s\n",operationID); + free(operationID); + } +} +void Call_CB_S_I_S_S_I(CB_S_I_S_S_I func,char* operationID,int errCode,char* errMsg,char* data,int progress) +{ + if(func == NULL){ + printf("callback func is null\n"); + return; + } + func(operationID,errCode,errMsg,data,progress); + if (errMsg != NULL && errMsg[0] != '\0') + { + printf("this is not null errmsg\n"); + free(errMsg); + } + if (data != NULL && data[0] != '\0') + { + printf("this is not null data\n"); + free(data); + } + if (operationID != NULL) + { + printf("this is not null operationID\n"); + free(operationID); + } +} + +enum CONN_EVENT{ + CONNECTING, + CONNECT_SUCCESS, + CONNECT_FAILED, + KICKED_OFFLINE, + USER_TOKEN_EXPIRED + +}; +*/ +import "C" diff --git a/c_cpp_wrapper/run_test.sh b/c_cpp_wrapper/run_test.sh new file mode 100755 index 0000000..fb5137b --- /dev/null +++ b/c_cpp_wrapper/run_test.sh @@ -0,0 +1,18 @@ +#!/bin/bash + + +# if arg 1 is c,or is none,means test c sdk +# if arg 1 is cc,means test cpp sdk + +rm ./test +if [ "$1" == "c" ] || [ "$1" == "" ]; then + echo "test c sdk" + gcc -o test ./test.c ./openimsdk.so + ./test + exit 0 +elif [ "$1" == "cc" ]; then + echo "test cpp sdk" + g++ -o test ./test.cc ./openimsdk.so ./openimsdkcc.so + ./test + exit 0 +fi \ No newline at end of file diff --git a/c_cpp_wrapper/test.c b/c_cpp_wrapper/test.c new file mode 100644 index 0000000..c7bf2f0 --- /dev/null +++ b/c_cpp_wrapper/test.c @@ -0,0 +1,66 @@ +// gcc -o test.exe -lc_wrapper.dll test.c +#include +#include +#include + +#include "openimsdk.h" + +typedef struct +{ + GoUint32 platformID; + char apiAddr[256]; + char wsAddr[256]; + char dataDir[256]; + GoUint32 logLevel; + GoUint8 isLogStandardOutput; + char logFilePath[256]; + GoUint8 isExternalExtensions; +} IMConfigC; + +void c_conn_callback(int event, char *data) +{ + printf("C c_conn_callback receive from Go callbck code: %d,data: %s\n", event,data); + +} +void c_conversation_callback(int event, char *data) +{ + printf("C c_conversation_callback receive from Go callbck code: %d,data: %s\n", event, data); +} +void c_message_callback(int event, char *data) +{ + printf("C c_message_callback receive from Go callbck code: %d,data: %s\n", event, data); +} +void c_base_callback(char * operationID ,int errCode,char * errMsg,char *data) +{ + printf("C c_base_callback operationID: %s receive from Go callbck code: %d, errMsg: %s, data: %s\n", operationID, errCode, errMsg, data); +} +int main(int argc, char **argv) +{ + char operationID[] = "12345"; +// char uid[] = "6959062403"; + char uid[] = "openIM123"; + // char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiI2OTU5MDYyNDAzIiwiUGxhdGZvcm1JRCI6MywiZXhwIjoxNzAwNzIwOTg0LCJuYmYiOjE2OTI5NDQ2ODQsImlhdCI6MTY5Mjk0NDk4NH0.8otKTFrOCs8_ueV10rNOD-rzHrCT_EN0obKS9q79bIc"; + char token[] = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJvcGVuSU0xMjMiLCJQbGF0Zm9ybUlEIjo2LCJleHAiOjE3MDkxMjQ2NzYsIm5iZiI6MTcwMTM0ODM3NiwiaWF0IjoxNzAxMzQ4Njc2fQ.EqlV5TlpiElYhUOHCEcSrZOWi9ldrUMR1L4q0blvxs0"; + + char *jsonString = "{\"platformID\": 2, \"apiAddr\": \"http://14.29.168.56:10002\", \"wsAddr\":\"ws://14.29.168.56:10001\",\"dataDir\": \"./\", \"logLevel\": 5, \"isLogStandardOutput\": true, \"logFilePath\": \"./\", \"isExternalExtensions\": true}"; + + GoUint8 init_result; + init_result = init_sdk(c_conn_callback,operationID, jsonString); + printf("init_result: %u\n", init_result); + set_conversation_listener(c_conversation_callback); + set_advanced_msg_listener(c_message_callback); + login(c_base_callback, operationID, uid, token); + sleep(10); + // char text[] = "哈哈"; + char* loginUserID=get_login_user(); + + printf("return :%s\n",loginUserID); + char operationID1[] = "12345,create"; + char *message = create_text_message(operationID1, "哈哈"); + printf("return :%s\n",message); + char operationID2[] = "12345,get_all_conversation_list"; + get_all_conversation_list(c_base_callback, operationID2); + + sleep(1000000); + return 0; +} \ No newline at end of file diff --git a/c_cpp_wrapper/test.cc b/c_cpp_wrapper/test.cc new file mode 100644 index 0000000..e7ec4f2 --- /dev/null +++ b/c_cpp_wrapper/test.cc @@ -0,0 +1,44 @@ +#include +#include +#include +#include +#include "openimsdkcc.h" +using namespace std; +using namespace openim; + +// simple test +int main(){ + auto sdkMgr = OpenIMManager::GetInstance(); + string operationID="12345"; + string uid= "openIM123"; + string token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VySUQiOiJvcGVuSU0xMjMiLCJQbGF0Zm9ybUlEIjo2LCJleHAiOjE3MDkxMjQ2NzYsIm5iZiI6MTcwMTM0ODM3NiwiaWF0IjoxNzAxMzQ4Njc2fQ.EqlV5TlpiElYhUOHCEcSrZOWi9ldrUMR1L4q0blvxs0"; + string jsonString="{\"platformID\": 6, \"apiAddr\": \"http://14.29.168.56:10002\", \"wsAddr\":\"ws://14.29.168.56:10001\",\"dataDir\": \"./\", \"logLevel\": 5, \"isLogStandardOutput\": true, \"logFilePath\": \"./\", \"isExternalExtensions\": true}"; + bool init_result = sdkMgr.InitSDK([](int event,const string& data){ + cout<<"init> "<<"event:"< "<<"event:"< "<<"event:"< " <<"operationID: "< "<<"data:"< +#include +*/ +import "C" + +import ( + "encoding/json" + "strconv" + "unsafe" +) + +func parseBool(b int) bool { + return !(b == 0) +} + +func StructToJsonString(param interface{}) string { + dataType, _ := json.Marshal(param) + dataString := string(dataType) + return dataString +} + +func FreeCString(strList ...*C.char) { + for _, str := range strList { + C.free(unsafe.Pointer(str)) + } +} +func Int32ToString(intValue int32) string { + return strconv.Itoa(int(intValue)) +} diff --git a/internal/login/empty_listener.go b/internal/login/empty_listener.go new file mode 100644 index 0000000..e2ca799 --- /dev/null +++ b/internal/login/empty_listener.go @@ -0,0 +1,185 @@ +package login + +type emptyGroupListener struct{} + +func newEmptyGroupListener() *emptyGroupListener { + return &emptyGroupListener{} +} + +func (emptyGroupListener) OnJoinedGroupAdded(groupInfo string) { + +} + +func (emptyGroupListener) OnJoinedGroupDeleted(groupInfo string) { + +} + +func (emptyGroupListener) OnGroupMemberAdded(groupMemberInfo string) { + +} + +func (emptyGroupListener) OnGroupMemberDeleted(groupMemberInfo string) { + +} + +func (emptyGroupListener) OnGroupApplicationAdded(groupApplication string) { + +} + +func (emptyGroupListener) OnGroupApplicationDeleted(groupApplication string) { + +} + +func (emptyGroupListener) OnGroupInfoChanged(groupInfo string) { + +} + +func (emptyGroupListener) OnGroupDismissed(groupInfo string) { + +} + +func (emptyGroupListener) OnGroupMemberInfoChanged(groupMemberInfo string) { + +} + +func (emptyGroupListener) OnGroupApplicationAccepted(groupApplication string) { + +} + +func (emptyGroupListener) OnGroupApplicationRejected(groupApplication string) { + +} + +type emptyFriendshipListener struct{} + +func newEmptyFriendshipListener() *emptyFriendshipListener { + return &emptyFriendshipListener{} +} + +func (emptyFriendshipListener) OnFriendApplicationAdded(friendApplication string) {} + +func (emptyFriendshipListener) OnFriendApplicationDeleted(friendApplication string) {} + +func (emptyFriendshipListener) OnFriendApplicationAccepted(friendApplication string) {} + +func (emptyFriendshipListener) OnFriendApplicationRejected(friendApplication string) {} + +func (emptyFriendshipListener) OnFriendAdded(friendInfo string) {} + +func (emptyFriendshipListener) OnFriendDeleted(friendInfo string) {} + +func (emptyFriendshipListener) OnFriendInfoChanged(friendInfo string) {} + +func (emptyFriendshipListener) OnBlackAdded(blackInfo string) {} + +func (emptyFriendshipListener) OnBlackDeleted(blackInfo string) {} + +type emptyConversationListener struct{} + +func newEmptyConversationListener() *emptyConversationListener { + return &emptyConversationListener{} +} + +func (emptyConversationListener) OnSyncServerStart() { + +} + +func (emptyConversationListener) OnSyncServerFinish() { + +} + +func (emptyConversationListener) OnSyncServerFailed() { + +} + +func (emptyConversationListener) OnNewConversation(conversationList string) { + +} + +func (emptyConversationListener) OnConversationChanged(conversationList string) { + +} + +func (emptyConversationListener) OnTotalUnreadMessageCountChanged(totalUnreadCount int32) { + +} + +type emptyAdvancedMsgListener struct{} + +func newEmptyAdvancedMsgListener() *emptyAdvancedMsgListener { + return &emptyAdvancedMsgListener{} +} + +func (emptyAdvancedMsgListener) OnRecvNewMessage(message string) { + +} + +func (emptyAdvancedMsgListener) OnRecvC2CReadReceipt(msgReceiptList string) { + +} + +func (emptyAdvancedMsgListener) OnRecvGroupReadReceipt(groupMsgReceiptList string) { + +} + +func (emptyAdvancedMsgListener) OnNewRecvMessageRevoked(messageRevoked string) { + +} + +func (emptyAdvancedMsgListener) OnRecvMessageExtensionsChanged(msgID string, reactionExtensionList string) { + +} + +func (emptyAdvancedMsgListener) OnRecvMessageExtensionsDeleted(msgID string, reactionExtensionKeyList string) { + +} + +func (emptyAdvancedMsgListener) OnRecvMessageExtensionsAdded(msgID string, reactionExtensionList string) { + +} + +func (emptyAdvancedMsgListener) OnRecvOfflineNewMessage(message string) { + +} + +func (emptyAdvancedMsgListener) OnMsgDeleted(message string) { + +} + +type emptyBatchMsgListener struct{} + +func newEmptyBatchMsgListener() *emptyBatchMsgListener { + return &emptyBatchMsgListener{} +} + +func (emptyBatchMsgListener) OnRecvNewMessages(messageList string) { + +} + +func (emptyBatchMsgListener) OnRecvOfflineNewMessages(messageList string) { + +} + +type emptyUserListener struct{} + +func newEmptyUserListener() *emptyUserListener { + return &emptyUserListener{} +} + +func (emptyUserListener) OnSelfInfoUpdated(userInfo string) { + +} + +func (emptyUserListener) OnUserStatusChanged(statusMap string) { + +} + +type emptyCustomBusinessListener struct{} + +func newEmptyCustomBusinessListener() *emptyCustomBusinessListener { + return &emptyCustomBusinessListener{} +} + +func (emptyCustomBusinessListener) OnRecvCustomBusinessMessage(businessMessage string) { + +}