internal void Radio(C2CRadioPackage radioPkg)
        {
            //配置请求包
            ServerRequestPackage reqtPkg       = new ServerRequestPackage(true);
            IRadioMessageRequest reqtInterface = reqtPkg.Active_RadioMessageRequest();

            reqtInterface.RadioMessage(radioPkg.Group.Token, radioPkg);

            BinTransferLayer   binProcessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage replyPkg     = null;

            try
            {
                replyPkg = binProcessor.SynSendMessage(reqtPkg, 100000);
            }
            catch (System.Exception ex)
            {
                throw new RadioGroupExcetion(ex.ToString());
            }
            IRadioReply replyInterface = replyPkg.Active_RadioGroupReply();
            bool        ret;
            string      errorDetail;

            replyInterface.RadioRet(out ret, out errorDetail);
            if (true == ret)
            {
                //nothing to do
            }
            else
            {
                throw new RadioGroupExcetion(errorDetail);
            }
        }
        internal GroupDevice GetGroup(string detail)
        {
            //配置请求包
            ServerRequestPackage    reqtPkg       = new ServerRequestPackage(true);
            IOnlineGroupListRequest reqtInterface = reqtPkg.Active_OnlineGroupListRequest();

            reqtInterface.OnlineGroupRequest();

            BinTransferLayer   binprocessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage replyPkg     = null;

            try
            {
                replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000);
            }
            catch (Exception ex)
            {
                throw new GetOnlineGroupExcetion(ex.ToString());
            }
            IOnlineGroupReply replyInterface = replyPkg.Active_OnlineGroupReply();
            bool   ret;
            string errorDetail;
            List <CSCommunicateClass.GroupInfo> onlineGroupInfo;

            replyInterface.OnlineGroupRet(out ret, out errorDetail, out onlineGroupInfo);
            if (true == ret)
            {
                foreach (CSCommunicateClass.GroupInfo item in onlineGroupInfo)
                {
                    if (item.Detail.Equals(detail))
                    {
                        GroupDevice gropInst = new GroupDevice(_mclLayerProcessor);
                        GroupDevice.Parse(item, gropInst);

                        try
                        {
                            //check join statucs
                            List <CSCommunicateClass.ClientInfo> clients = null;
                            GetGroupMembers(gropInst, out clients);
                            if ((null != clients) && (0 < clients.Count))
                            {
                                gropInst.Joined = true;
                            }
                        }
                        catch (System.Exception ex)
                        {
                            //nothing to do
                        }
                        return(gropInst);
                    }
                }
                throw new GetOnlineGroupExcetion("不存在指定名称的群组");
            }
            else
            {
                throw new GetOnlineGroupExcetion(errorDetail);
            }
        }
        internal void JoinGroup(GroupDevice group, GroupMemberRole role)
        {
            //配置请求包
            ServerRequestPackage reqtPkg       = new ServerRequestPackage(true);
            IJoinGroupRequest    reqtInterface = reqtPkg.Active_JoinGroupRequest();

            if (group.Ready && !string.IsNullOrEmpty(group.Token))
            {
                reqtInterface.JoinGroup(group.Token, role);
            }
            else
            {
                throw new ArgumentNullException("Group token is null");
            }
            BinTransferLayer   binprocessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage replyPkg     = null;

            try
            {
                replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000);
            }
            catch (System.Exception ex)
            {
                throw new JoinGroupExcetion(ex.ToString());
            }
            IJoinGroupReply replyInterface = replyPkg.Active_JoinGroupReply();
            bool            ret;
            string          detail;

            replyInterface.JoinGroupRet(out ret, out detail);
            if (true == ret)
            {
                //该部分逻辑内聚到Group内部

                ////加入成功
                //group.Joined = true;
                //try
                //{
                //    //从接口的使用习惯上考虑,立即返回成员列表
                //    group.Referesh();
                //}
                //catch (RefereshGroupInfo ex)
                //{
                //    //虽然刷新讯息抛出错误,但仍可以判定客户端已加入
                //    throw ex;
                //}
            }
            else
            {
                throw new JoinGroupExcetion(detail);
            }
        }
