2 * Copyright (c) 2016 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.CompilerServices;
19 using System.Runtime.InteropServices;
22 internal static partial class Interop
24 private const string LogTag = "Tizen.Maps";
26 public delegate ErrorCode GetterMethod<T>(out T value);
27 public delegate ErrorCode GetterPtrMethod(out IntPtr value);
28 public delegate ErrorCode SetterMethod<T>(T value);
30 internal static T NativeGet<T>(GetterMethod<T> getter, [CallerMemberName] string propertyName = "")
33 var err = getter(out value);
39 //err.WarnIfFailed($"Native getter for {propertyName} failed");
43 internal static T NativeGet<T>(GetterMethod<IntPtr> getter, Func<IntPtr, T> ctor, [CallerMemberName] string propertyName = "") where T : SafeMapsHandle
45 return ctor(NativeGet(getter, propertyName));
48 internal static T NativeGet<T>(GetterMethod<IntPtr> getter, Func<IntPtr, bool, T> ctor, bool hasOwnership, [CallerMemberName] string propertyName = "") where T : SafeMapsHandle
50 return ctor(NativeGet(getter, propertyName), hasOwnership);
53 internal static string NativeGet(GetterMethod<string> getter, [CallerMemberName] string propertyName = "")
56 var err = getter(out value);
62 //err.WarnIfFailed($"Native getter for {propertyName} failed");
66 internal static void NativeSet<T>(SetterMethod<T> setter, T value, [CallerMemberName] string propertyName = "")
68 setter(value).WarnIfFailed($"Native setter for {propertyName} failed");
71 internal abstract class SafeMapsHandle : SafeHandle
73 protected delegate ErrorCode DestroyNativeHandleMethod(IntPtr handle);
74 protected DestroyNativeHandleMethod DestroyHandle;
76 protected SafeMapsHandle(IntPtr handle, bool needToRelease, DestroyNativeHandleMethod destroy) : base(handle, true)
78 HasOwnership = needToRelease;
79 DestroyHandle = destroy;
82 internal bool HasOwnership { get; set; }
84 public override bool IsInvalid { get { return handle == IntPtr.Zero; } }
86 protected override bool ReleaseHandle()
90 var err = DestroyHandle(handle);
91 err.WarnIfFailed($"Failed to delete native {GetType()} handle");
94 SetHandle(IntPtr.Zero);
98 public static implicit operator IntPtr(SafeMapsHandle otherHandle)
100 return otherHandle.handle;