using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Windows.Forms; using Telerik.WinControls; using Telerik.WinControls.UI; using System.Threading; using Telerik.WinControls.Data; using System.Runtime.InteropServices; using SafeMobileLib; using System.Collections; using System.IO; using NAudio.CoreAudioApi; using Dispatcher.maptab.UIClasses; using System.Globalization; using NAudio.Wave; using System.Diagnostics; namespace Safedispatch_4_0.Radio { public partial class RadioTab : UserControl { private MainForm2 parent; private BindingList recordingsList = new BindingList(); private List subscribersList = new List(); public TcpClass tcpAudio; private Size normalSizeAudioSettings; private Size normalSizeChannelSettings; private DBrecordingsManager db; public SMdb_access smdbObj = null; public MainForm2 mainparent; public volatile Boolean RecivedData = false; private Hashtable AllCallHT = new Hashtable(); private Hashtable rgwHTByName = new Hashtable(); private Dictionary PriorityEmergency = new Dictionary(); DBgatewaysManager DBgw; private DBcallPatchManager dbpatch = new DBcallPatchManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB); private Telerik.WinControls.UI.RadDesktopAlert RemoteMonitorDesktopAlert; List dbPatches; private SafeMobileLib.Recording toAddRecording = null; [DllImport("winmm.dll")] public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume); [DllImport("winmm.dll")] public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume); List dispatchers = new List(); List radiogateways = new List(); List patchList = new List(); Dictionary> patchDictionary = new Dictionary>(); List runningPatches = new List(); public static int voicemanager_sampleRate = 8000; public static int voicemanager_bufferMilliseconds = 32; public static int voicemanager_bitDepth = 16; public RadioTab(MainForm2 parent) { InitializeComponent(); mainparent = parent; pbPTT.BackColor = Color.Transparent; pbPTT.Parent = pbSpectrum; pbPTT.Location = new Point(8, 8); this.parent = parent; panelInterConnect.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None; panelInterConnect.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed; panelAudioSettings.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None; panelAudioSettings.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed; panelChannelSettings.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None; panelChannelSettings.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed; panelCallHistory.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None; panelCallHistory.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed; panelSettings.Collapse(); #region THEMING /* btPrintReport.ButtonElement.ButtonFillElement.BackColor = MainForm2.ButtonColor; labelReportName.ForeColor = MainForm2.LabelColor; rgbReport.GroupBoxElement.Header.Border.TopColor = MainForm2.ButtonColor; rgbReport.GroupBoxElement.Header.Border.TopShadowColor = MainForm2.ButtonColor; rgbReport.GroupBoxElement.Header.TextPrimitive.ForeColor = MainForm2.ButtonColor;*/ pbPlayTestSound.Image = themePlay_Image; pb24H.Image = theme24H_Image; btRecordingsList_EnabledChanged(btRecordingsList, null); if (MainForm2.radioType == RADIOTYPE.REPEATER_TRBO) { // flag that recordings layout should be for repeater RecordingGridCellElement.REPEATER_LAYOUT = true; radPanel3.Visible = false; radPanel5.Visible = false; rcbBubble.Visible = false; panelCallHistory.Invalidate(); panelCallHistory.Refresh(); panelCallHistory.Location = new Point(0, 0); radPanel6.Location = new Point(radPanel6.Location.X, 0); radPanel4.Size = this.Size; radPanel4.Dock = DockStyle.Fill; radPanel4.BringToFront(); panelCallHistory.Size = this.Size; panelCallHistory.Dock = DockStyle.Fill; } #endregion // create the toolTip that will be displayed when the user sets a pattern // over the hint pictureBox toolTipHelp = new ToolTip(); toolTipHelp.ToolTipTitle = "Live"; toolTipHelp.AutoPopDelay = 0; toolTipHelp.InitialDelay = 0; toolTipHelp.ReshowDelay = 0; toolTipHelp.IsBalloon = false; toolTipHelp.ShowAlways = true; //load all the gateways for our user LoadAllGateways(); //init all multicast listener StartVoiceMulticast(MainForm2.radioType); #region RECORDINGS LIST db = new DBrecordingsManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB); RecordingGridColumn ctc = new RecordingGridColumn("recording"); ctc.AllowResize = true; ctc.AllowGroup = true; ctc.Name = "recording"; ctc.FieldName = "recording"; ctc.HeaderText = "recording"; ctc.AutoSizeMode = BestFitColumnMode.AllCells; ctc.HeaderTextAlignment = ContentAlignment.MiddleLeft; ctc.SortOrder = RadSortOrder.Ascending; this.gridRecordings.TableElement.RowHeight = 59; this.gridRecordings.Columns.Add(ctc); this.gridRecordings.Columns.Move(ctc.Index, 0); this.gridRecordings.GridViewElement.DrawBorder = false; this.gridRecordings.GridViewElement.GroupPanelElement.DrawBorder = false; rdpStartTime.Value = DateTime.Now.Date; rdpEndTime.Value = DateTime.Now.Date.AddDays(1); // set time grouping pbFilter_Click(pbFilterTime, null); #endregion #region SUBSCRIBERS LIST listViewSubscribers.ItemSize = new Size(180, 140); listViewSubscribers.ItemSpacing = 5; listViewSubscribers.AllowArbitraryItemHeight = false; listViewSubscribers.AllowArbitraryItemWidth = false; listViewSubscribers.AllowColumnReorder = false; listViewSubscribers.AllowEdit = false; listViewSubscribers.AllowRemove = false; listViewSubscribers.EnableFiltering = true; // Populate_subscriber_list(); //listSubscribers.DataSource = subscribersList; //listSubscribers.DisplayMember = "DispatcherName"; //listSubscribers.EnableCustomGrouping = true; listViewSubscribers.EnableGrouping = true; listViewSubscribers.ShowGroups = true; ListViewDataItemGroup docGroup = new ListViewDataItemGroup("Offline"); ListViewDataItemGroup diskGroup = new ListViewDataItemGroup("Online"); listViewSubscribers.Groups.Add(docGroup); listViewSubscribers.Groups.Add(diskGroup); /* foreach(ListViewDataItem item in listSubscribers.Items) { if ((item.DataBoundItem as Subscriber).Offline) item.Group = docGroup; else item.Group = diskGroup; }*/ // ORDER OF THE GROUPS STARTING WITH ALL AND ENDING WITH SUBSCRIBERS ListSortDirection sortDirection = String.Compare("Online", "Offline") <= 0 ? ListSortDirection.Descending : ListSortDirection.Ascending; GroupDescriptor groupByValue = new GroupDescriptor(new SortDescriptor[] { new SortDescriptor("SubscriberTypeRegion", sortDirection) }); listViewSubscribers.GroupDescriptors.Add(groupByValue); //foreach(ListViewDataItemGroup group in listSubscribers.Groups) { } #endregion #region FAVORITES LIST listFavorites.ItemSize = new Size(180, 140); listFavorites.ItemSpacing = 5; listFavorites.AllowArbitraryItemHeight = false; listFavorites.AllowArbitraryItemWidth = false; listFavorites.AllowColumnReorder = false; listFavorites.AllowEdit = false; listFavorites.AllowRemove = false; listFavorites.EnableFiltering = true; ((IconListViewElement)this.listFavorites.ListViewElement.ViewElement).Orientation = Orientation.Horizontal; //listFavorites.DataSource = subscribersList; //listSubscribers.DisplayMember = "DispatcherName"; //listSubscribers.EnableCustomGrouping = true; listFavorites.EnableGrouping = false; listFavorites.ShowGroups = false; FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true); listFavorites.FilterDescriptors.Clear(); listFavorites.FilterDescriptors.Add(valueFilter); #endregion #region GATEWAY LIST rlvGatewayStatus.ItemSize = new Size(100, 90); rlvGatewayStatus.ItemSpacing = 5; rlvGatewayStatus.AllowArbitraryItemHeight = false; rlvGatewayStatus.AllowArbitraryItemWidth = false; rlvGatewayStatus.AllowColumnReorder = false; rlvGatewayStatus.AllowEdit = false; rlvGatewayStatus.AllowRemove = false; ((IconListViewElement)this.rlvGatewayStatus.ListViewElement.ViewElement).Orientation = Orientation.Horizontal; rlvGatewayStatus.EnableGrouping = false; rlvGatewayStatus.ShowGroups = false; #endregion #region InitComunication try { smdbObj = new SMdb_access(); ArrayList tmpSound = smdbObj.GetSoundCards(0); if (tmpSound.Count > 0) { selectedOUTDeviceName = tmpSound[0].ToString(); selectedINDeviceName = tmpSound[1].ToString(); //if (tmpSound.Count > 2) // MainForm2.KeyforPTTall = tmpSound[2].ToString(); //else // MainForm2.KeyforPTTall = ""; } else { selectedOUTDeviceName = ""; selectedINDeviceName = ""; } } catch (Exception ex) { SM.Debug("Unable to load sound settings." + ex.ToString()); } // create the TCP for Audio voice received from mbus InitListToPlay(); //iniVoiceComponents(); InitAudioInputDevices(); InitAudioOutputDevices(); StartnVoice(); /*udp4Voice2 = new UdpMulticast(voiceMulticastIP2, Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port)); udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv); udp4Voice2.StartListen();*/ //MainForm2.tcpforClose = tcp; //MainForm2.tcpAudioforClose = tcpAudio; MainForm2.VoiceTabStarted = true; CheckMessage.RunWorkerAsync(); #endregion SetLanguages(); listBoxRadioGateways.DataSource = MainForm2.myGatewaylist; listBoxRadioGateways.DisplayMember = "DisplayedMemeber"; DBgw.gelAllGatewaysAndRadioGatewaysHT(ref MainForm2.radioGwHT); rgwHTByName = DBgw.gelAllGatewaysAndRadioGatewaysHTByName(); timer1.Start(); List rgw = MainForm2.myGatewaylist.ToList(); rgw.Add(new RadioGateway() { Gw_id = 0, Id = 0, Name = MainForm2.returnLNGString("Unassigned") }); rcbddGateways.DataSource = rgw; //MainForm2.myGatewaylist; rcbddGateways.DisplayMember = "Name"; rcddlRecordingsGateways.DataSource = rgw; //MainForm2.myGatewaylist; rcddlRecordingsGateways.DisplayMember = "Name"; #region Sip AttachEventHandlers(); parent.SipClassInitialized += SipClassInititializedInMainForm; #endregion this.parent.OnRadioGatewayStatusChanged += parent_OnRadioGatewayStatusChanged; this.parent.OnCallStatusHangChanged += parent_OnCallStatusHangChanged; panelCallHistory.Visible = pbFilterTime.Visible = pbFilterType.Visible = pbFilterUser.Visible = pbFilterDirection.Visible = MainForm2.recordingsDecide; } #region Sip Class Event Handlers private void SipClassInititializedInMainForm(object sender, EventArgs e) { AttachEventHandlers(); } private void AttachEventHandlers() { parent.AddDialogCreatedEventHandler(SipDialogCreated); if (MainForm2.recordingsDecide) { parent.AddVoiceReceivedEventHandler(SipVoiceReceived_Recordings); } else parent.AddVoiceReceivedEventHandler(SipVoiceReceived); parent.AddDialogClosedEventHandler(SipDialogClosed); parent.AddHangtimeEventHandler(SipHangtime); parent.AddErrorOnCreatingDialogEventHandler(SipErrorOnCreatingDialog); parent.AddSdCannotSendVoiceEventArgs(SdCannotSendSipVoice); parent.AddSdCanSendSipVoiceEventHandler(SdCanSendSipVoice); parent.AddSdReceivesSipCallInintEventHandler(SdReceivesSipCallInit); } private void SipDialogCreated(object sender, Dispatcher.Sip.SipDialogCreatedEventArgs e) { // Just show a message string dialogType = e.GroupId.HasValue ? "Group dialog with " + e.GroupId.Value : "Private dialog"; Utils.WriteLine($"{dialogType} created; {e.SipIdWhoSentInvite} sent the invite to {e.SipIdWhoReceivedInvite}"); } private void SipVoiceReceived(object sender, Dispatcher.Sip.SipVoiceReceivedEventArgs e) { // put the voice on audio output if (buffWaveProvider != null) { string audioSourceSipID = e.GroupId != null ? e.GroupId : e.CallSourceId.ToString(); int audioSourceSipID_int = int.Parse(audioSourceSipID); int audioSourceRadioID = parent.ContactLinxFromSipID(audioSourceSipID_int)?.Id ?? audioSourceSipID_int; if (MainForm2.PriorityIP == audioSourceRadioID.ToString()) { try { buffWaveProvider.AddSamples(e.Buffer, 0, e.Buffer.Length); } catch(Exception ex) { Utils.WriteLine(ex.Message, ConsoleColor.Red); } } } } private void SipVoiceReceived_Recordings(object sender, Dispatcher.Sip.SipVoiceReceivedEventArgs e) { SipVoiceReceived(null, e); // There is a licence for recordings // I will also put the voice on mBus parent.UdpMultForGwRecording.Send(e.Buffer, e.Buffer.Length); } private void SipDialogClosed(object sender, Dispatcher.Sip.SipDialogClosedEventArgs e) { string callType = e.GroupId == null ? "Private sip dialog" : "Group sip dialog"; Utils.WriteLine($"{callType} with {e.SipIdInDialogWith} was closed by {e.SipIdWhoClosed}"); if (PTTinprogres // SD sends voice && (e.SipIdWhoClosed == e.SipIdInDialogWith) // and SD receives Bye from a unit && (e.SipIdWhoClosed == selected_Subscriber.SipID) // and the unit that sends bye is the one that SD has called (in selectedSubscriber?) ) { // I received deKey from Linx killPTT = true; PTTinprogres = false; pttIsPressed = false; RecivedData = MainForm2.PriorityIP != ""; Thread.Sleep(60); pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00; pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; spectrumCount = 0; this.Invoke((Action)(() => { ManageSafeDispatchRingingSound(false); })); } else { // Here I will Simulate call end SimulateCallEnded( parent.ContactLinxFromSipID(e.SipIdInDialogWith)?.Id.ToString() ?? e.SipIdInDialogWith.ToString(), e.GroupId != null ? parent.ContactLinxFromSipID(int.Parse(e.GroupId))?.Id.ToString() ?? e.GroupId : MainForm2.userIDX.ToString(), e.GroupId != null ? SafeMobileLib.CallType.GROUPCALL : SafeMobileLib.CallType.PRIVATECALL, parent.ContactLinxFromSipID(e.SipIdInDialogWith)?.Type ?? ContactType.UNIT); } } private void SipHangtime(object sender, Dispatcher.Sip.SdReceivedCallStatusEventArgs e) { string sourceCallRadioId = parent.ContactLinxFromSipID(e.SourceCallSipId)?.Id.ToString() ?? e.SourceCallSipId.ToString(); string targetCallId = e.GroupCall ? parent.ContactLinxFromSipID(e.GroupSipId.Value)?.Id.ToString() ?? e.GroupSipId.Value.ToString() : MainForm2.userIDX.ToString(); // Here I will Simulate hangtime if (MainForm2.recordingsDecide) { // Send 125 with 2 int groupCallType = e.GroupCall ? 103 : 102; // send 125 on mbus // I changed the length of the command by adding a last "parameter": #0# // Sd will not process this longer command, only AppServer will do it for recordings string toSend = $"#0.0#125#{parent.SipGWIDandRadioID}.{sourceCallRadioId}#2#{groupCallType}#{targetCallId}#0#"; parent.Send_UDP_cmd_sent_withOutID(toSend); } SimulateHangtime( sourceCallRadioId, targetCallId, e.GroupCall ? SafeMobileLib.CallType.GROUPCALL : SafeMobileLib.CallType.PRIVATECALL, parent.ContactLinxFromSipID(e.SourceCallSipId)?.Type ?? ContactType.UNIT); } private void SipErrorOnCreatingDialog(object sender, SipComponent.ErrorEventArgs e) { // Show error Utils.WriteLine($"Error on Invite from {e.FromID} to {e.ToID}; Reason: {e.Reason}", ConsoleColor.Red); } private void SdReceivesSipCallInit(object sender, Dispatcher.Sip.SdReceivedCallStatusEventArgs e) { string sourceCallRadioId = parent.ContactLinxFromSipID(e.SourceCallSipId)?.Id.ToString() ?? e.SourceCallSipId.ToString(); string targetCallId = e.GroupCall ? parent.ContactLinxFromSipID(e.GroupSipId.Value)?.Id.ToString() ?? e.GroupSipId.Value.ToString() : MainForm2.userIDX.ToString(); if (MainForm2.recordingsDecide) { int groupCallType = e.GroupCall ? 103 : 102; // send 125 on mbus string toSend = $"#0.0#125#{parent.SipGWIDandRadioID}.{sourceCallRadioId}#1#{groupCallType}#{targetCallId}#0#"; parent.Send_UDP_cmd_sent_withOutID(toSend); } SimulateCallInitiated( sourceCallRadioId, targetCallId, e.GroupCall ? SafeMobileLib.CallType.GROUPCALL : SafeMobileLib.CallType.PRIVATECALL, parent.ContactLinxFromSipID(e.SourceCallSipId)?.Type ?? ContactType.UNIT); } private void SdCanSendSipVoice(object sender, Dispatcher.Sip.SdCanSendVoiceEventArgs e) { // Stop the ringing this.Invoke((Action)(() => { ManageSafeDispatchRingingSound(true); })); // SafeDispatch can now send voice SDcanSendVoice(e.TargetSipId, e.GroupCall); } private void SdCannotSendSipVoice(object sender, Dispatcher.Sip.SdCannotSendVoiceEventArgs e) { // Show console info Utils.WriteLine($"Cannot send ptt to {e.TargetSipId} because {e.Reason}", ConsoleColor.DarkRed); // Stop the ringing this.Invoke((Action)(() => { ManageSafeDispatchRingingSound(false); })); // Check if the failed attempt was private or group call ContactType linxType = parent.ContactLinxFromSipID(e.TargetSipId)?.Type ?? ContactType.UNIT; if (linxType == ContactType.GROUP) { // Do here what I do when receiving 123 with 2; Handle123Command(this.IdVOL = 2); // Show event on System log // If target sip id is 16777215, then it's an all call int mBusCmd = e.TargetSipId == 16777215 ? 121 : 123; // #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID# string cmd = ""; Utils.Convert_text_For_multicast( $"#1234#{mBusCmd}#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } else { // Do here what I do when receiving 122 with 2; Handle122Command(this.IdVOL = 2); // trigger event for the map parent.RaiseOnCallStatusChangedEvent( parent.ContactLinxFromSipID(e.TargetSipId)?.Name ?? "", false, false); // Show event on System log // #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID# string cmd = ""; Utils.Convert_text_For_multicast( $"#1234#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } } #endregion #region Private methods for Sip private void SDcanSendVoice(int targetSipID, bool groupCall) { string cmd = ""; if (groupCall) { // SD can send voice for sip group call // If group id is 16777215, then it's an all call int mbusCmd = targetSipID == 16777215 ? 121 : 123; if (!MainForm2.recordingsDecide) { // Do here what I do when receiving 123 with 1; Handle123Command(this.IdVOL = 1); // Show event on System log // #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID# Utils.Convert_text_For_multicast( $"#1234#{mbusCmd}#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#1#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } else { // Send 123 with 1 on Mbus, so that AppServer will record string seqId = parent.GetCallRequestForSip(targetSipID); if (seqId != null) { cmd = $"#{seqId}#{mbusCmd}#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#1#{MainForm2.userIDX}#"; parent.Send_UDP_cmd_sent_withOutID(cmd); } } } else { // SD can send voice for sip private call if (!MainForm2.recordingsDecide) { // Do here what I do when receiving 122 with 1; Handle122Command(this.IdVOL = 1); // Trigger event for the map parent.RaiseOnCallStatusChangedEvent( parent.ContactLinxFromSipID(targetSipID)?.Name, true, false); // Show event on System log // #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID# Utils.Convert_text_For_multicast( $"#1234#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#1#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } else { // Send 122 with 1 on Mbus, so that AppServer will record string seqId = parent.GetCallRequestForSip(targetSipID); if (seqId != null) { cmd = $"#{seqId}#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#1#{MainForm2.userIDX}#"; parent.Send_UDP_cmd_sent_withOutID(cmd); } } } } private void SimulateCallInitiated(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType callType, ContactType sourceType) { string gwID = parent.SipGWIDandRadioID.Split('.')[0]; string radioGwID = parent.SipGWIDandRadioID.Split('.')[1]; parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 1, (int)callType, int.Parse(targetCallSipID), true); // Add info in system tab //#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId# string cmd = ""; Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#1#{(int)callType}#{targetCallSipID}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd, sourceType); })); // Show call window this.Invoke((Action)(() => { Handle125Command(gwID, radioGwID, callStatusVOL = 1, callTypeVOL = (int)callType, grpIDVOL = callType == SafeMobileLib.CallType.PRIVATECALL ? MainForm2.userIDX : int.Parse(targetCallSipID), int.Parse(sourceCallSipID), sourceType); })); } private void SimulateHangtime(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType typeOfCall, ContactType sourceCallType) { string gwID = parent.SipGWIDandRadioID.Split('.')[0]; string radioGwID = parent.SipGWIDandRadioID.Split('.')[1]; parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 2, (int)typeOfCall, int.Parse(targetCallSipID), true); // Show info in System Tab // Add info in system tab //#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId# string cmd = ""; Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#2#{(int)typeOfCall}#{targetCallSipID}#", out cmd); this.Invoke((Action)(() => { Handle125Command(gwID, radioGwID, callStatusVOL = 2, callTypeVOL = (int)typeOfCall, grpIDVOL = MainForm2.userIDX, int.Parse(sourceCallSipID)); parent.AddDataToSystemGrid(false, cmd, sourceCallType); })); } private void SimulateCallEnded(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType typeOfCall, ContactType sourceCallType) { string gwID = parent.SipGWIDandRadioID.Split('.')[0]; string radioGwID = parent.SipGWIDandRadioID.Split('.')[1]; parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 3, (int)typeOfCall, int.Parse(targetCallSipID), true); // Show info in System Tab // Add info in system tab //#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId# string cmd = ""; Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#3#{(int)typeOfCall}#{targetCallSipID}#", out cmd); this.Invoke((Action)(() => { Handle125Command(gwID, radioGwID, callStatusVOL = 3, callTypeVOL = (int)typeOfCall, grpIDVOL = (typeOfCall == SafeMobileLib.CallType.PRIVATECALL ? MainForm2.userIDX : int.Parse(targetCallSipID)), int.Parse(sourceCallSipID)); parent.AddDataToSystemGrid(false, cmd, sourceCallType); })); } internal void UpdateSipStatus(bool status) { this.Invoke((MethodInvoker)delegate () { try { lbSipStatus.Text = (status ? MainForm2.returnLNGString("sipConnected") : MainForm2.returnLNGString("sipNotConnected")) + $"[{MainForm2.userSipId}]"; lbSipStatus.ForeColor = status ? Color.Green : Color.Red; } catch(Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); } }); } private void CloseSipCall(string callerName) { // Dekey for linx call if (MainForm2.vehicleHT.ContainsKey(callerName)) { // id is from an unit. // Close the call parent.StopPtt(((Vehicle)MainForm2.vehicleHT[callerName]).sipID.ToString()); } else if (MainForm2.userIDHash.ContainsKey(callerName)) { // id is from a dispatcher. // get the sip id. User dispatcher = MainForm2.UsersList.FirstOrDefault((user) => { return user.UserName == callerName; }); if (dispatcher != null) parent.StopPtt(dispatcher.SipID.ToString()); } } #endregion private void SetLanguages() { radLabel1.Text = MainForm2.returnLNGString("call"); rlPushToTalk.Text = MainForm2.returnLNGString("PushtoTalk"); panelCallHistory.Text = MainForm2.returnLNGString("callHistory"); tbSearch.NullText = MainForm2.returnLNGString("search"); rcpFavoritesPanel.HeaderText = MainForm2.returnLNGString("favSubscribers"); rcbCallType.NullText = rcbUnit.NullText = MainForm2.returnLNGString("displayall"); radLabel10.Text = MainForm2.returnLNGString("calltype"); radLabel11.Text = MainForm2.returnLNGString("htableVehiclesListColumns1"); rlRecordingsFrom.Text = MainForm2.returnLNGString("recordingsFrom"); rlRecordingsUntil.Text = MainForm2.returnLNGString("recordingsUntil"); btRecordingsList.Text = MainForm2.returnLNGString("exportRecordingsList"); rcbBubble.Text = MainForm2.returnLNGString("displayBubble"); panelAudioSettings.Text = MainForm2.returnLNGString("audioSett"); rlMicrophone.Text = MainForm2.returnLNGString("microphone"); rlSpeakers.Text = MainForm2.returnLNGString("speakers"); rbApplyAudioConfiguration.Text = MainForm2.returnLNGString("ApplyConfig"); panelChannelSettings.HeaderText = MainForm2.returnLNGString("RadioChannelSettings"); radLabel7.Text = MainForm2.returnLNGString("radio"); radLabel5.Text = MainForm2.returnLNGString("zonex"); radLabel6.Text = MainForm2.returnLNGString("chanel"); panelInterConnect.HeaderText = MainForm2.returnLNGString("InterConnectedSubscribers"); panelCallHistory.HeaderText = MainForm2.returnLNGString("callHistory"); panelSettings.HeaderText = MainForm2.returnLNGString("sett"); panelAudioSettings.HeaderText = MainForm2.returnLNGString("audioSett"); lbGatewayStatus.Text = MainForm2.returnLNGString("gwStatus"); rddFieldFilter.Items.Add(MainForm2.returnLNGString("htableVehiclesListColumns1")); rddFieldFilter.Items.Add(MainForm2.returnLNGString("imei")); rddFieldFilter.SelectedIndex = 0; rcbddGateways.NullText = MainForm2.returnLNGString("displayAllGateways"); rcddlRecordingsGateways.NullText = MainForm2.returnLNGString("displayAllGateways"); lblPatch.Text = MainForm2.returnLNGString("callPatching"); rlVolumeIndicator.Text = rlVolumeIndicator2.Text = MainForm2.returnLNGString("volumeIndicator"); rlMicrophone.Text = MainForm2.returnLNGString("microphone"); rlSpeakers.Text = MainForm2.returnLNGString("speakers"); rlVoiceStatus.Text = MainForm2.returnLNGString("voiceStatusPerGw"); gvPatch.Columns[0].HeaderText = MainForm2.returnLNGString("type"); gvPatch.Columns[1].HeaderText = MainForm2.returnLNGString("incomingFrom"); gvPatch.Columns[2].HeaderText = MainForm2.returnLNGString("redirectTo"); } /// /// Get the volume for the default audio device /// private void UpdateVolume() { /* // By the default set the volume to 0 uint CurrVol = 0; // At this point, CurrVol gets assigned the volume waveOutGetVolume(IntPtr.Zero, out CurrVol); // Calculate the volume ushort CalcVol = (ushort)(CurrVol & 0x0000ffff); // Get the volume on a scale of 1 to 10 (to fit the trackbar) rtbSpeakersVolume.Value = CalcVol / (ushort.MaxValue / 10);*/ } private List Populate_subscriber_list() { try { subscribersList.Clear(); #region SUBSCRIBERS foreach (String obj in MainForm2.vehicleHT.Keys) { if (((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID.Equals("-1.-1")) ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID = "0.0"; RadioGateway rg = MainForm2.myGatewaylist.Find(d => ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID.Equals(d.Gw_id + "." + d.Id)); if (obj.Equals("655")) ; //((Vehicle)MainForm2.vehicleHT[obj]).CheckPositionInSystem(); subscribersList.Add(new Subscriber() { DispatcherName = obj, SubscriberType = SubscriberType.SUBSCRIBER, SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.SUBSCRIBER.ToString()), ImageKey = "i_classic_bus_02", HasRemoteMonitor = (MainForm2.radioType == RADIOTYPE.MOTO ? true : false), HasTextMessage = true, Sc_id = ((Vehicle)MainForm2.vehicleHT[obj]).sc_id, Imei = ((Vehicle)MainForm2.vehicleHT[obj]).IMEI, IconFilePath = MainForm2.GetMapPathForUnit(obj), //Gw_and_radioID = Valid_GwID_and_RadioID, Gw_and_radioID = (rg?.Name == null ? "0.0" : ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID), GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned"), IP = String.Format("224.10.{0}", ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID), //IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), Favorite = ((Vehicle)MainForm2.vehicleHT[obj]).is_favorite, IsEmergency = ((Vehicle)MainForm2.vehicleHT[obj]).is_emergency, canMakeSipCalls = ((Vehicle)MainForm2.vehicleHT[obj]).canMakeSipCalls, SipID = ((Vehicle)MainForm2.vehicleHT[obj]).sipID }); } subscribersList.Sort((x, y) => x.DispatcherName.CompareTo(y.DispatcherName)); #endregion #region GROUP //Group g = null; foreach (var g in MainForm2.GroupCPSIDOnlyHashWithoutCategory) { //g = (Group)MainForm2.GroupCPSIDOnlyHashWithoutCategory[i]; string hashKey = "isFav" + "_" + SubscriberType.GROUP.ToString() + "_" + g.Value.Id.ToString() + g.Value.Gw_and_radioID; bool isFav = MainForm2.HashVal.ContainsKey(hashKey) ? Boolean.Parse(MainForm2.HashVal[hashKey] + "") : false; try { RadioGateway rg = MainForm2.myGatewaylist.Find(d => g.Value.Gw_and_radioID.Equals(d.Gw_id + "." + d.Id)); // skip groups that are assignet to other radio gateways if (rg == null) continue; subscribersList.Add(new Subscriber() { DispatcherName = g.Value.Name, SubscriberType = SubscriberType.GROUP, SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.GROUP.ToString()), HasRemoteMonitor = false, HasTextMessage = (MainForm2.radioType == RADIOTYPE.MOTO ? true : false), ImageKey = "i_group", IconFilePath = "i_group", Imei = g.Value.Id.ToString(), GatewayName = rg?.Name??"", //Gw_and_radioID = Valid_GwID_and_RadioID, Gw_and_radioID = g.Value.Gw_and_radioID, IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), Favorite = isFav, canMakeSipCalls = g.Value.Type == (int)GatewayType.Broadband || MainForm2.radioType == RADIOTYPE.EXCERA, SipID = g.Value.SipID, Id = g.Value.Id }); } catch (Exception ex) { Utils.WriteLine("Unable to create Group: " + ex.ToString(), ConsoleColor.Red); } } #endregion #region DISPATCHER //Dispatcher to dispatcher call needs to be added before uncomenting //foreach (var user in MainForm2.UsersList.OrderBy(d => d.UserName)) //{ // if (user.Id != MainForm2.userIDX) // { // string hashKey3 = "isFav" + "_" + SubscriberType.DISPATCHER.ToString() + "_" // + user.Id.ToString() + "_" + user.UserName; // bool isFav3 = MainForm2.HashVal.ContainsKey(hashKey3) ? Boolean.Parse(MainForm2.HashVal[hashKey3] + "") : false; // subscribersList.Add(new Subscriber() // { // DispatcherName = user.UserName, // SubscriberType = SubscriberType.DISPATCHER, // SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.DISPATCHER.ToString()), // HasRemoteMonitor = false, // HasTextMessage = false, // Gw_and_radioID = "0.0", // GatewayName = MainForm2.returnLNGString("Unassigned"), // ImageKey = "i_dispatch", // IconFilePath = "i_dispatch", // IP = String.Format("224.20.{0}.1", MainForm2.userIDX.ToString()), // Imei = user.Id.ToString(), // Favorite = isFav3, // canMakeSipCalls = false // }); // } //} #endregion #region ALL CALL if (MainForm2.radioType == RADIOTYPE.MOTO) { foreach (RadioGateway radgw in MainForm2.myGatewaylist.OrderBy(d => d.Name)) { string hashKey2 = "isFav" + "_" + SubscriberType.ALL.ToString() + "_" + "16777215" + "_" + radgw.Name; bool isFav2 = MainForm2.HashVal.ContainsKey(hashKey2) ? Boolean.Parse(MainForm2.HashVal[hashKey2] + "") : false; subscribersList.Add(new Subscriber() { DispatcherName = radgw.Name, SubscriberType = SubscriberType.ALL, SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.ALL.ToString()), HasRemoteMonitor = false, HasTextMessage = false, Imei = "16777215", SipID = 16777215, ImageKey = "i_all_call", IconFilePath = "i_all_call", GatewayName = radgw.Name, //Gw_and_radioID = Valid_GwID_and_RadioID, Gw_and_radioID = (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString()), //IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), IP = String.Format("224.10.{0}", (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString())), Favorite = isFav2, canMakeSipCalls = radgw.Type == (int)GatewayType.Broadband || MainForm2.radioType == RADIOTYPE.EXCERA }); if (!AllCallHT.ContainsKey(radgw.Name)) AllCallHT.Add(radgw.Name, (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString())); } } #endregion //subscribersList = subscribersList.OrderBy(d => d.DispatcherName).ToList(); listViewSubscribers.DataSource = subscribersList; listFavorites.DataSource = null; listFavorites.DataSource = subscribersList; if (this.listViewSubscribers.Items.Count > 0) { ListViewDataItem item = null; foreach(ListViewDataItemGroup g in listViewSubscribers.Groups) { if (g.Text.StartsWith(SubscriberType.ALL.ToString())) { item = g.Items[0]; break; } } if(item!= null) { selected_Subscriber = (Subscriber)item.DataBoundItem; listViewSubscribers.Select(new ListViewDataItem[] { item }); listViewSubscribers.ListViewElement.ViewElement.Scroller.ScrollToItem(item); Update_call_selected(); } } } catch (Exception ex) { Utils.WriteLine("Error on Populate subscriber list:" + ex.ToString(), ConsoleColor.Red); } return subscribersList; } public String Valid_GwID_and_RadioID = ""; public static string responseGW = ""; public static volatile string PersonalIP = ""; public String Valid_GwID = "0"; private void Populate_recording_list() { try { List recList = new List(); ArrayList param = new ArrayList(); // 0 typesd 0 =gateway 1 = dispather // 1 gw_id // 2 radiogw_id //sc_id from the field in case o dispatcher // 3 subscriber_id // user_id of dispatcher // User type param.Add(1); // User type gateway ID 0 param.Add(Convert.ToInt32(Valid_GwID)); // User type radio gateway ID 0 param.Add(0); // User type my user id param.Add(MainForm2.userIDX); foreach (RadioGateway obj in MainForm2.myGatewaylist) { param.Add(0); param.Add((Int32)obj.Gw_id);//1 param.Add((Int32)obj.Id);//8 param.Add(0); // i don't limit to specify subscriber } string from = "", to = ""; recList = db.GetAllRecordingsForDispatcherAndAssignGateway(param, 0, Int32.MaxValue, MainForm2.userIDX); int i = 0; foreach (SafeMobileLib.Recording obj in recList) { if (i++ == 0) { toAddRecording = obj; toAddRecording.startDateTime = DateTime.Now; toAddRecording.endDateTime = DateTime.Now.AddSeconds(7); } //obj.calltype //obj.startTime and obj.endTime //obj.startDateTime //obj.id for PLAY //obj.hddLocation for info //obj.typeSD and obj.subID and obj.Group_ID CallDirection calldir = CallDirection.INCOMING; if (obj.calltype < 4) calldir = CallDirection.OUTGOING; if (obj.calltype == 3) { calldir = obj.dispatcher_id == MainForm2.userIDX ? CallDirection.OUTGOING : CallDirection.INCOMING; } CallType callty = CallType.REMOTE_MONITORING; String Name = ""; CheckRecording(obj, out callty, out Name, out from, out to); RadioGateway rg = MainForm2.myGatewaylist.Find(d => (obj.gwID + "." + obj.radioGWID).Equals(d.Gw_id + "." + d.Id)); // do not display recordings from radio gateways that are not assigned anymore or where deleted if (rg == null) continue; recordingsList.Add(new Recording() { callDirection = calldir, callType = callty, dateUnix70 = obj.startTime, duration = (int)(obj.endTime - obj.startTime), username = Name, To = to, From = from, File_Name = obj.hddLocation, RecID = obj.id, Gw_and_radioID = (rg?.Name == null ? "0.0" : obj.gwID + "." + obj.radioGWID), GatewayName = rg?.Name??"N/A [deleted]" }); } Thread.Sleep(100); gridRecordings.DataSource = recordingsList; // set the time to be first recordings time and today rdpStartTime.Value = recordingsList.Count > 0 ? recordingsList[recordingsList.Count - 1].DateStart : DateTime.Now.Date; rdpEndTime.Value = DateTime.Now.Date.AddDays(1); DisplayEmptyMessageOnRecordingsGrid(); } catch (Exception ex) { Utils.WriteLine("Error on populate recordings:" + ex.ToString(), ConsoleColor.Red); } } private List listgw = new List(); private void LoadAllGateways() { try { DBgw = new DBgatewaysManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB); listgw = DBgw.getAllGateways(); foreach (Gateway rad in listgw) { List listRadgw = DBgw.gelAllRadioGateways_forUser(rad.Id, MainForm2.userIDX); foreach (RadioGateway radgw in listRadgw) { if (radgw.Gw_voice == 1) { //MainForm2.myGatewaylist.Add(radgw); Valid_GwID_and_RadioID = (String)(rad.Id.ToString() + "." + radgw.Id); Valid_GwID = rad.Id.ToString(); } } } } catch (Exception ex) { Utils.WriteLine("Error on load gateway: " + ex.ToString(), ConsoleColor.Red); } } public void StartVoiceMulticast(RADIOTYPE radioType) { //UdpMulticast udp4Voice2; Gatewaymulticast gatewaymulticast; if (radioType != RADIOTYPE.EXCERA) { // for Excera, the dispatcher should not lister for voice from gateways foreach (RadioGateway radgw in MainForm2.myGatewaylist) { Valid_GwID_and_RadioID = (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString()); //udp4Voice2 = new UdpMulticast(String.Format("224.10.{0}", Valid_GwID_and_RadioID), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port)); //udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv); //udp4Voice2.StartListen(); gatewaymulticast = new Gatewaymulticast(String.Format("224.10.{0}", Valid_GwID_and_RadioID), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port), this); Console.WriteLine("Listen to:" + String.Format("224.10.{0}", Valid_GwID_and_RadioID)); //List_of_multicast_voice.Add(udp4Voice2); } } foreach (Int32 obj in MainForm2.userIDHash.Keys) { if (obj != MainForm2.userIDX) { //udp4Voice2 = new UdpMulticast(String.Format("224.20.{0}.1", obj.ToString()), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port)); //udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv); //udp4Voice2.StartListen(); gatewaymulticast = new Gatewaymulticast(String.Format("224.20.{0}.1", obj.ToString()), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port), this); Console.WriteLine("Listen to:" + String.Format("224.20.{0}.1", obj.ToString())); //List_of_multicast_voice.Add(udp4Voice2); } } } /// /// Add the new recording row to the recordings grid /// /// New recording object public void Addrow(SafeMobileLib.Recording obj) { try { CallDirection calldir = CallDirection.INCOMING; if (obj.calltype < 4) calldir = CallDirection.OUTGOING; CallType callty = CallType.REMOTE_MONITORING; if(obj.calltype == 3) { calldir = obj.dispatcher_id == MainForm2.userIDX ? CallDirection.OUTGOING : CallDirection.INCOMING; } String Name = "", to = "", from = ""; CheckRecording(obj, out callty, out Name, out from, out to); //gridRecordings.BeginUpdate(); this.Invoke((MethodInvoker)delegate () { RadioGateway rg = MainForm2.myGatewaylist.Find(d => (obj.gwID + "." + obj.radioGWID).Equals(d.Gw_id + "." + d.Id)); // add the new row to the list //Utils.WriteLine("Add recording: " + obj.gwID, ConsoleColor.Red); recordingsList.Insert(0, new Recording() { callDirection = calldir, callType = callty, dateUnix70 = obj.startTime, duration = (int)(obj.endTime - obj.startTime), username = Name, File_Name = obj.hddLocation, RecID = obj.id, Gw_and_radioID = (rg?.Name == null ? "0.0" : obj.gwID + "." + obj.radioGWID), GatewayName = rg?.Name ?? "", To = to, From = from }); }); //gridRecordings.EndUpdate(); } catch (Exception ex) { SM.Debug("Error on populate grid" + ex.ToString()); } } private void CheckRecording(SafeMobileLib.Recording obj, out CallType callType, out string nameOfTheRecording, out string userWhoCalled, out string userWhoWasCalled) { callType = CallType.REMOTE_MONITORING; nameOfTheRecording = userWhoWasCalled = userWhoCalled = ""; switch (obj.calltype) { case 0: callType = CallType.PRIVATE_CALL; userWhoCalled = MainForm2.userLog; if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString())) { userWhoWasCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()]; } else { userWhoWasCalled = obj.subs_imei.ToString(); } break; case 4: callType = CallType.PRIVATE_CALL; userWhoWasCalled = MainForm2.userLog; if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString())) { userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()]; } else { userWhoCalled = obj.subs_imei.ToString(); } break; case 1: callType = CallType.GROUP_CALL; userWhoCalled = MainForm2.userLog; string key = obj.group_cpsId + "." + obj.radioGWID; if (MainForm2.GroupsAndRadioGW.ContainsKey(key)) userWhoWasCalled = ((Group)MainForm2.GroupsAndRadioGW[key]).Name; else userWhoWasCalled = obj.group_cpsId.ToString(); break; case 5: callType = CallType.GROUP_CALL; if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString())) userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()]; else userWhoCalled = obj.subs_imei.ToString(); //"recordings/Tetra102(102)_DO_GROUP_CALL_ID_457_02_Jul_19_13_16_20.wav" string key1 = obj.group_cpsId + "." + obj.radioGWID; string GroupIDFromPath=""; string[] GroupIDFromSplit; if (MainForm2.GroupsAndRadioGW.ContainsKey(key1)) userWhoWasCalled = ((Group)MainForm2.GroupsAndRadioGW[key1]).Name; else { if (obj.group_cpsId == null) { GroupIDFromPath = obj.hddLocation; GroupIDFromSplit = GroupIDFromPath.Split('_'); userWhoWasCalled = GroupIDFromSplit[5]; } else userWhoWasCalled = obj.group_cpsId.ToString(); } break; case 2: callType = CallType.ALL_CALL; userWhoCalled = MainForm2.userLog; userWhoWasCalled = "All Call"; break; case 6: callType = CallType.ALL_CALL; userWhoWasCalled = "All Call"; if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString())) userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()]; else userWhoCalled = obj.subs_imei.ToString(); break; case 7: callType = CallType.REMOTE_MONITORING; userWhoWasCalled = MainForm2.userLog; if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString())) userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()]; else userWhoCalled = "Radio_ID " + obj.subs_imei; break; case 3: callType = CallType.DISPATCHER_CALL; //userWhoCalled = MainForm2.userLog; userWhoCalled = MainForm2.userIDHash[obj.dispatcher_id] != null ? (string)MainForm2.userIDHash[obj.dispatcher_id] : "UserID" + obj.dispatcher_id; if (MainForm2.userIDHash.ContainsKey(obj.radioGWID)) userWhoWasCalled = (String)MainForm2.userIDHash[obj.radioGWID]; else userWhoWasCalled = "UserID" + obj.radioGWID; break; } nameOfTheRecording = userWhoCalled + " -> " + userWhoWasCalled; } private void radTrackBar1_LabelFormatting(object sender, Telerik.WinControls.UI.LabelFormattingEventArgs e) { try { if (e.LabelElement == null) return; if (e.LabelElement.Text == null) e.LabelElement.Text = ""; //make the top labels display the days if (e.LabelElement.Text.Equals("0") && !e.LabelElement.Text.Equals("100")) { e.LabelElement.Text = MainForm2.returnLNGString("Low"); } if (e.LabelElement.Text.Equals("100") && !e.LabelElement.Text.Equals("0")) { e.LabelElement.Text = MainForm2.returnLNGString("High"); } else if (!e.LabelElement.Text.Equals(MainForm2.returnLNGString("Low")) && !e.LabelElement.Text.Equals(MainForm2.returnLNGString("High"))) { e.LabelElement.Text = ""; } } catch(Exception ex) { Utils.WriteLine("Error when setting volume trackbar labels" + ex.ToString()); } } private void tbSearch_TextChanged(object sender, EventArgs e) { if (tbSearch.Text.Length == 0) { pbSearch.Image = Dispatcher.Properties.Resources.i_search; pbSearch.Cursor = Cursors.Default; } else { pbSearch.Image = Dispatcher.Properties.Resources.i_delete; pbSearch.Cursor = Cursors.Hand; } FilterDescriptor valueFilter = null; listViewSubscribers.BeginUpdate(); listViewSubscribers.FilterDescriptors.Remove("DispatcherName"); listViewSubscribers.FilterDescriptors.Remove("Imei"); valueFilter = rddFieldFilter.SelectedIndex == 0 ? new FilterDescriptor("DispatcherName", FilterOperator.Contains, tbSearch.Text) : new FilterDescriptor("Imei", FilterOperator.Contains, tbSearch.Text); listViewSubscribers.FilterDescriptors.Add(valueFilter); /* listSubscribers.FilterDescriptors.Remove("DispatcherName"); FilterDescriptor valueFilter = new FilterDescriptor("DispatcherName", FilterOperator.Contains, tbSearch.Text); /* while (listSubscribers.FilterDescriptors.Count > 0) listSubscribers.FilterDescriptors.RemoveAt(0); */ /*listSubscribers.FilterDescriptors.Add(valueFilter);*/ listViewSubscribers.EndUpdate(); if (this.listViewSubscribers.Items.Count == 1) { selected_Subscriber = (Subscriber)listViewSubscribers.Items[0].DataBoundItem; listViewSubscribers.SelectedIndex = 0; Update_call_selected(); } } private void pbSearch_Click(object sender, EventArgs e) { if (tbSearch.Text.Length > 0) tbSearch.Text = ""; } private void panel_Collapsed(object sender, EventArgs e) { if ((RadCollapsiblePanelElement)sender == panelAudioSettings.CollapsiblePanelElement) { panelChannelSettings.Location = new Point(panelChannelSettings.Location.X, panelChannelSettings.Location.Y - normalSizeAudioSettings.Height + 33); panelInterConnect.Location = new Point(panelInterConnect.Location.X, panelInterConnect.Location.Y - normalSizeAudioSettings.Height + 33); dividerChannelSettings.Location = new Point(dividerChannelSettings.Location.X, dividerChannelSettings.Location.Y - normalSizeAudioSettings.Height + 33); dividerInterConnect.Location = new Point(dividerInterConnect.Location.X, dividerInterConnect.Location.Y - normalSizeAudioSettings.Height + 33); } else if ((RadCollapsiblePanelElement)sender == panelChannelSettings.CollapsiblePanelElement) { panelInterConnect.Location = new Point(panelInterConnect.Location.X, panelInterConnect.Location.Y - normalSizeChannelSettings.Height + 33); dividerInterConnect.Location = new Point(dividerInterConnect.Location.X, dividerInterConnect.Location.Y - normalSizeChannelSettings.Height + 33); } else if ((RadCollapsiblePanelElement)sender == panelInterConnect.CollapsiblePanelElement) { } } private void panel_Expanding(object sender, CancelEventArgs e) { Console.WriteLine("Size is : " + normalSizeChannelSettings.Height); if ((RadCollapsiblePanelElement)sender == panelAudioSettings.CollapsiblePanelElement) { panelChannelSettings.Location = new Point(panelChannelSettings.Location.X, panelChannelSettings.Location.Y + normalSizeAudioSettings.Height - 33); panelInterConnect.Location = new Point(panelInterConnect.Location.X, panelInterConnect.Location.Y + normalSizeAudioSettings.Height - 33); dividerChannelSettings.Location = new Point(dividerChannelSettings.Location.X, dividerChannelSettings.Location.Y + normalSizeAudioSettings.Height - 33); dividerInterConnect.Location = new Point(dividerInterConnect.Location.X, dividerInterConnect.Location.Y + normalSizeAudioSettings.Height - 33); } else if ((RadCollapsiblePanelElement)sender == panelChannelSettings.CollapsiblePanelElement) { panelInterConnect.Location = new Point(panelInterConnect.Location.X, panelInterConnect.Location.Y + normalSizeChannelSettings.Height - 33); dividerInterConnect.Location = new Point(dividerInterConnect.Location.X, dividerInterConnect.Location.Y + normalSizeChannelSettings.Height - 33); } else if ((RadCollapsiblePanelElement)sender == panelInterConnect.CollapsiblePanelElement) { } } private void RadioTab_Load(object sender, EventArgs e) { normalSizeAudioSettings = panelAudioSettings.CollapsiblePanelElement.Size; normalSizeChannelSettings = panelChannelSettings.CollapsiblePanelElement.Size; //get all recordings LoadRecordingTimer.Enabled = true; LoadRecordingTimer.Start(); //subscriber list LoadSubscriberTimer.Enabled = true; LoadSubscriberTimer.Start(); // fill the recordings list Populate_recording_list(); // fill the subscribers list Populate_subscriber_list(); // fill the units combobox populateUnits(); // fill the call types rcbCallType.DataSource = new CallTypeBindingList(); rcbCallType.DisplayMember = "Name"; rcbCallType.ValueMember = "Id"; // get first time the volume level UpdateVolume(); //request String Totrans = "#503#"; mainparent.Send_UDP_cmd(Totrans, 0, 0); //display current datetime on watch lbCurrentDateTime.Text = DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern); //SetPTTButtonEnableDisable(); #region grid patching data source foreach (var user in MainForm2.UsersList) { //if (user.UserName != MainForm2.userLog) dispatchers.Add(user); } foreach (var gateway in MainForm2.myGatewaylist.OrderBy(d => d.Name)) { radiogateways.Add(gateway); } List patchType = new List(); if (dispatchers.Count >= 2) patchType.Add("Dispatcher"); if (radiogateways.Count >= 2) patchType.Add("Gateway"); ((GridViewComboBoxColumn)gvPatch.Columns["type"]).DataSource = patchType; //hide patch table if doesn't need it if (MainForm2.radioType == RADIOTYPE.MOTO) lblPatch.Visible = gvPatch.Visible = (radiogateways.Count >= 2 || dispatchers.Count >= 2); else lblPatch.Visible = gvPatch.Visible = false; dbPatches = dbpatch.getAllPatches(); gvPatch.DataSource = dbPatches; //add data into patching dictionary foreach (var patch in dbPatches) { string concat = patch.Type + patch.Incoming + patch.Outgoing; string key = patch.Type + "." + patch.IncomingId; //updatePatchStatus(patch.Incoming, true); updatePatchStatus(patch.Outgoing, true, patch.Type); if (!patchDictionary.ContainsKey(key)) { patchDictionary.Add(key, new List()); } if (patchDictionary.ContainsKey(key)) { if (!patchDictionary[key].Contains(patch.OutgoingId)) patchDictionary[key].Add(patch.OutgoingId); } patchList.Add(concat); } #endregion if (MainForm2.radioType == RADIOTYPE.LINX || MainForm2.radioType == RADIOTYPE.LINXB || MainForm2.radioType == RADIOTYPE.EXCERA) UpdateSipStatus(MainForm2.sipStatus); else lbSipStatus.Text = MainForm2.returnLNGString("gatewayStatus"); //lbSipStatus.Visible = MainForm2.radioType == RADIOTYPE.LINX || MainForm2.radioType == RADIOTYPE.LINXB; //update224Route(MainForm2.cfg.LocalIP); rcpFavoritesPanel.Collapse(); // hide radio gateway status list and panel because no active gateway assigned to the dispatcher if (radiogateways.Count == 0) containerGatewayStatus.Visible = false; else { // set datasource for gateway status list rlvGatewayStatus.DataSource = radiogateways; rlvGatewayStatus.DisplayMember = "DisplayedMemeber"; rlvGatewayStatus.EnableFiltering = true; // add filter to show only voice gateways rlvGatewayStatus.BeginUpdate(); rlvGatewayStatus.FilterDescriptors.Add(new FilterDescriptor("Gw_voice", FilterOperator.IsGreaterThan, 0)); rlvGatewayStatus.EndUpdate(); } } private void update224Route(string interfaceIP) { Process p = new Process(); p = new Process(); p.StartInfo.FileName = "cmd.exe"; p.StartInfo.Arguments = $"/c route change 224.0.0.0 mask 240.0.0.0 {interfaceIP}"; p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.Start(); string output = p.StandardOutput.ReadToEnd(); } /// /// Update the Radio Status list from the Settings tab. The status can be online or offline /// /// /// /// void parent_OnRadioGatewayStatusChanged(string gwandradioGW, bool status) { foreach (RadListDataItem tmp in listBoxRadioGateways.Items) { if (((RadioGateway)tmp.Value).Gw_id.ToString() + "." + ((RadioGateway)tmp.Value).Id.ToString() == gwandradioGW) { // update the gateway status to offline or idle when the radio gateway status changes OnRadioGatewayStateChanged((RadioGateway)MainForm2.radioGwHT[gwandradioGW], status ? RadioState.IDLE : RadioState.OFFLINE); tmp.Image = status == true ? global::Dispatcher.Properties.Resources.green_status : global::Dispatcher.Properties.Resources.grey_status; ((RadioGateway)MainForm2.radioGwHT[gwandradioGW]).Alive = status; break; } } this.Invoke((MethodInvoker)delegate { if(!pttIsPressed) SetPTTButtonEnableDisable(); }); } void parent_OnCallStatusHangChanged(string unitname, bool inCall, Boolean fromField, string GwPlusRadio) { //Thread.Sleep(250); if (MainForm2.radioGwHT.ContainsKey(GwPlusRadio)) { RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[GwPlusRadio]; Utils.WriteLine($"Radiogateway {GwPlusRadio} - {radioGw.Name} Patch status is {radioGw.InPatch}", ConsoleColor.Yellow); if (radioGw.InPatch) return; } ManageSafeDispatchRingingSound(inCall); } /// /// Stops the ringing sound when call is established. /// If not in call, plays busy sound and display error on ptt button /// Must be called ON THE UI THREAD /// /// true if in call, otherwise false private void ManageSafeDispatchRingingSound(bool callEstablished) { MainForm2.soundPlayer.Stop(); if (!callEstablished) { pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; MainForm2.soundPlayer.Stream = Dispatcher.Properties.Resources.phone_busy; MainForm2.soundPlayer.Play(); } } private ArrayList vehicleListNames = new ArrayList(); public BindingList UnitGroupItems = new BindingList(); /// /// Populate the drop down list with all the units /// private void populateUnits() { // add the datasource for the vehicles ComboBox rcbUnit.DataSource = null; List unitsName = (subscribersList.Select(x => x.DispatcherName).ToList()); // add dispatcher to the list unitsName.Add(MainForm2.userLog); unitsName.Sort(); rcbUnit.DataSource = unitsName; //cbVehName.DataSource = vehicleListNames; //cbVehName.DisplayMember = "Name"; if (rcbUnit.Items.Count > 1) rcbUnit.SelectedIndex = 0; } /// /// Get the image which needs to be set for a unit/group picture box/ list /// according to the type of the SafeDispatch /// /// Type of the SafeDispatch system [this is equal with the theme] /// String containing the /// Specify if the icon should be in enabled or disabled state /// The image which fulfills the constrains private Image GetIconForCombobox(RADIOTYPE radioType, String iconType, bool isEnabled) { if (iconType.Equals("unit")) { switch (MainForm2.radioType) { case RADIOTYPE.ATLAS: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled : Dispatcher.Properties.Resources.icon_cb_unit_disabled); case RADIOTYPE.HARRIS: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled_ha : Dispatcher.Properties.Resources.icon_cb_unit_disabled); default: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled : Dispatcher.Properties.Resources.icon_cb_unit_disabled); } } else if (iconType.Equals("group")) { switch (MainForm2.radioType) { case RADIOTYPE.ATLAS: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled); case RADIOTYPE.HARRIS: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled_ha : Dispatcher.Properties.Resources.icon_cb_group_disabled); default: return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled); } } return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled); } private void rcbCallType_ItemDataBound(object sender, ListItemDataBoundEventArgs args) { var test = args.NewItem.DataBoundItem as CallType_Drop; if (test == null) { return; } args.NewItem.Image = test.Image; } #region PTT internal volatile bool pttIsPressed = false; volatile bool killPTT = false; int spectrumCount = 0; internal void pbPTT_MouseDown(object sender, MouseEventArgs e) { if (selected_Subscriber == null) return; //if (listViewSubscribers.SelectedItem == null && listViewSubscribers.Items.Count > 0) // //listViewSubscribers.Items[0].Selected = true; // listViewSubscribers.SelectedItem = listViewSubscribers.Items[0]; //selected_Subscriber = listViewSubscribers.SelectedItem.DataBoundItem as Subscriber; selected_Subscriber = selected_Subscriber_PTT; if (selected_Subscriber.SubscriberType == SubscriberType.SUBSCRIBER) { if (selected_Subscriber.DispatcherName != "") { ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem(); selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID; } } else if (selected_Subscriber.SubscriberType == SubscriberType.ALL) { Valid_GwID_and_RadioID = AllCallHT[selected_Subscriber.DispatcherName].ToString(); } else if (selected_Subscriber.SubscriberType == SubscriberType.GROUP) { Valid_GwID_and_RadioID = selected_Subscriber.Gw_and_radioID; } sendPTT(selected_Subscriber); } private void sendRemoteMOnitor(Subscriber sel_subs) { // pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_over; String Totrans = ""; if (sel_subs.SubscriberType == SubscriberType.SUBSCRIBER) { Totrans = "#161#" + sel_subs.Gw_and_radioID + "." + sel_subs.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 15000, 161)); } } private void sendDekey(string linxSipID = null) { if (linxSipID != null) { int sipID; if (int.TryParse(linxSipID, out sipID)) { // close sip call parent.StopPtt(sipID.ToString()); } } else { // Send deDekey to radio GW String Totrans = String.Format("#160#{0}#", responseGW); mainparent.Send_UDP_cmd(Totrans, 0, 0); } } private void sendCallStop(String Imei) { //String Totrans = String.Format("#220#{0}.{1}#", Valid_GwID_and_RadioID, Imei); String Totrans = String.Format("#220#{0}.{1}#{2}#", responseGW, Imei, MainForm2.userIDX); mainparent.Send_UDP_cmd(Totrans, 0, 0); } public void updateGwAndRagioGatewayForSubscriber(String radioID, String gwId, String radioGwId) { //Utils.WriteLine("updateGwAndRagioGatewayForSubscriber " + radioID, ConsoleColor.DarkMagenta); listViewSubscribers.BeginUpdate(); listViewSubscribers.FilterDescriptors.Remove("GatewayName"); foreach (Object item in subscribersList) { Subscriber sub = item as Subscriber; if (sub == null) continue; if (sub.Imei.Equals(radioID)) { // do not update the dispatcher gateway if (sub.SubscriberType == SubscriberType.DISPATCHER) continue; RadioGateway rg = MainForm2.myGatewaylist.Find(d => (gwId + "." + radioGwId).Equals(d.Gw_id + "." + d.Id)); // update the value of the subscriber in the grid if (sub.SubscriberType == SubscriberType.SUBSCRIBER) { sub.Gw_and_radioID = (rg?.Name == null ? "0.0" : gwId + "." + radioGwId); sub.GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned"); //Utils.WriteLine("Moved unit " + sub.DispatcherName + " to " + sub.Gw_and_radioID); sub.NrOfUpdates++; } } } listViewSubscribers.EndUpdate(); listFavorites.FilterDescriptors.Remove("GatewayName"); listFavorites.BeginUpdate(); foreach (ListViewDataItem item in listFavorites.Items) { Subscriber sub = item.DataBoundItem as Subscriber; if (sub == null) continue; if (sub.Imei.Equals(radioID)) { // do not update the dispatcher gateway if (sub.SubscriberType == SubscriberType.DISPATCHER) continue; RadioGateway rg = MainForm2.myGatewaylist.Find(d => (gwId + "." + radioGwId).Equals(d.Gw_id + "." + d.Id)); // update the value of the subscriber in the grid if (sub.SubscriberType == SubscriberType.SUBSCRIBER) { // update the value of the subscriber in the grid sub.Gw_and_radioID = (rg?.Name == null ? "0.0" : gwId + "." + radioGwId); sub.GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned"); sub.NrOfUpdates++; Utils.WriteLine("Moved unit " + sub.DispatcherName + " to " + sub.Gw_and_radioID); } } } listFavorites.EndUpdate(); rcbddGateways_ItemCheckedChanged(rcbddGateways, null); } public void sendPTT(Subscriber sub, bool selectSubscriberInListView = false) { if (PTTinprogres) { // PTT already in progress. Just return return; } #region BUG: Voice call fails in various situations //1. if proces111or112or113FALSE is true means that a mobile radio has a call in progress and if we make a call in this situation //the call will be intrerupted by it's timer if (proces111or112or113FALSE) { ManageSafeDispatchRingingSound(false); System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); return; } #endregion SubscriberType subType = sub.SubscriberType; // get the radio gateway if (subType == SubscriberType.GROUP || subType == SubscriberType.SUBSCRIBER) { if (sub.Gw_and_radioID != null) { string gwAndRadioGw = sub.Gw_and_radioID; if (MainForm2.radioGwHT.ContainsKey(gwAndRadioGw)) { RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[gwAndRadioGw]; // Check the radio gateway type switch (radioGw.Type) { case (int)GatewayType.Tier2Radio: // if gateway is off or already in ptt, do not send ptt if (!radioGw.Alive || radioGw.InPTT) { Utils.WriteLine("PTT is not in progress anymore: " + radioGw.InPTT + " | " + radioGw.Alive); ManageSafeDispatchRingingSound(false); System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); PTTinprogres = false; return; } break; case (int)GatewayType.Broadband: case (int)GatewayType.Tier3Radio: // Play calling sound for Simoco and android MainForm2.soundPlayer.Stream = Dispatcher.Properties.Resources.phone_calling; MainForm2.soundPlayer.Play(); break; } } } } killPTT = false; selected_Subscriber = sub; if (selected_Subscriber.DispatcherName != "") { if (subType == SubscriberType.SUBSCRIBER) { ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem(); selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID; } } if (subType != SubscriberType.DISPATCHER) selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID; try { String gwId = "0"; String radioGwId = "0"; gwId = Valid_GwID_and_RadioID.Split(new char[] { '.' })[0]; radioGwId = Valid_GwID_and_RadioID.Split(new char[] { '.' })[1]; updateGwAndRagioGatewayForSubscriber(selected_Subscriber.Imei, gwId, radioGwId); } catch(Exception ex) { Utils.WriteLine("Error on updating the gateway for current selected unit: " + ex.ToString(), ConsoleColor.Red); } pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_over; if (selectSubscriberInListView) { ListViewDataItem lDataItem = listViewSubscribers.Items.FirstOrDefault((item) => { Subscriber s = item.DataBoundItem as Subscriber; if (s != null) { if (s.Imei == sub.Imei && s.SubscriberType == subType && s.Gw_and_radioID == sub.Gw_and_radioID) return true; else return false; } else return false; }); if (lDataItem != null) listViewSubscribers.SelectedItem = lDataItem; } bool sendCallInitOnMbus = true; if (selected_Subscriber.canMakeSipCalls) { try { Utils.WriteLine("SIP ID TO SEND PTT = " + selected_Subscriber.SipID, ConsoleColor.Magenta); parent.SendCallRequest(selected_Subscriber.SipID.ToString(), selected_Subscriber.SubscriberType == SubscriberType.GROUP || selected_Subscriber.SubscriberType == SubscriberType.ALL); if (!MainForm2.recordingsDecide) { // No licence for recordings // I will not send call init commands on mBus // I will send them only when there is licence for recordings, // so that the AppServer will start registering sendCallInitOnMbus = false; // Show data in system tab // init private call - 102 // #seqID#102#gatewayId.gatewayRadioId.remoteRadioId#voiceBroadcastAddress# // init group call - 103 // #seqID#103#gatewayId.gatewayRadioId.remoteRadioId#voiceBroadcastAddress# string cmd = ""; MessageBusCmds initCallCmd = MessageBusCmds.InitPrivateCall; switch (subType) { case SubscriberType.GROUP: initCallCmd = MessageBusCmds.InitGroupCall; break; case SubscriberType.ALL: initCallCmd = MessageBusCmds.InitAllCall; break; } Utils.Convert_text_For_multicast( $"#1234#{(int)initCallCmd}#{selected_Subscriber.Gw_and_radioID}.{selected_Subscriber.Imei}#224.20.{MainForm2.userIDX}.1#", out cmd); parent.AddDataToSystemGrid(true, cmd); } } catch (Exception ex) { // Threat this as call rejected by gateway if (subType == SubscriberType.GROUP) { Handle123Command(this.IdVOL = 2); // Show event on System log // #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID# string cmd = ""; Utils.Convert_text_For_multicast( $"#1234#123#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } else { Handle122Command(this.IdVOL = 2); // Trigger event for the map parent.RaiseOnCallStatusChangedEvent( selected_Subscriber.DispatcherName, false, false); // Show event on System log // #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID# string cmd = ""; Utils.Convert_text_For_multicast( $"#1234#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#", out cmd); this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); })); } Utils.WriteLine(ex.Message, ConsoleColor.Red); } } if (sendCallInitOnMbus) { String Totrans = ""; string seqId = ""; if (selected_Subscriber != null) { switch (subType) { case SubscriberType.ALL: Totrans = String.Format("#101#{0}#{1}#", selected_Subscriber.Gw_and_radioID, "224.20." + MainForm2.userIDX + ".1#0"); WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 101)); break; case SubscriberType.SUBSCRIBER: Totrans = "#102#" + /*selected_Subscriber.Gw_and_radioID*/ Valid_GwID_and_RadioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 102)); break; case SubscriberType.GROUP: Totrans = "#103#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 103)); break; case SubscriberType.DISPATCHER: Totrans = String.Format("#201#{0}#{1}#", selected_Subscriber.Imei, "224.20." + MainForm2.userIDX + ".1#0"); WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 201)); break; } #if EXCERA parent.AddCallRequestForSip(selected_Subscriber.SipID, seqId); #endif } } } private void ConfirmPTT_and_Start_Voice() { pttIsPressed = true; try { Thread p = new Thread(delegate () { while (pttIsPressed) { if (killPTT) { Utils.WriteLine("KILL PTTT"); pttIsPressed = false; //RecivedData = false; //pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00; //pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; //spectrumCount = 0; break; } //this.Invoke((MethodInvoker)delegate () //{ if (pbSpectrum != null) { switch (spectrumCount++ % 13) { case 1: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_01; break; case 2: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_02; break; case 3: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_03; break; case 4: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_04; break; case 5: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_05; break; case 6: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_06; break; case 7: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_07; break; case 8: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_08; break; case 9: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_09; break; case 10: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_10; break; case 11: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_11; break; case 12: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_12; break; //default: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_01; break; } } //}); Thread.Sleep(50); } }); p.Start(); } catch (Exception ex) { Utils.WriteLine("Error on ConfirmPTT_and_Start_Voice:" + ex.ToString()); } } internal void pbPTT_MouseUp(object sender, MouseEventArgs e) { Utils.WriteLine("PTT MOUSE UP", ConsoleColor.Green); if (selected_Subscriber == null) return; StopPTT(selected_Subscriber); } private void pbPTT_MouseLeave(object sender, EventArgs e) { Utils.WriteLine("PTT MOUSE LEAVE", ConsoleColor.Green); if (PTTinprogres) { if (selected_Subscriber == null) return; StopPTT(selected_Subscriber); } } public void StopPTT(Subscriber subs) { Utils.WriteLine("STOP PTT"); bool sendMbusCommand = true; if (!PTTinprogres) sendMbusCommand = false; // PTT is not in progress. No need to do anything else killPTT = true; // PTT is in progress, so the animation should be stop PTTinprogres = false; MainForm2.soundPlayer.Stop(); selected_Subscriber = subs; pttIsPressed = false; //RecivedData = false; RecivedData = MainForm2.PriorityIP != ""; Thread.Sleep(60); pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00; pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; spectrumCount = 0; if (selected_Subscriber.canMakeSipCalls) { string sipID = selected_Subscriber.SipID.ToString(); parent.StopPtt(sipID); sendMbusCommand = MainForm2.recordingsDecide; } if (sendMbusCommand) { String Totrans = ""; switch (selected_Subscriber.SubscriberType) { case SubscriberType.ALL: Totrans = String.Format("#111#{0}#{1}#", selected_Subscriber.Gw_and_radioID, "224.20." + MainForm2.userIDX + ".1#0"); WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 111)); break; case SubscriberType.SUBSCRIBER: Totrans = "#112#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112)); if (MainForm2.radioType != RADIOTYPE.EXCERA) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112)); else mainparent.Send_UDP_cmd(Totrans, 3000, 112); break; case SubscriberType.GROUP: Totrans = "#113#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113)); if (MainForm2.radioType != RADIOTYPE.EXCERA) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113)); else mainparent.Send_UDP_cmd(Totrans, 3000, 113); break; case SubscriberType.DISPATCHER: Totrans = String.Format("#211#{0}#{1}#", selected_Subscriber.Imei, "224.20." + MainForm2.userIDX + ".1#0");//selected_Subscriber.IP WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 211)); break; } } } private void pictureBox1_Click(object sender, EventArgs e) { //CallsForm cf = new CallsForm(); //cf.Show(); } #endregion private void pictureBox2_Click(object sender, EventArgs e) { if (listViewSubscribers.ViewType == ListViewType.DetailsView) listViewSubscribers.ViewType = ListViewType.IconsView; else listViewSubscribers.ViewType = ListViewType.DetailsView; } private void pbFilter_Click(object sender, EventArgs e) { pbFilterTime.Image = Dispatcher.Properties.Resources.filter_time_grey; pbFilterType.Image = Dispatcher.Properties.Resources.filter_type_grey; pbFilterUser.Image = Dispatcher.Properties.Resources.filter_user_grey; pbFilterDirection.Image = Dispatcher.Properties.Resources.filter_direction_grey; pbFilterTime.Tag = "disabled"; pbFilterType.Tag = "disabled"; pbFilterUser.Tag = "disabled"; pbFilterDirection.Tag = "disabled"; string filterName = "DateStart"; ListSortDirection sortDirection = ListSortDirection.Ascending; if ((PictureBox)sender == pbFilterTime) { pbFilterTime.Image = Dispatcher.Properties.Resources.filter_time_black; pbFilterTime.Tag = "enabled"; filterName = "DateStart"; // default sort direction for date start is descending sortDirection = ListSortDirection.Descending; } else if ((PictureBox)sender == pbFilterType) { pbFilterType.Image = Dispatcher.Properties.Resources.filter_type_black; pbFilterType.Tag = "enabled"; filterName = "callType"; } else if ((PictureBox)sender == pbFilterUser) { pbFilterUser.Image = Dispatcher.Properties.Resources.filter_user_black; pbFilterUser.Tag = "enabled"; filterName = "Initial"; } else if ((PictureBox)sender == pbFilterDirection) { pbFilterDirection.Image = Dispatcher.Properties.Resources.filter_direction_black; pbFilterDirection.Tag = "enabled"; filterName = "callDirection"; } if (gridRecordings.GroupDescriptors.Count > 0 && gridRecordings.GroupDescriptors[0].Expression.Contains(filterName)) { GroupDescriptor gd = gridRecordings.GroupDescriptors[0]; sortDirection = gd.Expression.Contains("ASC") ? ListSortDirection.Descending : ListSortDirection.Ascending; } // clear previous filters and add the new one gridRecordings.GroupDescriptors.Clear(); GroupDescriptor groupDescriptor = new GroupDescriptor(new SortDescriptor[] { new SortDescriptor(filterName, sortDirection) }); gridRecordings.GroupDescriptors.Add(groupDescriptor); } #region PLAY procedure private MemoryStream RecorderStream1 = null; private RawSourceWaveStream recordingWaveStream = null; private WaveOut recordingWaveOut = null; private void UnableToPlay_Tick(object sender, EventArgs e) { try { if (MainForm2.PlayingFile) BackToPlay(); UnableToPlay.Stop(); UnableToPlay.Enabled = false; } catch (Exception ex) { SM.Debug("UnableToPlay_Tick:" + ex.ToString()); } } private void StopPlayTimer_Tick(object sender, EventArgs e) { try { if (MainForm2.PlayingFile) BackToPlay(); StopPlayTimer.Stop(); StopPlayTimer.Enabled = false; } catch (Exception ex) { SM.Debug("Ex:" + ex.ToString()); } } public void BackToPlay() { try { MainForm2.PlayingFile = false; } catch (Exception ex) { SM.Debug("Unable to get back volume" + ex.ToString()); } } public void PlayFile(Int64 IdToPlay, Int32 TimerInterval) { if (TimerInterval == 0) { parent.DisplayToast("Unable to play recording", "The desired recording was not found. Probably it was deleted."); return; } try { MainForm2.PlayingFile = true; MainForm2.PlayingFileCount = 0; UnableToPlay.Enabled = true; UnableToPlay.Start(); StopPlayTimer.Interval = TimerInterval; StopPlayTimer.Enabled = true; StopPlayTimer.Start(); bool start = tcpAudio.Start(MainForm2.cfg.REC_IP, Convert.ToInt32(MainForm2.cfg.REC_audio_port)); RecorderStream1 = new MemoryStream(); Int64 id = (Int64)IdToPlay; byte[] temp = BitConverter.GetBytes(id); byte[] buff = new byte[temp.Length + 1]; buff[0] = 1; int i = 1; foreach (byte b in temp) { buff[i] = b; i++; } tcpAudio.Send(buff); } catch (Exception ex) { SM.Debug("PlayFile:" + ex.ToString()); } } private void InitListToPlay() { try { tcpAudio = new TcpClass(); tcpAudio.OnMessageRecv += new TcpClass.MessageRecv(tcpAudio_OnMessageRecv); tcpAudio.OnConnectionEnded += new TcpClass.ConnectionEnded(tcpAudio_OnConnectionEnded); } catch (Exception ex) { SM.Debug("InitListToPlay:" + ex.ToString()); } } void tcpAudio_OnMessageRecv(byte[] data, int recv) { try { RecorderStream1.Write(data, 0, recv); MainForm2.PlayingFileCount++; if (MainForm2.PlayingFileCount == 2) { UnableToPlay.Stop(); UnableToPlay.Enabled = false; } } catch (Exception ex) { SM.Debug("tcpAudio_OnMessageRecv:" + ex.ToString()); } } void tcpAudio_OnConnectionEnded() { try { recordingWaveStream = new RawSourceWaveStream(new MemoryStream(RecorderStream1.ToArray()), waveInClass.WaveFormat); recordingWaveOut.Init(recordingWaveStream); recordingWaveOut.Play(); } catch (Exception ex) { SM.Debug("Conection ended error:" + ex.ToString()); } } #endregion #region voiceINIT //public volatile NewAudio nVOice; public volatile WaveIn waveInClass = null; private volatile BufferedWaveProvider buffWaveProvider = null; public volatile WaveOut waveOutClass = null; public int selectedOUTDevice; public string selectedOUTDeviceName = " "; public int selectedINDevice; public string selectedINDeviceName = " "; public ArrayList soundINDevices = new ArrayList(); public ArrayList soundOUTDevices = new ArrayList(); EventHandler waveInClassHandlerForDataAvailable = null; public void StartnVoice() { try { if (waveOutClass != null) { waveOutClass.Dispose(); waveOutClass = null; } if (waveInClass != null) { waveInClass.DataAvailable -= waveInClassHandlerForDataAvailable; waveInClass.Dispose(); waveInClass = null; } //selectedINDevice = selectedOUTDevice = 0; if ((selectedINDevice != -1) && (selectedOUTDevice != -1)) { try { /*nVOice = new NewAudio(selectedINDevice, selectedOUTDevice); nVOice.OnVoiceRecv += new NewAudio.VoiceRecv(nVOice_OnNewDataRecv); MainForm2.nVoiceforClose = nVOice;*/ Utils.WriteLine("Device IN:" + selectedINDevice + " Device OUT:" + selectedOUTDevice, ConsoleColor.Magenta); waveInClass = new WaveIn(); waveInClass.DeviceNumber = selectedINDevice; waveInClass.BufferMilliseconds = voicemanager_bufferMilliseconds; waveInClassHandlerForDataAvailable = waveInClass_DataAvailable; #if LINX || LINXB || EXCERA if (MainForm2.recordingsDecide) { waveInClassHandlerForDataAvailable = waveInClass_DataAvailable_Recordings; } #endif waveInClass.DataAvailable += waveInClassHandlerForDataAvailable; int sampleRate = voicemanager_sampleRate; int channels = 1; waveInClass.WaveFormat = new NAudio.Wave.WaveFormat(sampleRate, voicemanager_bitDepth, channels); waveInClass.StartRecording(); buffWaveProvider = new BufferedWaveProvider(waveInClass.WaveFormat); waveOutClass = new WaveOut(); waveOutClass.DeviceNumber = selectedOUTDevice; waveOutClass.Init(buffWaveProvider); waveOutClass.Play(); recordingWaveOut = new WaveOut(); recordingWaveOut.DeviceNumber = selectedOUTDevice; //MainForm2.waveInClassforClose = waveInClass; //MainForm2.waveOutClassforClose = waveOutClass; Utils.WriteLine("Init new WAVE module", ConsoleColor.Magenta); } catch (Exception ex) { SM.Debug("Error to start voice for ALL call" + ex.ToString()); } } } catch (Exception ex) { SM.Debug("StartnVoice:" + ex.ToString()); } } void waveInClass_DataAvailable(object sender, WaveInEventArgs e) { try { if (PTTinprogres) { if (selected_Subscriber.canMakeSipCalls) { parent.SendSipVoice(selected_Subscriber.SipID.ToString(), e.Buffer, e.BytesRecorded, SipComponent.AudioFormat.PCM); } else { Utils.WriteLine($"Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} "); MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded); } } } catch (Exception ex) { SM.Debug("nVOice_OnNewDataRecv:" + ex.ToString()); } } void waveInClass_DataAvailable_Recordings(object sender, WaveInEventArgs e) { try { if (PTTinprogres) { if (selected_Subscriber.canMakeSipCalls) { parent.SendSipVoice(selected_Subscriber.SipID.ToString(), e.Buffer, e.BytesRecorded, SipComponent.AudioFormat.PCM); // Send also voice on mBus so that AppServer will record Utils.WriteLine($"[Rec] Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} "); MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded); } else { Utils.WriteLine($"[Rec] Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} "); MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded); } } } catch (Exception ex) { SM.Debug("nVOice_OnNewDataRecv:" + ex.ToString()); } } private void InputSoundList_Click(object sender, EventArgs e) { InitAudioInputDevices(); } private void OutputSoundList_Click(object sender, EventArgs e) { InitAudioOutputDevices(); } private void InitAudioInputDevices() { selectedINDevice = -1; try { InputSoundList.Items.Clear(); int nrOfWaveInDevices = WaveIn.DeviceCount; for (int j = 0; j < nrOfWaveInDevices; j++) { WaveInCapabilities deviceInvo = WaveIn.GetCapabilities(j); sDevice dev; dev.index = j; dev.name = deviceInvo.ProductName.Trim(); soundINDevices.Add(dev); InputSoundList.Items.Add(dev.name); } if (soundINDevices.Count > 0) { if (selectedINDevice < soundINDevices.Count) { bool found = false; foreach (sDevice dev in soundINDevices) { if (dev.name == selectedINDeviceName) { found = true; selectedINDevice = dev.index; //InputSoundList.Text = dev.name; InputSoundList.SelectedIndex = dev.index; } } if (!found) { selectedINDevice = 0; } } else { selectedINDevice = 0; } } InputSoundList.SelectedIndex = selectedINDevice; } catch (Exception ex) { SM.Debug("ERROR in voice ini : " + ex.ToString()); } } private void InitAudioOutputDevices() { selectedOUTDevice = -1; try { OutputSoundList.Items.Clear(); int nrOfWaveOUTDevices = WaveOut.DeviceCount; for (int j = 0; j < nrOfWaveOUTDevices; j++) { WaveOutCapabilities deviceInvo = WaveOut.GetCapabilities(j); sDevice dev; dev.index = j; dev.name = deviceInvo.ProductName.Trim(); soundOUTDevices.Add(dev); OutputSoundList.Items.Add(dev.name); } if (soundOUTDevices.Count > 0) { if (selectedOUTDevice < soundOUTDevices.Count) { bool found = false; foreach (sDevice dev in soundOUTDevices) { if (dev.name == selectedOUTDeviceName) { found = true; selectedOUTDevice = dev.index; //InputSoundList.Text = dev.name; OutputSoundList.SelectedIndex = dev.index; } } if (!found) { selectedOUTDevice = 0; } } else { selectedOUTDevice = 0; } } OutputSoundList.SelectedIndex = selectedOUTDevice; } catch (Exception ex) { SM.Debug("ERROR in voice ini : " + ex.ToString()); } } private void iniVoiceComponents() { selectedOUTDevice = -1; selectedINDevice = -1; try { InputSoundList.Items.Clear(); OutputSoundList.Items.Clear(); int nrOfWaveOUTDevices = WaveOut.DeviceCount; for (int j = 0; j < nrOfWaveOUTDevices; j++) { WaveOutCapabilities deviceInvo = WaveOut.GetCapabilities(j); sDevice dev; dev.index = j; dev.name = deviceInvo.ProductName.Trim(); soundOUTDevices.Add(dev); OutputSoundList.Items.Add(dev.name); } if (soundOUTDevices.Count > 0) { if (selectedOUTDevice < soundOUTDevices.Count) { bool found = false; foreach (sDevice dev in soundOUTDevices) { if (dev.name == selectedOUTDeviceName) { found = true; selectedOUTDevice = dev.index; //InputSoundList.Text = dev.name; OutputSoundList.SelectedIndex = dev.index; } } if (!found) { selectedOUTDevice = 0; } } else { selectedOUTDevice = 0; } } int nrOfWaveInDevices = WaveIn.DeviceCount; for (int j = 0; j < nrOfWaveInDevices; j++) { WaveInCapabilities deviceInvo = WaveIn.GetCapabilities(j); sDevice dev; dev.index = j; dev.name = deviceInvo.ProductName.Trim(); soundINDevices.Add(dev); InputSoundList.Items.Add(dev.name); } if (soundINDevices.Count > 0) { if (selectedINDevice < soundINDevices.Count) { bool found = false; foreach (sDevice dev in soundINDevices) { if (dev.name == selectedINDeviceName) { found = true; selectedINDevice = dev.index; //InputSoundList.Text = dev.name; InputSoundList.SelectedIndex = dev.index; } } if (!found) { selectedINDevice = 0; } } else { selectedINDevice = 0; } } // selectedOUTDevice = selectedINDevice = 0; OutputSoundList.SelectedIndex = selectedOUTDevice; InputSoundList.SelectedIndex = selectedINDevice; } catch (Exception ex) { SM.Debug("ERROR in voice ini : " + ex.ToString()); } } #endregion ~RadioTab() { //if(tcp!=null)tcp.Stop(); if (tcpAudio != null) tcpAudio.Stop(); } private void listRecordings_MouseClick(object sender, MouseEventArgs e) { Console.WriteLine("INTO CLICK LIST"); PlayFile(3949747661, 7); //PlayFile(((Recording)listRecordings.SelectedItem).RecID, ((Recording)listRecordings.SelectedItem).duration); } public Subscriber selected_Subscriber = null; /// /// Not used? Should be deleted? /// public Subscriber selected_Subscriber_PTT = null; /// /// Not used? Should be deleted? /// //private Subscriber field_subscriber_making_the_call = null; private void listSubscribers_SelectedIndexChanged(object sender, EventArgs e) { if (this.listViewSubscribers.SelectedItems.Count == 0) { selected_Subscriber = selected_Subscriber_PTT = null; return; } listFavorites.SelectedIndex = -1; listFavorites.Update(); selected_Subscriber = selected_Subscriber_PTT = (Subscriber)listViewSubscribers.SelectedItems[0].DataBoundItem; SetPTTButtonEnableDisable(); Update_call_selected(); } private void SetPTTButtonEnableDisable() { if (selected_Subscriber != null && selected_Subscriber.SubscriberType != SubscriberType.DISPATCHER && !selected_Subscriber.canMakeSipCalls) { try { if (MainForm2.vehicleHT.ContainsKey(selected_Subscriber.DispatcherName)) { ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem(); selected_Subscriber.Gw_and_radioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID; } RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[selected_Subscriber.Gw_and_radioID]; pbPTT.Enabled = radioGw.Alive; pbPTT.Image = pbPTT.Enabled ? Dispatcher.Properties.Resources.r_ptt : Dispatcher.Properties.Resources.r_ptt_incoming; } catch { pbPTT.Enabled = false; pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_incoming; } } else { pbPTT.Enabled = true; pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; } if(selected_Subscriber.canMakeSipCalls) { pbPTT.Enabled = MainForm2.sipStatus; pbPTT.Image = MainForm2.sipStatus ? Dispatcher.Properties.Resources.r_ptt : Dispatcher.Properties.Resources.r_ptt_incoming; } } private void listFavorites_SelectedIndexChanged(object sender, EventArgs e) { if (this.listFavorites.SelectedItems.Count == 0) { selected_Subscriber = selected_Subscriber_PTT = null; return; } listViewSubscribers.SelectedIndex = -1; listViewSubscribers.Update(); selected_Subscriber = selected_Subscriber_PTT = (Subscriber)listFavorites.SelectedItems[0].DataBoundItem; SetPTTButtonEnableDisable(); Update_call_selected(); } private void listFavorites_ItemMouseClick(object sender, ListViewItemEventArgs e) { // Daca e doar un element in lista, vreau ca la click sa se apleleze procedura de selectie if (listFavorites.Items.Count == 1) listFavorites_SelectedIndexChanged(listFavorites, null); } private void Update_call_selected() { switch (selected_Subscriber.SubscriberType) { case SubscriberType.SUBSCRIBER: lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forPrivatecallto"), selected_Subscriber.DispatcherName); break; case SubscriberType.GROUP: lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forGroupcallto"), selected_Subscriber.DispatcherName); break; case SubscriberType.ALL: lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forAllcall"), selected_Subscriber.DispatcherName); break; case SubscriberType.DISPATCHER: lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forDispatchercallto"), selected_Subscriber.DispatcherName); break; } } #region Recive Data From MessageBus private void CheckMessage_DoWork(object sender, DoWorkEventArgs e) { try { BackgroundWorker worker = sender as BackgroundWorker; e.Result = Computation(worker, e); } catch (Exception ex) { SM.Debug("Erorr start checkMessage:" + ex.ToString()); } } public volatile Int32 dataIntVOL = 0; public volatile Int32 typeVOL = 0; public volatile Int32 IdVOL = 0; private volatile Boolean PTTinprogres = false; public volatile Boolean ResponsePTT = false; private volatile string GatewayAndRadioID = ""; public volatile Int32 callStatusVOL = 0; public volatile Int32 callTypeVOL = 0; public volatile Int32 grpIDVOL = 0; private volatile Boolean Startrecevied = false; private Dictionary startReceivedDict = new Dictionary(); //private CallsForm uniqueCallForm = null; private Dictionary callFormContainer = new Dictionary(); public volatile Alarms voltmpx = null; //public volatile System.Threading.Timer tclose125 = null; private void Come_back_to_normal_PTT_state(object state) { try { if (this.InvokeRequired) { this.Invoke((Action)(() => { pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; })); } else pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; } catch (Exception ex) { SM.Debug("Ex101:" + ex.ToString()); } } private void CheckMessage_ProgressChanged(object sender, ProgressChangedEventArgs e) { try { dataIntVOL = e.ProgressPercentage; typeVOL = dataIntVOL % 1000; IdVOL = dataIntVOL / 1000; switch (typeVOL) { case 100: /* if (IdVOL == 1) { TurnON(); isON = true; //intreb gaby cum da canalele } else { TurnOFF(); isON = false; lbStatus.Text = radiooffline; lbStatus.Update(); }*/ break; case 999: //exitra timpu si opresc statia /* rbAllCall.Enabled = true; rbGroupCall.Enabled = true; rbPrivateCall.Enabled = true; rbAllCall.IsChecked = true; TurnOFF(); PTTclicked = false; lbStatus.Text = radiooffline; lbStatus.Update*/ break; case 998: /* lbStatus.Text = btRem.Text + " " + MainForm2.returnLNGString("error"); btRem.Enabled = true; EnableChALL(); PTT_enable(); PTTclicked = false; parent.GeneralPTTclick = false;*/ break; case 207: /* if (IdVOL == 1) { chanelFree = false; DisableALL(); } else { chanelFree = true; EnableALL(); }*/ break; case 124: /* SM.Debug("proccess 124 for IP:" + myIP); TurnON(); ImgStat.Image = global::Dispatcher.Properties.Resources.green_status; isON = true; FirstChanle00 = false; DisplayChChanel(IdVOL); PTTinprogres = false; */ break; case 115: PTTinprogres = false; Utils.WriteLine($"Received 115 commnad"); //confirmare mesajului de OFF break; case 116: PTTinprogres = false; Utils.WriteLine($"Received 116 commnad"); break; case 117: PTTinprogres = false; Utils.WriteLine($"Received 117 commnad"); break; case 121: if (IdVOL == 1) { Utils.WriteLine($"RadioTab Handle121Command {IdVOL}", ConsoleColor.Cyan); PTTinprogres = true; ConfirmPTT_and_Start_Voice(); } else { //set other status for button on response is wrong Talk with ADY pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); PTTinprogres = false; } ResponsePTT = true; break; case 10: String reason = "unknown"; switch ((RADIO_STATUS)IdVOL) { case RADIO_STATUS.ALLcall_INIT: reason = "All call"; break; case RADIO_STATUS.ALLcall_INPROGRES: reason = "All call"; break; case RADIO_STATUS.CallEvent: reason = "CallEvent"; break; case RADIO_STATUS.ChannelQuery: reason = "ChQuery"; break; case RADIO_STATUS.DKEY: reason = "Dkey"; break; case RADIO_STATUS.EnableDisable: reason = "En./Dis."; break; case RADIO_STATUS.FREE: reason = "Free"; break; case RADIO_STATUS.GroupCall_INIT: reason = "GroupCall"; break; case RADIO_STATUS.GroupCall_INPROGRES: reason = "GroupCall"; break; case RADIO_STATUS.HangTime: reason = "HangTime"; break; case RADIO_STATUS.OFF: reason = "OFF"; break; case RADIO_STATUS.PrivateCall_INIT: reason = "Priv. Call"; break; case RADIO_STATUS.PrivateCall_INPROGRES: reason = "Priv. Call"; break; case RADIO_STATUS.RemoteMonitor: reason = "RM"; break; case RADIO_STATUS.RemoteMonitor_INPROGRES: reason = "RM"; break; } break; case 122: Handle122Command(IdVOL); break; case 221: if (IdVOL == 1) { PTTinprogres = true; RecivedData = true; ConfirmPTT_and_Start_Voice(); } else { pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); PTTinprogres = false; //RecivedData = false; //receive data false ideea e ca daca aveam doua calluri simultan si unul se inchidea, daca pe celalalt il puneam pe principal nu mai venea voce //pentru ca exista un singur receive data RecivedData = MainForm2.PriorityIP != ""; } break; case 211: PTTinprogres = false; //RecivedData = false; RecivedData = MainForm2.PriorityIP != ""; //uniqueCallForm.Close(); //uniqueCallForm = null; if (callFormContainer.ContainsKey(PersonalIP) && callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); #region call patching if (patchDictionary.ContainsKey("Dispatcher." + IdVOL)) EndCallPatch("Dispatcher", "Dispatcher." + IdVOL, IdVOL.ToString()); #endregion } break; case 201: string idtmp = ""; if (MainForm2.userIDHash[IdVOL] != null) { idtmp = (string)MainForm2.userIDHash[IdVOL]; if ((idtmp != null) && (idtmp != "")) { if (idtmp.Length > 17) { idtmp = idtmp.Remove(17); idtmp += "..."; } } else idtmp = IdVOL.ToString(); } else idtmp = IdVOL.ToString(); if (MainForm2.userIDHash[IdVOL] != null) { string id2 = (string)MainForm2.userIDHash[IdVOL]; //field_subscriber_making_the_call = new Subscriber() //{ // DispatcherName = id2, // SubscriberType = SubscriberType.DISPATCHER, // ImageKey = "i_classic_bus_02", // IconFilePath = MainForm2.GetIconPathForUnit(id2), // IP = String.Format("224.20.{0}.1", IdVOL), // Imei = IdVOL.ToString(), // Favorite = false //}; } //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; //} if (!callFormContainer.ContainsKey(PersonalIP)) { callFormContainer.Add(PersonalIP, null); } else { if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); } } if (rcbBubble.Checked) { //uniqueCallForm = new CallsForm(IdVOL, idtmp, 0, 201, 4); //uniqueCallForm.OnHeadset_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2) GetAvailablePosition(); callFormContainer[PersonalIP] = new CallsForm(IdVOL, idtmp, 0, 201, 4, PersonalIP); callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"), GetRadioGatewayForSubscriber(IdVOL)?.Name); callFormContainer[PersonalIP].GatewayName = GetRadioGatewayForSubscriber(IdVOL)?.Name; callFormContainer[PersonalIP].SetMute(MainForm2.PriorityIP == ""); if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = PersonalIP; callFormContainer[PersonalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { // user wants to mute the sound from this user if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP) callFormContainer[MainForm2.PriorityIP].SetMute(false); if (MainForm2.PriorityIP != e2.IP) MainForm2.PriorityIP = e2.IP; else MainForm2.PriorityIP = ""; }; callFormContainer[PersonalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef) { // on form closing event if (((CallsForm)s)._IP == MainForm2.PriorityIP) { MainForm2.PriorityIP = ""; } }; //uniqueCallForm.OnPlay_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2) callFormContainer[PersonalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey) sendDekey(); else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call) sendCallStop(e2.IMEI); else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT)) { String Ip = e2.IP; if (e2.SubsType != SubscriberType.DISPATCHER) Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID); Subscriber tmpsub = new Subscriber { DispatcherName = e2.CallerName, SubscriberType = e2.SubsType, Sc_id = 0, Imei = e2.IMEI, Gw_and_radioID = Valid_GwID_and_RadioID, IP = Ip, Favorite = false, canMakeSipCalls = !e2.IP.Contains("224.") }; if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true); else StopPTT(tmpsub); } }; //uniqueCallForm.Show(); callFormContainer[PersonalIP].Show(); } RecivedData = true; #region call patching //if (patchDictionary.ContainsKey("Dispatcher." + IdVOL)) // StartCallPatch("Dispatcher", "Dispatcher." + IdVOL, IdVOL.ToString()); #endregion break; case 162: if (IdVOL == 1) { string id = "";// just protect to manual dial if (MainForm2.VehIMEIHash[selected_Subscriber.Imei] != null) { id = (string)MainForm2.VehIMEIHash[selected_Subscriber.Imei]; if ((id != null) && (id != "")) { if (id.Length > 17) { id = id.Remove(17); id += "..."; } } else id = selected_Subscriber.Imei; } else id = selected_Subscriber.Imei; //if (MainForm2.VehIMEIHash[selected_Subscriber.Imei] != null) //{ // id = (string)MainForm2.VehIMEIHash[selected_Subscriber.Imei]; // //((Vehicle)MainForm2.vehicleHT[name]).CheckPositionInSystem(); // field_subscriber_making_the_call = new Subscriber() // { // DispatcherName = id, // SubscriberType = SubscriberType.SUBSCRIBER, // ImageKey = "i_classic_bus_02", // IconFilePath = MainForm2.GetIconPathForUnit(id), // Sc_id = ((Vehicle)MainForm2.vehicleHT[id]).sc_id, // Imei = ((Vehicle)MainForm2.vehicleHT[id]).IMEI, // Gw_and_radioID = Valid_GwID_and_RadioID, // IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), // Favorite = false // }; //} //else //{ // field_subscriber_making_the_call = new Subscriber() // { // DispatcherName = selected_Subscriber.Imei, // SubscriberType = SubscriberType.SUBSCRIBER, // ImageKey = "i_classic_bus_02", // IconFilePath = MainForm2.GetIconPathForUnit(selected_Subscriber.Imei), // Sc_id = 0, // Imei = selected_Subscriber.Imei, // Gw_and_radioID = Valid_GwID_and_RadioID, // IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), // Favorite = false // }; //} //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; //} if (!callFormContainer.ContainsKey(PersonalIP)) { callFormContainer.Add(PersonalIP, null); } else { if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); } } if (rcbBubble.Checked) { //uniqueCallForm = new CallsForm(Convert.ToInt64(selected_Subscriber.Imei), id, grpIDVOL, 162, callStatusVOL); //uniqueCallForm.OnHeadset_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2) GetAvailablePosition(); callFormContainer[PersonalIP] = new CallsForm(Convert.ToInt64(selected_Subscriber.Imei), id, grpIDVOL, 162, callStatusVOL, PersonalIP); callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"), GetRadioGatewayForSubscriber(IdVOL)?.Name); callFormContainer[PersonalIP].GatewayName = GetRadioGatewayForSubscriber(IdVOL)?.Name; callFormContainer[PersonalIP].SetMute(MainForm2.PriorityIP == ""); if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = PersonalIP; callFormContainer[PersonalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { // user wants to mute the sound from this user if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP) callFormContainer[MainForm2.PriorityIP].SetMute(false); if (MainForm2.PriorityIP != e2.IP) MainForm2.PriorityIP = e2.IP; else MainForm2.PriorityIP = ""; }; callFormContainer[PersonalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef) { // on form closing event if (((CallsForm)s)._IP == MainForm2.PriorityIP) { MainForm2.PriorityIP = ""; } }; //uniqueCallForm.OnPlay_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2) callFormContainer[PersonalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey) sendDekey(); else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call) sendCallStop(e2.IMEI); else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT)) { String Ip = e2.IP; if (e2.SubsType != SubscriberType.DISPATCHER) Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID); Subscriber tmpsub = new Subscriber { DispatcherName = e2.CallerName, SubscriberType = e2.SubsType, Sc_id = 0, Imei = e2.IMEI, Gw_and_radioID = Valid_GwID_and_RadioID, IP = Ip, Favorite = false, canMakeSipCalls = !e2.IP.Contains("224.") }; if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true); else StopPTT(tmpsub); } }; //uniqueCallForm.Show(); callFormContainer[PersonalIP].Show(); } } else if (IdVOL == 2) { //SMSAlert RemoteMonitorDesktopAlert.FixedSize = new System.Drawing.Size(329, 120); RemoteMonitorDesktopAlert.ContentImage = global::Dispatcher.Properties.Resources.remmonitor24x20; String html_message = "" + MainForm2.returnLNGString("rem") + ": " + selected_Subscriber.DispatcherName + " "; RemoteMonitorDesktopAlert.ContentText = "" + html_message + ""; // mesajul din interior editat cu html String title = MainForm2.returnLNGString("remfail"); RemoteMonitorDesktopAlert.CaptionText = title; //SMSDesktopAlert.ContentText = (e.UserState as String); RemoteMonitorDesktopAlert.Show(); } break; case 172: //RecivedData = false; RecivedData = MainForm2.PriorityIP != ""; //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; //} if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); } break; case 222: //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; //} if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); } break; case 123: /* if (IdVOL == 1) { PTTinprogres = true; ConfirmPTT_and_Start_Voice(); } else { // ADY if we put other image for call rejected pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); PTTinprogres = false; PTTclicked = false; } ResponsePTT = true; */ Handle123Command(IdVOL); break; case 125: callStatusVOL = (e.UserState as transfer125).callStatus; callTypeVOL = (e.UserState as transfer125).callType; grpIDVOL = (e.UserState as transfer125).grpID; String gwID = (e.UserState as transfer125).gwID; String radioGwID = (e.UserState as transfer125).radioGwID; Int64 IdVOLx = (e.UserState as transfer125).intvalID; Handle125Command(gwID, radioGwID, callStatusVOL, callTypeVOL, grpIDVOL, IdVOLx); break; } } catch (Exception ex) { SM.Debug("Error processmessage on radio:" + ex.ToString()); } } private void Handle122Command(int result) { Utils.WriteLine($"RadioTab Handle122Command {result}", ConsoleColor.Cyan); if (result == 1) { PTTinprogres = true; ConfirmPTT_and_Start_Voice(); try { if (MainForm2.vehicleHT.Contains(selected_Subscriber.DispatcherName)) ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).EventLists.Add(new Alarms(rep_type.CALLSEND, DateTime.Now, "", "")); //FirstTimePriv = DateTime.Now; } catch (Exception ex) { SM.Debug("Erorr adding 122:" + ex.ToString()); } } else { // ADY if we put other image for call rejected pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1500, System.Threading.Timeout.Infinite); PTTinprogres = false; } ResponsePTT = true; } private void Handle123Command(int result) { Utils.WriteLine($"RadioTab Handle123Command {result}", ConsoleColor.Cyan); if (result == 1) { PTTinprogres = true; ConfirmPTT_and_Start_Voice(); } else { // ADY if we put other image for call rejected pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end; System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite); PTTinprogres = false; } ResponsePTT = true; } private RadioGateway GetRadioGatewayForSubscriber(Int64 radioID) { RadioGateway result = null; if (MainForm2.VehIMEIHash[radioID.ToString()] != null) { if (MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]] != null) { ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]]).CheckPositionInSystem(); GatewayAndRadioID = ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]]).GwandRadioID; if (MainForm2.radioGwHT[GatewayAndRadioID] != null) { result = ((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]); } } } return result; } public void OnRadioGatewayStateChanged(RadioGateway gateway, RadioState state) { if (this.InvokeRequired) { this.Invoke((MethodInvoker)delegate { OnRadioGatewayStateChanged(gateway, state); }); } else { rlvGatewayStatus.BeginUpdate(); RadioGateway rg = radiogateways.Find(d => d.Name.Equals(gateway.Name)); if(rg != null) rg.State1 = state; rlvGatewayStatus.EndUpdate(); } } private static readonly object lockerIP = new object(); /// /// Handles 125 command in RadioTab /// /// The State of the call: 1 - Initiated, 2 - HangTime, 3 - Ended /// The type of the call: 101 - All Call, 102 - Private Call, 103 - Group Call, 104 - Emergency Call /// The ID of the field or group which received the call /// The ID of the radio which initiated the call private void Handle125Command(String gwId, String radioGWId, int callStatus, int callType, int targetID, long sourceRadioID, ContactType sourceType = ContactType.UNIT) { //Utils.WriteLine($"Received CallStatus Update : {callStatus} | {callType} | {targetID} | {sourceRadioID} || {sourceType}", ConsoleColor.Yellow); RadioGateway rg = null; if (MainForm2.radioGwHT.ContainsKey(gwId+"." + radioGWId)) rg = ((RadioGateway)MainForm2.radioGwHT[gwId + "." + radioGWId]); if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) { if (MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]] != null) { ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).CheckPositionInSystem(); GatewayAndRadioID = ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).GwandRadioID; if (MainForm2.radioGwHT[GatewayAndRadioID] != null) { if (((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]).Type == (int)GatewayType.Broadband || ((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]).Type == (int)GatewayType.Tier3Radio) { if (callTypeVOL == 102 && MainForm2.userIDX != grpIDVOL) { return; } } } } } // Call initiated if (!startReceivedDict.ContainsKey(sourceRadioID)) startReceivedDict.Add(sourceRadioID, false); if (callStatusVOL == 1) { try { //if (!Startrecevied) if (startReceivedDict[sourceRadioID] == false) { try { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("CallStat:" + callStatusVOL + " calltype:" + callTypeVOL + " grpID:" + grpIDVOL); Console.ResetColor(); string id = ""; if (sourceType == ContactType.UNIT) { if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) // Check if source radio id is a unit { id = (string)MainForm2.VehIMEIHash[sourceRadioID.ToString()]; if ((id != null) && (id != "")) { if (id.Length > 17) { id = id.Remove(17); id += "..."; } } else id = sourceRadioID.ToString(); } else id = sourceRadioID.ToString(); } else if (sourceType == ContactType.USER) { if (MainForm2.userIDHash.ContainsKey((int)sourceRadioID)) // check if source radio id is a dispatcher (for sip group calls) { id = MainForm2.userIDHash[(int)sourceRadioID].ToString(); } else id = sourceRadioID.ToString(); } else id = sourceRadioID.ToString(); /*lbIDValue.Text = id; lbStatus.Text = id; if (callTypeVOL == 101) lbChanel.Text = rbAllCall.Text; else if (callTypeVOL == 103) lbChanel.Text = rbGroupCall.Text + " (" + grpIDVOL + ")"; else if (callTypeVOL == 102) lbChanel.Text = rbPrivateCall.Text; if (callTypeVOL == 101) rbAllCall.IsChecked = true; else if (callTypeVOL == 103) { rbGroupCall.IsChecked = true; tbGroupCallId.Text = grpIDVOL.ToString(); } else if (callTypeVOL == 102) { rbPrivateCall.IsChecked = true; tbPrivateCallId.Text = IdVOLx.ToString(); } else rbAllCall.IsChecked = true; // add new for bug858 rbAllCall.Enabled = false; rbGroupCall.Enabled = false; rbPrivateCall.Enabled = false;*/ //field_subscriber_making_the_call = new Subscriber(); //if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) //{ // id = (string)MainForm2.VehIMEIHash[sourceRadioID.ToString()]; // field_subscriber_making_the_call = new Subscriber() // { // DispatcherName = id, // SubscriberType = SubscriberType.SUBSCRIBER, // ImageKey = "i_classic_bus_02", // Sc_id = ((Vehicle)MainForm2.vehicleHT[id]).sc_id, // Imei = ((Vehicle)MainForm2.vehicleHT[id]).IMEI, // IconFilePath = MainForm2.GetIconPathForUnit(id), // Gw_and_radioID = Valid_GwID_and_RadioID, // IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), // Favorite = false // }; //} //else //{ // field_subscriber_making_the_call = new Subscriber() // { // DispatcherName = sourceRadioID.ToString(), // SubscriberType = SubscriberType.SUBSCRIBER, // ImageKey = "i_classic_bus_02", // Sc_id = 0, // IconFilePath = MainForm2.GetIconPathForUnit(sourceRadioID.ToString()), // Imei = sourceRadioID.ToString(), // Gw_and_radioID = Valid_GwID_and_RadioID, // IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID), // Favorite = false // }; //} //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; //} if (!callFormContainer.ContainsKey(PersonalIP)) { callFormContainer.Add(PersonalIP, null); } else { if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); } } if (rcbBubble.Checked) { //uniqueCallForm = new CallsForm(sourceRadioID, id, grpIDVOL, callTypeVOL, callStatusVOL); //uniqueCallForm.OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) GetAvailablePosition(); //check if radio is in emergency and isn't another emergency call in progress if (MainForm2.vehicleHT.ContainsKey(id)) { if (((Vehicle)MainForm2.vehicleHT[id]).is_emergency && PriorityEmergency.Count == 0) { if (MainForm2.PriorityIP != "") callFormContainer[MainForm2.PriorityIP].SetMute(false); MainForm2.PriorityIP = ""; PriorityEmergency.Add(id, true); } } string personalIP = PersonalIP; callFormContainer[personalIP] = new CallsForm(sourceRadioID, id, grpIDVOL, callTypeVOL, callStatusVOL, personalIP); callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"), rg?.Name); callFormContainer[PersonalIP].GatewayName = rg?.Name; callFormContainer[personalIP].SetMute(MainForm2.PriorityIP == ""); if (MainForm2.vehicleHT.ContainsKey(id)) { if (((Vehicle)MainForm2.vehicleHT[id]).is_emergency) { callFormContainer[personalIP].SetEmergencyColorBackground(); } } if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = personalIP; // Check if is sip call bool isSipCall = false; int sipID; if (int.TryParse(personalIP, out sipID)) { isSipCall = true; } callFormContainer[personalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { // user wants to mute the sound from this user if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP) callFormContainer[MainForm2.PriorityIP].SetMute(false); if (MainForm2.PriorityIP != e2.IP) MainForm2.PriorityIP = e2.IP; else MainForm2.PriorityIP = ""; PriorityEmergency = new Dictionary(); }; callFormContainer[personalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef) { // on form closing event if (((CallsForm)s)._IP == MainForm2.PriorityIP) { MainForm2.PriorityIP = ""; } if (PriorityEmergency.Count > 0) { if (PriorityEmergency.ContainsKey(((CallsForm)s).name)) PriorityEmergency = new Dictionary(); } }; //uniqueCallForm.OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) callFormContainer[personalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2) { if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey) { // Check if is sip call if (isSipCall) { // Dekey for linx call CloseSipCall(id); } else sendDekey(); } else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call) { if (isSipCall) { // Make dekey CloseSipCall(id); } else sendCallStop(e2.IMEI); } else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT)) { Valid_GwID_and_RadioID = responseGW; String Ip = e2.IP; if (e2.SubsType != SubscriberType.DISPATCHER) Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID); Subscriber tmpsub = new Subscriber { DispatcherName = e2.CallerName, SubscriberType = e2.SubsType, Sc_id = 0, Imei = e2.IMEI, Gw_and_radioID = Valid_GwID_and_RadioID, IP = Ip, Favorite = false, canMakeSipCalls = !e2.IP.Contains("224."), SipID = e2.SubsType == SubscriberType.SUBSCRIBER ? ((Vehicle)MainForm2.vehicleHT[id]).sipID : ( MainForm2.GroupCPSIDOnlyHashWithoutCategory.ContainsKey(e2.IMEI + Valid_GwID_and_RadioID) ? MainForm2.GroupCPSIDOnlyHashWithoutCategory[e2.IMEI + Valid_GwID_and_RadioID].SipID : -1 ) }; if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true); else StopPTT(tmpsub); } }; //uniqueCallForm.Show(); callFormContainer[personalIP].Show(); } RecivedData = true; voltmpx = null; if ((MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) && (((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]) != null)) { foreach (Alarms obj in ((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists) if (obj.type == rep_type.CALLRECIVE) voltmpx = obj; if ((voltmpx != null) && (voltmpx.descript == "")) ((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists.Remove(voltmpx); ((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists.Add(new Alarms(rep_type.CALLRECIVE, DateTime.Now, "", "")); } } catch (Exception ex) { SM.Debug("Erorr adding 125:" + ex.ToString()); } } } catch (Exception ex) { SM.Debug("Error on 125 with status 1 (begin call):" + ex.ToString()); } //Startrecevied = true; startReceivedDict[sourceRadioID] = true; if (patchDictionary.ContainsKey("Gateway." + responseGW)) StartCallPatch("Gateway", "Gateway." + responseGW, responseGW); } else { try { //if (Startrecevied) if (startReceivedDict[sourceRadioID] == true) { } } catch (Exception ex) { SM.Debug("Error on 125 with status 2 or 3 (end call or hang time):" + ex.ToString()); } //Startrecevied = false; startReceivedDict[sourceRadioID] = false; if (callStatusVOL == 2) { //RecivedData = false; RecivedData = MainForm2.PriorityIP != ""; //if (uniqueCallForm != null) // uniqueCallForm.UpdateCallStatus(callStatusVOL); if (callFormContainer.ContainsKey(PersonalIP)) { if (callFormContainer[PersonalIP] != null) callFormContainer[PersonalIP].UpdateCallStatus(callStatusVOL); } } else if (callStatusVOL == 3) { RecivedData = false; RecivedData = MainForm2.PriorityIP != ""; //if (uniqueCallForm != null) //{ // uniqueCallForm.Close(); // uniqueCallForm = null; // field_subscriber_making_the_call = null; //} if (callFormContainer.ContainsKey(PersonalIP)) { if (callFormContainer[PersonalIP] != null) { if (callFormContainer[PersonalIP].RequestForClosing()) callFormContainer[PersonalIP] = null; //RearrangeCallForm(); //field_subscriber_making_the_call = null; } } if (patchDictionary.ContainsKey("Gateway." + responseGW)) { if (runningPatches.Contains(responseGW)) EndCallPatch("Gateway", "Gateway." + responseGW, responseGW); } } // if (tclose125 != null) // tclose125.Dispose(); } } public volatile ArrayList WatchList = new ArrayList(); public volatile ArrayList ClearList = new ArrayList(); private volatile Boolean proces124 = false; private volatile Boolean proces125 = false; private volatile Boolean proces111or112or113 = false; private volatile Boolean proces111or112or113FALSE = false; private volatile Boolean proces121or122or123 = false; private volatile Boolean proces101or102or103 = false; private volatile Boolean procesReport = true; private volatile Int32 Idproces = 0; private volatile Int32 Limitsend = 0; private volatile Int32 X = 0; private volatile String volSTR = ""; public volatile transfer125 tmptransVOL = null; long Computation(BackgroundWorker worker, DoWorkEventArgs e) { while (MainForm2.isRunning) { try { proces124 = false; proces125 = false; proces111or112or113 = false; proces111or112or113FALSE = false; proces121or122or123 = false; proces101or102or103 = false; Idproces = 0; lock (this) { X = 0; while (X < WatchList.Count) { //SM.Debug("in comands " + myIP); volSTR = (String)WatchList[X]; if (mainparent.Listcmd[volSTR] == null) ClearList.Add(volSTR); else { if (!((TimerAndResp)mainparent.Listcmd[volSTR]).wait) { if (((TimerAndResp)mainparent.Listcmd[volSTR]).Respose) { Int32 tmp = (Int32)((TimerAndResp)mainparent.Listcmd[volSTR]).intval * 1000 + ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID; if (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 125) { tmp = 0 * 1000 + ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID; tmptransVOL = new transfer125(((TimerAndResp)mainparent.Listcmd[volSTR]).callStatus, ((TimerAndResp)mainparent.Listcmd[volSTR]).callType, ((TimerAndResp)mainparent.Listcmd[volSTR]).GrpID, ((TimerAndResp)mainparent.Listcmd[volSTR]).intval); tmptransVOL.gwID = ((TimerAndResp)mainparent.Listcmd[volSTR]).gwID; tmptransVOL.radioGwID = ((TimerAndResp)mainparent.Listcmd[volSTR]).radioGwID; proces125 = true; } //displayStat if (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 124) { proces124 = true; Limitsend = 0; } if ((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 120) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 124)) { proces121or122or123 = true; Limitsend = 0; } procesReport = true; if ((tmp > 2114) && (tmp < 2118)) { if (tmp == 2115) Idproces = 111; else if (tmp == 2116) Idproces = 112; else Idproces = 113; Limitsend++; proces111or112or113FALSE = true; procesReport = false; } if (procesReport) { if (!proces125) worker.ReportProgress(tmp); else worker.ReportProgress(tmp, tmptransVOL); } } else { if (((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 110) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 114)) || (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 104) || (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 161)) { proces111or112or113 = true; Idproces = ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID; } if (((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 100) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 104))) { proces101or102or103 = true; //Idproces = ((TimerAndResp)mainparent.Listcmd[obj]).typeID; } } mainparent.Listcmd.Remove(volSTR); ClearList.Add(volSTR); /* if ((FirstChanle00) && !proces124) { worker.ReportProgress(1999);//sc_id =1 (fake) si comanda 999 isON = false; FirstChanle00 = false; }*/ } } X++; } } foreach (String obj in ClearList) WatchList.Remove(obj); ClearList.Clear(); // ciudat remove 104 pentru care a venit 124 String tmpIdtoRemove = ""; if (proces124) { foreach (String obj in WatchList) if (((TimerAndResp)mainparent.Listcmd[obj]).typeID == 104) { tmpIdtoRemove = obj; break; } if (tmpIdtoRemove != "") WatchList.Remove(tmpIdtoRemove); } //SM.Debug("Value for proces121or122or123:" + proces121or122or123 + " and OUTBEFORE:"+OUTBEFORE); //if ((proces121or122or123) && (OUTBEFORE)) callStopProcedure(true); if (proces101or102or103) worker.ReportProgress(1115); if (proces111or112or113 || proces111or112or113FALSE) { if (Limitsend < 6) { if (Idproces == 111) { if (proces111or112or113) ;//Stop_PTT(String.Format("224.20.{0}.1", MainForm2.userIDX)); else { WatchList.Add(mainparent.Send_delay(String.Format("#111#{0}#{1}#", selected_Subscriber.Gw_and_radioID, selected_Subscriber.IP), 3000, 111, 3000)); } } else if (Idproces == 112) { //prevent resending private excera doesn't have gateway //if (MainForm2.radioType == RADIOTYPE.EXCERA) // return 0; String Totrans = "#112#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; if (proces111or112or113) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112)); else WatchList.Add(mainparent.Send_delay(Totrans, 3000, 112, 3000)); } else if (Idproces == 113) { //prevent resending private excera doesn't have gateway //if (MainForm2.radioType == RADIOTYPE.EXCERA) // return 0; String Totrans = "#113#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#"; if (proces111or112or113) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113)); else WatchList.Add(mainparent.Send_delay(Totrans, 3000, 113, 3000)); } else if (Idproces == 161) { worker.ReportProgress(1998);//sc_id =1 (fake) si comanda 999 } Limitsend++; } else //station come back to normal state { worker.ReportProgress(1999);//sc_id =1 (fake) si comanda 999 } } } catch (Exception ex) { SM.Debug("Error on radio list" + ex.ToString()); } Thread.Sleep(10); if (MainForm2.ClosingApp) { SM.Debug("ComputMess Voice: CancellationPending in Radio: "); e.Cancel = true; return 1; } } return 0; } #endregion #region STYLE UI ELEMENTS private void listSubscribers_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e) { if (e.VisualItem is IconListViewVisualItem) { //Utils.WriteLine("listSubscribers_VisualItemCreating"); e.VisualItem = new SubscriberVisualListItem(); ((SubscriberVisualListItem)e.VisualItem).OnFavorite_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee) { Utils.WriteLine("Fav is " + ee.subscriber.DispatcherName + " | " + ee.isActive); if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER) { // update isFavorite Value if (MainForm2.VehIMEIHash.ContainsKey(ee.subscriber.Sc_id + "")) (((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[ee.subscriber.Sc_id + ""]])).is_favorite = ee.isActive; // add to hash the new value for isFavorite VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.Sc_id + "", ee.isActive + ""); } else { // add to hash the new value for isFavorite //am pus variabila add pentru cazul in care am doua grupuri pe doua gatewayuri diferite cu acelasi imei string add = ee.subscriber.SubscriberType == SubscriberType.GROUP ? ee.subscriber.Gw_and_radioID : "_" + ee.subscriber.DispatcherName; VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.SubscriberType.ToString() + "_" + ee.subscriber.Imei + add + "", ee.isActive + ""); } ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber); if (item != null) { listViewSubscribers.BeginUpdate(); Subscriber sub = (item.DataBoundItem as Subscriber); sub.Favorite = ee.isActive; sub.NrOfUpdates++; listViewSubscribers.EndUpdate(); } //listFavorites.DataSource = subscribersList; FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true); listFavorites.FilterDescriptors.Remove("Favorite"); listFavorites.FilterDescriptors.Add(valueFilter); }; ((SubscriberVisualListItem)e.VisualItem).OnTextSend_Req += delegate (object s, SubscriberVisualListItem.TextSendEventArgs ee) { //Utils.WriteLine("Text is " + ee.subscriber.DispatcherName + " | " + ee.text); //String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#"; //String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#" + // MainForm2.userIDX + "#"; ////((MainForm2)(this.Parent)).Send_UDP_cmd(Totrans, 0, 0); //mainparent.Send_UDP_cmd(Totrans, 0, 0); //mainparent.DisplayToast(MainForm2.returnLNGString("txtMsgTo") + " " + ee.subscriber.DispatcherName, string.Format(MainForm2.returnLNGString("msgHTML"), ee.text)); if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER) parent.SendSmsOnMBus(ee.text, ee.subscriber.Sc_id, (int)DateTime.Now.ToUniversalTime().DateTo70Format()); else if (ee.subscriber.SubscriberType == SubscriberType.GROUP) { //Group grp = ((Group)MainForm2.TalkGroups[0]); parent.SendSMSGroup(ee.text, ee.subscriber.Id, 0, ee.subscriber.DispatcherName); } }; ((SubscriberVisualListItem)e.VisualItem).OnRemote_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee) { //Utils.WriteLine("Remote is " + ee.subscriber.DispatcherName + " | " + ee.isActive); sendRemoteMOnitor(ee.subscriber); mainparent.DisplayToast(MainForm2.returnLNGString("Remotemonitorfor") + " " + ee.subscriber.DispatcherName, MainForm2.returnLNGString("remoteMonitorHTML")); }; } } private void listSubscribers_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e) { // write the gateway name to the topRight element if (e.VisualItem is SubscriberVisualListItem && e.VisualItem.Data.DataBoundItem is Subscriber) (e.VisualItem as SubscriberVisualListItem).topRightElement.Text = (e.VisualItem.Data.DataBoundItem as Subscriber).GatewayName; //Utils.WriteLine("listSubscribers_VisualItemFormatting"); if (e.VisualItem.Selected) { e.VisualItem.DrawFill = true; e.VisualItem.BackColor = MainForm2.GridSelectedRow; e.VisualItem.NumberOfColors = 1; } else e.VisualItem.DrawFill = false; GroupDescriptor descriptor = null; if ((descriptor = listViewSubscribers.GroupDescriptors[0]) != null) { if (descriptor.Expression.Contains("Online")) { BaseListViewGroupVisualItem groupItem = e.VisualItem as BaseListViewGroupVisualItem; if (groupItem != null) { groupItem.Font = new Font("Segoe UI", 10f, FontStyle.Bold); groupItem.ForeColor = Color.Black; groupItem.Text = (groupItem.Data.Text.ToLower().Equals("true") ? "Online" : "Offline") + " [" + ((ListViewDataItemGroup)groupItem.Data).Items.Count + "]"; } } else if (descriptor.Expression.Contains("SubscriberTypeRegion")) { BaseListViewGroupVisualItem groupItem = e.VisualItem as BaseListViewGroupVisualItem; if (groupItem != null) { groupItem.Font = new Font("Segoe UI", 10f, FontStyle.Bold); groupItem.ForeColor = Color.Black; groupItem.Text = (groupItem.Data.Text) + " [" + ((ListViewDataItemGroup)groupItem.Data).Items.Count + "]"; } } } } private void listFavorites_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e) { if (e.VisualItem is IconListViewVisualItem) { e.VisualItem = new SubscriberVisualListItem(); ((SubscriberVisualListItem)e.VisualItem).OnFavorite_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee) { Utils.WriteLine("Fav is " + ee.subscriber.DispatcherName + " | " + ee.isActive); if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER) { if (MainForm2.VehIMEIHash.ContainsKey(ee.subscriber.Imei + "")) { (((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[ee.subscriber.Imei + ""]])).is_favorite = ee.isActive; } // add to hash the new value for isFavorite VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.Sc_id + "", ee.isActive + ""); //????///VisualSettings.InsertUpdateHTforVisualItems("onMap", ee.subscriber.Sc_id + "", ee.isActive + ""); } else { // add to hash the new value for isFavorite //am pus variabila add pentru cazul in care am doua grupuri pe doua gatewayuri diferite cu acelasi imei string add = ee.subscriber.SubscriberType == SubscriberType.GROUP ? ee.subscriber.Gw_and_radioID : "_" + ee.subscriber.DispatcherName; VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.SubscriberType.ToString() + "_" + ee.subscriber.Imei + add + "", ee.isActive + ""); } /* ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber); if (item != null) { Subscriber sub = (item.DataBoundItem as Subscriber); sub.Favorite = ee.isActive; sub.NrOfUpdates = sub.NrOfUpdates + 1; } */ ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber); if (item != null) { listViewSubscribers.BeginUpdate(); Subscriber sub = (item.DataBoundItem as Subscriber); sub.Favorite = ee.isActive; sub.NrOfUpdates++; listViewSubscribers.EndUpdate(); } //listFavorites.DataSource = subscribersList; FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true); listFavorites.FilterDescriptors.Clear(); listFavorites.FilterDescriptors.Add(valueFilter); }; ((SubscriberVisualListItem)e.VisualItem).OnTextSend_Req += delegate (object s, SubscriberVisualListItem.TextSendEventArgs ee) { //Utils.WriteLine("Text is " + ee.subscriber.DispatcherName + " | " + ee.text); //String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#"; //String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#" + // MainForm2.userIDX + "#"; ////((MainForm2)(this.Parent)).Send_UDP_cmd(Totrans, 0, 0); //mainparent.Send_UDP_cmd(Totrans, 0, 0); //mainparent.DisplayToast(MainForm2.returnLNGString("txtMsgTo") + ee.subscriber.DispatcherName, string.Format(MainForm2.returnLNGString("msgHTML"), ee.text)); mainparent.SendSmsOnMBus(ee.text, ee.subscriber.Sc_id, (int)DateTime.Now.ToUniversalTime().DateTo70Format()); }; ((SubscriberVisualListItem)e.VisualItem).OnRemote_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee) { // Utils.WriteLine("Remote is " + ee.subscriber.DispatcherName + " | " + ee.isActive); sendRemoteMOnitor(ee.subscriber); mainparent.DisplayToast(MainForm2.returnLNGString("Remotemonitorfor") + " " + ee.subscriber.DispatcherName, MainForm2.returnLNGString("remoteMonitorHTML")); }; } } private void listFavorites_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e) { // write the gateway name to the topRight element if (e.VisualItem is SubscriberVisualListItem && e.VisualItem.Data.DataBoundItem is Subscriber) (e.VisualItem as SubscriberVisualListItem).topRightElement.Text = (e.VisualItem.Data.DataBoundItem as Subscriber).GatewayName; if (e.VisualItem.Selected) { e.VisualItem.DrawFill = true; e.VisualItem.BackColor = MainForm2.GridSelectedRow; e.VisualItem.NumberOfColors = 1; } else e.VisualItem.DrawFill = false; } private void rlvGatewayStatus_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e) { if (e.VisualItem is IconListViewVisualItem) { e.VisualItem = new RadioGatewayStatusVisualItem(); } } private void rlvGatewayStatus_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e) { if (e.VisualItem.Selected) { e.VisualItem.DrawFill = false; e.VisualItem.BackColor = MainForm2.GridSelectedRow; e.VisualItem.NumberOfColors = 1; } else e.VisualItem.DrawFill = false; } #endregion /// /// Change fore color and background color for the export button when its state changes /// private void btRecordingsList_EnabledChanged(object sender, EventArgs e) { if (btRecordingsList.Enabled) { btRecordingsList.ButtonElement.ButtonFillElement.BackColor = Color.White; btRecordingsList.ButtonElement.TextElement.ForeColor = MainForm2.ButtonColor; } else { btRecordingsList.ButtonElement.ButtonFillElement.BackColor = Color.WhiteSmoke; btRecordingsList.ButtonElement.TextElement.ForeColor = Color.Gray; } } /// /// Handles the picture box click for simulating a checkbox and to /// enable/disable other panels /// private Image themeUnit_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.filter_user_black, MainForm2.ButtonColor); private Image themeCallType_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.filter_type_black, MainForm2.ButtonColor); private Image theme24H_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.h_24h, MainForm2.ButtonColor); private Image themePlay_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.r_play, MainForm2.ButtonColor); private void pbEnableDisable_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbUnit) { if (pbUnit.Tag.Equals("disabled")) { pbUnit.Tag = "enabled"; pbUnit.Image = themeUnit_Image; rcbUnit.Enabled = true; ckUnit.Checked = true; } else { pbUnit.Tag = "disabled"; pbUnit.Image = Dispatcher.Properties.Resources.filter_user_grey; rcbUnit.Enabled = false; ckUnit.Checked = false; } // force the remove of the filters rcbUnit_ItemCheckedChanged(rcbCallType, null); } else if ((PictureBox)sender == pbCallType) { if (pbCallType.Tag.Equals("disabled")) { pbCallType.Tag = "enabled"; pbCallType.Image = themeCallType_Image; rcbCallType.Enabled = true; ckCallType.Checked = true; } else { pbCallType.Tag = "disabled"; pbCallType.Image = Dispatcher.Properties.Resources.filter_type_grey; rcbCallType.Enabled = false; ckCallType.Checked = false; } // force the remove of the filters rcbCallType_ItemCheckedChanged(rcbCallType, null); } else if ((PictureBox)sender == pb24H) { if (pb24H.Tag.Equals("enabled")) { pb24H.Tag = "disabled"; rdpEndTime.Enabled = true; rdpStartTime.Enabled = true; pb24H.Image = global::Dispatcher.Properties.Resources.h_24h_w; } else if (pb24H.Tag.Equals("disabled")) { pb24H.Tag = "enabled"; rdpEndTime.Enabled = false; rdpStartTime.Enabled = false; pb24H.Image = theme24H_Image; } // filter the grid for 24 hours or not TimeFilter(pb24H.Tag.Equals("enabled")); } } /// /// filter recordings based on the selected units /// private void rcbUnit_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { // clear all units filters gridRecordings.FilterDescriptors.Remove("From"); gridRecordings.FilterDescriptors.Remove("To"); // do not add filter if the filter is not active if (!rcbUnit.Enabled) { // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); return; } // add filters only if selected unit if (rcbUnit.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic List selectedItems = new List(); // for each selected unit add a custom filedescriptor foreach (RadListDataItem item in rcbUnit.CheckedItems) { selectedItems.Add(item.Text.ToString()); } // add filter CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); for (int i = 0; i < selectedItems.Count; i++) { statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("From", FilterOperator.Contains, selectedItems[i])); statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("To", FilterOperator.Contains, selectedItems[i])); } statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; this.gridRecordings.FilterDescriptors.Add(statusDescriptor); // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); } } /// /// filter recordings based on the selected call types /// private void rcbCallType_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { try { // clear all call types filters gridRecordings.FilterDescriptors.Remove("CallTypeDirectionFilter"); // do not add filters if the picture box is inactive if (!rcbCallType.Enabled) { // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); return; } // add filters only if selected call type if (rcbCallType.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; String[] types = new String[rcbCallType.CheckedItems.Count]; int i = 0; // for each selected unit add a custom filedescriptor foreach (RadListDataItem item in rcbCallType.CheckedItems) { types[i++] = item.Text; //statusDescriptor.FilterDescriptors.Add(); } // add filter this.gridRecordings.FilterDescriptors.Add(new FilterDescriptor("CallTypeDirectionFilter", FilterOperator.IsContainedIn, types)); // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); } } catch (Exception ex) { Utils.WriteLine("rcbCallType_ItemCheckedChanged : " + ex.ToString(), ConsoleColor.Red); } } private void btRecordingsList_Click(object sender, EventArgs e) { SaveFileDialog sfd = new SaveFileDialog(); sfd.Filter = "Docx|*.docx"; sfd.Title = "Save all filtered recordings"; string dateTime = DateTime.Now.ToString(); dateTime = dateTime.Replace("/", "_"); dateTime = dateTime.Replace("\\", "_"); dateTime = dateTime.Replace(" ", "_"); dateTime = dateTime.Replace(":", "."); sfd.FileName = String.Format(@"" + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile") + "_recordings_{0}.docx", dateTime); DialogResult dr = sfd.ShowDialog(); // If the file name is not an empty string open it for saving. if (dr == System.Windows.Forms.DialogResult.OK || dr == System.Windows.Forms.DialogResult.Yes) { // We will need a file name for our output file (change to suit your machine): string fileNameTemplate = sfd.FileName + (sfd.FileName.EndsWith(".docx") ? "" : ".docx"); //@"Invoice_{0}-{1:MM_dd_yy_HH.mm.ss}.docx"; // Let's save the file with a meaningful name, including the applicant name and the letter date: //System.IO.Directory.CreateDirectory("exports"); //string outputFileName = string.Format("exports/" + fileNameTemplate, cbCabinetWork.Text, DateTime.Now); // Grab a reference to the desired template var doc = Novacode.DocX.Load(@"resource\templates\export_recordings.docx"); doc.ReplaceText("%DATA%", String.Format("{0}", DateTime.Now.ToString())); doc.ReplaceText("%COMPANY%", "Generated using " + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile") + " Dispatch"); #region Works // get the empty template row Novacode.Row emptyRow = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1]; FontFamily centuryGothic = null; try { centuryGothic = new FontFamily("Century Gothic"); } catch (Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); } FontFamily font = new FontFamily("Arial"); if (centuryGothic != null) font = centuryGothic; int counter = 1; //Utils.WriteLine(gridRecordings.ChildRows.Count + ""); foreach (GridViewRowInfo groupRow in gridRecordings.ChildRows) { if (groupRow.ChildRows.Count > 0) { foreach (GridViewRowInfo gridRow in groupRow.ChildRows) { Recording rec = gridRow.DataBoundItem as Recording; // skip group headers and others UI elements withoug databound items if (rec == null) continue; // add a new empty row and then edit it doc.Tables[0].InsertRow(emptyRow); // get the new inserted row which is empty Novacode.Row row = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1]; int column = 0; row.Cells[column++].Paragraphs[0].Append(counter++ + "").FontSize(9).Font(font); using (MemoryStream ms = new MemoryStream()) { //write image to the memory stream Utils.ScaleImage(rec.callTypeImage, 48, 48).Save(ms, System.Drawing.Imaging.ImageFormat.Png); // go to the begining of the picture ms.Seek(0, SeekOrigin.Begin); Novacode.Image img = doc.AddImage(ms); // Create image. Novacode.Picture pic1 = img.CreatePicture(); // Create picture. row.Cells[column++].Paragraphs[0].AppendPicture(pic1); } row.Cells[column++].Paragraphs[0].Append(rec.username).FontSize(9).Font(font); row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(0, 0, 255)); row.Cells[column - 1].Paragraphs[0].Bold(); row.Cells[column++].Paragraphs[0].Append(rec.From).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(rec.To).FontSize(9).Font(font); row.Cells[column++].Paragraphs[0].Append(rec.DateTimeStart.ToString("dd.MM.yyyy HH:mm:ss")).FontSize(8).Font(font); row.Cells[column++].Paragraphs[0].Append(rec.duration + " sec").FontSize(9).Font(font); row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(66, 66, 66)); } } } // remove first row after the header because is an empty one doc.Tables[0].RemoveRow(1); #endregion // Save as New filename: doc.SaveAs(sfd.FileName); // Open in word: //Process.Start("WINWORD.EXE", "\"" + outputFileName + "\""); mainparent.DisplayToast(MainForm2.returnLNGString("recExpSucces"), string.Format(MainForm2.returnLNGString("RadioExportHTML"), fileNameTemplate, sfd.FileName)); } } private void LoadRecordingTimer_Tick(object sender, EventArgs e) { LoadRecordingTimer.Stop(); LoadRecordingTimer.Enabled = false; } private void LoadSubscriberTimer_Tick(object sender, EventArgs e) { LoadSubscriberTimer.Stop(); LoadSubscriberTimer.Enabled = false; //listViewSubscribers.DataSource = null; //Populate_subscriber_list(); //listSubscribers.DataSource = subscribersList; } private void listFavorites_SelectedItemChanged(object sender, EventArgs e) { } #region AUDIO SETTINGS MIC & HEADSET private NAudio.Wave.WaveIn waveIn = null; private NAudio.Wave.WaveOut waveOut = null; private Stream stream = Dispatcher.Properties.Resources.air; private Boolean isPlaying = false; private static MMDeviceEnumerator enumer = new MMDeviceEnumerator(); private MMDevice headsetDevice = null; /// /// Save the new REc Sound card into the Database /// private void InputSoundList_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) { try { if (waveIn != null) { waveIn.StopRecording(); waveIn = null; } } catch (NAudio.MmException ex) { Utils.WriteLine("InputSoundList_SelectedIndexChanged 1 Exception: " + ex.ToString(), ConsoleColor.Red); } try { waveIn = new NAudio.Wave.WaveIn(); waveIn.DeviceNumber = e.Position; waveIn.DataAvailable += waveIn_DataAvailable; int sampleRate = voicemanager_sampleRate; // 8 kHz int channels = 1; // mono waveIn.WaveFormat = new NAudio.Wave.WaveFormat(sampleRate, channels); waveIn.StartRecording(); } catch (NAudio.MmException ex) { Utils.WriteLine("InputSoundList_SelectedIndexChanged 2 Exception: " + ex.ToString(), ConsoleColor.Red); } } /// /// Evalute the sound received from the input device /// void waveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e) { int count = 0; float min = 0, max = 0; for (int index = 0; index < e.BytesRecorded; index += 2) { short sample = (short)((e.Buffer[index + 1] << 8) | e.Buffer[index + 0]); float sample32 = sample / 32768f; // initialize the min and max if (index == 0) { min = sample32; max = sample32; } if (max < sample32) max = sample32; if (min > sample32) min = sample32; float m = Math.Max(max, Math.Abs(min)); //if (count++ % 10 == 0) // Console.WriteLine(m + " | " + Math.Log10(m)); //Console.WriteLine("Val: " + Math.Max(max, Math.Abs(min)) * 20); if (count % 100 == 0) { if (m < 0.003) m = 0.001f; //rtbMicrophoneVolume.Value = (float)((Math.Log10(m) + 3) * 33); rtbMicrophoneVolume.Value = (int)(Math.Max(max, Math.Abs(min)) * 100); } } } /// /// Detach from previous mic that was listened in order to check it's levels /// private void InputSoundList_SelectedIndexChanging(object sender, Telerik.WinControls.UI.Data.PositionChangingCancelEventArgs e) { if (waveIn != null) waveIn.DataAvailable -= waveIn_DataAvailable; } /// /// I don't have where to call this /// /// /// private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (waveIn != null) { waveIn.StopRecording(); waveIn = null; } } /// /// Save the new Play Sound card into the Database /// private void OutputSoundList_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) { } /// /// Event listener for when the audio volume changes /// /// void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data) { try { // This shows data.MasterVolume, you can do whatever you want here Utils.WriteLine("Volume level is : " + data.MasterVolume * 100f, ConsoleColor.Red); //rtbSpeakersVolume.Value = data.MasterVolume * 100f; } catch (Exception e) { Utils.WriteLine("AudioEndpointVolume_OnVolumeNotification: " + e.ToString(), ConsoleColor.Red); } } /// /// Reset audio stream when the playback has finished /// void waveOut_PlaybackStopped(object sender, EventArgs e) { //Utils.WriteLine("Done playing"); stream.Position = 0; pbPlayTestSound.Image = themePlay_Image; isPlaying = false; } /// /// Detach from previous sound output device in order to attach to another /// private void OutputSoundList_SelectedIndexChanging(object sender, Telerik.WinControls.UI.Data.PositionChangingCancelEventArgs e) { // close previous sounds if (waveOut != null) { pbPlayTestSound.Image = themePlay_Image; isPlaying = false; waveOut.PlaybackStopped -= waveOut_PlaybackStopped; waveOut.Pause(); waveOut.Stop(); waveOut = null; stream.Position = 0; } //if (OutputSoundList.SelectedItem != null && OutputSoundList.SelectedItem.DataBoundItem != null) //{ // KeyValuePair> dataBound = // (KeyValuePair>)OutputSoundList.SelectedItem.DataBoundItem; // OutputSoundList.Text = dataBound.Value.Item2.FriendlyName + " - " + dataBound.Value.Item2.DeviceFriendlyName; //} } /// /// Format the text which will be displayed inside the heasphone dropdown list /// private void OutputSoundList_VisualListItemFormatting(object sender, VisualItemFormattingEventArgs args) { //KeyValuePair> dataBound = // (KeyValuePair>)args.VisualItem.Data.DataBoundItem; //args.VisualItem.Text = dataBound.Value.Item2.FriendlyName + " - " + dataBound.Value.Item2.DeviceFriendlyName; //args.VisualItem.Text = ((RadDropDownList)sender).SelectedItem.Text; } /// /// Save the new audio configuration into the database and /// reset it into radio tab /// private void rbApplyAudioConfiguration_Click(object sender, EventArgs e) { //KeyValuePair> dataBound = // (KeyValuePair>)OutputSoundList.SelectedItem.DataBoundItem; //smdbObj.SaveSoundCardinDB(0, dataBound.Value.Item1, InputSoundList.Text, ""); smdbObj.SaveSoundCardinDB(0, OutputSoundList.Text, InputSoundList.Text, ""); // set the new index values selectedINDevice = InputSoundList.SelectedIndex; //selectedOUTDevice = ((KeyValuePair>)OutputSoundList.SelectedItem.DataBoundItem).Key; selectedOUTDevice = OutputSoundList.SelectedIndex; StartnVoice(); mainparent.DisplayToast(MainForm2.returnLNGString("Audiosettingschangedsuccessfully"), string.Format(MainForm2.returnLNGString("newAudioCfg"), InputSoundList.Text, OutputSoundList.Text)); } /// /// Play a sound on the selected configuration in order to test the current /// selected audio device /// private void pbPlayTestSound_Click(object sender, EventArgs e) { try { if (!isPlaying) { pbPlayTestSound.Image = Dispatcher.Properties.Resources.r_play_blue; // load the stream NAudio.Wave.WaveFileReader waveReader = new NAudio.Wave.WaveFileReader(stream); // create a new output device based on the selected device waveOut = new NAudio.Wave.WaveOut(); //KeyValuePair> dataBound = // (KeyValuePair>)OutputSoundList.SelectedItem.DataBoundItem; //Utils.WriteLine("Playing on " + dataBound.Key + " device"); //waveOut.DeviceNumber = dataBound.Key; Utils.WriteLine("Playing on " + OutputSoundList.SelectedItem.Text + " device"); waveOut.DeviceNumber = OutputSoundList.SelectedIndex; // initialize the output device waveOut.Init(waveReader); // detech when the play had finished to reset the stream to 0 waveOut.PlaybackStopped += waveOut_PlaybackStopped; // flag that playing isPlaying = true; // play sound waveOut.Play(); } } catch (Exception ex) { Utils.WriteLine("Can't play sound : " + ex.ToString()); } } #endregion #region STYLE GRID RECORDINGS /// /// Set the event listener for the play click /// private void gridRecordings_CellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e) { GridCellElement cellElement = e.CellElement; GridViewDataColumn columnInfo = e.CellElement.ColumnInfo as GridViewDataColumn; // do not draw border cellElement.DrawBorder = false; // do not highlight the cell on which was clicked if (e.CellElement.IsCurrent) e.CellElement.IsCurrent = false; // set padding and force the content adding if (cellElement is RecordingGridCellElement && columnInfo.Name == "recording") { cellElement.Padding = new Padding(0, 0, 0, 0); //cellElement.SetContent(); // add click listener only if not added before if ((cellElement.Tag != null && !cellElement.Tag.Equals("done")) || cellElement.Tag == null) { ((RecordingGridCellElement)cellElement).OnPlay_Click += delegate (object s, RecordingGridCellElement.ToggleClickEventArgs ee) { // Utils.WriteLine("Fav is " + ee.recording.username + " | " + ee.isActive); PlayFile(ee.recording.RecID, ee.recording.duration); }; } cellElement.Tag = "done"; } } /// /// Prevent the opening of the context menu /// private void gridRecordings_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e) { e.Cancel = true; } /// /// Set the type of data which will be displayed inside the grid /// private void gridRecordings_CreateCell(object sender, GridViewCreateCellEventArgs e) { // format live column if (e.Row is GridDataRowElement) { // increase row height //e.Row.RowInfo.Height = 53; if (e.Column.Name.Equals("recording")) { e.CellType = typeof(RecordingGridColumn); e.CellElement = new RecordingGridCellElement(e.Column, e.Row); } if (e.Column is GridViewIndentColumn) { e.Column.IsVisible = false; /* e.Column.MaxWidth = 7; e.Column.MinWidth = 7; e.Column.Width = 7;*/ //e.CellElement.Visibility = ElementVisibility.Hidden; } } } private void gridRecordings_CustomGrouping(object sender, GridViewCustomGroupingEventArgs e) { } private void gridRecordings_GroupSummaryEvaluate(object sender, GroupSummaryEvaluationEventArgs e) { if (e.SummaryItem == null || e.Value == null) return; try { if (e.SummaryItem.Name.Equals("DateStart")) { if (((DateTime)e.Value).Year == DateTime.Now.Year) e.FormatString = ((DateTime)e.Value).ToString("dd.MMMM"); else e.FormatString = ((DateTime)e.Value).ToString("dd.MMMM.yyyy"); } else if (e.SummaryItem.Name.Equals("callType")) { e.FormatString = e.Value.ToString().Replace('_', ' '); } else if (e.SummaryItem.Name.Equals("Initial")) { e.FormatString = e.Value.ToString().ToUpper(); } else if (e.SummaryItem.Name.Equals("callDirection")) { e.FormatString = e.Value.ToString(); } } catch (Exception ex) { Utils.WriteLine("gridRecordings_GroupSummaryEvaluate: " + ex.ToString(), ConsoleColor.Red); } } #endregion #region FILTERS /// /// Intercept date time change in order to filter the recordings grid /// private void TimeFilter_ValueChanged(object sender, EventArgs e) { TimeFilter(false); } /// /// Filter recordings grid for displaying the last 24 hours /// or the selected interval from the date time /// /// Boolean telling if the last 24 hours /// are needed private void TimeFilter(bool is24Hours) { // clear all units filters gridRecordings.FilterDescriptors.Remove("DateTimeStart"); gridRecordings.FilterDescriptors.Remove("DateTimeEnd"); // Create a composite file descriptor with AND logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.And; statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("DateTimeStart", FilterOperator.IsGreaterThan, pb24H.Tag.Equals("enabled") ? (DateTime.Now).AddDays(-1) : rdpStartTime.Value)); statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("DateTimeEnd", FilterOperator.IsLessThan, pb24H.Tag.Equals("enabled") ? DateTime.Now : rdpEndTime.Value)); // add filter this.gridRecordings.FilterDescriptors.Add(statusDescriptor); // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); } /// /// Format the rows to display alternate colors /// private void gridRecordings_RowFormatting(object sender, RowFormattingEventArgs e) { e.RowElement.DrawFill = true; e.RowElement.NumberOfColors = 1; if (e.RowElement.IsSelected) e.RowElement.BackColor = MainForm2.GridSelectedRow; else e.RowElement.BackColor = (e.RowElement.RowInfo.Index % 2 == 0 ? Color.White : MainForm2.GridAlternateRow); } /// /// Invalidate selected row in order for the play button to be placed /// on the grid /// private void gridRecordings_CurrentRowChanged(object sender, CurrentRowChangedEventArgs e) { if (e.CurrentRow == null) return; e.CurrentRow.InvalidateRow(); } /// /// Scroll to first row after the filtering is done /// private void gridRecordings_FilterChanged(object sender, GridViewCollectionChangedEventArgs e) { if (gridRecordings.Rows.Count > 0) { gridRecordings.Rows[0].IsSelected = true; gridRecordings.Rows[0].IsCurrent = true; gridRecordings.CurrentRow = gridRecordings.Rows[0]; gridRecordings.TableElement.ScrollToRow(gridRecordings.CurrentRow); } } /// /// Display the tooltip when the mouse enters over the /// picture box /// private void pbFilter_MouseEnter(object sender, EventArgs e) { PictureBox pbSender = (PictureBox)sender; String toolTipTitle = ""; String toolTipText = ""; if (pbSender == pbFilterTime) { toolTipTitle = MainForm2.returnLNGString("Recordingtimegrouping"); toolTipText = MainForm2.returnLNGString("RecordingtimegroupingDET"); } else if (pbSender == pbFilterDirection) { toolTipTitle = MainForm2.returnLNGString("Recordingdirectiongrouping"); toolTipText = MainForm2.returnLNGString("RecordingdirectiongroupingDET"); } else if (pbSender == pbFilterType) { toolTipTitle = MainForm2.returnLNGString("Recordingcalltypegrouping"); toolTipText = MainForm2.returnLNGString("RecordingcalltypegroupingDET"); } else if (pbSender == pbFilterUser) { toolTipTitle = MainForm2.returnLNGString("Recordinguserinitialsgrouping"); toolTipText = MainForm2.returnLNGString("RecordinguserinitialsgroupingDET"); } else if (pbSender == pb24H) { toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbytime"); toolTipText = MainForm2.returnLNGString("FilterrecordingsbytimeDET"); } else if (pbSender == pbCallType) { toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbycalltype"); toolTipText = MainForm2.returnLNGString("FilterrecordingsbycalltypeDET"); } else if (pbSender == pbUnit) { toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbyuser"); toolTipText = MainForm2.returnLNGString("FilterrecordingsbyuserDET"); } toolTipHelp.ToolTipTitle = toolTipTitle + ": " + (pbSender.Tag.Equals("enabled") ? MainForm2.returnLNGString("active") : MainForm2.returnLNGString("inactive")); toolTipHelp.Show( String.Format(toolTipText), pbSender, 150000); } /// /// Hide the tooltip when the mouse exits the picture box /// private void pbFilter_MouseLeave(object sender, EventArgs e) { toolTipHelp.Hide((PictureBox)sender); } /// /// Display a message inside the recordings grid based on its state /// If the list of recordings has no visible row, but has rows, a message /// telling that the current configuration of filters has no recordings /// private void DisplayEmptyMessageOnRecordingsGrid() { // display a message for when the table elements are empty if (gridRecordings.ChildRows.Count > 0) gridRecordings.TableElement.Text = ""; // recordings exists but outside the filters else if (gridRecordings.ChildRows.Count == 0 && gridRecordings.Rows.Count > 0) { gridRecordings.TableElement.Text = MainForm2.returnLNGString("norecordstoshow"); } // no recordings at all else gridRecordings.TableElement.Text = MainForm2.returnLNGString("listOfRecordings"); } #endregion private void listBoxRadioGateways_ItemDataBound(object sender, ListItemDataBoundEventArgs args) { RadioGateway view = (RadioGateway)args.NewItem.DataBoundItem; args.NewItem.Text = "" + "" + view.Name + "" + "
" + "" + " " + view.TypeDesc + ""; args.NewItem.Image = global::Dispatcher.Properties.Resources.red_status; } private void listBoxRadioGateways_CreatingVisualListItem(object sender, CreatingVisualListItemEventArgs args) { RadListVisualItem visualItem = new RadListVisualItem(); visualItem.Padding = new Padding(5, 5, 0, 5); args.VisualItem = visualItem; } private void timer1_Tick(object sender, EventArgs e) { lbCurrentDateTime.Text = DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern); } private void RearrangeCallForm() { //CallsForm.position = 0; //foreach (KeyValuePair callForm in callFormContainer) //{ // if (callForm.Value != null) // { // callForm.Value.Location = new Point(Screen.PrimaryScreen.Bounds.X + 93, //should be (0,0) // Screen.PrimaryScreen.Bounds.Y + CallsForm.position); // callForm.Value.TopMost = true; // callForm.Value.StartPosition = FormStartPosition.Manual; // CallsForm.position += 93; // } //} } private void GetAvailablePosition() { List positionList = new List(); int deviation = 310; // 304 latimea butonului de ptt deci 310 sa nu il imbarlige CallsForm.positionX = 0; CallsForm.positionY = 0; foreach (KeyValuePair callForm in callFormContainer) { if (callForm.Value != null) { positionList.Add(string.Format("({0},{1})", callForm.Value.Location.Y, callForm.Value.Location.X)); } } for (int j = 0; j <= this.Width / 350; j++) { for (int i = 0; i <= this.Height / 94; i++) { int pointY = i * 94; int pointX = j * 350 + deviation; string point = string.Format("({0},{1})", pointY, pointX); if (!positionList.Contains(point)) { CallsForm.positionY = pointY; CallsForm.positionX = pointX; return; } } } } private class Gatewaymulticast { private string gatewayIp = ""; private UdpMulticast udp4Voice2; private RadioTab parent; public Gatewaymulticast(string GatewayIp, int voicePort, RadioTab parent) { gatewayIp = GatewayIp; this.parent = parent; udp4Voice2 = new UdpMulticast(gatewayIp, voicePort); udp4Voice2.OnNewDataRecv += Udp4Voice2_OnNewDataRecv; udp4Voice2.StartListen(MainForm2.cfg.LocalIP); } private void Udp4Voice2_OnNewDataRecv(byte[] data, int dataLen) { try { //Console.WriteLine("Recived AudioData RecivedData:" + RecivedData + " dataLen:" + dataLen); if ((parent.RecivedData) && (dataLen > 30))//&& (VoiceON) { //int activeCount = ShapeNew.receiving_hash.Count; //if (MainForm2.PriorityIP.Length == 0) MainForm2.PriorityIP = gatewayIp; if (MainForm2.PriorityIP.CompareTo(gatewayIp) == 0) { if (parent.buffWaveProvider != null) parent.buffWaveProvider.AddSamples(data, 0, dataLen); //nVOice.PlaySound(data, dataLen); } } } catch (Exception ex) { SM.Debug("Error on put data: " + ex.ToString()); } } } #region call patching private void gvPatch_ValueChanged(object sender, EventArgs e) { if (((GridVirtualizedCellElement)(((RadDropDownListEditor)sender).OwnerElement)).Data.HeaderText != "Type") return; if (((RadDropDownListEditor)sender).Value.ToString() == "Dispatcher") { ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = dispatchers; ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "UserName"; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = dispatchers; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "UserName"; } if (((RadDropDownListEditor)sender).Value.ToString() == "Gateway") { ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = radiogateways; ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "Name"; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = radiogateways; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "Name"; } } private void gvPatch_CurrentRowChanged(object sender, CurrentRowChangedEventArgs e) { try { if (gvPatch == null) return; if (gvPatch.CurrentRow.Cells["type"].Value == null) return; if (gvPatch.CurrentRow.Cells["type"].Value.ToString() == "Dispatcher") { ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = dispatchers; ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "UserName"; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = dispatchers; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "UserName"; } if (gvPatch.CurrentRow.Cells["type"].Value.ToString() == "Gateway") { ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = radiogateways; ((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "Name"; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = radiogateways; ((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "Name"; } } catch(Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); } } private void gvPatch_UserAddingRow(object sender, GridViewRowCancelEventArgs e) { try { if ((gvPatch.CurrentRow.Cells["incoming"]).Value == null || (gvPatch.CurrentRow.Cells["outgoing"]).Value == null) { e.Rows[0].ErrorText = MainForm2.returnLNGString("incOutNotNull"); e.Cancel = true; return; } //check if incoming = outgoing or if this row is already added string type = (gvPatch.CurrentRow.Cells["type"]).Value.ToString(); string incoming = (gvPatch.CurrentRow.Cells["incoming"]).Value.ToString(); string outgoing = (gvPatch.CurrentRow.Cells["outgoing"]).Value.ToString(); string incomingId = ""; string outgoingId = ""; int tip = 0; if (type == "Dispatcher") { incomingId = dispatchers.First(s => s.UserName == incoming).Id.ToString(); outgoingId = dispatchers.First(s => s.UserName == outgoing).Id.ToString(); tip = 0; } else if (type == "Gateway") { RadioGateway incomingGW = radiogateways.First(s => s.Name == incoming); RadioGateway outgoingGW = radiogateways.First(s => s.Name == outgoing); incomingId = incomingGW.Gw_id + "." + incomingGW.Id; outgoingId = outgoingGW.Gw_id + "." + outgoingGW.Id; tip = 1; } else { e.Cancel = true; return; } string concat = type + incoming + outgoing; if (incoming == outgoing) { e.Rows[0].ErrorText = MainForm2.returnLNGString("incOutEqError"); e.Cancel = true; return; } if (patchList.Contains(concat)) { e.Rows[0].ErrorText = MainForm2.returnLNGString("callPatchAlready"); e.Cancel = true; return; } string key = type + "." + incomingId; if (!patchDictionary.ContainsKey(key)) { patchDictionary.Add(key, new List()); } if (patchDictionary.ContainsKey(key)) { if (!patchDictionary[key].Contains(outgoingId)) patchDictionary[key].Add(outgoingId); } //updatePatchStatus(incoming, true); updatePatchStatus(outgoing, true, type); patchList.Add(concat); //send data to message bus string Totrans = "#510#" + tip + "#" + incomingId + "#" + incoming + "#" + outgoingId + "#" + outgoing + "#" + MainForm2.userIDX; parent.Send_UDP_cmd(Totrans, 0, 0); e.Rows[0].ErrorText = string.Empty; } catch(Exception ex) { e.Rows[0].ErrorText = ex.Message.ToString(); e.Cancel = true; } } private void gvPatch_UserDeletingRow(object sender, GridViewRowCancelEventArgs e) { try { string type = (gvPatch.CurrentRow.Cells["type"]).Value.ToString(); string incoming = (gvPatch.CurrentRow.Cells["incoming"]).Value.ToString(); string outgoing = (gvPatch.CurrentRow.Cells["outgoing"]).Value.ToString(); string incomingId = ""; string outgoingId = ""; int tip = 0; if (type == "Dispatcher") { incomingId = dispatchers.First(s => s.UserName == incoming).Id.ToString(); outgoingId = dispatchers.First(s => s.UserName == outgoing).Id.ToString(); tip = 0; } if (type == "Gateway") { RadioGateway incomingGW = radiogateways.First(s => s.Name == incoming); RadioGateway outgoingGW = radiogateways.First(s => s.Name == outgoing); incomingId = incomingGW.Gw_id + "." + incomingGW.Id; outgoingId = outgoingGW.Gw_id + "." + outgoingGW.Id; tip = 1; } string concat = type + incoming + outgoing; string key = type + "." + incomingId; //updatePatchStatus(incoming, false); updatePatchStatus(outgoing, false, type); if (patchList.Contains(concat)) patchList.Remove(concat); if (patchDictionary.ContainsKey(key)) { if (patchDictionary[key].Contains(outgoingId)) patchDictionary[key].Remove(outgoingId); if (patchDictionary[key].Count == 0) patchDictionary.Remove(key); //send data to message bus string Totrans = "#511#" + tip + "#" + incomingId + "#" + incoming + "#" + outgoingId + "#" + outgoing + "#" + MainForm2.userIDX; parent.Send_UDP_cmd(Totrans, 0, 0); } } catch(Exception ex) { Utils.WriteLine("Error on deleting call patch from gridview", ConsoleColor.Red); } } internal void StartCallPatch(string type, string key, string from) { Utils.WriteLine("Start call patch", ConsoleColor.Green); runningPatches.Add(from); pttIsPressed = false; if (!patchDictionary.ContainsKey(key)) return; string Totrans = string.Empty; foreach (string patch in patchDictionary[key]) { if (type == "Dispatcher") { Totrans = String.Format("#201#{0}#{1}#", patch, "224.20." + from + ".1#1"); //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 10000, 201)); mainparent.Send_UDP_cmd(Totrans, 10000, 201, from); } if (type == "Gateway") { Totrans = String.Format("#101#{0}#{1}#", patch, "224.10." + from + "#1"); //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 10000, 101)); mainparent.Send_UDP_cmd(Totrans, 10000, 101); //if (MainForm2.radioGwHT.ContainsKey(patch)) //{ // ((RadioGateway)MainForm2.radioGwHT[patch]).InPatch = true; // Utils.WriteLine($"Start call patch on {patch} - {((RadioGateway)MainForm2.radioGwHT[patch]).Name}", ConsoleColor.Green); //} //if (MainForm2.radioGwHT.ContainsKey(from)) //{ // ((RadioGateway)MainForm2.radioGwHT[from]).InPatch = true; // Utils.WriteLine($"Start call patch on {from} - {((RadioGateway)MainForm2.radioGwHT[from]).Name}", ConsoleColor.Green); //} } } } private void updatePatchStatus(string patch, bool value, string type) { if (type == "Dispatcher") //0 -> dispatcher, 1 -> gateway return; if (type == "0") return; if (!rgwHTByName.ContainsKey(patch)) return; string key = ((RadioGateway)rgwHTByName[patch]).Gw_id + "." + ((RadioGateway)rgwHTByName[patch]).Id; if (MainForm2.radioGwHT.ContainsKey(key)) { ((RadioGateway)MainForm2.radioGwHT[key]).InPatch = value; } } private void EndCallPatch(string type, string key, string from) { Utils.WriteLine("End call patch", ConsoleColor.Green); pttIsPressed = false; runningPatches.RemoveAll(x => x == from); if (!patchDictionary.ContainsKey(key)) return; string Totrans = string.Empty; foreach (string patch in patchDictionary[key]) { if (type == "Dispatcher") { Totrans = String.Format("#211#{0}#{1}#", patch, "224.20." + from + ".1#1");//selected_Subscriber.IP //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 211)); mainparent.Send_UDP_cmd(Totrans, 3000, 211, from); } if (type == "Gateway") { Totrans = String.Format("#111#{0}#{1}#", patch, "224.10." + from + "#1"); //WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 111)); mainparent.Send_UDP_cmd(Totrans, 3000, 111); //if (MainForm2.radioGwHT.ContainsKey(patch)) //{ // ((RadioGateway)MainForm2.radioGwHT[patch]).InPatch = false; // Utils.WriteLine($"Stop call patch on {patch} - {((RadioGateway)MainForm2.radioGwHT[patch]).Name}", ConsoleColor.Red); //} //if (MainForm2.radioGwHT.ContainsKey(from)) //{ // ((RadioGateway)MainForm2.radioGwHT[from]).InPatch = false; // Utils.WriteLine($"Stop call patch on {from} - {((RadioGateway)MainForm2.radioGwHT[from]).Name}", ConsoleColor.Red); //} } } this.Invoke((MethodInvoker)delegate { pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00; }); } internal void UpdateCallPatchGridViewInfo(int type, Patch patch) { string tip, concat, key; tip = patch.Type == "0" ? "Dispatcher" : "Gateway"; concat = tip + patch.Incoming + patch.Outgoing; key = tip + "." + patch.IncomingId; this.Invoke((Action)(() => { switch (type) { case 510: if (!patchDictionary.ContainsKey(key)) { patchDictionary.Add(key, new List()); } if (patchDictionary.ContainsKey(key)) { if (!patchDictionary[key].Contains(patch.OutgoingId)) patchDictionary[key].Add(patch.OutgoingId); } //updatePatchStatus(patch.Incoming, true); updatePatchStatus(patch.Outgoing, true, patch.Type); patchList.Add(concat); dbPatches.Add(patch); gvPatch.Rows.Add(tip, patch.Incoming, patch.Outgoing); break; case 511: patchList.Remove(concat); if (patchDictionary.ContainsKey(key)) { if (patchDictionary[key].Contains(patch.OutgoingId)) patchDictionary[key].Remove(patch.OutgoingId); if (patchDictionary[key].Count == 0) patchDictionary.Remove(key); //updatePatchStatus(patch.Incoming, false); updatePatchStatus(patch.Outgoing, false, patch.Type); } foreach (var row in gvPatch.Rows) { if ((row.Cells["incoming"]).Value.ToString() == patch.Incoming && (row.Cells["outgoing"]).Value.ToString() == patch.Outgoing) { gvPatch.Rows.Remove(row); return; } } break; } })); } #endregion /// /// Intercept when the selected gateway is changed in order to filter the list subscribers and list favorites /// private void rcbddGateways_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { //Utils.WriteLine("rcbddGateways_ItemCheckedChanged", ConsoleColor.DarkCyan); // clear all statuses filters listViewSubscribers.FilterDescriptors.Remove("GatewayName"); // add filters only if selected event types if (rcbddGateways.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; // for each selected status add a custom filedescroptor foreach (RadCheckedListDataItem item in rcbddGateways.CheckedItems) { RadioGateway radioGw = item.DataBoundItem as RadioGateway; if (radioGw == null) continue; statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("GatewayName", FilterOperator.IsEqualTo, radioGw.Name)); //radioGw.Gw_id + "." + radioGw.Id)); } // add filter this.listViewSubscribers.FilterDescriptors.Add(statusDescriptor); } // clear all statuses filters listFavorites.FilterDescriptors.Remove("GatewayName"); // add filters only if selected event types if (rcbddGateways.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; // for each selected status add a custom filedescroptor foreach (RadCheckedListDataItem item in rcbddGateways.CheckedItems) { RadioGateway radioGw = item.DataBoundItem as RadioGateway; if (radioGw == null) continue; statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("GatewayName", FilterOperator.IsEqualTo, radioGw.Name)); //radioGw.Gw_id + "." + radioGw.Id)); } // add filter this.listFavorites.FilterDescriptors.Add(statusDescriptor); } } private void rcddlRecordingsGateways_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e) { try { // clear all call types filters gridRecordings.FilterDescriptors.Remove("Gw_and_radioID"); // add filters only if selected call type if (rcddlRecordingsGateways.CheckedItems.Count > 0) { // Create a composite file descriptor with OR logic CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor(); statusDescriptor.LogicalOperator = FilterLogicalOperator.Or; String[] types = new String[rcddlRecordingsGateways.CheckedItems.Count]; int i = 0; // for each selected unit add a custom filedescriptor foreach (RadListDataItem item in rcddlRecordingsGateways.CheckedItems) { RadioGateway radioGw = item.DataBoundItem as RadioGateway; types[i++] = radioGw.Gw_id + "." + radioGw.Id; //statusDescriptor.FilterDescriptors.Add(); } // add filter this.gridRecordings.FilterDescriptors.Add(new FilterDescriptor("Gw_and_radioID", FilterOperator.IsContainedIn, types)); // display/hide the empty message DisplayEmptyMessageOnRecordingsGrid(); } } catch (Exception ex) { Utils.WriteLine("rcddlRecordingsGateways_ItemCheckedChanged : " + ex.ToString(), ConsoleColor.Red); } } } }