From 9b418a8d178e8a2485729476d3e9f1ccd0dd243d Mon Sep 17 00:00:00 2001 From: Gordon <1432970085@qq.com> Date: Sun, 3 Sep 2023 16:08:37 +0800 Subject: [PATCH] fix: modify the way of communication from C to Go. --- c_wrapper/build_dll.bat | 2 +- c_wrapper/constant.go | 21 ++++++++ c_wrapper/export.go | 106 ++++++++++++++++------------------------ c_wrapper/protocol.go | 33 +++++++++++++ 4 files changed, 97 insertions(+), 65 deletions(-) create mode 100644 c_wrapper/constant.go create mode 100644 c_wrapper/protocol.go diff --git a/c_wrapper/build_dll.bat b/c_wrapper/build_dll.bat index 1ab8539..a514873 100644 --- a/c_wrapper/build_dll.bat +++ b/c_wrapper/build_dll.bat @@ -1,2 +1,2 @@ -go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o openimsdk.dll export.go +go build -buildmode=c-shared -trimpath -ldflags="-s -w" -o openimsdk.dll export.go constant.go protocol.go diff --git a/c_wrapper/constant.go b/c_wrapper/constant.go new file mode 100644 index 0000000..e3fe025 --- /dev/null +++ b/c_wrapper/constant.go @@ -0,0 +1,21 @@ +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 +) diff --git a/c_wrapper/export.go b/c_wrapper/export.go index 9c6355b..5bd82a8 100644 --- a/c_wrapper/export.go +++ b/c_wrapper/export.go @@ -2,30 +2,12 @@ package main /* #include -typedef void (*CB)(); -typedef void (*CB_I_S)(int,char *); -typedef void (*CB_S)(char *); -typedef void (*CB_I)(int); -__attribute__((weak)) -void Call_CB(CB func) -{ - func(); -} -__attribute__((weak)) -void Call_CB_I_S(CB_I_S func,int errCode,char* errMsg) -{ - func(errCode,errMsg); -} -__attribute__((weak)) -void Call_CB_S(CB_S func,char* data) -{ - func(data); -} -__attribute__((weak)) -void Call_CB_I(CB_I func,int progress) -{ - func(progress); -} +typedef void (*CB_I_I_S)(int,int,char *); +typedef void (*CB_I_S_S)(int,char *,char *); +typedef void (*CB_I_S_S_I)(int,char *,char *,int); +extern void Call_CB_I_I_S(CB_I_I_S func,int event,int errCode,char* errMsg); +extern void Call_CB_I_S_S(CB_I_S_S func,int errCode,char* errMsg,char* data); +extern void Call_CB_I_S_S_I(CB_I_S_S_I func,int errCode,char* errMsg,char* data,int progress); */ import "C" @@ -34,78 +16,75 @@ import ( ) type ConnCallback struct { - onConnecting C.CB - onConnectSuccess C.CB - onConnectFailed C.CB_I_S - onKickedOffline C.CB - onUserTokenExpired C.CB + cCallback C.CB_I_I_S } -func NewConnCallback(onConnecting C.CB, onConnectSuccess C.CB, - onKickedOffline C.CB, onUserTokenExpired C.CB, onConnectFailed C.CB_I_S) *ConnCallback { - return &ConnCallback{onConnecting: onConnecting, onConnectSuccess: onConnectSuccess, - onKickedOffline: onKickedOffline, onUserTokenExpired: onUserTokenExpired, onConnectFailed: onConnectFailed} +func NewConnCallback(cCallback C.CB_I_I_S) *ConnCallback { + return &ConnCallback{cCallback: cCallback} } func (c ConnCallback) OnConnecting() { - C.Call_CB(c.onConnecting) + C.Call_CB_I_I_S(c.cCallback, CONNECTING, NO_ERR, NO_ERR_MSG) } func (c ConnCallback) OnConnectSuccess() { - C.Call_CB(c.onConnectSuccess) + C.Call_CB_I_I_S(c.cCallback, CONNECT_SUCCESS, NO_ERR, NO_ERR_MSG) } func (c ConnCallback) OnConnectFailed(errCode int32, errMsg string) { - C.Call_CB_I_S(c.onConnectFailed, C.int(errCode), C.CString(errMsg)) + C.Call_CB_I_I_S(c.cCallback, CONNECT_FAILED, C.int(errCode), C.CString(errMsg)) } func (c ConnCallback) OnKickedOffline() { - C.Call_CB(c.onKickedOffline) + C.Call_CB_I_I_S(c.cCallback, KICKED_OFFLINE, NO_ERR, NO_ERR_MSG) } func (c ConnCallback) OnUserTokenExpired() { - C.Call_CB(c.onUserTokenExpired) + C.Call_CB_I_I_S(c.cCallback, USER_TOKEN_EXPIRED, NO_ERR, NO_ERR_MSG) } type SendMessageCallback struct { - *BaseCallback - progressFunc C.CB_I + cCallback C.CB_I_S_S_I +} + +func NewSendMessageCallback(cCallback C.CB_I_S_S_I) *SendMessageCallback { + return &SendMessageCallback{cCallback: cCallback} +} + +func (s SendMessageCallback) OnError(errCode int32, errMsg string) { + C.Call_CB_I_S_S_I(s.cCallback, C.int(errCode), C.CString(errMsg), NO_DATA, NO_PROGRESS) } -func NewSendMessageCallback(baseCallback *BaseCallback, progressFunc C.CB_I) *SendMessageCallback { - return &SendMessageCallback{BaseCallback: baseCallback, progressFunc: progressFunc} +func (s SendMessageCallback) OnSuccess(data string) { + C.Call_CB_I_S_S_I(s.cCallback, NO_ERR, NO_ERR_MSG, C.CString(data), NO_PROGRESS) } func (s SendMessageCallback) OnProgress(progress int) { - C.Call_CB_I(s.progressFunc, C.int(progress)) + C.Call_CB_I_S_S_I(s.cCallback, NO_ERR, NO_ERR_MSG, NO_DATA, C.int(progress)) } type BaseCallback struct { - successFunc C.CB_S - failedFunc C.CB_I_S + cCallback C.CB_I_S_S } -func NewBaseCallback(successFunc C.CB_S, failedFunc C.CB_I_S) *BaseCallback { - return &BaseCallback{successFunc: successFunc, failedFunc: failedFunc} +func NewBaseCallback(cCallback C.CB_I_S_S) *BaseCallback { + return &BaseCallback{cCallback: cCallback} } func (b BaseCallback) OnError(errCode int32, errMsg string) { - C.Call_CB_I_S(b.failedFunc, C.int(errCode), C.CString(errMsg)) + C.Call_CB_I_S_S(b.cCallback, C.int(errCode), C.CString(errMsg), NO_DATA) } func (b BaseCallback) OnSuccess(data string) { - C.Call_CB_S(b.successFunc, C.CString(data)) + C.Call_CB_I_S_S(b.cCallback, NO_ERR, NO_ERR_MSG, C.CString(data)) } //export init_sdk -func init_sdk(onConnecting C.CB, - onConnectSuccess C.CB, - onKickedOffline C.CB, - onUserTokenExpired C.CB, - onConnectFailed C.CB_I_S, +func init_sdk( + cCallback C.CB_I_I_S, operationID *C.char, config *C.char) bool { - callback := NewConnCallback(onConnecting, onConnectSuccess, onKickedOffline, onUserTokenExpired, onConnectFailed) + callback := NewConnCallback(cCallback) return open_im_sdk.InitSDK(callback, C.GoString(operationID), C.GoString(config)) } @@ -115,20 +94,20 @@ func un_init_sdk(operationID *C.char) { } //export login -func login(successFunc C.CB_S, failedFunc C.CB_I_S, operationID, uid, token *C.char) { - baseCallback := NewBaseCallback(successFunc, failedFunc) +func login(cCallback C.CB_I_S_S, operationID, uid, token *C.char) { + baseCallback := NewBaseCallback(cCallback) open_im_sdk.Login(baseCallback, C.GoString(operationID), C.GoString(uid), C.GoString(token)) } //export logout -func logout(successFunc C.CB_S, failedFunc C.CB_I_S, operationID *C.char) { - baseCallback := NewBaseCallback(successFunc, failedFunc) +func logout(cCallback C.CB_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback) open_im_sdk.Logout(baseCallback, C.GoString(operationID)) } //export network_status_changed -func network_status_changed(successFunc C.CB_S, failedFunc C.CB_I_S, operationID *C.char) { - baseCallback := NewBaseCallback(successFunc, failedFunc) +func network_status_changed(cCallback C.CB_I_S_S, operationID *C.char) { + baseCallback := NewBaseCallback(cCallback) open_im_sdk.NetworkStatusChanged(baseCallback, C.GoString(operationID)) } @@ -258,9 +237,8 @@ func create_forward_message(operationID, m *C.char) string { } //export send_message -func send_message(successFunc C.CB_S, failedFunc C.CB_I_S, progressFunc C.CB_I, operationID, message, recvID, groupID, offlinePushInfo *C.char) { - baseCallback := NewBaseCallback(successFunc, failedFunc) - sendMsgCallback := NewSendMessageCallback(baseCallback, progressFunc) +func send_message(cCallback C.CB_I_S_S_I, operationID, message, recvID, groupID, offlinePushInfo *C.char) { + sendMsgCallback := NewSendMessageCallback(cCallback) open_im_sdk.SendMessage(sendMsgCallback, C.GoString(operationID), C.GoString(message), C.GoString(recvID), C.GoString(groupID), C.GoString(offlinePushInfo)) } diff --git a/c_wrapper/protocol.go b/c_wrapper/protocol.go new file mode 100644 index 0000000..9d985ca --- /dev/null +++ b/c_wrapper/protocol.go @@ -0,0 +1,33 @@ +package main + +/* +#include +typedef void (*CB_I_I_S)(int,int,char *); +typedef void (*CB_I_S_S)(int,char *,char *); +typedef void (*CB_I_S_S_I)(int,char *,char *,int); + +__attribute__((weak)) +void Call_CB_I_I_S(CB_I_I_S func,int event,int errCode,char* errMsg) +{ + func(event,errCode,errMsg); +} +__attribute__((weak)) +void Call_CB_I_S_S(CB_I_S_S func,int errCode,char* errMsg,char* data) +{ + func(errCode,errMsg,data); +} +__attribute__((weak)) +void Call_CB_I_S_S_I(CB_I_S_S_I func,int errCode,char* errMsg,char* data,int progress) +{ + func(errCode,errMsg,data,progress); +} +enum CONN_EVENT{ + CONNECTING, + CONNECT_SUCCESS, + CONNECT_FAILED, + KICKED_OFFLINE, + USER_TOKEN_EXPIRED + +}; +*/ +import "C"