Beispiel #4
0
        /// <summary>
        /// 非阻塞式执行一次消息发送请求
        /// </summary>
        /// <param name="mtPkg">发往远程中间件设备的消息包</param>
        internal void AsynSendMessage(MiddlewareTransferPackage mtPkg)
        {
            //will send a message
            if ((mtPkg is RequestMTPackage) && ((mtPkg as RequestMTPackage).WattingResponse))
            {
                __ActiveMiddlewareMessageWattinghere(mtPkg);
            }

            bool mustWaitReponse = true;
            ServerRequestPackage wilSendScsMsg = new ServerRequestPackage(mustWaitReponse);

            //配置为Middleware传输包
            IMiddleware2MiddlewareCommunicatRequest statSeter = wilSendScsMsg.Active_MiddlewareCommunicatRequest();

            statSeter.WilSendMiddleware2MiddlewareMessage(mtPkg.TargetDevice, mtPkg);

            BinTransferLayer   btlprocessor = _middlewareCorelogicLayer.BinTransferProcessor;
            ServerReplyPackage replyServPkg = null;

            try
            {
                replyServPkg = btlprocessor.SynSendMessage(wilSendScsMsg, 100000);
            }
            catch (System.Exception ex)
            {
                //TODO
                throw new MiddlewareTransferErrorExcetion(ex);
            }
            //分析服务端报文
            IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply();
            bool   ret;
            string detail;

            try
            {
                replyInterface.SendMiddlewareMsgOprRet(out ret, out detail);
            }
            catch (Exception ex)
            {
                throw new MiddlewareTransferErrorExcetion(ex.ToString());
            }
            if (true == ret)
            {
                //noting to do
            }
            else
            {
                throw new MiddlewareTransferErrorExcetion(detail);
            }
        }
        internal MiddlewareCorelogicLayer()
        {
            _binProcessferProcessor         = new BinTransferLayer(this);
            _middlewareCommunicateProcessor = new MiddlewareCommunicateLayer(this);
            _groupCommunicateProcessor      = new GroupCommunicateLayer(this);
            mMiddlewareMessenger            = MiddlewareMessenger.Instance;

            _asynSendRequestRunner = new SequentialItemProcessor <RequestCommunicatePackage>(this.__CoAsynSendRequestRunning);
            _asynFeedbackCommunicateReplyMessageRunner = new SequentialItemProcessor <ReplyCommunicatePackage>(this.__AsynFeedbackCommunicateReplyMessageRunning);
            _asynGetGroupRunner    = new SequentialItemProcessor <KeyValuePair <string, GroupDevice> >(this.__AsynCoGetGroupRunning);
            _asynJoinGroupRunner   = new SequentialItemProcessor <KeyValuePair <GroupDevice, GroupMemberRole> >(this.__CoAsynJoinGroupRunning);
            _asynExitGroupRunner   = new SequentialItemProcessor <GroupDevice>(this.__CoAsynExitGroupRunning);
            _asynRadioRunner       = new SequentialItemProcessor <GroupComunicatePackage>(this.__CoAsynRadioRunning);
            _asynCreategroupRunner = new SequentialItemProcessor <KeyValuePair <string, GroupDevice> >(this.__CoAsynCreateGroupRunning);
        }
        internal void ExitGroup(GroupDevice group)
        {
            if (!group.Ready || string.IsNullOrEmpty(group.Token))
            {
                throw new ExitGroupExcetion((new NullReferenceException("Group token is null")).ToString());
            }
            //配置请求包
            ServerRequestPackage reqtPkg       = new ServerRequestPackage(true);
            IExitGroupRequest    reqtInterface = reqtPkg.Active_ExitGroupRequest();

            reqtInterface.ExitGroup(group.Token);

            BinTransferLayer   binprocessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage replyPkg     = null;

            try
            {
                replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000);
            }
            catch (Exception ex)
            {
                throw new ExitGroupExcetion(ex.ToString());
            }
            IExitGroupRely replyInterface = replyPkg.Active_ExitGroupReply();
            bool           ret;
            string         errorDetail;

            replyInterface.ExitGroupRet(out ret, out errorDetail);
            if (true == ret)
            {
                //该部分逻辑内聚到Group内部

                //group.Joined = false;
                //try
                //{
                //    group.Referesh();
                //}catch(RefereshGroupInfo ex)
                //{
                //    throw ex;
                //}
            }
            else
            {
                throw new ExitGroupExcetion(errorDetail);
            }
        }
        internal void GetGroupMembers(GroupDevice gropDevice, out List <CSCommunicateClass.ClientInfo> onlineGroupMembers)
        {
            //配置数据包
            ServerRequestPackage      servReqtPkg   = new ServerRequestPackage(true);
            IOnlineGroupClientRequest reqtInterface = servReqtPkg.Active_OnlineGroupClientRequest();

            reqtInterface.OnlineGroupClientRequest(gropDevice.Token);

            BinTransferLayer   binprocessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage servReplyPkg = null;

            try
            {
                servReplyPkg = binprocessor.SynSendMessage(servReqtPkg, 100000);
            }
            catch (System.Exception ex)
            {
                throw new GetOnlineGroupClientExcetion(ex.ToString());
            }
            IOnlineGroupClientReply replyInterface = servReplyPkg.Active_OnlineGroupClientReply();
            bool   ret;
            string errorDetail;

            try
            {
                replyInterface.OnlineGroupClientRet(out ret, out errorDetail, out onlineGroupMembers);
            }
            catch (Exception ex)
            {
                throw new GetOnlineGroupClientExcetion(ex.ToString());
            }
            if (true == ret)
            {
                //nothing to do
            }
            else
            {
                throw new GetOnlineGroupClientExcetion(errorDetail);
            }
        }
        internal GroupDevice CreateGroup(string detail)
        {
            //配置请求包
            ServerRequestPackage reqtPkg       = new ServerRequestPackage(true);
            ICreateGroupRequest  reqtInterface = reqtPkg.Active_CreateGroupRequest();

            reqtInterface.CreateNewGroup(detail);

            BinTransferLayer   binprocessor = _mclLayerProcessor.BinTransferProcessor;
            ServerReplyPackage replyPkg     = null;

            try
            {
                replyPkg = binprocessor.SynSendMessage(reqtPkg, 100000);
            }
            catch (System.Exception ex)
            {
                //throw timeout excetion
                throw new CreateGroupExcetion(ex.ToString());
            }
            ICreateGroupReply replyInterface = replyPkg.Active_CreateGroupReply();
            bool   ret;
            string detailOrToken;

            replyInterface.CreateGroupRet(out ret, out detailOrToken);
            if (true == ret)
            {
                GroupDevice retGrop = new GroupDevice(_mclLayerProcessor);
                retGrop.Token  = detailOrToken;
                retGrop.Detail = detail;
                retGrop.Ready  = true;
                return(retGrop);
            }
            else
            {
                throw new CreateGroupExcetion(detailOrToken);
            }
        }
