/// <summary> /// /// </summary> bool RegisterClientSourceTypes(ClientId clientId) { IMessageBus messageBus = _messageBus; if (messageBus == null) { Console.WriteLine("Failed to register client source type, message bus not found."); #if Matrix_Diagnostics InstanceMonitor.OperationError("Failed to register client source type, message bus not found."); #endif return(false); } List <string> sourceTypes = messageBus.GetClientSourceTypes(clientId); if (sourceTypes == null) { Console.WriteLine("Failed to register client source type, source type not found."); #if Matrix_Diagnostics InstanceMonitor.OperationError("Failed to register client source type, source type not found."); #endif return(false); } foreach (Type superType in ReflectionHelper.GetKnownTypes(sourceTypes)) { if (superType.IsInterface == false || ReflectionHelper.TypeHasCustomAttribute(superType, typeof(SuperPoolInterfaceAttribute), false) == false) { continue; } HotSwapList <ClientId> clientList = null; if (_clientsInterfaces.TryGetValue(superType, out clientList) == false) { clientList = _clientsInterfaces.GetOrAdd(superType, new HotSwapList <ClientId>()); } clientList.AddUnique(clientId); if (ReflectionHelper.TypeHasCustomAttribute(superType, typeof(SuperPoolInterfaceAttribute), false) == false) {// Register this type as well. _proxyTypeManager.ObtainInterfaceProxy(superType); } } return(true); }
/// <summary> /// Basic asynchronous call operation. /// </summary> /// <param name="receiverId">The value of the receiver, null means call all.</param> internal bool Call <InterfaceType>(SuperPoolClient sender, IEnumerable <ComponentId> receiversIds, out InterfaceType result, out SuperPoolProxyCall call) where InterfaceType : class { call = null; result = null; // SLOW. //if (_messageBus.ContainsClient(sender.Id) == false) //{ // SystemMonitor.OperationError("Client not a member of message bus (and super pool)."); // return false; //} if (typeof(InterfaceType).IsInterface == false) { throw new Exception("Type provided not an interface."); } // Very slow !! //object[] attributes = typeof(InterfaceType).GetCustomAttributes(typeof(SuperPoolInterfaceAttribute), false); //if (attributes == null || attributes.Length == 0) //{ // SystemMonitor.Throw("Interface type [" + typeof(InterfaceType).Name + "] not marked as super pool interface."); // return false; //} ProxyTypeManager typeManager = _proxyTypeManager; if (typeManager == null) { return(false); } if (_pendingThreadsCalls.TryGetValue(Thread.CurrentThread.ManagedThreadId, out call) == false) {// We are safe from danger of someone else already adding the value with this id, // since we are the only thread with this id. call = new SuperPoolProxyCall(); // This is slow, but very rarely executed, since thread ids are reused. _pendingThreadsCalls.Add(Thread.CurrentThread.ManagedThreadId, call); } else { // Since we reuse the call, clean it up before usage. call.Clear(); } call.Processed = false; if (receiversIds != null) {// Extract the Indeces from the Ids. List <ClientId> receiversIndeces = new List <ClientId>(); foreach (ComponentId id in receiversIds) { receiversIndeces.Add((ClientId)id); } call.ReceiversIds = receiversIndeces; } else { call.ReceiversIds = null; } call.Sender = sender; result = (InterfaceType)typeManager.ObtainInterfaceProxy(typeof(InterfaceType)); return(true); }