package main /* #include #include #include #include #include "bh_api.h" void print(int v) { printf("print %d\n", v); } static void ReadData(void **p, int32_t *n) { *n = 4; *p = malloc(4); memcpy(*p, "abc", 4); *n = 4; } static void PrintData(void *p, int32_t n) { printf("data :%s\n", (char*)p); free(p); } */ // #cgo LDFLAGS: -L/home/lichao/code/shmsg/build/lib -L/usr/local/lib -lbhome_shmq -lbhome_msg -lprotobuf-lite -lstdc++ -lpthread -lrt import "C" import ( bh "bhome/bhome_msg" "fmt" "unsafe" ) func BHApiIn1Out1(bhfunc C.FBHApiIn1Out1, data []byte, reply *bh.MsgCommonReply, timeout_ms int) bool { creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHApiIn1Out1Proxy(bhfunc, unsafe.Pointer(&data[0]), C.int(len(data)), &creply, &creply_len, C.int(timeout_ms)) > 0 if r { reply.Unmarshal(C.GoBytes(creply, creply_len)) } return r } func Register(proc *bh.ProcInfo, reply *bh.MsgCommonReply, timeout_ms int) bool { data, _ := proc.Marshal() return BHApiIn1Out1(C.FBHApiIn1Out1(C.BHRegister), data, reply, timeout_ms) } func RegisterTopics(topics *bh.MsgTopicList, reply *bh.MsgCommonReply, timeout_ms int) bool { data, _ := topics.Marshal() return BHApiIn1Out1(C.FBHApiIn1Out1(C.BHRegisterTopics), data, reply, timeout_ms) } func Subscribe(topics *bh.MsgTopicList, reply *bh.MsgCommonReply, timeout_ms int) bool { data, _ := topics.Marshal() return BHApiIn1Out1(C.FBHApiIn1Out1(C.BHSubscribeTopics), data, reply, timeout_ms) } func Heartbeat(topics *bh.MsgTopicList, reply *bh.MsgCommonReply, timeout_ms int) bool { data, _ := topics.Marshal() return BHApiIn1Out1(C.FBHApiIn1Out1(C.BHHeartbeat), data, reply, timeout_ms) } func HeartbeatEasy(timeout_ms int) bool { return C.BHHeartbeatEasy(C.int(timeout_ms)) > 0 } func Publish(pub *bh.MsgPublish, timeout_ms int) bool { data, _ := pub.Marshal() return C.BHPublish(unsafe.Pointer(&data[0]), C.int(len(data)), C.int(timeout_ms)) > 0 } func ReadSub(proc_id *string, pub *bh.MsgPublish, timeout_ms int) bool { cpid := unsafe.Pointer(nil) cpid_len := C.int(0) defer C.BHFree(cpid, cpid_len) creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHReadSub(&cpid, &cpid_len, &creply, &creply_len, C.int(timeout_ms)) > 0 *proc_id = string(C.GoBytes(cpid, cpid_len)) pub.Unmarshal(C.GoBytes(creply, creply_len)) return r } func AsyncRequest(req *bh.MsgRequestTopic, msg_id *[]byte) bool { data, _ := req.Marshal() creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHAsyncRequest(unsafe.Pointer(&data[0]), C.int(len(data)), &creply, &creply_len) > 0 if r { *msg_id = C.GoBytes(creply, creply_len) } return r } func Request(req *bh.MsgRequestTopic, proc_id *string, reply *bh.MsgRequestTopicReply, timeout_ms int) bool { data, _ := req.Marshal() cpid := unsafe.Pointer(nil) cpid_len := C.int(0) defer C.BHFree(cpid, cpid_len) creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHRequest(unsafe.Pointer(&data[0]), C.int(len(data)), &cpid, &cpid_len, &creply, &creply_len, C.int(timeout_ms)) > 0 if r { *proc_id = string(C.GoBytes(cpid, cpid_len)) reply.Unmarshal(C.GoBytes(creply, creply_len)) } return r } func ReadRequest(proc_id *string, req *bh.MsgRequestTopic, psrc *unsafe.Pointer, timeout_ms int) bool { cpid := unsafe.Pointer(nil) cpid_len := C.int(0) defer C.BHFree(cpid, cpid_len) creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHReadRequest(&cpid, &cpid_len, &creply, &creply_len, psrc, C.int(timeout_ms)) > 0 if r { *proc_id = string(C.GoBytes(cpid, cpid_len)) req.Unmarshal(C.GoBytes(creply, creply_len)) } return r } func SendReply(src unsafe.Pointer, rep *bh.MsgRequestTopicReply) bool { data, _ := rep.Marshal() return C.BHSendReply(src, unsafe.Pointer(&data[0]), C.int(len(data))) > 0 } func GetLastError() (int, string) { creply := unsafe.Pointer(nil) creply_len := C.int(0) defer C.BHFree(creply, creply_len) r := C.BHGetLastError(&creply, &creply_len) return int(r), string(C.GoBytes(creply, creply_len)) } type ServecCB func(src unsafe.Pointer, proc_id *string, req *bh.MsgRequestTopic) type SubDataCB func(proc_id *string, pub *bh.MsgPublish) type ClientCB func(proc_id *string, msg_id *[]byte, reply *bh.MsgRequestTopicReply) func cserver_callback(cpid unsafe.Pointer, pid_len C.int, src unsafe.Pointer) { } func StartWorker(server_cb ServecCB, sub_cb SubDataCB, client_cb ClientCB) { } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // user code: func ServerCallback(proc_id *string, req *bh.MsgRequestTopic, reply *bh.MsgRequestTopicReply) bool { // xxxx return true } func SubDataCallback(proc_id *string, pub *bh.MsgPublish) { } func ClientCallback(proc_id *string, msg_id *[]byte, reply *bh.MsgRequestTopicReply) { } func main() { proc := bh.ProcInfo{} proc.ProcId = []byte("test_proc") reply := bh.MsgCommonReply{} r := Register(&proc, &reply, 1000) if r { fmt.Println("register ok") } else { fmt.Println("register failed") return } r = HeartbeatEasy(1000) if r { fmt.Println("heartbeat ok") } else { fmt.Println("heartbeat failed") } topics := bh.MsgTopicList{} topics.TopicList = append(topics.TopicList, []byte("topic0"), []byte("topic1")) RegisterTopics(&topics, &reply, 0) if r { fmt.Println("reg topics ok") } else { fmt.Println("reg topics failed") } p := unsafe.Pointer(nil) n := C.int32_t(0) C.ReadData(&p, &n) C.PrintData(p, n) }