Beispiel #9
0
        private MiddlewareTransferPackage __SendMessageAndWattingForResponse(MiddlewareTransferPackage msg, int timeoutMilliseconds)
        {
            WaitingMessage waitMsg = new WaitingMessage();

            lock (_synWriteLockObject)
            {
                _synWattingMiddlewareReplyMessages[msg.MessageId] = waitMsg;
            }

            //send message
            bool mustWaitReponse = true;
            ServerRequestPackage wilSendServMsg = new ServerRequestPackage(mustWaitReponse);

            //配置为中间件传输包
            IMiddleware2MiddlewareCommunicatRequest statSetter = wilSendServMsg.Active_MiddlewareCommunicatRequest();

            statSetter.WilSendMiddleware2MiddlewareMessage(msg.TargetDevice, msg);

            BinTransferLayer   btlpeocessor = _middlewareCorelogicLayer.BinTransferProcessor;
            ServerReplyPackage replyServPkg = null;

            try
            {
                replyServPkg = btlpeocessor.SynSendMessage(wilSendServMsg, 100000);
            }
            catch (System.Exception ex)
            {
                //释放锁记录
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                throw new MiddlewareTransferErrorExcetion(ex.ToString());
            }
            //分析服务端报文
            IMiddleware2MiddlewareCommunicatReply replyInterface = replyServPkg.Active_Middleware2MiddlewareCommunicatReply();
            bool   ret;
            string detail;

            replyInterface.SendMiddlewareMsgOprRet(out ret, out detail);
            if (true == ret)
            {
                //noting to do
            }
            else
            {
                throw new MiddlewareTransferErrorExcetion(detail);
            }

            //wait for the recived event
            waitMsg.WaitEvent.Wait(timeoutMilliseconds);

            //Check for exceptions
            switch (waitMsg.State)
            {
            case MiddlewareTransferServerStateInfo.WaittingForResponse:
            {
                //同步超时
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                throw new MiddlewareTransferErrorExcetion(MiddlewareTransferServerStateInfo.TimeOut.ToString());
            }

            case MiddlewareTransferServerStateInfo.ResponseReceived:
            {
                lock (_synWriteLockObject)
                {
                    _synWattingMiddlewareReplyMessages.Remove(msg.MessageId);
                }
                break;
            }
            }
            return(waitMsg.ResponseMessage);
        }