private bool DecodeAndParseCommandMessage(RSMP_Messages.Header packetHeader, string sJSon, bool bUseStrictProtocolAnalysis, bool bUseCaseSensitiveIds, ref bool bHasSentAckOrNack, ref string sError) { StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; bool bSuccess = false; // Values to return List <RSMP_Messages.CommandResponse_Value> rvs = new List <RSMP_Messages.CommandResponse_Value>(); //Dictionary<cRoadSideObject, cRoadSideObject> UpdatedRoadSideObjects = new Dictionary<cRoadSideObject, cRoadSideObject>(); try { RSMP_Messages.CommandRequest CommandRequest = JSonSerializer.Deserialize <RSMP_Messages.CommandRequest>(sJSon); // Response message RSMP_Messages.CommandResponse CommandResponse = new RSMP_Messages.CommandResponse(); bool bSomeValueWasBad = false; // Scan through each value to set foreach (RSMP_Messages.CommandRequest_Value CommandRequest_Value in CommandRequest.arg) { // Create return value for each value to be set RSMP_Messages.CommandResponse_Value rv = new RSMP_Messages.CommandResponse_Value(); rv.v = null; rv.n = CommandRequest_Value.n; rv.age = "undefined"; bool bFoundCommand = false; cRoadSideObject RoadSideObject = cHelper.FindRoadSideObject(CommandRequest.ntsOId, CommandRequest.cId, bUseStrictProtocolAnalysis); if (RoadSideObject != null) { // Find command in object foreach (cCommandObject CommandObject in RoadSideObject.CommandObjects) { bool bDone = false; // Find command name in command foreach (cCommandReturnValue CommandReturnValue in CommandObject.CommandReturnValues) { if (CommandReturnValue.sName.Equals(CommandRequest_Value.n, sc) && CommandReturnValue.sCommand.Equals(CommandRequest_Value.cO, sc)) { // Do some validation if (ValidateTypeAndRange(CommandReturnValue.Value.GetValueType(), CommandRequest_Value.v)) { if (CommandReturnValue.Value.GetValueType().Equals("base64", StringComparison.OrdinalIgnoreCase)) { if (RSMPGS.MainForm.ToolStripMenuItem_StoreBase64Updates.Checked) { CommandReturnValue.Value.SetValue(RSMPGS.SysLog.StoreBase64DebugData(CommandRequest_Value.v)); } } else { CommandReturnValue.Value.SetValue(CommandRequest_Value.v); } rv.v = CommandRequest_Value.v; rv.cCI = CommandRequest_Value.cCI; rv.age = "recent"; RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Got Command, updated NTSObjectId: {0}, ComponentId: {1}, CommandCodeId: {2}, Name: {3}, Command: {4}, Value: {5}", CommandRequest.ntsOId, CommandRequest.cId, CommandRequest_Value.cCI, CommandRequest_Value.n, CommandRequest_Value.cO, CommandRequest_Value.v); RSMPGS.MainForm.HandleCommandListUpdate(RoadSideObject, CommandObject, CommandReturnValue); } else { rv.v = null; rv.cCI = CommandRequest_Value.cCI; rv.age = "unknown"; sError = "Value and/or type is out of range or invalid for this RSMP protocol version, type: " + CommandReturnValue.Value.GetValueType() + ", value: " + ((CommandRequest_Value.v.Length < 10) ? CommandRequest_Value.v : CommandRequest_Value.v.Substring(0, 9) + "..."); RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "{0}", sError); bSomeValueWasBad = true; } /* * // Found at least one value * if (UpdatedRoadSideObjects.ContainsKey(RoadSideObject) == false) * { * UpdatedRoadSideObjects.Add(RoadSideObject, RoadSideObject); * } */ bDone = true; bFoundCommand = true; break; } } if (bDone) { break; } } } rvs.Add(rv); if (bFoundCommand == false) { sError = "Got Command, failed to find object/command/name (NTSObjectId: " + CommandRequest.ntsOId + ", ComponentId: " + CommandRequest.cId + ", CommandCodeId: " + CommandRequest_Value.cCI + ", Name: " + CommandRequest_Value.n + ", Command: " + CommandRequest_Value.cO + ", Value: " + CommandRequest_Value.v + ")"; RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "{0}", sError); bSomeValueWasBad = true; } } //cRoadSideObject UpdatedRoadSideObject = null; /* * foreach (cRoadSideObject UpdatedRoadSideObject in UpdatedRoadSideObjects.Values) * { * RSMPGS.MainForm.HandleCommandListUpdate(UpdatedRoadSideObject); * } */ bSuccess = bSomeValueWasBad == false ? true : false; // Send response to client CommandResponse.mType = "rSMsg"; CommandResponse.type = "CommandResponse"; CommandResponse.mId = System.Guid.NewGuid().ToString(); CommandResponse.ntsOId = CommandRequest.ntsOId; CommandResponse.xNId = CommandRequest.xNId; CommandResponse.cId = CommandRequest.cId; //CommandResponse.cCI = CommandRequest.cCI; CommandResponse.cTS = CreateISO8601UTCTimeStamp(); CommandResponse.rvs = rvs; if (bHasSentAckOrNack == false) { bHasSentAckOrNack = SendPacketAck(bSuccess, packetHeader.mId, ""); } string sSendBuffer = JSonSerializer.SerializeObject(CommandResponse); RSMPGS.JSon.SendJSonPacket(CommandResponse.type, CommandResponse.mId, sSendBuffer, true); if (RSMPGS.MainForm.checkBox_ViewOnlyFailedPackets.Checked == false) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Sent CommandResponse message, Type: " + CommandResponse.type + ", MsgId: " + CommandResponse.mId); } } catch (Exception e) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to deserialize packet: {0}", e.Message); } return(bSuccess); }
public void CreateAndSendCommandMessage(cRoadSideObject RoadSideObject, List <cCommandReturnValue> ReturnValues, bool bUseCaseSensitiveIds) { StringComparison sc = bUseCaseSensitiveIds ? StringComparison.Ordinal : StringComparison.OrdinalIgnoreCase; RSMP_Messages.CommandRequest CommandRequest; RSMP_Messages.CommandRequest_Value CommandRequest_Value; string sSendBuffer; try { CommandRequest = new RSMP_Messages.CommandRequest(); CommandRequest.mType = "rSMsg"; CommandRequest.type = "CommandRequest"; CommandRequest.mId = System.Guid.NewGuid().ToString(); CommandRequest.ntsOId = RoadSideObject.sNTSObjectId; CommandRequest.xNId = RoadSideObject.sExternalNTSId; CommandRequest.cId = RoadSideObject.sComponentId; CommandRequest.arg = new List <RSMP_Messages.CommandRequest_Value>(); foreach (cCommandReturnValue CommandReturnValue in ReturnValues) { CommandRequest_Value = new RSMP_Messages.CommandRequest_Value(); CommandRequest_Value.cCI = CommandReturnValue.CommandObject.sCommandCodeId; CommandRequest_Value.n = CommandReturnValue.sName; CommandRequest_Value.cO = CommandReturnValue.sCommand; if (CommandReturnValue.Value.GetValueType().Equals("base64", StringComparison.OrdinalIgnoreCase)) { // Path? if (CommandReturnValue.Value.GetValue().Contains("\\")) { try { byte[] Base64Bytes = null; // Open file for reading System.IO.FileStream fsBase64 = new System.IO.FileStream(CommandReturnValue.Value.GetValue(), System.IO.FileMode.Open, System.IO.FileAccess.Read); System.IO.BinaryReader brBase64 = new System.IO.BinaryReader(fsBase64); long lBytes = new System.IO.FileInfo(CommandReturnValue.Value.GetValue()).Length; Base64Bytes = brBase64.ReadBytes((Int32)lBytes); fsBase64.Close(); fsBase64.Dispose(); brBase64.Close(); CommandRequest_Value.v = Convert.ToBase64String(Base64Bytes); if (CommandRequest_Value.v.Length > (cTcpSocketClientThread.BUFLENGTH - 100)) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Base64 encoded packet is too big (" + Base64Bytes.GetLength(0).ToString() + " bytes), max buffer length is " + cTcpSocketClientThread.BUFLENGTH.ToString() + " bytes"); CommandRequest_Value.v = null; } } catch (Exception e) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Could not base64-encode and send file '{0}', error {1}", CommandReturnValue.Value.GetValue(), e.Message); CommandRequest_Value.v = null; } } } else { CommandRequest_Value.v = CommandReturnValue.Value.GetValue(); } CommandRequest.arg.Add(CommandRequest_Value); cCommandEvent CommandEvent = new cCommandEvent(); CommandEvent.sTimeStamp = CreateLocalTimeStamp(); CommandEvent.sMessageId = CommandRequest.mId; CommandEvent.sEvent = "Sent Command"; CommandEvent.sCommandCodeId = CommandReturnValue.CommandObject.sCommandCodeId; CommandEvent.sName = CommandReturnValue.sName; CommandEvent.sCommand = CommandReturnValue.sCommand; CommandEvent.sValue = CommandReturnValue.Value.GetValue(); RoadSideObject.CommandEvents.Add(CommandEvent); RSMPGS.MainForm.HandleCommandListUpdate(RoadSideObject, CommandRequest.ntsOId, CommandRequest.cId, CommandEvent, true, bUseCaseSensitiveIds); if (RSMPGS_Main.bWriteEventsContinous) { RSMPGS.SysLog.EventLog("Command;{0}\tMId: {1}\tComponentId: {2}\tCommandCodeId: {3}\tName: {4}\tCommand: {5}\tValue: {6}\t Age: {7}\tEvent: {8}", CommandEvent.sTimeStamp, CommandEvent.sMessageId, CommandRequest.cId, CommandEvent.sCommandCodeId, CommandEvent.sName, CommandEvent.sCommand, CommandEvent.sValue, CommandEvent.sAge, CommandEvent.sEvent); } } sSendBuffer = JSonSerializer.SerializeObject(CommandRequest); if (RSMPGS.JSon.SendJSonPacket(CommandRequest.type, CommandRequest.mId, sSendBuffer, true)) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Info, "Sent command message, MsgId: " + CommandRequest.mId); } else { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to send command message, MsgId: " + CommandRequest.mId); } } catch (Exception e) { RSMPGS.SysLog.SysLog(cSysLogAndDebug.Severity.Error, "Failed to create command message: {0}", e.Message); } }