e3d039114e71cb007d8ad783b4ca11345ca06c48
[platform/core/csapi/tizenfx.git] / src / Tizen.Applications.Common / Tizen.Applications.RPCPort / Parcel.cs
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18
19 namespace Tizen.Applications.RPCPort
20 {
21     /// <summary>
22     /// This structure represents the time stamp.
23     /// </summary>
24     /// <since_tizen> 9 </since_tizen>
25     public class TimeStamp
26     {
27         /// <summary>
28         /// Constructor with TimeStamp.
29         /// </summary>
30         /// <since_tizen> 9 </since_tizen>
31         internal TimeStamp(long second, long nanoSecond)
32         {
33             this.Second = second;
34             this.NanoSecond = nanoSecond;
35         }
36
37         /// <summary>
38         /// The second of TimeStamp.
39         /// </summary>
40         /// <since_tizen> 9 </since_tizen>
41         public long Second
42         {
43             get;
44             private set;
45         }
46
47         /// <summary>
48         /// The nano second of TimeStamp.
49         /// </summary>
50         /// <since_tizen> 9 </since_tizen>
51         public long NanoSecond
52         {
53             get;
54             private set;
55         }
56     }
57
58     /// <summary>
59     /// The class is the header that has the Parcel's information.
60     /// </summary>
61     /// <since_tizen> 9 </since_tizen>
62     public class ParcelHeader
63     {
64         internal IntPtr _handle;
65
66         /// <summary>
67         /// Constructor with Header
68         /// </summary>
69         /// <since_tizen> 9 </since_tizen>
70         internal ParcelHeader()
71         {
72         }
73
74         /// <summary>
75         /// Sets tag of Header.
76         /// </summary>
77         /// <param name="tag">The tag of Header</param>
78         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
79         /// <since_tizen> 9 </since_tizen>
80         public void SetTag(string tag)
81         {
82             var r = Interop.LibRPCPort.Parcel.SetTag(_handle, tag);
83             if (r != Interop.LibRPCPort.ErrorCode.None)
84                 throw new InvalidIOException();
85         }
86
87         /// <summary>
88         /// Gets tag of Header.
89         /// </summary>
90         /// <returns>Tag</returns>
91         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
92         /// <since_tizen> 9 </since_tizen>
93         public string GetTag()
94         {
95             var r = Interop.LibRPCPort.Parcel.GetTag(_handle, out string tag);
96             if (r != Interop.LibRPCPort.ErrorCode.None)
97                 throw new InvalidIOException();
98
99             return tag;
100         }
101
102         /// <summary>
103         /// Sets sequence number of Header.
104         /// </summary>
105         /// <param name="sequenceNumber">The seqence number of Header</param>
106         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
107         /// <since_tizen> 9 </since_tizen>
108         public void SetSequenceNumber(int sequenceNumber)
109         {
110             var r = Interop.LibRPCPort.Parcel.SetSeqNum(_handle, sequenceNumber);
111             if (r != Interop.LibRPCPort.ErrorCode.None)
112                 throw new InvalidIOException();
113         }
114
115         /// <summary>
116         /// Gets sequence number of Header.
117         /// </summary>
118         /// <returns>Sequence number</returns>
119         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
120         /// <since_tizen> 9 </since_tizen>
121         public int GetSequenceNumber()
122         {
123             var r = Interop.LibRPCPort.Parcel.GetSeqNum(_handle, out int sequenceNumber);
124             if (r != Interop.LibRPCPort.ErrorCode.None)
125                 throw new InvalidIOException();
126
127             return sequenceNumber;
128         }
129
130         /// <summary>
131         /// Gets time stamp of Header.
132         /// </summary>
133         /// <returns>Time stamp</returns>
134         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
135         /// <since_tizen> 9 </since_tizen>
136         public TimeStamp GetTimeStamp()
137         {
138             Interop.Libc.TimeStamp time = new Interop.Libc.TimeStamp();
139
140             var r = Interop.LibRPCPort.Parcel.GetTimeStamp(_handle, ref time);
141             if (r != Interop.LibRPCPort.ErrorCode.None)
142                 throw new InvalidIOException();
143
144             return new TimeStamp(time.sec, time.nsec);
145         }
146     };
147
148     /// <summary>
149     /// The class that helps to perform marshalling and unmarshalling for RPC.
150     /// </summary>
151     /// <since_tizen> 5 </since_tizen>
152     public class Parcel : IDisposable
153     {
154         private IntPtr _handle;
155         private ParcelHeader _header;
156
157         /// <summary>
158         /// Constructor for this class.
159         /// </summary>
160         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
161         /// <since_tizen> 5 </since_tizen>
162         public Parcel()
163         {
164             var r = Interop.LibRPCPort.Parcel.Create(out _handle);
165             if (r != Interop.LibRPCPort.ErrorCode.None)
166                 throw new InvalidIOException();
167         }
168
169         /// <summary>
170         /// Constructor with port object.
171         /// </summary>
172         /// <param name="port">Port object.</param>
173         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
174         /// <since_tizen> 5 </since_tizen>
175         public Parcel(Port port)
176         {
177             if (port == null)
178                 throw new InvalidIOException();
179             var r = Interop.LibRPCPort.Parcel.CreateFromPort(out _handle, port.Handle);
180             if (r != Interop.LibRPCPort.ErrorCode.None)
181                 throw new InvalidIOException();
182         }
183
184         /// <summary>
185         /// Sends parcel data through the port.
186         /// </summary>
187         /// <param name="p">The RPC port object for writing data.</param>
188         /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
189         /// <since_tizen> 5 </since_tizen>
190         public void Send(Port p)
191         {
192             if (p == null)
193                 throw new InvalidIOException();
194             var r = Interop.LibRPCPort.Parcel.Send(_handle, p.Handle);
195             if (r != Interop.LibRPCPort.ErrorCode.None)
196                 throw new InvalidIOException();
197         }
198
199         /// <summary>
200         /// Writes a byte value into parcel object.
201         /// </summary>
202         /// <param name="b">byte data.</param>
203         /// <since_tizen> 5 </since_tizen>
204         public void WriteByte(byte b)
205         {
206             Interop.LibRPCPort.Parcel.WriteByte(_handle, b);
207         }
208
209         /// <summary>
210         /// Writes a short value into parcel object.
211         /// </summary>
212         /// <param name="b">short data.</param>
213         /// <since_tizen> 5 </since_tizen>
214         public void WriteShort(short b)
215         {
216             Interop.LibRPCPort.Parcel.WriteInt16(_handle, b);
217         }
218
219         /// <summary>
220         /// Writes an int value into parcel object.
221         /// </summary>
222         /// <param name="b">int data.</param>
223         /// <since_tizen> 5 </since_tizen>
224         public void WriteInt(int b)
225         {
226             Interop.LibRPCPort.Parcel.WriteInt32(_handle, b);
227         }
228
229         /// <summary>
230         /// Writes a long value into parcel object.
231         /// </summary>
232         /// <param name="b">long data.</param>
233         /// <since_tizen> 5 </since_tizen>
234         public void WriteLong(long b)
235         {
236             Interop.LibRPCPort.Parcel.WriteInt64(_handle, b);
237         }
238
239         /// <summary>
240         /// Writes a float value into parcel object.
241         /// </summary>
242         /// <param name="b">float data.</param>
243         /// <since_tizen> 5 </since_tizen>
244         public void WriteFloat(float b)
245         {
246             Interop.LibRPCPort.Parcel.WriteFloat(_handle, b);
247         }
248
249         /// <summary>
250         /// Writes a double value into parcel object.
251         /// </summary>
252         /// <param name="b">double data.</param>
253         /// <since_tizen> 5 </since_tizen>
254         public void WriteDouble(double b)
255         {
256             Interop.LibRPCPort.Parcel.WriteDouble(_handle, b);
257         }
258
259         /// <summary>
260         /// Writes a string value into parcel object.
261         /// </summary>
262         /// <param name="b">string data.</param>
263         /// <since_tizen> 5 </since_tizen>
264         public void WriteString(string b)
265         {
266             Interop.LibRPCPort.Parcel.WriteString(_handle, b);
267         }
268
269         /// <summary>
270         /// Writes a bool value into parcel object.
271         /// </summary>
272         /// <param name="b">bool data.</param>
273         /// <since_tizen> 5 </since_tizen>
274         public void WriteBool(bool b)
275         {
276             Interop.LibRPCPort.Parcel.WriteBool(_handle, b);
277         }
278
279         /// <summary>
280         /// Writes a Bundle data into parcel object.
281         /// </summary>
282         /// <param name="b">Bundle data.</param>
283         /// <since_tizen> 5 </since_tizen>
284         public void WriteBundle(Bundle b)
285         {
286             Interop.LibRPCPort.Parcel.WriteBundle(_handle, b.SafeBundleHandle.DangerousGetHandle());
287         }
288
289         /// <summary>
290         /// Writes a count of an array into parcel object.
291         /// </summary>
292         /// <param name="cnt">Array count.</param>
293         /// <since_tizen> 5 </since_tizen>
294         public void WriteArrayCount(int cnt)
295         {
296             Interop.LibRPCPort.Parcel.WriteArrayCount(_handle, cnt);
297         }
298
299         /// <summary>
300         /// Reads a byte value from parcel object.
301         /// </summary>
302         /// <returns>byte data.</returns>
303         /// <since_tizen> 5 </since_tizen>
304         public byte ReadByte()
305         {
306             Interop.LibRPCPort.Parcel.ReadByte(_handle, out byte b);
307             return b;
308         }
309
310         /// <summary>
311         /// Reads a short value from parcel object.
312         /// </summary>
313         /// <returns>short data.</returns>
314         /// <since_tizen> 5 </since_tizen>
315         public short ReadShort()
316         {
317             Interop.LibRPCPort.Parcel.ReadInt16(_handle, out short b);
318             return b;
319         }
320
321         /// <summary>
322         /// Reads an int value from parcel object.
323         /// </summary>
324         /// <returns>int data.</returns>
325         /// <since_tizen> 5 </since_tizen>
326         public int ReadInt()
327         {
328             Interop.LibRPCPort.Parcel.ReadInt32(_handle, out int b);
329             return b;
330         }
331
332         /// <summary>
333         /// Reads a long value from parcel object.
334         /// </summary>
335         /// <returns>long data.</returns>
336         /// <since_tizen> 5 </since_tizen>
337         public long ReadLong()
338         {
339             Interop.LibRPCPort.Parcel.ReadInt64(_handle, out long b);
340             return b;
341         }
342
343         /// <summary>
344         /// Reads a float value from parcel object.
345         /// </summary>
346         /// <returns>float data.</returns>
347         /// <since_tizen> 5 </since_tizen>
348         public float ReadFloat()
349         {
350             Interop.LibRPCPort.Parcel.ReadFloat(_handle, out float b);
351             return b;
352         }
353
354         /// <summary>
355         /// Reads a double value from parcel object.
356         /// </summary>
357         /// <returns>double data.</returns>
358         /// <since_tizen> 5 </since_tizen>
359         public double ReadDouble()
360         {
361             Interop.LibRPCPort.Parcel.ReadDouble(_handle, out double b);
362             return b;
363         }
364
365         /// <summary>
366         /// Reads a string value from parcel object.
367         /// </summary>
368         /// <returns>string data.</returns>
369         /// <since_tizen> 5 </since_tizen>
370         public string ReadString()
371         {
372             Interop.LibRPCPort.Parcel.ReadString(_handle, out string b);
373             return b;
374         }
375
376         /// <summary>
377         /// Reads a bool value from parcel object.
378         /// </summary>
379         /// <returns>bool data.</returns>
380         /// <since_tizen> 5 </since_tizen>
381         public bool ReadBool()
382         {
383             Interop.LibRPCPort.Parcel.ReadBool(_handle, out bool b);
384             return b;
385         }
386
387         /// <summary>
388         /// Reads a Bundle value from parcel object.
389         /// </summary>
390         /// <returns>Bundle data.</returns>
391         /// <since_tizen> 5 </since_tizen>
392         public Bundle ReadBundle()
393         {
394             Interop.LibRPCPort.Parcel.ReadBundle(_handle, out IntPtr b);
395
396             return new Bundle(new SafeBundleHandle(b, true));
397         }
398
399         /// <summary>
400         /// Reads a count of an array from parcel object.
401         /// </summary>
402         /// <returns>Array count.</returns>
403         /// <since_tizen> 5 </since_tizen>
404         public int ReadArrayCount()
405         {
406             Interop.LibRPCPort.Parcel.ReadArrayCount(_handle, out int b);
407             return b;
408         }
409
410         /// <summary>
411         /// Writes bytes into parcel object.
412         /// </summary>
413         /// <param name="bytes">Array of bytes.</param>
414         /// <since_tizen> 5 </since_tizen>
415         public void Write(byte[] bytes)
416         {
417             Interop.LibRPCPort.Parcel.Write(_handle, bytes, bytes.Length);
418         }
419
420         /// <summary>
421         /// Reads bytes from parcel object.
422         /// </summary>
423         /// <param name="size">Bytes to read.</param>
424         /// <returns>Array of bytes.</returns>
425         /// <since_tizen> 5 </since_tizen>
426         public byte[] Read(int size)
427         {
428             var ret = new byte[size];
429             Interop.LibRPCPort.Parcel.Read(_handle, ret, size);
430             return ret;
431         }
432
433         /// <summary>
434         /// Gets header of rpc port parcel.
435         /// </summary>
436         /// <returns>Parcel header</returns>
437         /// <since_tizen> 9 </since_tizen>
438         public ParcelHeader GetHeader()
439         {
440             if (_header == null) {
441                 Interop.LibRPCPort.Parcel.GetHeader(_handle, out IntPtr handle);
442                 _header = new ParcelHeader() {
443                     _handle = handle
444                 };
445             }
446
447             return _header;
448         }
449
450         #region IDisposable Support
451         private bool disposedValue = false;
452
453         private void Dispose(bool disposing)
454         {
455             if (!disposedValue)
456             {
457                 if (disposing)
458                 {
459                 }
460
461                 if (_handle != IntPtr.Zero)
462                 {
463                     Interop.LibRPCPort.Parcel.Destroy(_handle);
464                     _handle = IntPtr.Zero;
465                 }
466
467                 disposedValue = true;
468             }
469         }
470
471         /// <summary>
472         /// Finalizer of the class Parcel.
473         /// </summary>
474         ~Parcel()
475         {
476             Dispose(false);
477         }
478
479         /// <summary>
480         /// Release all the resources used by the class Parcel.
481         /// </summary>
482         /// <since_tizen> 5 </since_tizen>
483         public void Dispose()
484         {
485             Dispose(true);
486             GC.SuppressFinalize(this);
487         }
488         #endregion
489     }
490 }