internal static CallData GetCallData(IntPtr handle)
{
+ if (handle == IntPtr.Zero)
+ {
+ return null;
+ }
+
CallData data = new CallData();
int ret = Interop.CallManager.GetCallId(handle, out uint id);
if (ret != (int)CmError.None)
internal static ConferenceCallData GetConfCallData(IntPtr handle)
{
+ if (handle == IntPtr.Zero)
+ {
+ return null;
+ }
+
ConferenceCallData confData = new ConferenceCallData();
int ret = Interop.CallManager.GetConfCallId(handle, out uint callId);
if (ret != (int)CmError.None)
return confData;
}
- internal static CallEventData GetCallEventData(IntPtr handle)
+ internal static CallEventData GetCallEventData(CallEvent callEvent, IntPtr handle)
{
- CallEventData eventData = new CallEventData();
- int ret = Interop.CallManager.GetEventDataCallId(handle, out uint id);
- if (ret != (int)CmError.None)
+ if (handle == IntPtr.Zero)
{
- Log.Error(CmUtility.LogTag, "Failed to get event data call ID, Error: " + (CmError)ret);
+ return null;
}
- else
- {
- eventData.EventId = id;
- }
+ CallEventData eventData = new CallEventData();
- ret = Interop.CallManager.GetSimSlot(handle, out MultiSimSlot simSlot);
- if (ret != (int)CmError.None)
- {
- Log.Error(CmUtility.LogTag, "Failed to get event data sim slot, Error: " + (CmError)ret);
- }
+ if (callEvent == CallEvent.Active)
+ {
+ int ret = Interop.CallManager.GetEventDataCallId(handle, out uint id);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get event data call ID, Error: " + (CmError)ret);
+ }
+
+ else
+ {
+ eventData.EventId = id;
+ }
+
+ ret = Interop.CallManager.GetSimSlot(handle, out MultiSimSlot simSlot);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get event data sim slot, Error: " + (CmError)ret);
+ }
+
+ else
+ {
+ eventData.Slot = simSlot;
+ }
+
+ ret = Interop.CallManager.GetIncomingCallData(handle, out IntPtr incoming);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get incoming call data, Error: " + (CmError)ret);
+ }
+
+ else
+ {
+ CallData incomingData = GetCallData(incoming);
+ if (incomingData != null)
+ {
+ ret = Interop.CallManager.FreeCallData(incoming);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to free incoming call data, Error: " + (CmError)ret);
+ }
+ }
- else
- {
- eventData.Slot = simSlot;
- }
+ eventData.Incoming = incomingData;
+ }
- ret = Interop.CallManager.GetEndCause(handle, out CallEndCause endCause);
- if (ret != (int)CmError.None)
- {
- Log.Error(CmUtility.LogTag, "Failed to get end cause, Error: " + (CmError)ret);
- }
+ ret = Interop.CallManager.GetActiveCall(handle, out IntPtr active);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get active call data, Error: " + (CmError)ret);
+ }
- else
- {
- eventData.Cause = endCause;
- }
+ else
+ {
+ CallData activeData = GetCallData(active);
+ if (activeData != null)
+ {
+ ret = Interop.CallManager.FreeCallData(active);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to free active call data, Error: " + (CmError)ret);
+ }
+ }
- ret = Interop.CallManager.GetIncomingCallData(handle, out IntPtr incoming);
- if (ret != (int)CmError.None)
- {
- Log.Error(CmUtility.LogTag, "Failed to get incoming call data, Error: " + (CmError)ret);
- }
+ eventData.Active = activeData;
+ }
- else
- {
- eventData.Incoming = GetCallData(incoming);
- }
+ ret = Interop.CallManager.GetHeldCall(handle, out IntPtr held);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get held call data, Error: " + (CmError)ret);
+ }
- ret = Interop.CallManager.GetActiveCall(handle, out IntPtr active);
- if (ret != (int)CmError.None)
- {
- Log.Error(CmUtility.LogTag, "Failed to get active call data, Error: " + (CmError)ret);
- }
+ else
+ {
+ CallData heldData = GetCallData(held);
+ if (heldData != null)
+ {
+ ret = Interop.CallManager.FreeCallData(held);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to free held call data, Error: " + (CmError)ret);
+ }
+ }
- else
- {
- eventData.Active = GetCallData(active);
+ eventData.Held = heldData;
+ }
}
- ret = Interop.CallManager.GetHeldCall(handle, out IntPtr held);
- if (ret != (int)CmError.None)
+ else if (callEvent == CallEvent.Idle)
{
- Log.Error(CmUtility.LogTag, "Failed to get held call data, Error: " + (CmError)ret);
- }
+ int ret = Interop.CallManager.GetEndCause(handle, out CallEndCause endCause);
+ if (ret != (int)CmError.None)
+ {
+ Log.Error(CmUtility.LogTag, "Failed to get end cause, Error: " + (CmError)ret);
+ }
- else
- {
- eventData.Held = GetCallData(held);
+ else
+ {
+ eventData.Cause = endCause;
+ }
}
return eventData;