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.Collections.ObjectModel;
21 namespace Tizen.Messaging.Messages
24 /// A class to represent all messages.
26 public abstract class Message : IDisposable
28 protected IntPtr _messageHandle = IntPtr.Zero;
29 private bool disposed = false;
31 private ICollection<MessagesAddress> _from = new Collection<MessagesAddress>();
32 protected ICollection<MessagesAddress> _to = new Collection<MessagesAddress>();
33 protected ICollection<MessagesAddress> _cc = new Collection<MessagesAddress>();
34 protected ICollection<MessagesAddress> _bcc = new Collection<MessagesAddress>();
36 protected Message(MessageType type)
38 int ret = Interop.Messages.CreateMessage((int)type, out _messageHandle);
39 if (ret != (int)MessagesError.None)
41 Log.Error(Globals.LogTag, "Failed to create message handle, Error - " + (MessagesError)ret);
42 MessagesErrorFactory.ThrowMessagesException(ret);
46 protected Message(IntPtr messageHandle)
48 _messageHandle = messageHandle;
52 internal void FillHandle()
55 (this as MmsMessage)?.SetAttachments();
66 GC.SuppressFinalize(this);
69 private void Dispose(bool disposing)
76 // Free managed objects
79 // Free unmanaged objects
80 if (_messageHandle != IntPtr.Zero)
82 Interop.Messages.DestroyMessage(_messageHandle);
83 _messageHandle = IntPtr.Zero;
88 internal IntPtr GetHandle()
90 return _messageHandle;
93 private void SetAddresses()
95 foreach (var it in _to)
100 foreach (var it in _cc)
105 foreach (var it in _bcc)
111 private void AddAddress(MessagesAddress address)
113 int ret = Interop.Messages.AddAddress(_messageHandle, address.Number, (int)address.Type);
114 if (ret != (int)MessagesError.None)
116 Log.Error(Globals.LogTag, "Failed to add address, Error - " + (MessagesError)ret);
117 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
121 private void GetAllAddresses()
125 int ret = Interop.Messages.GetAddressCount(_messageHandle, out count);
126 if (ret != (int)MessagesError.None)
128 Log.Error(Globals.LogTag, "Failed to get address count, Error - " + (MessagesError)ret);
129 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
134 var To = new Collection<MessagesAddress>();
135 var Cc = new Collection<MessagesAddress>();
136 var Bcc = new Collection<MessagesAddress>();
137 var From = new Collection<MessagesAddress>();
139 for (int i = 0; i < count; i++)
141 ret = Interop.Messages.GetAddress(_messageHandle, i, out number, out type);
142 if (ret != (int)MessagesError.None)
144 Log.Error(Globals.LogTag, "Failed to get address, Error - " + (MessagesError)ret);
145 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
148 var addressItem = new MessagesAddress((RecipientType)type, number);
149 switch ((RecipientType)type)
151 case RecipientType.To:
154 case RecipientType.Cc:
157 case RecipientType.Bcc:
158 Bcc.Add(addressItem);
161 From.Add(addressItem);
177 int ret = Interop.Messages.GetMessageId(_messageHandle, out id);
178 if (ret != (int)MessagesError.None)
180 Log.Error(Globals.LogTag, "Failed to get message id, Error - " + (MessagesError)ret);
192 int ret = Interop.Messages.GetMessagePort(_messageHandle, out port);
193 if (ret != (int)MessagesError.None)
195 Log.Error(Globals.LogTag, "Failed to get message port, Error - " + (MessagesError)ret);
202 public MessageBoxType BoxType
206 int boxType = (int)MessageBoxType.All;
207 int ret = Interop.Messages.GetMboxType(_messageHandle, out boxType);
208 if (ret != (int)MessagesError.None)
210 Log.Error(Globals.LogTag, "Failed to get message box type, Error - " + (MessagesError)ret);
213 return (MessageBoxType)boxType;
217 int ret = Interop.Messages.SetMboxType(_messageHandle, (int)value);
218 if (ret != (int)MessagesError.None)
220 Log.Error(Globals.LogTag, "Failed to set message box type, Error - " + (MessagesError)ret);
221 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
231 int ret = Interop.Messages.GetText(_messageHandle, out text);
232 if (ret != (int)MessagesError.None)
234 Log.Error(Globals.LogTag, "Failed to get text, Error - " + (MessagesError)ret);
241 int ret = Interop.Messages.SetText(_messageHandle, value);
242 if (ret != (int)MessagesError.None)
244 Log.Error(Globals.LogTag, "Failed to set text, Error - " + (MessagesError)ret);
245 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
255 int ret = Interop.Messages.GetTime(_messageHandle, out time);
256 if (ret != (int)MessagesError.None)
258 Log.Error(Globals.LogTag, "Failed to get time, Error - " + (MessagesError)ret);
261 return (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(time).ToLocalTime();
265 int ret = Interop.Messages.SetTime(_messageHandle, (int)(value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds));
266 if (ret != (int)MessagesError.None)
268 Log.Error(Globals.LogTag, "Failed to set time, Error - " + (MessagesError)ret);
269 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
274 public SimSlotId SimId
278 int simId = (int)SimSlotId.Unknown;
279 int ret = Interop.Messages.GetSimId(_messageHandle, out simId);
280 if (ret != (int)MessagesError.None)
282 Log.Error(Globals.LogTag, "Failed to get simId, Error - " + (MessagesError)ret);
285 return (SimSlotId)simId;
289 int ret = Interop.Messages.SetSimId(_messageHandle, (int)value);
290 if (ret != (int)MessagesError.None)
292 Log.Error(Globals.LogTag, "Failed to set simId, Error - " + (MessagesError)ret);
293 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
298 public IReadOnlyCollection<MessagesAddress> From
302 return _from as IReadOnlyCollection<MessagesAddress>;