static void KickCallback(IntPtr userData, IntPtr err, IntPtr kickAnswerBuf) { var handle = GCHandle.FromIntPtr(userData); var context = (CallbackContext <bool>)handle.Target; if (err != IntPtr.Zero) { var pe = new PitayaError( PitayaCluster.pitaya_error_code(err), PitayaCluster.pitaya_error_message(err)); context.t.SetException(new Exception($"Kick failed: code={pe.Code} message={pe.Message}")); return; } Int32 len; IntPtr resData = PitayaCluster.pitaya_buffer_data(kickAnswerBuf, out len); var kickAnswer = new KickAnswer(); kickAnswer.MergeFrom(new CodedInputStream(GetDataFromRawPointer(resData, len))); if (!kickAnswer.Kicked) { context.t.SetException(new Exception($"Kick failed: received kicked=false from server")); return; } context.t.SetResult(true); }
public static unsafe Task <bool> SendKickToUser(string frontendId, string serverType, KickMsg kick) { return(_rpcTaskFactory.StartNew(() => { bool ok = false; MemoryBuffer inMemBuf = new MemoryBuffer(); MemoryBuffer *outMemBufPtr = null; var retError = new Error(); try { var data = kick.ToByteArray(); fixed(byte *p = data) { inMemBuf.data = (IntPtr)p; inMemBuf.size = data.Length; IntPtr inMemBufPtr = new StructWrapper(inMemBuf); ok = KickInternal(frontendId, serverType, inMemBufPtr, &outMemBufPtr, ref retError); if (!ok) // error { Logger.Error($"Push failed: ({retError.code}: {retError.msg})"); return false; } var kickAns = new KickAnswer(); kickAns.MergeFrom(new CodedInputStream(outMemBufPtr->GetData())); return kickAns.Kicked; } } finally { if (outMemBufPtr != null) { FreeMemoryBufferInternal(outMemBufPtr); } } })); }