Example #1
0
        public void ProcessRequest(MigClientRequest request)
        {
            var context       = request.Context.Data as HttpListenerContext;
            var requestOrigin = context.Request.RemoteEndPoint.Address.ToString();

            var migCommand = request.Command;

            switch (migCommand.Command)
            {
            case "Events.Push":
                //TODO: implemet security and trust mechanism
                var stream      = request.RequestText;
                var moduleEvent = JsonConvert.DeserializeObject <ModuleEvent>(
                    stream,
                    new JsonSerializerSettings()
                {
                    Culture = System.Globalization.CultureInfo.InvariantCulture
                }
                    );
                // prefix remote event domain with HGIC:<remote_node_address>.<domain>
                moduleEvent.Module.Domain = "HGIC:" + requestOrigin.Replace(".", "_") + "." + moduleEvent.Module.Domain;
                //
                var module = homegenie.Modules.Find(delegate(Module o) {
                    return(o.Domain == moduleEvent.Module.Domain && o.Address == moduleEvent.Module.Address);
                });
                if (module == null)
                {
                    module = moduleEvent.Module;
                    homegenie.Modules.Add(module);
                }
                Utility.ModuleParameterSet(module, moduleEvent.Parameter.Name, moduleEvent.Parameter.Value);
                // "<ip>:<port>" remote endpoint port is passed as the first argument from the remote point itself
                module.RoutingNode = requestOrigin + (migCommand.GetOption(0) != "" ? ":" + migCommand.GetOption(0) : "");
                //
                homegenie.RaiseEvent(
                    requestOrigin,
                    moduleEvent.Module.Domain,
                    moduleEvent.Module.Address,
                    requestOrigin,
                    moduleEvent.Parameter.Name,
                    moduleEvent.Parameter.Value
                    );
                var eventData = new ProgramManager.RoutedEvent()
                {
                    Sender    = requestOrigin,
                    Module    = module,
                    Parameter = moduleEvent.Parameter
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(homegenie.ProgramManager.RoutePropertyChangedEvent), eventData);
                break;
            }
        }
Example #2
0
        public void RouteModuleEvent(ProgramManager.RoutedEvent eventData)
        {
            if (moduleUpdateHandler == null)
            {
                return;
            }
            var module    = new ModuleHelper(homegenie, eventData.Module);
            var parameter = eventData.Parameter;
            var callback  = new WaitCallback((state) =>
            {
                try
                {
                    homegenie.MigService.RaiseEvent(
                        this,
                        Domains.HomeAutomation_HomeGenie,
                        SourceModule.Scheduler,
                        "Scheduler Routed Event",
                        Properties.SchedulerModuleUpdateStart,
                        schedulerItem.Name);
                    moduleUpdateHandler(module, parameter);
                    homegenie.MigService.RaiseEvent(
                        this,
                        Domains.HomeAutomation_HomeGenie,
                        SourceModule.Scheduler,
                        "Scheduler Routed Event",
                        Properties.SchedulerModuleUpdateEnd,
                        schedulerItem.Name);
                }
                catch (Exception e)
                {
                    homegenie.MigService.RaiseEvent(
                        this,
                        Domains.HomeAutomation_HomeGenie,
                        SourceModule.Scheduler,
                        e.Message.Replace('\n', ' ').Replace('\r', ' '),
                        Properties.SchedulerError,
                        schedulerItem.Name);
                }
            });

            ThreadPool.QueueUserWorkItem(callback);
        }