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); } } }
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; } }