Release 4.0.0-preview1-00051
[platform/core/csapi/tizenfx.git] / src / Tizen.Maps / Interop / Interop.SafeMapsHandle.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 using System;
18 using System.Runtime.CompilerServices;
19 using System.Runtime.InteropServices;
20
21
22 internal static partial class Interop
23 {
24     private const string LogTag = "Tizen.Maps";
25
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);
29
30     internal static T NativeGet<T>(GetterMethod<T> getter, [CallerMemberName] string propertyName = "")
31     {
32         T value;
33         var err = getter(out value);
34         if (err.IsSuccess())
35         {
36             return value;
37         }
38
39         //err.WarnIfFailed($"Native getter for {propertyName} failed");
40         return default(T);
41     }
42
43     internal static T NativeGet<T>(GetterMethod<IntPtr> getter, Func<IntPtr, T> ctor, [CallerMemberName] string propertyName = "") where T : SafeMapsHandle
44     {
45         return ctor(NativeGet(getter, propertyName));
46     }
47
48     internal static T NativeGet<T>(GetterMethod<IntPtr> getter, Func<IntPtr, bool, T> ctor, bool hasOwnership, [CallerMemberName] string propertyName = "") where T : SafeMapsHandle
49     {
50         return ctor(NativeGet(getter, propertyName), hasOwnership);
51     }
52
53     internal static string NativeGet(GetterMethod<string> getter, [CallerMemberName] string propertyName = "")
54     {
55         string value;
56         var err = getter(out value);
57         if (err.IsSuccess())
58         {
59             return value;
60         }
61
62         //err.WarnIfFailed($"Native getter for {propertyName} failed");
63         return string.Empty;
64     }
65
66     internal static void NativeSet<T>(SetterMethod<T> setter, T value, [CallerMemberName] string propertyName = "")
67     {
68         setter(value).WarnIfFailed($"Native setter for {propertyName} failed");
69     }
70
71     internal abstract class SafeMapsHandle : SafeHandle
72     {
73         protected delegate ErrorCode DestroyNativeHandleMethod(IntPtr handle);
74         protected DestroyNativeHandleMethod DestroyHandle;
75
76         protected SafeMapsHandle(IntPtr handle, bool needToRelease, DestroyNativeHandleMethod destroy) : base(handle, true)
77         {
78             HasOwnership = needToRelease;
79             DestroyHandle = destroy;
80         }
81
82         internal bool HasOwnership { get; set; }
83
84         public override bool IsInvalid { get { return handle == IntPtr.Zero; } }
85
86         protected override bool ReleaseHandle()
87         {
88             if (HasOwnership)
89             {
90                 var err = DestroyHandle(handle);
91                 err.WarnIfFailed($"Failed to delete native {GetType()} handle");
92             }
93
94             SetHandle(IntPtr.Zero);
95             return true;
96         }
97
98         public static implicit operator IntPtr(SafeMapsHandle otherHandle)
99         {
100             return otherHandle.handle;
101         }
102     }
103 }