Example #1
0
        public object RetriveResource(string name, Type t)
        {
            DelayedResult result = new DelayedResult()
            {
                Name = name
            };

            _Messages.Add(new Message(MessageType.RequestResource, result));
            result.Lock.Wait();
            result.Lock.Dispose();
            return(result.Data);
        }
Example #2
0
 public object RetriveResource(string name, Type t)
 {
     DelayedResult result = new DelayedResult() { Name = name };
     this.Messages.Add( new Message( MessageType.RequestResource, result ) );
     result.Lock.Wait();
     result.Lock.Dispose();
     return result.Data;
 }
Example #3
0
        private bool ProcessMessage(BinaryWriter writer, BinaryFormatter outputFormat, Message message)
        {
            switch (message.Type)
            {
            case MessageType.PostComplete:
            {
                writer.Write((Int32)MessageType.PostComplete);
            }
            break;

            case MessageType.PostResource:
            {
                var data = message.Data as Result;
                writer.Write(data.Name);
                outputFormat.Serialize(writer.BaseStream, data.Data);
            }
            break;

            case MessageType.PostProgess:
            {
                writer.Write((Int32)MessageType.PostProgess);
                writer.Write(_Progress);
                writer.Flush();
            }
            break;

            case MessageType.RequestResource:
            {
                var dr = message.Data as DelayedResult;
                ResourceRequests.AddLast(dr);
                writer.Write((Int32)MessageType.RequestResource);
                writer.Write(dr.Name);
                writer.Flush();
            }
            break;

            case MessageType.ReturningResource:
            {
                var           result   = message.Data as Result;
                DelayedResult toRemove = null;
                foreach (var delayed in ResourceRequests)
                {
                    if (delayed.Name == result.Name)
                    {
                        toRemove     = delayed;
                        delayed.Data = result.Data;
                        delayed.Lock.Release();
                        break;
                    }
                }
                if (toRemove != null)
                {
                    ResourceRequests.Remove(toRemove);
                }
            }
            break;

            case MessageType.PostCancel:
            {
                var ms = _CurrentRunningModelSystem;
                // if we don't have a model system then we are done
                if (ms == null)
                {
                    break;
                }
                try
                {
                    // try to cancel the model system
                    ms.ExitRequest();
                }
                catch
                {
                }
            }
            break;

            case MessageType.SendModelSystem:
                try
                {
                    var mssBuff = message.Data as byte[];
                    IModelSystemStructure mss = null;
                    using (MemoryStream memory = new MemoryStream())
                    {
                        memory.Write(mssBuff, 0, mssBuff.Length);
                        memory.Position = 0;
                        mss             = ModelSystemStructure.Load(memory, _Configuration);
                    }
                    if (_ModelSystemThread != null && _ModelSystemThread.IsAlive)
                    {
                        try
                        {
                            _ModelSystemThread.Abort();
                        }
                        catch
                        {
                        }
                    }
                    // now that the other thread is going to end
                    // we can now go and start generating ourselves
                    // in another run thread
                    (_ModelSystemThread =
                         new Thread(ModelSystemStartup)).Start(mss);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                    return(true);
                }
                break;

            case MessageType.WriteToHostConsole:
                writer.Write((int)MessageType.WriteToHostConsole);
                writer.Write(message.Data as string);
                break;

            case MessageType.SendCustomMessage:
            {
                var    msg       = message.Data as SendCustomMessageMessage;
                int    msgNumber = msg.CustomMessageNumber;
                int    length    = 0;
                var    failed    = false;
                byte[] buffer    = null;
                Action <object, Stream> customConverter;
                bool getConverter = false;
                lock (this)
                {
                    getConverter = _CustomSenders.TryGetValue(msgNumber, out customConverter);
                }
                if (getConverter)
                {
                    using (MemoryStream mem = new MemoryStream(0x100))
                    {
                        try
                        {
                            customConverter(msg.Data, mem);
                            mem.Position = 0;
                            buffer       = mem.ToArray();
                            length       = buffer.Length;
                        }
                        catch
                        {
                            failed = true;
                        }
                    }
                }
                writer.Write((Int32)MessageType.SendCustomMessage);
                writer.Write((Int32)msg.CustomMessageNumber);
                writer.Write((Int32)length);
                if (!failed)
                {
                    writer.Write(buffer, 0, length);
                    buffer = null;
                }
            }
            break;

            case MessageType.ReceiveCustomMessage:
            {
                var msg          = message.Data as ReceiveCustomMessageMessage;
                var customNumber = msg.CustomMessageNumber;
                Func <Stream, object> customConverter;
                bool getConverted = false;
                lock (this)
                {
                    getConverted = _CustomReceivers.TryGetValue(customNumber, out customConverter);
                }
                if (getConverted)
                {
                    using (var stream = msg.Stream)
                    {
                        try
                        {
                            object output = customConverter(stream);
                            if (_CustomHandlers.TryGetValue(msg.CustomMessageNumber, out List <Action <object> > handlers))
                            {
                                foreach (var handler in handlers)
                                {
                                    try
                                    {
                                        handler(output);
                                    }
                                    catch (Exception e)
                                    {
                                        Console.WriteLine(e.Message + "\r\n" + e.StackTrace);
                                    }
                                }
                            }
                        }
                        catch
                        {
                        }
                    }
                }
            }
            break;

            default:
                // FAIL!
                Console.WriteLine("Processing a message of type " + message.Type + " and we didn't know what to do with it.");
                return(true);
            }
            return(false);
        }