2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using Tizen.Internals.Errors;
20 namespace Tizen.CallManager
24 None = ErrorCode.None,
25 OutOfMemory = ErrorCode.OutOfMemory,
26 InvalidParameter = ErrorCode.InvalidParameter,
27 PermissionDenied = ErrorCode.PermissionDenied,
28 NotSupported = ErrorCode.NotSupported,
29 NotRegistered = -0x00000000 | 0x01,
30 AlreadyRegistered = -0x00000000 | 0x02,
31 OperationFailed = -0x00000000 | 0x03,
32 InvalidState = -0x00000000 | 0x04
35 internal static class CmUtility
37 internal const string LogTag = "Tizen.CallManager";
39 internal static CallData GetCallData(IntPtr handle)
41 if (handle == IntPtr.Zero)
46 CallData data = new CallData();
47 int ret = Interop.CallManager.GetCallId(handle, out uint id);
48 if (ret != (int)CmError.None)
50 Log.Error(CmUtility.LogTag, "Failed to get call ID from call data, Error: " + (CmError)ret);
58 ret = Interop.CallManager.GetCallDirection(handle, out CallDirection direction);
59 if (ret != (int)CmError.None)
61 Log.Error(CmUtility.LogTag, "Failed to get call direction from call data, Error: " + (CmError)ret);
66 data.CallDirection = direction;
69 ret = Interop.CallManager.GetCallNumber(handle, out string number);
70 if (ret != (int)CmError.None)
72 Log.Error(CmUtility.LogTag, "Failed to get call number from call data, Error: " + (CmError)ret);
80 ret = Interop.CallManager.GetCallingName(handle, out string name);
81 if (ret != (int)CmError.None)
83 Log.Error(CmUtility.LogTag, "Failed to get calling name from call data, Error: " + (CmError)ret);
91 ret = Interop.CallManager.GetCallType(handle, out CallType type);
92 if (ret != (int)CmError.None)
94 Log.Error(CmUtility.LogTag, "Failed to get call type from call data, Error: " + (CmError)ret);
102 ret = Interop.CallManager.GetCallState(handle, out CallState state);
103 if (ret != (int)CmError.None)
105 Log.Error(CmUtility.LogTag, "Failed to get call state from call data, Error: " + (CmError)ret);
110 data.CallState = state;
113 ret = Interop.CallManager.GetCallMemberCount(handle, out int count);
114 if (ret != (int)CmError.None)
116 Log.Error(CmUtility.LogTag, "Failed to get call member count from call data, Error: " + (CmError)ret);
124 ret = Interop.CallManager.IsEmergencyCall(handle, out bool isEmergency);
125 if (ret != (int)CmError.None)
127 Log.Error(CmUtility.LogTag, "Failed to check if the call is emergency from call data, Error: " + (CmError)ret);
132 data.IsEcc = isEmergency;
135 ret = Interop.CallManager.IsVoiceMailNumber(handle, out bool isVoiceMail);
136 if (ret != (int)CmError.None)
138 Log.Error(CmUtility.LogTag, "Failed to check if the number is voicemail number from call data, Error: " + (CmError)ret);
143 data.IsVoiceMail = isVoiceMail;
146 ret = Interop.CallManager.GetCallDomain(handle, out CallDomain domain);
147 if (ret != (int)CmError.None)
149 Log.Error(CmUtility.LogTag, "Failed to get call domain from call data, Error: " + (CmError)ret);
154 data.CallDomain = domain;
157 ret = Interop.CallManager.GetPersonId(handle, out int personId);
158 if (ret != (int)CmError.None)
160 Log.Error(CmUtility.LogTag, "Failed to get person ID from call data, Error: " + (CmError)ret);
165 data.PersonIndex = personId;
168 ret = Interop.CallManager.GetStartTime(handle, out long startTime);
169 if (ret != (int)CmError.None)
171 Log.Error(CmUtility.LogTag, "Failed to get start time from call data, Error: " + (CmError)ret);
176 data.CallStartTime = startTime;
179 ret = Interop.CallManager.GetNameMode(handle, out CallNameMode nameMode);
180 if (ret != (int)CmError.None)
182 Log.Error(CmUtility.LogTag, "Failed to get name mode from call data, Error: " + (CmError)ret);
187 data.CallNameMode = nameMode;
190 ret = Interop.CallManager.GetSessionId(handle, out int sessionId);
191 if (ret != (int)CmError.None)
193 Log.Error(CmUtility.LogTag, "Failed to get session ID from call data, Error: " + (CmError)ret);
198 data.SessionIdIms = sessionId;
201 ret = Interop.CallManager.GetHdIconState(handle, out int isHdEnable);
202 if (ret != (int)CmError.None)
204 Log.Error(CmUtility.LogTag, "Failed to get HD icon state from call data, Error: " + (CmError)ret);
209 data.IsHdEnableIms = (isHdEnable == 1) ? true : false;
212 ret = Interop.CallManager.IsWiFiCalling(handle, out int isWiFiCalling);
213 if (ret != (int)CmError.None)
215 Log.Error(CmUtility.LogTag, "Failed to identify WiFi calling from call data, Error: " + (CmError)ret);
220 data.IsWiFiCall = (isWiFiCalling == 1) ? true : false;
223 ret = Interop.CallManager.GetUpgradeDowngradeState(handle, out int isEnable);
224 if (ret != (int)CmError.None)
226 Log.Error(CmUtility.LogTag, "Failed to get updagrade downgrade state from call data, Error: " + (CmError)ret);
231 data.IsUpgradeDowngrade = (isEnable == 1) ? true : false;
234 ret = Interop.CallManager.IsRemoteOnHold(handle, out int isHold);
235 if (ret != (int)CmError.None)
237 Log.Error(CmUtility.LogTag, "Failed to get remote on hold state from call data, Error: " + (CmError)ret);
242 data.IsRemoteHold = (isHold == 1) ? true : false;
245 ret = Interop.CallManager.IsAddedToConference(handle, out int isAdded);
246 if (ret != (int)CmError.None)
248 Log.Error(CmUtility.LogTag, "Failed to check if the call is in conf state from call data, Error: " + (CmError)ret);
253 data.IsAddedToConf = (isAdded == 1) ? true : false;
256 ret = Interop.CallManager.IsForwardedCall(handle, out bool isForwarded);
257 if (ret != (int)CmError.None)
259 Log.Error(CmUtility.LogTag, "Failed to check if the call is forwarded call from call data, Error: " + (CmError)ret);
264 data.IsForwardedCall = isForwarded;
270 internal static ConferenceCallData GetConfCallData(IntPtr handle)
272 if (handle == IntPtr.Zero)
277 ConferenceCallData confData = new ConferenceCallData();
278 int ret = Interop.CallManager.GetConfCallId(handle, out uint callId);
279 if (ret != (int)CmError.None)
281 Log.Error(CmUtility.LogTag, "Failed to get conf call ID, Error: " + (CmError)ret);
286 confData.CallId = callId;
289 ret = Interop.CallManager.GetConfCallNumber(handle, out string number);
290 if (ret != (int)CmError.None)
292 Log.Error(CmUtility.LogTag, "Failed to get conf call number, Error: " + (CmError)ret);
297 confData.Number = number;
300 ret = Interop.CallManager.GetConfCallPersonId(handle, out int personId);
301 if (ret != (int)CmError.None)
303 Log.Error(CmUtility.LogTag, "Failed to get conf call person ID, Error: " + (CmError)ret);
308 confData.PersonIndex = personId;
311 ret = Interop.CallManager.GetConfCallNameMode(handle, out CallNameMode nameMode);
312 if (ret != (int)CmError.None)
314 Log.Error(CmUtility.LogTag, "Failed to get conf call name mode, Error: " + (CmError)ret);
319 confData.NameMode = nameMode;
325 internal static CallEventData GetCallEventData(CallEvent callEvent, IntPtr handle)
327 if (handle == IntPtr.Zero)
332 CallEventData eventData = new CallEventData();
334 if (callEvent == CallEvent.Active)
336 int ret = Interop.CallManager.GetEventDataCallId(handle, out uint id);
337 if (ret != (int)CmError.None)
339 Log.Error(CmUtility.LogTag, "Failed to get event data call ID, Error: " + (CmError)ret);
344 eventData.EventId = id;
347 ret = Interop.CallManager.GetSimSlot(handle, out MultiSimSlot simSlot);
348 if (ret != (int)CmError.None)
350 Log.Error(CmUtility.LogTag, "Failed to get event data sim slot, Error: " + (CmError)ret);
355 eventData.Slot = simSlot;
358 ret = Interop.CallManager.GetIncomingCallData(handle, out IntPtr incoming);
359 if (ret != (int)CmError.None)
361 Log.Error(CmUtility.LogTag, "Failed to get incoming call data, Error: " + (CmError)ret);
366 CallData incomingData = GetCallData(incoming);
367 if (incomingData != null)
369 ret = Interop.CallManager.FreeCallData(incoming);
370 if (ret != (int)CmError.None)
372 Log.Error(CmUtility.LogTag, "Failed to free incoming call data, Error: " + (CmError)ret);
376 eventData.Incoming = incomingData;
379 ret = Interop.CallManager.GetActiveCall(handle, out IntPtr active);
380 if (ret != (int)CmError.None)
382 Log.Error(CmUtility.LogTag, "Failed to get active call data, Error: " + (CmError)ret);
387 CallData activeData = GetCallData(active);
388 if (activeData != null)
390 ret = Interop.CallManager.FreeCallData(active);
391 if (ret != (int)CmError.None)
393 Log.Error(CmUtility.LogTag, "Failed to free active call data, Error: " + (CmError)ret);
397 eventData.Active = activeData;
400 ret = Interop.CallManager.GetHeldCall(handle, out IntPtr held);
401 if (ret != (int)CmError.None)
403 Log.Error(CmUtility.LogTag, "Failed to get held call data, Error: " + (CmError)ret);
408 CallData heldData = GetCallData(held);
409 if (heldData != null)
411 ret = Interop.CallManager.FreeCallData(held);
412 if (ret != (int)CmError.None)
414 Log.Error(CmUtility.LogTag, "Failed to free held call data, Error: " + (CmError)ret);
418 eventData.Held = heldData;
422 else if (callEvent == CallEvent.Idle)
424 int ret = Interop.CallManager.GetEndCause(handle, out CallEndCause endCause);
425 if (ret != (int)CmError.None)
427 Log.Error(CmUtility.LogTag, "Failed to get end cause, Error: " + (CmError)ret);
432 eventData.Cause = endCause;
439 internal static void ThrowCmException(int exception)
441 _throwException(exception, false, "");
444 internal static void ThrowCmException(int exception, IntPtr handle)
446 _throwException(exception, (handle == IntPtr.Zero), "");
449 internal static void ThrowCmException(int exception, IntPtr handle, string message)
451 _throwException(exception, (handle == IntPtr.Zero), message);
454 private static void _throwException(int exception, bool isHandleNull, string message)
456 CmError _error = (CmError)exception;
459 case CmError.NotSupported:
460 throw new NotSupportedException("Unsupported feature: http://tizen.org/feature/network.telephony");
461 case CmError.PermissionDenied:
462 throw new UnauthorizedAccessException("Permission denied: " + message);
463 case CmError.OutOfMemory:
464 throw new OutOfMemoryException("System out of memory");
465 case CmError.InvalidParameter:
468 throw new InvalidOperationException("Invalid instance (object may have been disposed or released)");
471 throw new ArgumentException("Invalid parameter");
473 throw new InvalidOperationException(_error.ToString());