/***************************************************************************************/

        #region Utils

        void DoorOperation(string Token,
                           string operationName,
                           Func <DoorCapabilities, bool> capabilitiesCheck,
                           Func <DoorMode, bool> operationForbiddenCheck,
                           string notAllowedSeverity,
                           Func <DoorMode, DoorMode> transition)
        {
            LoggingService.LogMessage(string.Format("{0} operation requested for {1}", operationName, Token), ExternalLogging.MessageType.Details);

            ConfStorageLoad();
            EventServerLoad();

            if (ConfStorage.DoorStateList.ContainsKey(Token))
            {
                if (capabilitiesCheck(ConfStorage.DoorInfoList[Token].Capabilities))
                {
                    DoorState doorState = ConfStorage.DoorStateList[Token];
                    if (operationForbiddenCheck(doorState.DoorMode))
                    {
                        string message = String.Format("Door {0} is {1}. Operation {2}", Token,
                                                       doorState.DoorMode.ToString(), notAllowedSeverity);

                        LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                        FaultLib.ReturnFault(message, new string[] { "Sender", "ActionNotSupported" });
                        //throw FaultLib.GetSoapException(FaultType.General, message);
                    }
                    else
                    {
                        DoorMode targetState = transition(doorState.DoorMode);
                        doorState.DoorMode = targetState;
                        DoorSensorService.ProcessModeChanging(Token, targetState, ConfStorage, EventServer, StateReporter);
                        StateReporter.ReportStateUpdate(Token, doorState);
                        EventServer.DoorModeEvent(this, "Changed", Token, doorState.DoorMode);
                    }
                }
                else
                {
                    string message = string.Format("{0} is not supported for {1}.", operationName, Token);
                    LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                    FaultLib.ReturnFault(message, new string[] { "Sender", "ActionNotSupported" });
                    //throw FaultLib.GetSoapException(FaultType.General, message);
                }
            }
            else
            {
                string message = string.Format("Token {0} does not exist", Token);
                LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                FaultLib.ReturnFault(message, new string[] { "Sender", "InvalidArgVal", "NotFound" });
                //throw FaultLib.GetSoapException(FaultType.General, message);
            }

            EventServerSave();
            ConfStorageSave();
        }
        /***************************************************************************************/

        #region Utils

        void DoorOperation(string Token,
                           string operationName,
                           Func <DoorCapabilities, bool> capabilitiesCheck,
                           Func <DoorModeType, bool> operationForbiddenCheck,
                           string notAllowedSeverity,
                           Func <DoorModeType, DoorModeType> transition)
        {
            LoggingService.LogMessage(string.Format("{0} operation requested for {1}", operationName, Token), ExternalLogging.MessageType.Details);

            ConfStorageLoad();
            EventServerLoad();

            if (ConfStorage.DoorStateList.ContainsKey(Token))
            {
                if (capabilitiesCheck(ConfStorage.DoorCapabilitiesList[Token]))
                {
                    DoorState doorState = ConfStorage.DoorStateList[Token];
                    if (operationForbiddenCheck(doorState.DoorMode))
                    {
                        string message = String.Format("Door {0} is {1}. Operation {2}", Token,
                                                       doorState.DoorMode.ToString(), notAllowedSeverity);

                        LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                        throw FaultLib.GetSoapException(FaultType.General,
                                                        message);
                    }
                    else
                    {
                        DoorModeType targetState = transition(doorState.DoorMode);
                        doorState.DoorMode = targetState;
                        StateReporter.ReportStateUpdate(Token, doorState);
                        EventServer.DoorModeEvent(this, "Changed", Token, doorState.DoorMode);
                    }
                }
                else
                {
                    string message = string.Format("{0} is not suported for {1}.", operationName, Token);
                    LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);

                    throw FaultLib.GetSoapException(FaultType.General, message);
                }
            }
            else
            {
                string message = string.Format("Token {0} does not exist", Token);
                LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                throw FaultLib.GetSoapException(FaultType.General, message);
            }

            EventServerSave();
            ConfStorageSave();
        }
