示例#1
0
        /// <summary>
        /// 合并命令处理
        /// </summary>
        /// <param name="data"></param>
        internal void Merge(ref SubArray <byte> data)
        {
            try
            {
                byte[] dataArray = data.Array;
                ClientCommand.Command command;
                int        receiveIndex = data.Start, receiveCount = data.EndIndex;
                ReturnType type;
                fixed(byte *dataFixed = data.Array)
                {
                    byte *start;

                    do
                    {
                        int receiveSize = receiveCount - receiveIndex;
                        if (receiveSize < sizeof(uint))
                        {
                            if (receiveSize == 0)
                            {
                                return;
                            }
                            break;
                        }
                        CommandIndex = *(uint *)(start = dataFixed + receiveIndex);
                        if ((type = Server.GetReturnType(ref CommandIndex)) == ReturnType.Unknown)
                        {
                            if (receiveSize < (sizeof(uint) + sizeof(int)))
                            {
                                break;
                            }
                            if ((dataSize = *(int *)(start + sizeof(uint))) <= 0)
                            {
                                break;
                            }
                            if (dataSize > (receiveSize -= (sizeof(uint) + sizeof(int))))
                            {
                                break;
                            }
                            receiveIndex += (sizeof(uint) + sizeof(int));

                            //if ((command = CommandIndex == keepCallbackCommandIndex ? keepCallbackCommand : getCommand()) != null)
                            if ((command = CommandPool.GetCommand((int)CommandIndex)) != null)
                            {
                                //if (command.CommandInfo.TaskType == ClientTaskType.Synchronous)
                                //{
                                //    data.Set(receiveIndex, dataSize);
                                //    command.OnReceiveSynchronous(ref data);
                                //}
                                //else if (command.CommandInfo.IsKeepCallback == 0) command.CopyDataRunTask(dataArray, receiveIndex, dataSize);
                                //else new CommandKeepDataTask().CopyData(command, dataArray, receiveIndex, dataSize);
                                data.Set(receiveIndex, dataSize);
                                command.OnReceive(ref data);
                            }
                            receiveIndex += dataSize;
                        }
                        else
                        {
                            onReceive(type);
                            receiveIndex += sizeof(uint);
                        }
                    }while (true);
                }
            }
            catch (Exception error)
            {
                Log.Add(AutoCSer.Log.LogType.Error, error);
            }
            mergeError();
        }