[Tizen.Applications.RPCPort] Add RPCPort ParcelHeader APIs (#3512)
authorChangGyu Choi <uppletaste@gmail.com>
Thu, 9 Sep 2021 05:16:52 +0000 (14:16 +0900)
committerGitHub <noreply@github.com>
Thu, 9 Sep 2021 05:16:52 +0000 (14:16 +0900)
* [rpc-port] Add new APIs

Adds:
 class:
 - Tizen.Applications.RPCPort.Parcel.Header

 Operation:
 - Tizen.Applications.RPCPort.Disconnect()
 - Tizen.Applications.RPCPort.Parcel.GetHeader()
 - Tizen.Applications.RPCPort.Parcel.Header.SetTag()
 - Tizen.Applications.RPCPort.Parcel.Header.GetTag()
 - Tizen.Applications.RPCPort.Parcel.Header.SetSeqNum()
 - Tizen.Applications.RPCPort.Parcel.Header.GetSeqNum()
 - Tizen.Applications.RPCPort.Parcel.Header.GetTimeStamp()

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Fix some design

Changes:
 - Replace TimeStamp and Header scope to Parcel's outside
 - Change parameter name of SetSeqNum()
 - Change naming for visibility

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Fix GetHeader()

Fix implementation that unnecesaary creating Header.

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Fix to not matched description of parameter

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Remove unnecessary description

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Change types of Timestamp to nint

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
* Change Disconnect()'s exception code

Signed-off-by: ChangGyu Choi <uppletaste@gmail.com>
src/Tizen.Applications.Common/Interop/Interop.Libc.cs
src/Tizen.Applications.Common/Interop/Interop.RPCPort.cs
src/Tizen.Applications.Common/Tizen.Applications.Common.csproj
src/Tizen.Applications.Common/Tizen.Applications.RPCPort/Parcel.cs
src/Tizen.Applications.Common/Tizen.Applications.RPCPort/Port.cs

index 825599e..2580f63 100644 (file)
 using System;
 using System.Runtime.InteropServices;
 
+using Tizen.Internals;
+
 internal static partial class Interop
 {
     internal static partial class Libc
     {
         [DllImport(Libraries.Libc, EntryPoint = "free", CallingConvention = CallingConvention.Cdecl)]
         internal static extern int Free(IntPtr ptr);
+
+        [NativeStruct("struct timespec", Include = "time.h")]
+        [StructLayout(LayoutKind.Sequential)]
+        internal struct TimeStamp
+        {
+            public nint sec;
+            public nint nsec;
+        }
     }
 }
index cfd4a21..e4d2728 100755 (executable)
@@ -145,6 +145,30 @@ internal static partial class Interop
             //int rpc_port_parcel_burst_write(rpc_port_parcel_h h, const unsigned char *buf, unsigned int size);
             [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_burst_write")]
             internal static extern ErrorCode Write(IntPtr parcelHandle, byte[] buf, int size);
+
+            //int rpc_port_parcel_get_header(rpc_port_parcel_h h, rpc_port_parcel_header_h *header);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_get_header")]
+            internal static extern ErrorCode GetHeader(IntPtr parcelHandle, out IntPtr ParcelHeaderHandle);
+
+            //int rpc_port_parcel_header_set_tag(rpc_port_parcel_header_h header, const char *tag);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_header_set_tag")]
+            internal static extern ErrorCode SetTag(IntPtr parcelHeaderHandle, string tag);
+
+            //int rpc_port_parcel_header_get_tag(rpc_port_parcel_header_h header, char **tag);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_header_get_tag")]
+            internal static extern ErrorCode GetTag(IntPtr parcelHeaderHandle, out string tag);
+
+            //int rpc_port_parcel_header_set_seq_num(rpc_port_parcel_header_h header, int seq_num);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_header_set_seq_num")]
+            internal static extern ErrorCode SetSeqNum(IntPtr parcelHeaderHandle, int seq_num);
+
+            //int rpc_port_parcel_header_get_seq_num(rpc_port_parcel_header_h header, int *seq_num);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_header_get_seq_num")]
+            internal static extern ErrorCode GetSeqNum(IntPtr parcelHeaderHandle, out int seq_num);
+
+            //int rpc_port_parcel_header_get_timestamp(rpc_port_parcel_header_h header, struct timespec *timestamp);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_parcel_header_get_timestamp")]
+            internal static extern ErrorCode GetTimeStamp(IntPtr parcelHeaderHandle, ref Libc.TimeStamp time);
         }
 
         internal static partial class Proxy
@@ -266,6 +290,10 @@ internal static partial class Interop
             //int rpc_port_unset_private_sharing(rpc_port_h port);
             [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_unset_private_sharing")]
             internal static extern ErrorCode UnsetPrivateSharing(IntPtr handle);
+
+            //int rpc_port_disconnect(rpc_port_h h);
+            [DllImport(Libraries.RpcPort, EntryPoint = "rpc_port_disconnect")]
+            internal static extern ErrorCode Disconnect(IntPtr handle);
         }
     }
 }
index 53fd210..c829f98 100755 (executable)
@@ -2,6 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
+    <LangVersion>9.0</LangVersion>
   </PropertyGroup>
 
   <ItemGroup>
