fix: modify the way of communication from C to Go.

dev_1
Gordon 2 years ago committed by Gordon
parent d8c3e1181e
commit 9b418a8d17
  1. 2
      c_wrapper/build_dll.bat
  2. 21
      c_wrapper/constant.go
  3. 106
      c_wrapper/export.go
  4. 33
      c_wrapper/protocol.go

@ -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

@ -0,0 +1,21 @@
package main
/*
#include <stdio.h>
*/
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
)

@ -2,30 +2,12 @@ package main
/* /*
#include <stdio.h> #include <stdio.h>
typedef void (*CB)(); typedef void (*CB_I_I_S)(int,int,char *);
typedef void (*CB_I_S)(int,char *); typedef void (*CB_I_S_S)(int,char *,char *);
typedef void (*CB_S)(char *); typedef void (*CB_I_S_S_I)(int,char *,char *,int);
typedef void (*CB_I)(int); extern void Call_CB_I_I_S(CB_I_I_S func,int event,int errCode,char* errMsg);
__attribute__((weak)) extern void Call_CB_I_S_S(CB_I_S_S func,int errCode,char* errMsg,char* data);
void Call_CB(CB func) extern void Call_CB_I_S_S_I(CB_I_S_S_I func,int errCode,char* errMsg,char* data,int progress);
{
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);
}
*/ */
import "C" import "C"
@ -34,78 +16,75 @@ import (
) )
type ConnCallback struct { type ConnCallback struct {
onConnecting C.CB cCallback C.CB_I_I_S
onConnectSuccess C.CB
onConnectFailed C.CB_I_S
onKickedOffline C.CB
onUserTokenExpired C.CB
} }
func NewConnCallback(onConnecting C.CB, onConnectSuccess C.CB, func NewConnCallback(cCallback C.CB_I_I_S) *ConnCallback {
onKickedOffline C.CB, onUserTokenExpired C.CB, onConnectFailed C.CB_I_S) *ConnCallback { return &ConnCallback{cCallback: cCallback}
return &ConnCallback{onConnecting: onConnecting, onConnectSuccess: onConnectSuccess,
onKickedOffline: onKickedOffline, onUserTokenExpired: onUserTokenExpired, onConnectFailed: onConnectFailed}
} }
func (c ConnCallback) OnConnecting() { 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() { 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) { 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() { 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() { 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 { type SendMessageCallback struct {
*BaseCallback cCallback C.CB_I_S_S_I
progressFunc C.CB_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 { func (s SendMessageCallback) OnSuccess(data string) {
return &SendMessageCallback{BaseCallback: baseCallback, progressFunc: progressFunc} 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) { 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 { type BaseCallback struct {
successFunc C.CB_S cCallback C.CB_I_S_S
failedFunc C.CB_I_S
} }
func NewBaseCallback(successFunc C.CB_S, failedFunc C.CB_I_S) *BaseCallback { func NewBaseCallback(cCallback C.CB_I_S_S) *BaseCallback {
return &BaseCallback{successFunc: successFunc, failedFunc: failedFunc} return &BaseCallback{cCallback: cCallback}
} }
func (b BaseCallback) OnError(errCode int32, errMsg string) { 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) { 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 //export init_sdk
func init_sdk(onConnecting C.CB, func init_sdk(
onConnectSuccess C.CB, cCallback C.CB_I_I_S,
onKickedOffline C.CB,
onUserTokenExpired C.CB,
onConnectFailed C.CB_I_S,
operationID *C.char, config *C.char) bool { 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)) 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 //export login
func login(successFunc C.CB_S, failedFunc C.CB_I_S, operationID, uid, token *C.char) { func login(cCallback C.CB_I_S_S, operationID, uid, token *C.char) {
baseCallback := NewBaseCallback(successFunc, failedFunc) baseCallback := NewBaseCallback(cCallback)
open_im_sdk.Login(baseCallback, C.GoString(operationID), C.GoString(uid), C.GoString(token)) open_im_sdk.Login(baseCallback, C.GoString(operationID), C.GoString(uid), C.GoString(token))
} }
//export logout //export logout
func logout(successFunc C.CB_S, failedFunc C.CB_I_S, operationID *C.char) { func logout(cCallback C.CB_I_S_S, operationID *C.char) {
baseCallback := NewBaseCallback(successFunc, failedFunc) baseCallback := NewBaseCallback(cCallback)
open_im_sdk.Logout(baseCallback, C.GoString(operationID)) open_im_sdk.Logout(baseCallback, C.GoString(operationID))
} }
//export network_status_changed //export network_status_changed
func network_status_changed(successFunc C.CB_S, failedFunc C.CB_I_S, operationID *C.char) { func network_status_changed(cCallback C.CB_I_S_S, operationID *C.char) {
baseCallback := NewBaseCallback(successFunc, failedFunc) baseCallback := NewBaseCallback(cCallback)
open_im_sdk.NetworkStatusChanged(baseCallback, C.GoString(operationID)) open_im_sdk.NetworkStatusChanged(baseCallback, C.GoString(operationID))
} }
@ -258,9 +237,8 @@ func create_forward_message(operationID, m *C.char) string {
} }
//export send_message //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) { func send_message(cCallback C.CB_I_S_S_I, operationID, message, recvID, groupID, offlinePushInfo *C.char) {
baseCallback := NewBaseCallback(successFunc, failedFunc) sendMsgCallback := NewSendMessageCallback(cCallback)
sendMsgCallback := NewSendMessageCallback(baseCallback, progressFunc)
open_im_sdk.SendMessage(sendMsgCallback, C.GoString(operationID), C.GoString(message), C.GoString(recvID), C.GoString(groupID), C.GoString(offlinePushInfo)) open_im_sdk.SendMessage(sendMsgCallback, C.GoString(operationID), C.GoString(message), C.GoString(recvID), C.GoString(groupID), C.GoString(offlinePushInfo))
} }

@ -0,0 +1,33 @@
package main
/*
#include <stdio.h>
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"
Loading…
Cancel
Save