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.
19 namespace Tizen.Applications.RPCPort
22 /// This structure represents the time stamp.
24 /// <since_tizen> 9 </since_tizen>
25 public class TimeStamp
28 /// Constructor with TimeStamp.
30 /// <since_tizen> 9 </since_tizen>
31 internal TimeStamp(long second, long nanoSecond)
34 this.NanoSecond = nanoSecond;
38 /// The second of TimeStamp.
40 /// <since_tizen> 9 </since_tizen>
48 /// The nano second of TimeStamp.
50 /// <since_tizen> 9 </since_tizen>
51 public long NanoSecond
59 /// The class is the header that has the Parcel's information.
61 /// <since_tizen> 9 </since_tizen>
62 public class ParcelHeader
64 internal IntPtr _handle;
67 /// Constructor with Header
69 /// <since_tizen> 9 </since_tizen>
70 internal ParcelHeader()
75 /// Sets tag of Header.
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)
82 var r = Interop.LibRPCPort.Parcel.SetTag(_handle, tag);
83 if (r != Interop.LibRPCPort.ErrorCode.None)
84 throw new InvalidIOException();
88 /// Gets tag of Header.
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()
95 var r = Interop.LibRPCPort.Parcel.GetTag(_handle, out string tag);
96 if (r != Interop.LibRPCPort.ErrorCode.None)
97 throw new InvalidIOException();
103 /// Sets sequence number of Header.
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)
110 var r = Interop.LibRPCPort.Parcel.SetSeqNum(_handle, sequenceNumber);
111 if (r != Interop.LibRPCPort.ErrorCode.None)
112 throw new InvalidIOException();
116 /// Gets sequence number of Header.
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()
123 var r = Interop.LibRPCPort.Parcel.GetSeqNum(_handle, out int sequenceNumber);
124 if (r != Interop.LibRPCPort.ErrorCode.None)
125 throw new InvalidIOException();
127 return sequenceNumber;
131 /// Gets time stamp of Header.
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()
138 Interop.Libc.TimeStamp time = new Interop.Libc.TimeStamp();
140 var r = Interop.LibRPCPort.Parcel.GetTimeStamp(_handle, ref time);
141 if (r != Interop.LibRPCPort.ErrorCode.None)
142 throw new InvalidIOException();
144 return new TimeStamp(time.sec, time.nsec);
149 /// The class that helps to perform marshalling and unmarshalling for RPC.
151 /// <since_tizen> 5 </since_tizen>
152 public class Parcel : IDisposable
154 private IntPtr _handle;
155 private ParcelHeader _header;
158 /// Constructor for this class.
160 /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
161 /// <since_tizen> 5 </since_tizen>
164 var r = Interop.LibRPCPort.Parcel.Create(out _handle);
165 if (r != Interop.LibRPCPort.ErrorCode.None)
166 throw new InvalidIOException();
170 /// Constructor with port object.
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)
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();
185 /// Sends parcel data through the port.
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)
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();
200 /// Writes a byte value into parcel object.
202 /// <param name="b">byte data.</param>
203 /// <since_tizen> 5 </since_tizen>
204 public void WriteByte(byte b)
206 Interop.LibRPCPort.Parcel.WriteByte(_handle, b);
210 /// Writes a short value into parcel object.
212 /// <param name="b">short data.</param>
213 /// <since_tizen> 5 </since_tizen>
214 public void WriteShort(short b)
216 Interop.LibRPCPort.Parcel.WriteInt16(_handle, b);
220 /// Writes an int value into parcel object.
222 /// <param name="b">int data.</param>
223 /// <since_tizen> 5 </since_tizen>
224 public void WriteInt(int b)
226 Interop.LibRPCPort.Parcel.WriteInt32(_handle, b);
230 /// Writes a long value into parcel object.
232 /// <param name="b">long data.</param>
233 /// <since_tizen> 5 </since_tizen>
234 public void WriteLong(long b)
236 Interop.LibRPCPort.Parcel.WriteInt64(_handle, b);
240 /// Writes a float value into parcel object.
242 /// <param name="b">float data.</param>
243 /// <since_tizen> 5 </since_tizen>
244 public void WriteFloat(float b)
246 Interop.LibRPCPort.Parcel.WriteFloat(_handle, b);
250 /// Writes a double value into parcel object.
252 /// <param name="b">double data.</param>
253 /// <since_tizen> 5 </since_tizen>
254 public void WriteDouble(double b)
256 Interop.LibRPCPort.Parcel.WriteDouble(_handle, b);
260 /// Writes a string value into parcel object.
262 /// <param name="b">string data.</param>
263 /// <since_tizen> 5 </since_tizen>
264 public void WriteString(string b)
266 Interop.LibRPCPort.Parcel.WriteString(_handle, b);
270 /// Writes a bool value into parcel object.
272 /// <param name="b">bool data.</param>
273 /// <since_tizen> 5 </since_tizen>
274 public void WriteBool(bool b)
276 Interop.LibRPCPort.Parcel.WriteBool(_handle, b);
280 /// Writes a Bundle data into parcel object.
282 /// <param name="b">Bundle data.</param>
283 /// <since_tizen> 5 </since_tizen>
284 public void WriteBundle(Bundle b)
286 Interop.LibRPCPort.Parcel.WriteBundle(_handle, b.SafeBundleHandle.DangerousGetHandle());
290 /// Writes a count of an array into parcel object.
292 /// <param name="cnt">Array count.</param>
293 /// <since_tizen> 5 </since_tizen>
294 public void WriteArrayCount(int cnt)
296 Interop.LibRPCPort.Parcel.WriteArrayCount(_handle, cnt);
300 /// Reads a byte value from parcel object.
302 /// <returns>byte data.</returns>
303 /// <since_tizen> 5 </since_tizen>
304 public byte ReadByte()
306 Interop.LibRPCPort.Parcel.ReadByte(_handle, out byte b);
311 /// Reads a short value from parcel object.
313 /// <returns>short data.</returns>
314 /// <since_tizen> 5 </since_tizen>
315 public short ReadShort()
317 Interop.LibRPCPort.Parcel.ReadInt16(_handle, out short b);
322 /// Reads an int value from parcel object.
324 /// <returns>int data.</returns>
325 /// <since_tizen> 5 </since_tizen>
328 Interop.LibRPCPort.Parcel.ReadInt32(_handle, out int b);
333 /// Reads a long value from parcel object.
335 /// <returns>long data.</returns>
336 /// <since_tizen> 5 </since_tizen>
337 public long ReadLong()
339 Interop.LibRPCPort.Parcel.ReadInt64(_handle, out long b);
344 /// Reads a float value from parcel object.
346 /// <returns>float data.</returns>
347 /// <since_tizen> 5 </since_tizen>
348 public float ReadFloat()
350 Interop.LibRPCPort.Parcel.ReadFloat(_handle, out float b);
355 /// Reads a double value from parcel object.
357 /// <returns>double data.</returns>
358 /// <since_tizen> 5 </since_tizen>
359 public double ReadDouble()
361 Interop.LibRPCPort.Parcel.ReadDouble(_handle, out double b);
366 /// Reads a string value from parcel object.
368 /// <returns>string data.</returns>
369 /// <since_tizen> 5 </since_tizen>
370 public string ReadString()
372 Interop.LibRPCPort.Parcel.ReadString(_handle, out string b);
377 /// Reads a bool value from parcel object.
379 /// <returns>bool data.</returns>
380 /// <since_tizen> 5 </since_tizen>
381 public bool ReadBool()
383 Interop.LibRPCPort.Parcel.ReadBool(_handle, out bool b);
388 /// Reads a Bundle value from parcel object.
390 /// <returns>Bundle data.</returns>
391 /// <since_tizen> 5 </since_tizen>
392 public Bundle ReadBundle()
394 Interop.LibRPCPort.Parcel.ReadBundle(_handle, out IntPtr b);
396 return new Bundle(new SafeBundleHandle(b, true));
400 /// Reads a count of an array from parcel object.
402 /// <returns>Array count.</returns>
403 /// <since_tizen> 5 </since_tizen>
404 public int ReadArrayCount()
406 Interop.LibRPCPort.Parcel.ReadArrayCount(_handle, out int b);
411 /// Writes bytes into parcel object.
413 /// <param name="bytes">Array of bytes.</param>
414 /// <since_tizen> 5 </since_tizen>
415 public void Write(byte[] bytes)
417 Interop.LibRPCPort.Parcel.Write(_handle, bytes, bytes.Length);
421 /// Reads bytes from parcel object.
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)
428 var ret = new byte[size];
429 Interop.LibRPCPort.Parcel.Read(_handle, ret, size);
434 /// Gets header of rpc port parcel.
436 /// <returns>Parcel header</returns>
437 /// <since_tizen> 9 </since_tizen>
438 public ParcelHeader GetHeader()
440 if (_header == null) {
441 Interop.LibRPCPort.Parcel.GetHeader(_handle, out IntPtr handle);
442 _header = new ParcelHeader() {
450 #region IDisposable Support
451 private bool disposedValue = false;
453 private void Dispose(bool disposing)
461 if (_handle != IntPtr.Zero)
463 Interop.LibRPCPort.Parcel.Destroy(_handle);
464 _handle = IntPtr.Zero;
467 disposedValue = true;
472 /// Finalizer of the class Parcel.
480 /// Release all the resources used by the class Parcel.
482 /// <since_tizen> 5 </since_tizen>
483 public void Dispose()
486 GC.SuppressFinalize(this);