diff --git a/src/Tizen.Multimedia.Remoting/ScreenMirroring/ScreenMirroring.cs b/src/Tizen.Multimedia.Remoting/ScreenMirroring/ScreenMirroring.cs index 80ea9ddd222..6fa2e6cd5cc 100644 --- a/src/Tizen.Multimedia.Remoting/ScreenMirroring/ScreenMirroring.cs +++ b/src/Tizen.Multimedia.Remoting/ScreenMirroring/ScreenMirroring.cs @@ -499,60 +499,65 @@ public void SetUibcInformation(Size windowSize, ScreenMirroringCaptureMode mode) /// An internal error occurs. /// /// is null. + /// is empty. /// The has already been disposed. [EditorBrowsable(EditorBrowsableState.Never)] public void SendGenericMouseEvent(IEnumerable uibcMouseInfos, ScreenMirroringMouseEventType type) { + ArgumentNullException.ThrowIfNull(uibcMouseInfos); + ValidateState(ScreenMirroringState.Connected, ScreenMirroringState.Playing); - if (!uibcMouseInfos.Any()) + var infos = uibcMouseInfos as IReadOnlyList ?? uibcMouseInfos.ToArray(); + if (infos.Count == 0) { - throw new ArgumentNullException(nameof(uibcMouseInfos)); + throw new ArgumentException("uibcMouseInfos cannot be empty.", nameof(uibcMouseInfos)); } - var uibcMouseInfosSize = uibcMouseInfos.Count(); + var uibcMouseInfosSize = infos.Count; var uibcMouse = new Native.UibcMouse[uibcMouseInfosSize]; - int i = 0; - IntPtr unmanagedUibcMousePtr; - foreach (var uibcMouseInfo in uibcMouseInfos) + for (int i = 0; i < uibcMouseInfosSize; i++) { + var uibcMouseInfo = infos[i]; uibcMouse[i].id = uibcMouseInfo.Id; uibcMouse[i].x = uibcMouseInfo.X; - uibcMouse[i++].y = uibcMouseInfo.Y; + uibcMouse[i].y = uibcMouseInfo.Y; } var size = Marshal.SizeOf(typeof(Native.UibcMouse)); - IntPtr unmanagedUibcMouse = Marshal.AllocHGlobal(size * uibcMouseInfosSize); - for (i = 0; i < uibcMouseInfosSize; i++) + IntPtr unmanagedUibcMouse = IntPtr.Zero; + IntPtr unmanagedUibcObject = IntPtr.Zero; + + try { - if (IntPtr.Size == 4) + unmanagedUibcMouse = Marshal.AllocHGlobal(size * uibcMouseInfosSize); + for (int i = 0; i < uibcMouseInfosSize; i++) { - unmanagedUibcMousePtr = new IntPtr(unmanagedUibcMouse.ToInt32() + i * size); + IntPtr unmanagedUibcMousePtr = unmanagedUibcMouse + (i * size); + Marshal.StructureToPtr(uibcMouse[i], unmanagedUibcMousePtr, false); } - else - { - unmanagedUibcMousePtr = new IntPtr(unmanagedUibcMouse.ToInt64() + i * size); - } - Marshal.StructureToPtr(uibcMouse[i], unmanagedUibcMousePtr, false); - } - Native.UibcMouseEvent uibcObject; - uibcObject.size = uibcMouseInfosSize; - uibcObject.type = type; - uibcObject.uibcMouse = unmanagedUibcMouse; + Native.UibcMouseEvent uibcObject; + uibcObject.size = uibcMouseInfosSize; + uibcObject.type = type; + uibcObject.uibcMouse = unmanagedUibcMouse; - var unmanagedUibcObject = Marshal.AllocHGlobal(Marshal.SizeOf(uibcObject)); - Marshal.StructureToPtr(uibcObject, unmanagedUibcObject, false); + unmanagedUibcObject = Marshal.AllocHGlobal(Marshal.SizeOf(uibcObject)); + Marshal.StructureToPtr(uibcObject, unmanagedUibcObject, false); - try - { Native.SendGenericMouseEvent(Handle, unmanagedUibcObject).ThrowIfError("Failed to send generic mouse event"); } finally { - Marshal.FreeHGlobal(unmanagedUibcMouse); - Marshal.FreeHGlobal(unmanagedUibcObject); + if (unmanagedUibcMouse != IntPtr.Zero) + { + Marshal.FreeHGlobal(unmanagedUibcMouse); + } + if (unmanagedUibcObject != IntPtr.Zero) + { + Marshal.FreeHGlobal(unmanagedUibcObject); + } } }