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 /// This class represents all the messages.
26 /// <since_tizen> 3 </since_tizen>
27 public abstract class Message : IDisposable
29 internal IntPtr _messageHandle = IntPtr.Zero;
30 private bool disposed = false;
31 private int _memoryPressureSize = IntPtr.Size * 11 + sizeof(int) * 5 + sizeof(bool) * 5 + sizeof(short) * 2 + sizeof(byte) * 1176;
33 private ICollection<MessagesAddress> _from = new Collection<MessagesAddress>();
34 internal ICollection<MessagesAddress> _to = new Collection<MessagesAddress>();
35 internal ICollection<MessagesAddress> _cc = new Collection<MessagesAddress>();
36 internal ICollection<MessagesAddress> _bcc = new Collection<MessagesAddress>();
38 internal Message(MessageType type)
40 int ret = Interop.Messages.CreateMessage((int)type, out _messageHandle);
41 if (ret != (int)MessagesError.None)
43 Log.Error(Globals.LogTag, "Failed to create message handle, Error - " + (MessagesError)ret);
44 MessagesErrorFactory.ThrowMessagesException(ret);
47 GC.AddMemoryPressure(_memoryPressureSize);
50 internal Message(IntPtr messageHandle)
52 _messageHandle = messageHandle;
54 GC.AddMemoryPressure(_memoryPressureSize);
57 internal void FillHandle()
60 (this as MmsMessage)?.SetAttachments();
72 /// Releases all resources used by the Message.
74 /// <since_tizen> 3 </since_tizen>
78 GC.SuppressFinalize(this);
79 GC.RemoveMemoryPressure(_memoryPressureSize);
82 private void Dispose(bool disposing)
89 // Free managed objects
92 // Free unmanaged objects
93 if (_messageHandle != IntPtr.Zero)
95 Interop.Messages.DestroyMessage(_messageHandle);
96 _messageHandle = IntPtr.Zero;
101 internal IntPtr GetHandle()
103 return _messageHandle;
106 private void SetAddresses()
108 foreach (var it in _to)
113 foreach (var it in _cc)
118 foreach (var it in _bcc)
124 private void AddAddress(MessagesAddress address)
126 int ret = Interop.Messages.AddAddress(_messageHandle, address.Number, (int)address.Type);
127 if (ret != (int)MessagesError.None)
129 Log.Error(Globals.LogTag, "Failed to add address, Error - " + (MessagesError)ret);
130 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
134 private void GetAllAddresses()
138 int ret = Interop.Messages.GetAddressCount(_messageHandle, out count);
139 if (ret != (int)MessagesError.None)
141 Log.Error(Globals.LogTag, "Failed to get address count, Error - " + (MessagesError)ret);
142 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
147 var To = new Collection<MessagesAddress>();
148 var Cc = new Collection<MessagesAddress>();
149 var Bcc = new Collection<MessagesAddress>();
150 var From = new Collection<MessagesAddress>();
152 for (int i = 0; i < count; i++)
154 ret = Interop.Messages.GetAddress(_messageHandle, i, out number, out type);
155 if (ret != (int)MessagesError.None)
157 Log.Error(Globals.LogTag, "Failed to get address, Error - " + (MessagesError)ret);
158 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
161 var addressItem = new MessagesAddress((RecipientType)type, number);
162 switch ((RecipientType)type)
164 case RecipientType.To:
167 case RecipientType.Cc:
170 case RecipientType.Bcc:
171 Bcc.Add(addressItem);
174 From.Add(addressItem);
189 /// After creating the Message object, the default value of this property is 0. After sending, this value is changed.
191 /// <since_tizen> 3 </since_tizen>
197 int ret = Interop.Messages.GetMessageId(_messageHandle, out id);
198 if (ret != (int)MessagesError.None)
200 Log.Error(Globals.LogTag, "Failed to get message id, Error - " + (MessagesError)ret);
208 /// The destination port of the message.
210 /// <since_tizen> 3 </since_tizen>
216 int ret = Interop.Messages.GetMessagePort(_messageHandle, out port);
217 if (ret != (int)MessagesError.None)
219 Log.Error(Globals.LogTag, "Failed to get message port, Error - " + (MessagesError)ret);
227 /// The message box type.
229 /// <since_tizen> 3 </since_tizen>
230 public MessageBoxType BoxType
234 int boxType = (int)MessageBoxType.All;
235 int ret = Interop.Messages.GetMboxType(_messageHandle, out boxType);
236 if (ret != (int)MessagesError.None)
238 Log.Error(Globals.LogTag, "Failed to get message box type, Error - " + (MessagesError)ret);
241 return (MessageBoxType)boxType;
245 int ret = Interop.Messages.SetMboxType(_messageHandle, (int)value);
246 if (ret != (int)MessagesError.None)
248 Log.Error(Globals.LogTag, "Failed to set message box type, Error - " + (MessagesError)ret);
249 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
255 /// The text of the message.
257 /// <since_tizen> 3 </since_tizen>
263 int ret = Interop.Messages.GetText(_messageHandle, out text);
264 if (ret != (int)MessagesError.None)
266 Log.Error(Globals.LogTag, "Failed to get text, Error - " + (MessagesError)ret);
273 int ret = Interop.Messages.SetText(_messageHandle, value);
274 if (ret != (int)MessagesError.None)
276 Log.Error(Globals.LogTag, "Failed to set text, Error - " + (MessagesError)ret);
277 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
283 /// The time of the message.
285 /// <since_tizen> 3 </since_tizen>
291 int ret = Interop.Messages.GetTime(_messageHandle, out time);
292 if (ret != (int)MessagesError.None)
294 Log.Error(Globals.LogTag, "Failed to get time, Error - " + (MessagesError)ret);
297 return (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(time).ToLocalTime();
301 int ret = Interop.Messages.SetTime(_messageHandle, (int)(value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds));
302 if (ret != (int)MessagesError.None)
304 Log.Error(Globals.LogTag, "Failed to set time, Error - " + (MessagesError)ret);
305 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
311 /// The SIM slot index of the message.
313 /// <since_tizen> 3 </since_tizen>
314 public SimSlotId SimId
318 int simId = (int)SimSlotId.Unknown;
319 int ret = Interop.Messages.GetSimId(_messageHandle, out simId);
320 if (ret != (int)MessagesError.None)
322 Log.Error(Globals.LogTag, "Failed to get simId, Error - " + (MessagesError)ret);
325 return (SimSlotId)simId;
329 int ret = Interop.Messages.SetSimId(_messageHandle, (int)value);
330 if (ret != (int)MessagesError.None)
332 Log.Error(Globals.LogTag, "Failed to set simId, Error - " + (MessagesError)ret);
333 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
339 /// Indicates the sender of the message.
341 /// <since_tizen> 3 </since_tizen>
342 public IReadOnlyCollection<MessagesAddress> From
346 return _from as IReadOnlyCollection<MessagesAddress>;