fix: modify the way of communication from C to Go.
This commit is contained in:
parent
d8c3e1181e
commit
9b418a8d17
@ -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
|
||||||
|
|
||||||
|
21
c_wrapper/constant.go
Normal file
21
c_wrapper/constant.go
Normal file
@ -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(baseCallback *BaseCallback, progressFunc C.CB_I) *SendMessageCallback {
|
func NewSendMessageCallback(cCallback C.CB_I_S_S_I) *SendMessageCallback {
|
||||||
return &SendMessageCallback{BaseCallback: baseCallback, progressFunc: progressFunc}
|
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 (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) {
|
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))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
33
c_wrapper/protocol.go
Normal file
33
c_wrapper/protocol.go
Normal file
@ -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…
x
Reference in New Issue
Block a user