Пример #3
0
        public Task RequestAsync(String requestString, IPEndPoint remoteEndPoint)
        {
            return(Task.Run(() =>
            {
                StateReporter statusReporter = new StateReporter(++CLIENT_ID, this);

                try
                {
                    using (TcpIpClient client = new TcpIpClient(remoteEndPoint.AddressFamily, Preferences.ClientStringEncoding, Preferences.ReceiveTimeout, Preferences.SendTimeout, TcpIpClient.DEF_RECEIVE_BUFFER_SIZE))
                    {
                        statusReporter.Report("Connecting to " + remoteEndPoint + "...");
                        client.Connect(remoteEndPoint);

                        if (Preferences.ReplaceHex)
                        {
                            requestString = Utilities.ConvertAllHex(requestString, Preferences.ClientStringEncoding);
                        }

                        statusReporter.Report("Connected to " + client.RemoteEndPoint + ".");

                        client.Send(requestString);
                        statusReporter.Report("Request sent to " + client.RemoteEndPoint + ":", requestString, true);

                        string respsonseString;

                        while (true)
                        {
                            respsonseString = client.Receive();

                            if (respsonseString == null)
                            {
                                statusReporter.Report("The socket at " + client.RemoteEndPoint + " was shut down.");
                                break;
                            }
                            else
                            {
                                statusReporter.Report("Response received from " + client.RemoteEndPoint + ":", respsonseString, true);
                            }
                        }
                    }
                }
                catch (SocketException ex)
                {
                    statusReporter.Report("Socket Error " + ex.ErrorCode + ":\n" + ex.Message);
                }

                statusReporter.Report("Client stopped.");
            }));
        }
