2 * Copyright (c) 2018 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.Runtime.InteropServices;
20 namespace Tizen.Applications.RPCPort
23 /// This structure represents the time stamp.
25 /// <since_tizen> 9 </since_tizen>
26 public class TimeStamp
29 /// Constructor with TimeStamp.
31 /// <since_tizen> 9 </since_tizen>
32 internal TimeStamp(long second, long nanoSecond)
35 this.NanoSecond = nanoSecond;
39 /// The second of TimeStamp.
41 /// <since_tizen> 9 </since_tizen>
49 /// The nano second of TimeStamp.
51 /// <since_tizen> 9 </since_tizen>
52 public long NanoSecond
60 /// The class is the header that has the Parcel's information.
62 /// <since_tizen> 9 </since_tizen>
63 public class ParcelHeader
65 internal IntPtr _handle;
68 /// Constructor with Header
70 /// <since_tizen> 9 </since_tizen>
71 internal ParcelHeader()
76 /// Sets tag of Header.
78 /// <param name="tag">The tag of Header</param>
79 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
80 /// <since_tizen> 9 </since_tizen>
81 public void SetTag(string tag)
83 var r = Interop.LibRPCPort.Parcel.SetTag(_handle, tag);
84 if (r != Interop.LibRPCPort.ErrorCode.None)
85 throw new InvalidIOException();
89 /// Gets tag of Header.
91 /// <returns>Tag</returns>
92 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
93 /// <since_tizen> 9 </since_tizen>
94 public string GetTag()
96 var r = Interop.LibRPCPort.Parcel.GetTag(_handle, out string tag);
97 if (r != Interop.LibRPCPort.ErrorCode.None)
98 throw new InvalidIOException();
104 /// Sets sequence number of Header.
106 /// <param name="sequenceNumber">The seqence number of Header</param>
107 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
108 /// <since_tizen> 9 </since_tizen>
109 public void SetSequenceNumber(int sequenceNumber)
111 var r = Interop.LibRPCPort.Parcel.SetSeqNum(_handle, sequenceNumber);
112 if (r != Interop.LibRPCPort.ErrorCode.None)
113 throw new InvalidIOException();
117 /// Gets sequence number of Header.
119 /// <returns>Sequence number</returns>
120 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
121 /// <since_tizen> 9 </since_tizen>
122 public int GetSequenceNumber()
124 var r = Interop.LibRPCPort.Parcel.GetSeqNum(_handle, out int sequenceNumber);
125 if (r != Interop.LibRPCPort.ErrorCode.None)
126 throw new InvalidIOException();
128 return sequenceNumber;
132 /// Gets time stamp of Header.
134 /// <returns>Time stamp</returns>
135 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
136 /// <since_tizen> 9 </since_tizen>
137 public TimeStamp GetTimeStamp()
139 Interop.Libc.TimeStamp time = new Interop.Libc.TimeStamp();
141 var r = Interop.LibRPCPort.Parcel.GetTimeStamp(_handle, ref time);
142 if (r != Interop.LibRPCPort.ErrorCode.None)
143 throw new InvalidIOException();
145 return new TimeStamp(time.sec.ToInt64(), time.nsec.ToInt64());
150 /// The class that helps to perform marshalling and unmarshalling for RPC.
152 /// <since_tizen> 5 </since_tizen>
153 public class Parcel : IDisposable
155 private IntPtr _handle;
156 private ParcelHeader _header;
159 /// Constructor for this class.
161 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
162 /// <since_tizen> 5 </since_tizen>
165 var r = Interop.LibRPCPort.Parcel.Create(out _handle);
166 if (r != Interop.LibRPCPort.ErrorCode.None)
167 throw new InvalidIOException();
171 /// Constructor with port object.
173 /// <param name="port">Port object.</param>
174 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
175 /// <since_tizen> 5 </since_tizen>
176 public Parcel(Port port)
179 throw new InvalidIOException();
180 var r = Interop.LibRPCPort.Parcel.CreateFromPort(out _handle, port.Handle);
181 if (r != Interop.LibRPCPort.ErrorCode.None)
182 throw new InvalidIOException();
186 /// Constructor with the raw bytes.
188 /// <param name="bytes">The raw bytes.</param>
189 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
190 /// <since_tizen> 9 </since_tizen>
191 public Parcel(byte[] bytes)
194 throw new InvalidIOException();
195 var r = Interop.LibRPCPort.Parcel.CreateFromRaw(out _handle, bytes, (uint)bytes.Length);
196 if (r != Interop.LibRPCPort.ErrorCode.None)
197 throw new InvalidIOException();
201 /// Gets the raw bytes of the parcel.
203 /// <returns>The raw bytes of the parcel.</returns>
204 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
205 /// <since_tizen> 9 </since_tizen>
206 public byte[] ToBytes()
208 var r = Interop.LibRPCPort.Parcel.GetRaw(_handle, out IntPtr raw, out uint size);
209 if (r != Interop.LibRPCPort.ErrorCode.None)
210 throw new InvalidIOException();
211 byte[] bytes = new byte[size];
212 Marshal.Copy(raw, bytes, 0, (int)size);
217 /// Sends parcel data through the port.
219 /// <param name="p">The RPC port object for writing data.</param>
220 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
221 /// <since_tizen> 5 </since_tizen>
222 public void Send(Port p)
225 throw new InvalidIOException();
226 var r = Interop.LibRPCPort.Parcel.Send(_handle, p.Handle);
227 if (r != Interop.LibRPCPort.ErrorCode.None)
228 throw new InvalidIOException();
232 /// Writes a byte value into parcel object.
234 /// <param name="b">byte data.</param>
235 /// <since_tizen> 5 </since_tizen>
236 public void WriteByte(byte b)
238 Interop.LibRPCPort.Parcel.WriteByte(_handle, b);
242 /// Writes a short value into parcel object.
244 /// <param name="b">short data.</param>
245 /// <since_tizen> 5 </since_tizen>
246 public void WriteShort(short b)
248 Interop.LibRPCPort.Parcel.WriteInt16(_handle, b);
252 /// Writes an int value into parcel object.
254 /// <param name="b">int data.</param>
255 /// <since_tizen> 5 </since_tizen>
256 public void WriteInt(int b)
258 Interop.LibRPCPort.Parcel.WriteInt32(_handle, b);
262 /// Writes a long value into parcel object.
264 /// <param name="b">long data.</param>
265 /// <since_tizen> 5 </since_tizen>
266 public void WriteLong(long b)
268 Interop.LibRPCPort.Parcel.WriteInt64(_handle, b);
272 /// Writes a float value into parcel object.
274 /// <param name="b">float data.</param>
275 /// <since_tizen> 5 </since_tizen>
276 public void WriteFloat(float b)
278 Interop.LibRPCPort.Parcel.WriteFloat(_handle, b);
282 /// Writes a double value into parcel object.
284 /// <param name="b">double data.</param>
285 /// <since_tizen> 5 </since_tizen>
286 public void WriteDouble(double b)
288 Interop.LibRPCPort.Parcel.WriteDouble(_handle, b);
292 /// Writes a string value into parcel object.
294 /// <param name="b">string data.</param>
295 /// <since_tizen> 5 </since_tizen>
296 public void WriteString(string b)
298 Interop.LibRPCPort.Parcel.WriteString(_handle, b);
302 /// Writes a bool value into parcel object.
304 /// <param name="b">bool data.</param>
305 /// <since_tizen> 5 </since_tizen>
306 public void WriteBool(bool b)
308 Interop.LibRPCPort.Parcel.WriteBool(_handle, b);
312 /// Writes a Bundle data into parcel object.
314 /// <param name="b">Bundle data.</param>
315 /// <since_tizen> 5 </since_tizen>
316 public void WriteBundle(Bundle b)
318 Interop.LibRPCPort.Parcel.WriteBundle(_handle, b.SafeBundleHandle.DangerousGetHandle());
322 /// Writes a count of an array into parcel object.
324 /// <param name="cnt">Array count.</param>
325 /// <since_tizen> 5 </since_tizen>
326 public void WriteArrayCount(int cnt)
328 Interop.LibRPCPort.Parcel.WriteArrayCount(_handle, cnt);
332 /// Reads a byte value from parcel object.
334 /// <returns>byte data.</returns>
335 /// <since_tizen> 5 </since_tizen>
336 public byte ReadByte()
338 Interop.LibRPCPort.Parcel.ReadByte(_handle, out byte b);
343 /// Reads a short value from parcel object.
345 /// <returns>short data.</returns>
346 /// <since_tizen> 5 </since_tizen>
347 public short ReadShort()
349 Interop.LibRPCPort.Parcel.ReadInt16(_handle, out short b);
354 /// Reads an int value from parcel object.
356 /// <returns>int data.</returns>
357 /// <since_tizen> 5 </since_tizen>
360 Interop.LibRPCPort.Parcel.ReadInt32(_handle, out int b);
365 /// Reads a long value from parcel object.
367 /// <returns>long data.</returns>
368 /// <since_tizen> 5 </since_tizen>
369 public long ReadLong()
371 Interop.LibRPCPort.Parcel.ReadInt64(_handle, out long b);
376 /// Reads a float value from parcel object.
378 /// <returns>float data.</returns>
379 /// <since_tizen> 5 </since_tizen>
380 public float ReadFloat()
382 Interop.LibRPCPort.Parcel.ReadFloat(_handle, out float b);
387 /// Reads a double value from parcel object.
389 /// <returns>double data.</returns>
390 /// <since_tizen> 5 </since_tizen>
391 public double ReadDouble()
393 Interop.LibRPCPort.Parcel.ReadDouble(_handle, out double b);
398 /// Reads a string value from parcel object.
400 /// <returns>string data.</returns>
401 /// <since_tizen> 5 </since_tizen>
402 public string ReadString()
404 Interop.LibRPCPort.Parcel.ReadString(_handle, out string b);
409 /// Reads a bool value from parcel object.
411 /// <returns>bool data.</returns>
412 /// <since_tizen> 5 </since_tizen>
413 public bool ReadBool()
415 Interop.LibRPCPort.Parcel.ReadBool(_handle, out bool b);
420 /// Reads a Bundle value from parcel object.
422 /// <returns>Bundle data.</returns>
423 /// <since_tizen> 5 </since_tizen>
424 public Bundle ReadBundle()
426 Interop.LibRPCPort.Parcel.ReadBundle(_handle, out IntPtr b);
428 return new Bundle(new SafeBundleHandle(b, true));
432 /// Reads a count of an array from parcel object.
434 /// <returns>Array count.</returns>
435 /// <since_tizen> 5 </since_tizen>
436 public int ReadArrayCount()
438 Interop.LibRPCPort.Parcel.ReadArrayCount(_handle, out int b);
443 /// Writes bytes into parcel object.
445 /// <param name="bytes">Array of bytes.</param>
446 /// <since_tizen> 5 </since_tizen>
447 public void Write(byte[] bytes)
449 Interop.LibRPCPort.Parcel.Write(_handle, bytes, bytes.Length);
453 /// Reads bytes from parcel object.
455 /// <param name="size">Bytes to read.</param>
456 /// <returns>Array of bytes.</returns>
457 /// <since_tizen> 5 </since_tizen>
458 public byte[] Read(int size)
460 var ret = new byte[size];
461 Interop.LibRPCPort.Parcel.Read(_handle, ret, size);
466 /// Gets header of rpc port parcel.
468 /// <returns>Parcel header</returns>
469 /// <since_tizen> 9 </since_tizen>
470 public ParcelHeader GetHeader()
472 if (_header == null) {
473 Interop.LibRPCPort.Parcel.GetHeader(_handle, out IntPtr handle);
474 _header = new ParcelHeader() {
482 #region IDisposable Support
483 private bool disposedValue = false;
485 private void Dispose(bool disposing)
493 if (_handle != IntPtr.Zero)
495 Interop.LibRPCPort.Parcel.Destroy(_handle);
496 _handle = IntPtr.Zero;
499 disposedValue = true;
504 /// Finalizer of the class Parcel.
512 /// Release all the resources used by the class Parcel.
514 /// <since_tizen> 5 </since_tizen>
515 public void Dispose()
518 GC.SuppressFinalize(this);