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 internal IntPtr _messageHandle = IntPtr.Zero;
29 private bool disposed = false;
30 private int _memoryPressureSize = IntPtr.Size * 11 + sizeof(int) * 5 + sizeof(bool) * 5 + sizeof(short) * 2 + sizeof(byte) * 1176;
32 private ICollection<MessagesAddress> _from = new Collection<MessagesAddress>();
33 internal ICollection<MessagesAddress> _to = new Collection<MessagesAddress>();
34 internal ICollection<MessagesAddress> _cc = new Collection<MessagesAddress>();
35 internal ICollection<MessagesAddress> _bcc = new Collection<MessagesAddress>();
37 internal Message(MessageType type)
39 int ret = Interop.Messages.CreateMessage((int)type, out _messageHandle);
40 if (ret != (int)MessagesError.None)
42 Log.Error(Globals.LogTag, "Failed to create message handle, Error - " + (MessagesError)ret);
43 MessagesErrorFactory.ThrowMessagesException(ret);
46 GC.AddMemoryPressure(_memoryPressureSize);
49 internal Message(IntPtr messageHandle)
51 _messageHandle = messageHandle;
53 GC.AddMemoryPressure(_memoryPressureSize);
56 internal void FillHandle()
59 (this as MmsMessage)?.SetAttachments();
70 GC.SuppressFinalize(this);
71 GC.RemoveMemoryPressure(_memoryPressureSize);
74 private void Dispose(bool disposing)
81 // Free managed objects
84 // Free unmanaged objects
85 if (_messageHandle != IntPtr.Zero)
87 Interop.Messages.DestroyMessage(_messageHandle);
88 _messageHandle = IntPtr.Zero;
93 internal IntPtr GetHandle()
95 return _messageHandle;
98 private void SetAddresses()
100 foreach (var it in _to)
105 foreach (var it in _cc)
110 foreach (var it in _bcc)
116 private void AddAddress(MessagesAddress address)
118 int ret = Interop.Messages.AddAddress(_messageHandle, address.Number, (int)address.Type);
119 if (ret != (int)MessagesError.None)
121 Log.Error(Globals.LogTag, "Failed to add address, Error - " + (MessagesError)ret);
122 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
126 private void GetAllAddresses()
130 int ret = Interop.Messages.GetAddressCount(_messageHandle, out count);
131 if (ret != (int)MessagesError.None)
133 Log.Error(Globals.LogTag, "Failed to get address count, Error - " + (MessagesError)ret);
134 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
139 var To = new Collection<MessagesAddress>();
140 var Cc = new Collection<MessagesAddress>();
141 var Bcc = new Collection<MessagesAddress>();
142 var From = new Collection<MessagesAddress>();
144 for (int i = 0; i < count; i++)
146 ret = Interop.Messages.GetAddress(_messageHandle, i, out number, out type);
147 if (ret != (int)MessagesError.None)
149 Log.Error(Globals.LogTag, "Failed to get address, Error - " + (MessagesError)ret);
150 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
153 var addressItem = new MessagesAddress((RecipientType)type, number);
154 switch ((RecipientType)type)
156 case RecipientType.To:
159 case RecipientType.Cc:
162 case RecipientType.Bcc:
163 Bcc.Add(addressItem);
166 From.Add(addressItem);
181 /// After creating Message object, default value of this property is 0. After sending, this value is changed.
188 int ret = Interop.Messages.GetMessageId(_messageHandle, out id);
189 if (ret != (int)MessagesError.None)
191 Log.Error(Globals.LogTag, "Failed to get message id, Error - " + (MessagesError)ret);
199 /// The destination port of the message
206 int ret = Interop.Messages.GetMessagePort(_messageHandle, out port);
207 if (ret != (int)MessagesError.None)
209 Log.Error(Globals.LogTag, "Failed to get message port, Error - " + (MessagesError)ret);
217 /// The message box type
219 public MessageBoxType BoxType
223 int boxType = (int)MessageBoxType.All;
224 int ret = Interop.Messages.GetMboxType(_messageHandle, out boxType);
225 if (ret != (int)MessagesError.None)
227 Log.Error(Globals.LogTag, "Failed to get message box type, Error - " + (MessagesError)ret);
230 return (MessageBoxType)boxType;
234 int ret = Interop.Messages.SetMboxType(_messageHandle, (int)value);
235 if (ret != (int)MessagesError.None)
237 Log.Error(Globals.LogTag, "Failed to set message box type, Error - " + (MessagesError)ret);
238 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
244 /// The text of the message
251 int ret = Interop.Messages.GetText(_messageHandle, out text);
252 if (ret != (int)MessagesError.None)
254 Log.Error(Globals.LogTag, "Failed to get text, Error - " + (MessagesError)ret);
261 int ret = Interop.Messages.SetText(_messageHandle, value);
262 if (ret != (int)MessagesError.None)
264 Log.Error(Globals.LogTag, "Failed to set text, Error - " + (MessagesError)ret);
265 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
271 /// The time of the message
278 int ret = Interop.Messages.GetTime(_messageHandle, out time);
279 if (ret != (int)MessagesError.None)
281 Log.Error(Globals.LogTag, "Failed to get time, Error - " + (MessagesError)ret);
284 return (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(time).ToLocalTime();
288 int ret = Interop.Messages.SetTime(_messageHandle, (int)(value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds));
289 if (ret != (int)MessagesError.None)
291 Log.Error(Globals.LogTag, "Failed to set time, Error - " + (MessagesError)ret);
292 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
298 /// The SIM slot index of the message
300 public SimSlotId SimId
304 int simId = (int)SimSlotId.Unknown;
305 int ret = Interop.Messages.GetSimId(_messageHandle, out simId);
306 if (ret != (int)MessagesError.None)
308 Log.Error(Globals.LogTag, "Failed to get simId, Error - " + (MessagesError)ret);
311 return (SimSlotId)simId;
315 int ret = Interop.Messages.SetSimId(_messageHandle, (int)value);
316 if (ret != (int)MessagesError.None)
318 Log.Error(Globals.LogTag, "Failed to set simId, Error - " + (MessagesError)ret);
319 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
325 /// Indicates sender of the message
327 public IReadOnlyCollection<MessagesAddress> From
331 return _from as IReadOnlyCollection<MessagesAddress>;