Пример #4
0
        public MainWindow()
        {
            InitializeComponent();
            DataObject.AddPastingHandler(tbxRemoteIp, tbxRemoteIp_OnPasting);

            client = new Client();
            server = new Server();
            clientStatusReporter = new StateReporter(client);
            serverStatusReporter = new StateReporter(server);

            this.Title = "TCP/IP-Proxy " + FileVersionInfo.GetVersionInfo(Assembly.GetExecutingAssembly().Location).ProductVersion;

            StateReporter.setReporter(new Progress <State>(ProcessState));

            Interaction.GetBehaviors(dgCommands).Add(new RemoveEmptyRowBehavior <Command>());

            //commands.Add(new Command()
            //{
            //    Request = "Marco",
            //    Response = "Polo"
            //});

            dgCommands.ItemsSource = commands;
            server.CommandsList    = commands;

            btnToggleServer.Content           = SERVER_START;
            sbServerStatus.Text               = SERVER_STATE_STOPPED;
            checkBoxCloseConnection.IsChecked = true;

            tbxRequestInterval.Value = 1000;
            tbxLocalPort.Value       = 8000;

            //tbxRemoteIp.Text = "webservice";
            //tbxRequest.Text = "GET /qs1/ HTTP/1.1\nHost: " + tbxRemoteIp.Text + "\n\n";
            //tbxRemotePort.Value = 80;

            //tbxRequest.Text = "Marco";
            //tbxResponse.Text = "Polo";

            tbxRemoteIp.Text    = TcpIp.Helper.GetHostIpAsync(Dns.GetHostName()).Result.ToString();
            tbxRemotePort.Value = 8000;

            UpdateView();
        }
 private void AccessToDoorImplementation(string Token, TimeSpan AccessTime, int DoorAccessSesion)
 {
     if (AccessTime == TimeSpan.Zero)
     {
         System.Threading.Thread.Sleep(c_DefaultAccessTime);
     }
     else
     {
         System.Threading.Thread.Sleep((int)(AccessTime.TotalMilliseconds));
     }
     if (ConfStorage.DoorStateList[Token].DoorMode == DoorMode.Accessed)
     {
         if (DoorAccessSesion == ConfStorage.DoorAccessList[Token])
         {
             ConfStorage.DoorStateList[Token].DoorMode = ConfStorage.DoorAccessPreviousStateList[Token];
             DoorSensorService.ProcessModeChanging(Token, ConfStorage.DoorStateList[Token].DoorMode, ConfStorage, EventServer, StateReporter);
             StateReporter.ReportStateUpdate(Token, ConfStorage.DoorStateList[Token]);
             EventServer.DoorModeEvent(this, "Changed", Token, ConfStorage.DoorStateList[Token].DoorMode);
         }
     }
 }
        public override void AccessDoor(string Token, bool UseExtendedTime, [System.Xml.Serialization.XmlIgnoreAttribute()] bool UseExtendedTimeSpecified, [System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] string AccessTime, [System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] string OpenTooLongTime, [System.Xml.Serialization.XmlElementAttribute(DataType = "duration")] string PreAlarmTime, AccessDoorExtension Extension)
        {
            ConfStorageLoad();
            EventServerLoad();

            LoggingService.LogMessage(string.Format("AccessDoor operation requested for {0}", Token),
                                      ExternalLogging.MessageType.Details);

            if (ConfStorage.DoorStateList.ContainsKey(Token))
            {
                if (ConfStorage.DoorInfoList[Token].Capabilities.AccessSpecified && ConfStorage.DoorInfoList[Token].Capabilities.Access)
                {
                    if ((ConfStorage.DoorStateList[Token].DoorMode == DoorMode.Blocked) || (ConfStorage.DoorStateList[Token].DoorMode == DoorMode.LockedDown) || (ConfStorage.DoorStateList[Token].DoorMode == DoorMode.LockedOpen))
                    {
                        string message = "Door " + Token + " is " + ConfStorage.DoorStateList[Token].DoorMode.ToString() +
                                         ". Operation denied.";

                        LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                        FaultLib.ReturnFault(message, new string[] { "Sender", "ActionNotSupported" });
                        //throw FaultLib.GetSoapException(FaultType.General, message);
                    }
                    else
                    {
                        try
                        {
                            TimeSpan timeSpan = TimeSpan.Zero;
                            if (!string.IsNullOrEmpty(AccessTime))
                            {
                                timeSpan = System.Xml.XmlConvert.ToTimeSpan(AccessTime);
                            }

                            if (ConfStorage.DoorStateList[Token].DoorMode != DoorMode.Accessed)
                            {
                                ConfStorage.DoorAccessPreviousStateList[Token] = ConfStorage.DoorStateList[Token].DoorMode;
                            }

                            ConfStorage.DoorStateList[Token].DoorMode = DoorMode.Accessed;
                            StateReporter.ReportStateUpdate(Token, ConfStorage.DoorStateList[Token]);
                            DoorSensorService.ProcessModeChanging(Token, DoorMode.Accessed, ConfStorage, EventServer, StateReporter);

                            EventServer.DoorModeEvent(this, "Changed", Token, ConfStorage.DoorStateList[Token].DoorMode);

                            AccessToDoor func = new AccessToDoor(AccessToDoorImplementation);
                            ConfStorage.DoorAccessList[Token]++;

                            func.BeginInvoke(Token, timeSpan, ConfStorage.DoorAccessList[Token], null, null);
                        }
                        catch (Exception)
                        {
                            string message = string.Format("Wrong duration ({0})", AccessTime);
                            LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                            FaultLib.ReturnFault(message, new string[] { "Sender", "InvalidArgVal" });
                            //throw FaultLib.GetSoapException(FaultType.General, "Wrong duration.");
                        }
                    }
                }
                else
                {
                    string message = string.Format("MomentaryAccess isn't supported for {0}.", Token);
                    LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                    FaultLib.ReturnFault(message, new string[] { "Sender", "ActionNotSupported" });
                    //throw FaultLib.GetSoapException(FaultType.General, message);
                }
            }
            else
            {
                string message = string.Format("Token {0} does not exist", Token);
                LoggingService.LogMessage(message, ExternalLogging.MessageType.Error);
                FaultLib.ReturnFault(message, new string[] { "Sender", "InvalidArgVal", "NotFound" });
                //throw FaultLib.GetSoapException(FaultType.General, message);
            }

            EventServerSave();
            ConfStorageSave();
        }
