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 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();
71 /// Releases all resources used by the Message.
76 GC.SuppressFinalize(this);
77 GC.RemoveMemoryPressure(_memoryPressureSize);
80 private void Dispose(bool disposing)
87 // Free managed objects
90 // Free unmanaged objects
91 if (_messageHandle != IntPtr.Zero)
93 Interop.Messages.DestroyMessage(_messageHandle);
94 _messageHandle = IntPtr.Zero;
99 internal IntPtr GetHandle()
101 return _messageHandle;
104 private void SetAddresses()
106 foreach (var it in _to)
111 foreach (var it in _cc)
116 foreach (var it in _bcc)
122 private void AddAddress(MessagesAddress address)
124 int ret = Interop.Messages.AddAddress(_messageHandle, address.Number, (int)address.Type);
125 if (ret != (int)MessagesError.None)
127 Log.Error(Globals.LogTag, "Failed to add address, Error - " + (MessagesError)ret);
128 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
132 private void GetAllAddresses()
136 int ret = Interop.Messages.GetAddressCount(_messageHandle, out count);
137 if (ret != (int)MessagesError.None)
139 Log.Error(Globals.LogTag, "Failed to get address count, Error - " + (MessagesError)ret);
140 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
145 var To = new Collection<MessagesAddress>();
146 var Cc = new Collection<MessagesAddress>();
147 var Bcc = new Collection<MessagesAddress>();
148 var From = new Collection<MessagesAddress>();
150 for (int i = 0; i < count; i++)
152 ret = Interop.Messages.GetAddress(_messageHandle, i, out number, out type);
153 if (ret != (int)MessagesError.None)
155 Log.Error(Globals.LogTag, "Failed to get address, Error - " + (MessagesError)ret);
156 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
159 var addressItem = new MessagesAddress((RecipientType)type, number);
160 switch ((RecipientType)type)
162 case RecipientType.To:
165 case RecipientType.Cc:
168 case RecipientType.Bcc:
169 Bcc.Add(addressItem);
172 From.Add(addressItem);
187 /// After creating the Message object, the default value of this property is 0. After sending, this value is changed.
194 int ret = Interop.Messages.GetMessageId(_messageHandle, out id);
195 if (ret != (int)MessagesError.None)
197 Log.Error(Globals.LogTag, "Failed to get message id, Error - " + (MessagesError)ret);
205 /// The destination port of the message.
212 int ret = Interop.Messages.GetMessagePort(_messageHandle, out port);
213 if (ret != (int)MessagesError.None)
215 Log.Error(Globals.LogTag, "Failed to get message port, Error - " + (MessagesError)ret);
223 /// The message box type.
225 public MessageBoxType BoxType
229 int boxType = (int)MessageBoxType.All;
230 int ret = Interop.Messages.GetMboxType(_messageHandle, out boxType);
231 if (ret != (int)MessagesError.None)
233 Log.Error(Globals.LogTag, "Failed to get message box type, Error - " + (MessagesError)ret);
236 return (MessageBoxType)boxType;
240 int ret = Interop.Messages.SetMboxType(_messageHandle, (int)value);
241 if (ret != (int)MessagesError.None)
243 Log.Error(Globals.LogTag, "Failed to set message box type, Error - " + (MessagesError)ret);
244 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
250 /// The text of the message.
257 int ret = Interop.Messages.GetText(_messageHandle, out text);
258 if (ret != (int)MessagesError.None)
260 Log.Error(Globals.LogTag, "Failed to get text, Error - " + (MessagesError)ret);
267 int ret = Interop.Messages.SetText(_messageHandle, value);
268 if (ret != (int)MessagesError.None)
270 Log.Error(Globals.LogTag, "Failed to set text, Error - " + (MessagesError)ret);
271 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
277 /// The time of the message.
284 int ret = Interop.Messages.GetTime(_messageHandle, out time);
285 if (ret != (int)MessagesError.None)
287 Log.Error(Globals.LogTag, "Failed to get time, Error - " + (MessagesError)ret);
290 return (new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).AddSeconds(time).ToLocalTime();
294 int ret = Interop.Messages.SetTime(_messageHandle, (int)(value.ToUniversalTime().Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds));
295 if (ret != (int)MessagesError.None)
297 Log.Error(Globals.LogTag, "Failed to set time, Error - " + (MessagesError)ret);
298 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
304 /// The SIM slot index of the message.
306 public SimSlotId SimId
310 int simId = (int)SimSlotId.Unknown;
311 int ret = Interop.Messages.GetSimId(_messageHandle, out simId);
312 if (ret != (int)MessagesError.None)
314 Log.Error(Globals.LogTag, "Failed to get simId, Error - " + (MessagesError)ret);
317 return (SimSlotId)simId;
321 int ret = Interop.Messages.SetSimId(_messageHandle, (int)value);
322 if (ret != (int)MessagesError.None)
324 Log.Error(Globals.LogTag, "Failed to set simId, Error - " + (MessagesError)ret);
325 MessagesErrorFactory.ThrowMessagesException(ret, _messageHandle);
331 /// Indicates the sender of the message.
333 public IReadOnlyCollection<MessagesAddress> From
337 return _from as IReadOnlyCollection<MessagesAddress>;