Пример #1
0
 private void processMessage(PmlElement Message)
 {
     if (Message is PmlString)
     {
         String cmd = Message.ToString();
         if (cmd == "PING")
         {
             _WriteMessage("PONG");
         }
         else if (cmd == "PONG")
         {
         }
     }
     else if (Message is PmlDictionary)
     {
         String cmd = Message.GetChild("CMD").ToString();
         if (cmd == "SES")
         {
             processSessionMessage(Message);
         }
         else if (cmd == "RPL")
         {
             UInt32       SID = Message.GetChild("SID").ToUInt32();
             CSyncRequest SRequest;
             lock (_invocations) {
                 if (!_invocations.TryGetValue(SID, out SRequest))
                 {
                     SRequest = null;
                 }
                 _invocations.Remove(SID);
             }
             if (SRequest != null)
             {
                 SRequest.Completed((PmlDictionary)Message);
             }
         }
         else if (cmd == "REQ" || cmd == "MSG")
         {
             UThreadPool.RunCall(processCall, Message);
         }
     }
 }
Пример #2
0
        private void processSessionMessage(PmlElement Message)
        {
            //Todo: This function may block or send out PML calls, but incoming packets must be sequenced per channel...
            //Todo: Generate semi-unique SIDs for bidirectional links?
            UInt32     SID      = Message.GetChild("SID").ToUInt32();
            byte       SCMD     = Message.GetChild("SCMD").ToByte();
            PmlElement InnerMsg = Message.GetChild("MSG");
            SubChannel Session;

            lock (_sessions) if (!_sessions.TryGetValue(SID, out Session))
                {
                    Session = null;
                }
            switch (SCMD)
            {
            case 0:                     //Request
                if (Session != null)
                {
                    RemoveSession(Session);
                    Session.CloseIn();
                    WriteSessionMessage(SID, 2, null);
                }
                else if (ChannelRequestReceived != null)
                {
                    try {
                        PmlChannelRequestReceivedEventArgsA ea = new PmlChannelRequestReceivedEventArgsA(this, SID, InnerMsg);
                        ChannelRequestReceived(this, ea);
                        ea.RejectIfNotAccepted();
                    } catch (Exception ex) {
                        Console.WriteLine("UCIS.Pml.PmlCommunicator.processSessionMessage: exception in ChannelRequestReceived: " + ex.ToString());
                        WriteSessionMessage(SID, 2, null);
                    }
                }
                else
                {
                    WriteSessionMessage(SID, 2, null);
                }
                break;

            case 1:                     //Message
                if (Session != null)
                {
                    Session.MessageIn(InnerMsg);
                }
                else
                {
                    WriteSessionMessage(SID, 2, null);
                }
                break;

            case 2:                     //Close
                if (Session != null)
                {
                    if (InnerMsg != null && !(InnerMsg is PmlNull))
                    {
                        Session.MessageIn(InnerMsg);
                    }
                    RemoveSession(Session);
                    Session.CloseIn();
                }
                break;
            }
        }