2009-12-04 Jeffrey Stedfast <fejj@novell.com>
[moon.git] / class / System.Windows / Mono / ToggleRef.cs
blob2f5949abbba6cb9e9d37330ee75f305b2052ec4d
1 //
2 // ToggleRef.cs
3 //
4 // Contact:
5 // Moonlight List (moonlight-list@lists.ximian.com)
6 //
7 // Copyright 2009 Novell, Inc.
8 //
9 // Permission is hereby granted, free of charge, to any person obtaining
10 // a copy of this software and associated documentation files (the
11 // "Software"), to deal in the Software without restriction, including
12 // without limitation the rights to use, copy, modify, merge, publish,
13 // distribute, sublicense, and/or sell copies of the Software, and to
14 // permit persons to whom the Software is furnished to do so, subject to
15 // the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be
18 // included in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 using System;
30 using System.Runtime.InteropServices;
31 using System.Collections.Generic;
33 namespace Mono
35 internal sealed class ToggleRef
37 IntPtr handle;
38 object reference;
39 GCHandle gch;
41 public ToggleRef (INativeEventObjectWrapper target)
43 handle = target.NativeHandle;
44 gch = GCHandle.Alloc (this);
45 reference = target;
48 public void Initialize () {
49 NativeMethods.event_object_add_toggle_ref_notifier (handle, ToggleNotifyCallback);
52 public bool IsAlive {
53 get {
54 if (reference is WeakReference) {
55 WeakReference weak = reference as WeakReference;
56 return weak.IsAlive;
57 } else if (reference == null)
58 return false;
59 return true;
63 public IntPtr Handle {
64 get {
65 return handle;
69 public INativeEventObjectWrapper Target {
70 get {
71 if (reference == null)
72 return null;
73 else if (reference is INativeEventObjectWrapper)
74 return reference as INativeEventObjectWrapper;
76 WeakReference weak = reference as WeakReference;
77 return weak.Target as INativeEventObjectWrapper;
81 public void Free ()
83 NativeMethods.event_object_remove_toggle_ref_notifier (handle);
84 reference = null;
85 gch.Free ();
88 void Toggle (bool isLastRef)
90 if (isLastRef && reference is INativeEventObjectWrapper)
91 reference = new WeakReference (reference);
92 else if (!isLastRef && reference is WeakReference) {
93 WeakReference weak = reference as WeakReference;
94 if (weak.IsAlive)
95 reference = weak.Target;
99 internal delegate void ToggleNotifyHandler (IntPtr obj, bool isLastref);
101 static void RefToggled (IntPtr obj, bool isLastRef)
103 try {
104 ToggleRef tref = null;
105 NativeDependencyObjectHelper.objects.TryGetValue (obj, out tref);
106 if (tref != null)
107 tref.Toggle (isLastRef);
108 } catch (Exception e) {
109 //ExceptionManager.RaiseUnhandledException (e, false);
110 Console.WriteLine (e);
114 static ToggleNotifyHandler toggle_notify_callback;
115 static ToggleNotifyHandler ToggleNotifyCallback {
116 get {
117 if (toggle_notify_callback == null)
118 toggle_notify_callback = new ToggleNotifyHandler (RefToggled);
119 return toggle_notify_callback;