示例#1
0
        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);
                    }
                }
            }));
        }