index 2571d86..e3d0391 100755 (executable)
@@ -19,12 +19,140 @@ using System;
 namespace Tizen.Applications.RPCPort
 {
     /// <summary>
+    /// This structure represents the time stamp.
+    /// </summary>
+    /// <since_tizen> 9 </since_tizen>
+    public class TimeStamp
+    {
+        /// <summary>
+        /// Constructor with TimeStamp.
+        /// </summary>
+        /// <since_tizen> 9 </since_tizen>
+        internal TimeStamp(long second, long nanoSecond)
+        {
+            this.Second = second;
+            this.NanoSecond = nanoSecond;
+        }
+
+        /// <summary>
+        /// The second of TimeStamp.
+        /// </summary>
+        /// <since_tizen> 9 </since_tizen>
+        public long Second
+        {
+            get;
+            private set;
+        }
+
+        /// <summary>
+        /// The nano second of TimeStamp.
+        /// </summary>
+        /// <since_tizen> 9 </since_tizen>
+        public long NanoSecond
+        {
+            get;
+            private set;
+        }
+    }
+
+    /// <summary>
+    /// The class is the header that has the Parcel's information.
+    /// </summary>
+    /// <since_tizen> 9 </since_tizen>
+    public class ParcelHeader
+    {
+        internal IntPtr _handle;
+
+        /// <summary>
+        /// Constructor with Header
+        /// </summary>
+        /// <since_tizen> 9 </since_tizen>
+        internal ParcelHeader()
+        {
+        }
+
+        /// <summary>
+        /// Sets tag of Header.
+        /// </summary>
+        /// <param name="tag">The tag of Header</param>
+        /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public void SetTag(string tag)
+        {
+            var r = Interop.LibRPCPort.Parcel.SetTag(_handle, tag);
+            if (r != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidIOException();
+        }
+
+        /// <summary>
+        /// Gets tag of Header.
+        /// </summary>
+        /// <returns>Tag</returns>
+        /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public string GetTag()
+        {
+            var r = Interop.LibRPCPort.Parcel.GetTag(_handle, out string tag);
+            if (r != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidIOException();
+
+            return tag;
+        }
+
+        /// <summary>
+        /// Sets sequence number of Header.
+        /// </summary>
+        /// <param name="sequenceNumber">The seqence number of Header</param>
+        /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public void SetSequenceNumber(int sequenceNumber)
+        {
+            var r = Interop.LibRPCPort.Parcel.SetSeqNum(_handle, sequenceNumber);
+            if (r != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidIOException();
+        }
+
+        /// <summary>
+        /// Gets sequence number of Header.
+        /// </summary>
+        /// <returns>Sequence number</returns>
+        /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public int GetSequenceNumber()
+        {
+            var r = Interop.LibRPCPort.Parcel.GetSeqNum(_handle, out int sequenceNumber);
+            if (r != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidIOException();
+
+            return sequenceNumber;
+        }
+
+        /// <summary>
+        /// Gets time stamp of Header.
+        /// </summary>
+        /// <returns>Time stamp</returns>
+        /// <exception cref="InvalidIOException">Thrown when an internal IO error occurs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public TimeStamp GetTimeStamp()
+        {
+            Interop.Libc.TimeStamp time = new Interop.Libc.TimeStamp();
+
+            var r = Interop.LibRPCPort.Parcel.GetTimeStamp(_handle, ref time);
+            if (r != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidIOException();
+
+            return new TimeStamp(time.sec, time.nsec);
+        }
+    };
+
+    /// <summary>
     /// The class that helps to perform marshalling and unmarshalling for RPC.
     /// </summary>
     /// <since_tizen> 5 </since_tizen>
     public class Parcel : IDisposable
     {
         private IntPtr _handle;
+        private ParcelHeader _header;
 
         /// <summary>
         /// Constructor for this class.
@@ -302,6 +430,23 @@ namespace Tizen.Applications.RPCPort
             return ret;
         }
 
+        /// <summary>
+        /// Gets header of rpc port parcel.
+        /// </summary>
+        /// <returns>Parcel header</returns>
+        /// <since_tizen> 9 </since_tizen>
+        public ParcelHeader GetHeader()
+        {
+            if (_header == null) {
+                Interop.LibRPCPort.Parcel.GetHeader(_handle, out IntPtr handle);
+                _header = new ParcelHeader() {
+                    _handle = handle
+                };
+            }
+
+            return _header;
+        }
+
         #region IDisposable Support
         private bool disposedValue = false;
 
index a8eca4c..f826190 100755 (executable)
@@ -96,5 +96,17 @@ namespace Tizen.Applications.RPCPort
             if (err != Interop.LibRPCPort.ErrorCode.None)
                 throw new InvalidIOException();
         }
+
+        /// <summary>
+        /// Disconnects the port.
+        /// </summary>
+        /// <exception cref="System.InvalidOperationException">Thrown when an internal IO error occurrs.</exception>
+        /// <since_tizen> 9 </since_tizen>
+        public void Disconnect()
+        {
+            Interop.LibRPCPort.ErrorCode err = Interop.LibRPCPort.Port.Disconnect(Handle);
+            if (err != Interop.LibRPCPort.ErrorCode.None)
+                throw new InvalidOperationException();
+        }
     }
 }