Advertisement
konalisp

messaging.cs

May 28th, 2016
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.00 KB | None | 0 0
  1. using System;
  2.  
  3. namespace MEL.Core.Messaging {
  4.     //-- .NET using directives.
  5.     using System.IO;
  6.     using System.Configuration;
  7.     using System.Collections.Generic;
  8.     using System.Threading;
  9.     using System.Linq;
  10.     using System.ServiceModel;
  11.    
  12.     //-- Internal using directives.
  13.     using MEL.Core.IOTypes;
  14.    
  15.    
  16.     public class Message {
  17.         public Guid Sender = Guid.Empty;
  18.         public Guid Receiver = Guid.Empty;
  19.         public string Signature = "NULL";
  20.         public string Subject = "NULL";
  21.         public object Data = null;
  22.        
  23.         private int _lifetime = 3;
  24.         public int Lifetime { get { return _lifetime; } }
  25.         public void Update() { if (_lifetime > 0) _lifetime--; }
  26.        
  27.         public Message() {
  28.            
  29.         }
  30.        
  31.         public Message(Message _message) {
  32.             Sender = _message.Receiver;
  33.             Receiver = _message.Sender;
  34.         }
  35.        
  36.         public Message(Message _message, string _signature) {
  37.             Sender = _message.Receiver;
  38.             Receiver = _message.Sender;
  39.             Signature = _signature;
  40.         }
  41.     }
  42.    
  43.     public class BufferSystem {
  44.         public List<Message> Messages { set; get; }
  45.         public List<InputMessage> Input { set; get; }
  46.         public List<OutputMessage> Output { set; get; }
  47.        
  48.         public BufferSystem() {
  49.             Messages = new List<Message>();
  50.             Input = new List<InputMessage>(); //for system I/O
  51.             Output = new List<OutputMessage>();
  52.         }
  53.     }
  54.    
  55.    
  56.     //-- Messaging
  57.    
  58.     public class MessageDispatcher {
  59.         private static readonly object Locker = new object();
  60.        
  61.         public string MessagerName { private set; get; }
  62.         public Guid Identifier { private set; get; }
  63.         public BufferSystem Buffer { private set; get; }
  64.        
  65.         public MessageDispatcher() {
  66.             MessagerName = "MESSAGING";
  67.             Identifier = Guid.NewGuid();
  68.             Buffer = new BufferSystem();
  69.         }
  70.        
  71.         public void Update() {
  72.             var _mr = new List<Message>();
  73.             foreach (Message _m in Buffer.Messages) {
  74.                 _m.Update();
  75.                 if (_m.Lifetime <= 0) {
  76.                     _mr.Add(_m);
  77.                 }
  78.             }
  79.             Buffer.Messages = Buffer.Messages.Except(_mr).ToList();
  80.         }
  81.        
  82.         public void Send(Message _message) {
  83.             lock (Locker) {
  84.                 Buffer.Messages.Add(_message);
  85.             }
  86.         }
  87.        
  88.         public List<Message> CheckMessages(Guid _identifier) {
  89.             return CheckMessages(_identifier, true);
  90.         }
  91.        
  92.         public List<Message> CheckMessages(Guid _identifier, bool _delete) {
  93.             var _mr = new List<Message>();
  94.             foreach (Message _m in Buffer.Messages) {
  95.                 if (_m.Receiver == _identifier) {
  96.                     _mr.Add(_m);
  97.                 }
  98.             }
  99.            
  100.             lock (Locker) {
  101.                 if (_delete)
  102.                     Buffer.Messages = Buffer.Messages.Except(_mr).ToList();
  103.             }
  104.            
  105.             return _mr;
  106.         }
  107.     }
  108.    
  109.     //-- Channels
  110.    
  111.     public class Channel {
  112.         public string Name { private set; get; }
  113.         public List<Guid> Recipients { private set; get; }
  114.        
  115.         public Channel(string _name) {
  116.             Name = _name;
  117.             Recipients = new List<Guid>();
  118.         }
  119.        
  120.         public void Join(Guid _identifier) {
  121.             Recipients.Add(_identifier);
  122.         }
  123.        
  124.         public void Leave(Guid _identifier) {
  125.             Recipients.Remove(_identifier);
  126.         }
  127.     }
  128.    
  129.     public class ChannelNetwork {
  130.         public string MessagerName { private set; get; }
  131.         public Guid Identifier { private set; get; }
  132.         public List<Channel> Channels { private set; get; }
  133.        
  134.         public ChannelNetwork() {
  135.             MessagerName = "CHANNEL_NETWORK";
  136.             Identifier = Guid.NewGuid();
  137.             Channels = new List<Channel>();
  138.         }
  139.        
  140.         public void Update() {
  141.             ScanMessages();
  142.         }
  143.        
  144.         public void Send(string _channelname, Message _message) {
  145.             Channel c = Channels.Find(x => x.Name == _channelname);
  146.             if (c != null) {
  147.                 foreach (Guid g in c.Recipients) {
  148.                     Message mes = _message;
  149.                     mes.Receiver = g;
  150.                     Globals.Messages.Send(mes);
  151.                 }
  152.             }
  153.         }
  154.        
  155.         private void ScanMessages() {
  156.             var _messages = new List<Message>();
  157.             _messages = Globals.Messages.CheckMessages(this.Identifier);
  158.            
  159.             foreach (Message _m in _messages) {
  160.                 Message mes = new Message(_m, MessagerName);
  161.                 List<string> ls = _m.Subject.Split(' ').ToList();
  162.                
  163.                 if (ls.Count > 1) {
  164.                     string command = ls[0];
  165.                     string channelname = ls[1];
  166.                     Channel c = Channels.Find(x => x.Name == channelname);
  167.                    
  168.                     switch (command) {
  169.                         case "JOIN":
  170.                             if (c != null) {
  171.                                 c.Join(_m.Sender);
  172.                                 mes.Subject = "SUCCESS";
  173.                             }
  174.                         break;
  175.                         case "LEAVE":
  176.                             if (c != null) {
  177.                                 c.Leave(_m.Sender);
  178.                                 mes.Subject = "SUCCESS";
  179.                             }
  180.                         break;
  181.                         case "CREATE":
  182.                             if (c == null) {
  183.                                 Channels.Add(new Channel(channelname));
  184.                                 mes.Subject = "SUCCESS";
  185.                             }
  186.                         break;
  187.                         case "DESTROY":
  188.                             if (c != null) {
  189.                                 Channels.Remove(c);
  190.                                 mes.Subject = "SUCCESS";
  191.                             }
  192.                         break;
  193.                         case "SEND":
  194.                             Message protomes = _m.Data as Message;
  195.                             if (c != null && protomes != null) {
  196.                                 this.Send(channelname, protomes);
  197.                                 mes.Subject = "SUCCESS";
  198.                             }
  199.                         break;
  200.                     }
  201.                 }
  202.                
  203.                 if (mes.Subject != "SUCCESS") {
  204.                     mes.Subject = "FAILURE";
  205.                 }
  206.                
  207.                 Globals.Messages.Send(mes);
  208.             }
  209.         }
  210.        
  211.         public Channel Find(string _name) {
  212.             return Channels.Find(x => x.Name == _name);
  213.         }
  214.     }
  215. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement