private void SetCallback(ChangeNotificationEventArgs.Notification n) { Interop.Telephony.NotificationCallback NotificationDelegate = (IntPtr handle, ChangeNotificationEventArgs.Notification notiId, IntPtr data, IntPtr userData) => { SlotHandle simHandle = Manager.FindHandle(handle); object notiData = null; switch (notiId) { case ChangeNotificationEventArgs.Notification.SimStatus: { notiData = (Sim.State)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.SimCallForwardingIndicatorState: { notiData = ((Marshal.ReadInt32(data) == 0) ? false : true); break; } case ChangeNotificationEventArgs.Notification.NetworkServiceState: { notiData = (Network.ServiceState)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkCellid: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkRoamingStatus: { notiData = (Marshal.ReadInt32(data) == 0) ? false : true; break; } case ChangeNotificationEventArgs.Notification.NetworkSignalstrengthLevel: { notiData = (Network.Rssi)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkNetworkName: { notiData = Marshal.PtrToStringAnsi(data); break; } case ChangeNotificationEventArgs.Notification.NetworkPsType: { notiData = (Network.PsType)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkDefaultDataSubscription: { notiData = (Network.DefaultDataSubscription)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkDefaultSubscription: { notiData = (Network.DefaultSubscription)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkLac: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkTac: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkSystemId: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkId: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkBsId: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkBsLatitude: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.NetworkBsLongitude: { notiData = Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusIdle: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusActive: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusHeld: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusDialing: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusAlerting: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VoiceCallStatusIncoming: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VideoCallStatusIdle: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VideoCallStatusActive: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VideoCallStatusDialing: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VideoCallStatusAlerting: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.VideoCallStatusIncoming: { notiData = (uint)Marshal.ReadInt32(data); break; } case ChangeNotificationEventArgs.Notification.CallPreferredVoiceSubscription: { notiData = (CallPreferredVoiceSubscription)Marshal.ReadInt32(data); break; } } ChangeNotificationEventArgs args = new ChangeNotificationEventArgs(notiId, notiData); ChangeNotification?.Invoke(simHandle, args); }; _changeNotificationList.Add(NotificationDelegate); Interop.Telephony.TelephonyError error = Interop.Telephony.TelephonySetNotiCb(_handle, n, NotificationDelegate, IntPtr.Zero); if (error != Interop.Telephony.TelephonyError.None) { Exception e = ExceptionFactory.CreateException(error); // Check if error is Invalid Parameter then hide the error if (e is ArgumentException) { e = new InvalidOperationException("Internal Error Occured"); } throw e; } }