Пример #7
0
 public Server()
 {
     stateReporter = new StateReporter(this);
 }
Пример #8
0
        public void SignalReceived(string deviceToken, string deviceType, string sensor, string value)
        {
            ConfStorageLoad();

            LoggingService.LogMessage(string.Format("Signal received: token={0}, deviceType={1} sensor={2}, value={3}", deviceToken, deviceType, sensor, value), ExternalLogging.MessageType.Details);

            if (deviceType == "Door")
            {
                DoorState doorState = null;
                if (ConfStorage.DoorStateList.ContainsKey(deviceToken))
                {
                    doorState = ConfStorage.DoorStateList[deviceToken];
                }

                switch (sensor)
                {
                case "Alarm":
                {
                    DoorAlarmState state = (DoorAlarmState)Enum.Parse(typeof(DoorAlarmState), value);
                    if (doorState != null)
                    {
                        doorState.Alarm = state;
                        EventServer.DoorAlarmMonitorEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;

                case "LockPhysicalState":
                {
                    LockPhysicalState state =
                        (LockPhysicalState)Enum.Parse(typeof(LockPhysicalState), value);
                    if (doorState != null)
                    {
                        doorState.LockPhysicalState = state;
                        EventServer.LockPhysicalStateEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;

                case "DoubleLockPhysicalState":
                {
                    LockPhysicalState state =
                        (LockPhysicalState)Enum.Parse(typeof(LockPhysicalState), value);

                    if (doorState != null)
                    {
                        doorState.DoubleLockPhysicalState = state;
                        EventServer.DoubleLockPhysicalStateEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;

                case "DoorPhysicalState":
                {
                    DoorPhysicalState state =
                        (DoorPhysicalState)Enum.Parse(typeof(DoorPhysicalState), value);

                    if (doorState != null)
                    {
                        doorState.DoorPhysicalState = state;
                        EventServer.DoorPhysicalStateEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;

                case "Tamper":
                {
                    DoorTamperState state =
                        (DoorTamperState)Enum.Parse(typeof(DoorTamperState), value);

                    if ((doorState != null) && (doorState.Tamper != null))
                    {
                        doorState.Tamper.State = state;
                        EventServer.DoorTamperMonitorEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;

                case "Fault":
                {
                    DoorFaultState state =
                        (DoorFaultState)Enum.Parse(typeof(DoorFaultState), value);

                    if ((doorState != null) && (doorState.Fault != null))
                    {
                        doorState.Fault.State = state;
                        EventServer.DoorFaultEvent(null, "Changed", deviceToken, state);
                    }
                }
                break;
                }

                StateReporter.ReportStateUpdate(deviceToken, doorState);
            }

            if (deviceType == "Credential")
            {
                CredentialState credentialState = null;
                if (ConfStorage.CredentialStateList.ContainsKey(deviceToken))
                {
                    credentialState = ConfStorage.CredentialStateList[deviceToken];
                }

                switch (sensor)
                {
                case "AntipassbackViolated":
                {
                    bool state = (value == "True");
                    if (credentialState != null)
                    {
                        credentialState.AntipassbackState.AntipassbackViolated = state;
                        //TODO: event
                    }
                }
                break;
                }
            }
        }
Пример #9
0
 public void Unsubscribe(Guid receiver)
 {
     StateReporter.Unsubscribe(receiver);
 }
Пример #10
0
 public Guid Subscribe(string receiver)
 {
     return(StateReporter.Subscribe(receiver));
 }