Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.48 KB | None | 0 0
  1. using UnityEngine;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5.  
  6. public delegate void Callback<T>(T arg1);
  7.  
  8. /*
  9. public class MessageManagerScript {
  10.  
  11.     public enum MessageType
  12.     {
  13.         ObjectPickedUp,
  14.         ObjectDropped
  15.     }
  16.  
  17.     private static Dictionary<MessageType, Delegate> eventTable = new Dictionary<MessageType, Delegate>();
  18.  
  19.     public static void AddListener(MessageType mType, Callback<T> handler)
  20.     {
  21.         Delegate d;
  22.         if (eventTable.TryGetValue(mType, out d))
  23.         {
  24.  
  25.         }
  26.     }
  27.  
  28.     public static void RemoveListener(MessageType mType, Callback<T> handler)
  29.     {
  30.  
  31.     }
  32.  
  33.     public static void BroadcastMessage(MessageType mType)
  34.     {
  35.  
  36.     }
  37.  
  38. }
  39. */
  40.  
  41. public enum MessengerMode
  42. {
  43.     DONT_REQUIRE_LISTENER,
  44.     REQUIRE_LISTENER,
  45. }
  46.  
  47. public enum MessengerMessageType
  48. {
  49.    
  50.     LogIntoFacebook,
  51.     GetFacebookUsername,
  52.     CheckFacebookLoginStarted,
  53.     GetFacebookLoginStatus,
  54.     ShowFacebookButton,
  55.     HideFacebookButton,
  56.     PostOnMyFacebookWall,
  57. }
  58.  
  59. static internal class MessengerInternal
  60. {
  61.     static public Dictionary<MessengerMessageType, Delegate> eventTable = new Dictionary<MessengerMessageType, Delegate>();
  62.     static public readonly MessengerMode DEFAULT_MODE = MessengerMode.REQUIRE_LISTENER;
  63.  
  64.     static public void OnListenerAdding(MessengerMessageType eventType, Delegate listenerBeingAdded)
  65.     {
  66.         if (!eventTable.ContainsKey(eventType))
  67.         {
  68.             eventTable.Add(eventType, null);
  69.         }
  70.  
  71.         Delegate d = eventTable[eventType];
  72.         if (d != null && d.GetType() != listenerBeingAdded.GetType())
  73.         {
  74.             throw new ListenerException(string.Format("Attempting to add listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being added has type {2}", eventType, d.GetType().Name, listenerBeingAdded.GetType().Name));
  75.         }
  76.     }
  77.  
  78.     static public void OnListenerRemoving(MessengerMessageType eventType, Delegate listenerBeingRemoved)
  79.     {
  80.         if (eventTable.ContainsKey(eventType))
  81.         {
  82.             Delegate d = eventTable[eventType];
  83.  
  84.             if (d == null)
  85.             {
  86.                 throw new ListenerException(string.Format("Attempting to remove listener with for event type {0} but current listener is null.", eventType));
  87.             }
  88.             else if (d.GetType() != listenerBeingRemoved.GetType())
  89.             {
  90.                 throw new ListenerException(string.Format("Attempting to remove listener with inconsistent signature for event type {0}. Current listeners have type {1} and listener being removed has type {2}", eventType, d.GetType().Name, listenerBeingRemoved.GetType().Name));
  91.             }
  92.         }
  93.         else
  94.         {
  95.             throw new ListenerException(string.Format("Attempting to remove listener for type {0} but Messenger doesn't know about this event type.", eventType));
  96.         }
  97.     }
  98.  
  99.     static public void OnListenerRemoved(MessengerMessageType eventType)
  100.     {
  101.         if (eventTable[eventType] == null)
  102.         {
  103.             eventTable.Remove(eventType);
  104.         }
  105.     }
  106.  
  107.     static public void OnBroadcasting(MessengerMessageType eventType, MessengerMode mode)
  108.     {
  109.         if (mode == MessengerMode.REQUIRE_LISTENER && !eventTable.ContainsKey(eventType))
  110.         {
  111.             //throw new MessengerInternal.BroadcastException(string.Format("Broadcasting message {0} but no listener found.", eventType));
  112.         }
  113.     }
  114.  
  115.     static public BroadcastException CreateBroadcastSignatureException(MessengerMessageType eventType)
  116.     {
  117.         return new BroadcastException(string.Format("Broadcasting message {0} but listeners have a different signature than the broadcaster.", eventType));
  118.     }
  119.  
  120.     public class BroadcastException : Exception
  121.     {
  122.         public BroadcastException(string msg)
  123.             : base(msg)
  124.         {
  125.         }
  126.     }
  127.  
  128.     public class ListenerException : Exception
  129.     {
  130.         public ListenerException(string msg)
  131.             : base(msg)
  132.         {
  133.         }
  134.     }
  135. }
  136.  
  137.  
  138. // One parameter
  139. static public class Messenger<T>
  140. {
  141.     private static Dictionary<MessengerMessageType, Delegate> eventTable = MessengerInternal.eventTable;
  142.  
  143.     static public void AddListener(MessengerMessageType eventType, Callback<T> handler)
  144.     {
  145.         MessengerInternal.OnListenerAdding(eventType, handler);
  146.         eventTable[eventType] = (Callback<T>)eventTable[eventType] + handler;
  147.     }
  148.  
  149.     static public void RemoveListener(MessengerMessageType eventType, Callback<T> handler)
  150.     {
  151.         MessengerInternal.OnListenerRemoving(eventType, handler);
  152.         eventTable[eventType] = (Callback<T>)eventTable[eventType] - handler;
  153.         MessengerInternal.OnListenerRemoved(eventType);
  154.     }
  155.  
  156.     static public void Broadcast(MessengerMessageType eventType, T arg1)
  157.     {
  158.         Broadcast(eventType, arg1, MessengerInternal.DEFAULT_MODE);
  159.     }
  160.  
  161.     static public void Broadcast(MessengerMessageType eventType, T arg1, MessengerMode mode)
  162.     {
  163.         MessengerInternal.OnBroadcasting(eventType, mode);
  164.         Delegate d;
  165.         if (eventTable.TryGetValue(eventType, out d))
  166.         {
  167.             Callback<T> callback = d as Callback<T>;
  168.             if (callback != null)
  169.             {
  170.                 callback(arg1);
  171.             }
  172.             else
  173.             {
  174.                 throw MessengerInternal.CreateBroadcastSignatureException(eventType);
  175.             }
  176.         }
  177.     }
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement