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 System.Collections.Generic;
19 using System.Threading.Tasks;
21 namespace Tizen.Messaging.Messages
23 static internal class Globals
25 internal const string LogTag = "Tizen.Messaging.Messages";
28 internal partial class MessagesManagerImpl : IDisposable
30 private static readonly MessagesManagerImpl _instance = new MessagesManagerImpl();
31 private bool disposed = false;
33 private static IntPtr _MessageServiceHandle;
35 private Interop.Messages.MessageSentCallback _messageSentCallback;
37 internal static MessagesManagerImpl Instance
45 private MessagesManagerImpl()
50 ~MessagesManagerImpl()
58 GC.SuppressFinalize(this);
61 private void Dispose(bool disposing)
68 // Free managed objects
71 // Free unmanaged objects
76 private void initialize()
80 ret = Interop.Messages.OpenService(out _MessageServiceHandle);
81 if (ret != (int)MessagesError.None)
83 Log.Error(Globals.LogTag, "Failed to open service, Error - " + (MessagesError)ret);
84 MessagesErrorFactory.ThrowMessagesException(ret);
88 private void deinitialize()
90 if (_MessageServiceHandle != IntPtr.Zero)
94 ret = Interop.Messages.CloseService(_MessageServiceHandle);
95 if (ret != (int)MessagesError.None)
97 Log.Error(Globals.LogTag, "Failed to close service, Error - " + (MessagesError)ret);
100 _MessageServiceHandle = IntPtr.Zero;
104 internal Task<SentResult> SendMessageAsync(Message message, bool saveToSentbox)
106 var task = new TaskCompletionSource<SentResult>();
108 _messageSentCallback = (int result, IntPtr data) =>
110 task.SetResult((SentResult)result);
113 message.FillHandle();
116 IntPtr messageHandle = message.GetHandle();
118 ret = Interop.Messages.SendMessage(_MessageServiceHandle, messageHandle, saveToSentbox, _messageSentCallback, IntPtr.Zero);
119 if (ret != (int)MessagesError.None)
121 Log.Error(Globals.LogTag, "Failed to send message, Error - " + (MessagesError)ret);
122 MessagesErrorFactory.ThrowMessagesException(ret, _MessageServiceHandle);
128 internal Task<IEnumerable<Message>> SearchMessageAsync(MessagesSearchFilter filter)
130 return Task.Run<IEnumerable<Message>>(() =>
132 List<Message> messageList = new List<Message>();
135 Interop.Messages.MessageSearchCallback callback = (IntPtr messageHandle, int index, int resultCount, int totalCount, IntPtr userData) =>
139 if (messageHandle != IntPtr.Zero)
141 IntPtr duplicatedMessageHandle = IntPtr.Zero;
143 DuplicateMessageHandle(messageHandle, out duplicatedMessageHandle);
144 if (duplicatedMessageHandle != IntPtr.Zero)
146 int type = (int)MessageType.Unknown;
147 int result = Interop.Messages.GetMessageType(duplicatedMessageHandle, out type);
148 if (result != (int)MessagesError.None)
150 Log.Error(Globals.LogTag, "Failed to get message type, Error - " + (MessagesError)result);
153 switch ((MessageType)type)
155 case MessageType.Sms:
157 var messageItem = new SmsMessage(duplicatedMessageHandle);
158 messageList.Add(messageItem);
161 case MessageType.Mms:
163 var messageItem = new MmsMessage(duplicatedMessageHandle);
164 messageList.Add(messageItem);
167 case MessageType.CellBroadcast:
169 var messageItem = new CBMessage(duplicatedMessageHandle);
170 messageList.Add(messageItem);
173 case MessageType.Push:
175 var messageItem = new PushMessage(duplicatedMessageHandle);
176 messageList.Add(messageItem);
181 Log.Error(Globals.LogTag, "Invaild message type - " + type);
192 Log.Error(Globals.LogTag, "Exception in Callback");
198 ret = Interop.Messages.SearchMessage(_MessageServiceHandle, (int)filter.MessageBoxType, (int)filter.MessageType, filter.TextKeyword, filter.AddressKeyword, 0, 0, callback, IntPtr.Zero);
199 if (ret != (int)MessagesError.None)
201 Log.Error(Globals.LogTag, "Failed to search message, Error - " + (MessagesError)ret);
202 MessagesErrorFactory.ThrowMessagesException(ret, _MessageServiceHandle);
209 private void DuplicateMessageHandle(IntPtr sourceHandle, out IntPtr clonedHandle)
212 IntPtr returnedHandle = IntPtr.Zero;
214 int ret = Interop.Messages.GetMessageId(sourceHandle, out msgId);
215 if (ret == (int)MessagesError.None)
217 ret = Interop.Messages.GetMessageById(_MessageServiceHandle, msgId, out returnedHandle);
218 if (ret != (int)MessagesError.None)
220 Log.Error(Globals.LogTag, "Failed to get message by id, Error - " + (MessagesError)ret);
221 MessagesErrorFactory.ThrowMessagesException(ret, _MessageServiceHandle);
226 Log.Error(Globals.LogTag, "Failed to get message id, Error - " + (MessagesError)ret);
227 MessagesErrorFactory.ThrowMessagesException(ret, _MessageServiceHandle);
230 clonedHandle = returnedHandle;