Author: toshok
Date: 2007-07-12 15:27:49 -0400 (Thu, 12 Jul 2007)
New Revision: 81895

Modified:
   trunk/olive/class/agclr/System.Windows/ChangeLog
   trunk/olive/class/agclr/System.Windows/Downloader.cs
Log:
2007-07-12  Chris Toshok  <[EMAIL PROTECTED]>

        * Downloader.cs: move to using UnmanagedEventHandlers to proxy
        events.



Modified: trunk/olive/class/agclr/System.Windows/ChangeLog
===================================================================
--- trunk/olive/class/agclr/System.Windows/ChangeLog    2007-07-12 19:26:44 UTC 
(rev 81894)
+++ trunk/olive/class/agclr/System.Windows/ChangeLog    2007-07-12 19:27:49 UTC 
(rev 81895)
@@ -1,3 +1,8 @@
+2007-07-12  Chris Toshok  <[EMAIL PROTECTED]>
+
+       * Downloader.cs: move to using UnmanagedEventHandlers to proxy
+       events.
+
 2007-07-11  Chris Toshok  <[EMAIL PROTECTED]>
 
        * UIElement.cs: use the MS event names for the strings we pass to

Modified: trunk/olive/class/agclr/System.Windows/Downloader.cs
===================================================================
--- trunk/olive/class/agclr/System.Windows/Downloader.cs        2007-07-12 
19:26:44 UTC (rev 81894)
+++ trunk/olive/class/agclr/System.Windows/Downloader.cs        2007-07-12 
19:27:49 UTC (rev 81895)
@@ -47,57 +47,13 @@
                public static readonly DependencyProperty UriProperty =
                        DependencyProperty.Lookup (Kind.DOWNLOADER, "Uri", 
typeof (string));
 
-               NativeMethods.UpdateFunction updater;
-
-               string filename;
-               
-               void UpdateCallback (int kind, IntPtr cb_data, IntPtr extra)
-               {
-                       EventHandler h = null;
-                       
-                       switch (kind){
-                       case 0:
-                               h = Completed;
-                               break;
-                       case 1:
-                               h = DownloadProgressChanged;
-                               break;
-                       case 2:
-                               ErrorEventHandler df = DownloadFailed;
-                               if (df != null) {
-                                       filename = Marshal.PtrToStringAuto 
(extra);
-                                       ErrorEventArgs eea = new ErrorEventArgs 
(4001, filename, ErrorType.DownloadError);
-                                       df (this, eea);
-                               }
-                               return;
-                       }
-                       if (h != null)
-                               h (this, EventArgs.Empty);
-               }
-               
-               internal void NotifyWantUpdates ()
-               {
-                       if (native == IntPtr.Zero)
-                               return;
-                       
-                       updater = new NativeMethods.UpdateFunction 
(UpdateCallback);
-                       NativeMethods.downloader_want_events (native, updater, 
IntPtr.Zero);
-               }
-               
                public Downloader () : base (NativeMethods.downloader_new ())
                {
                        NativeMethods.base_ref (native);
-
-                       // OPTIMIZEME: We should do this only if an event is 
hooked up,
-                       // currently we do it always.
-                       NotifyWantUpdates ();
                }
                
                internal Downloader (IntPtr raw) : base (raw)
                {
-                       // OPTIMIZME: We should do this only if an event is 
hooked up,
-                       // currently we do it always.
-                       NotifyWantUpdates ();
                }
 
 
@@ -167,11 +123,88 @@
                        NativeMethods.downloader_send (native);
                }
 
-               public event EventHandler Completed;
+               static object CompletedEvent = new object();
+               static object DownloadProgressChangedEvent = new object ();
+               static object DownloadFailedEvent = new object ();
 
-               public event EventHandler DownloadProgressChanged;
+               public event EventHandler Completed {
+                       add {
+                               if (events[CompletedEvent] == null)
+                                       Events.AddHandler (this, "Completed", 
completed_proxy);
+                               events.AddHandler (CompletedEvent, value);
+                       }
+                       remove {
+                               events.RemoveHandler (CompletedEvent, value);
+                               if (events[CompletedEvent] == null)
+                                       Events.RemoveHandler (this, 
"Completed", completed_proxy);
+                       }
+               }
 
-               public event ErrorEventHandler DownloadFailed;
+               public event EventHandler DownloadProgressChanged {
+                       add {
+                               if (events[DownloadProgressChangedEvent] == 
null)
+                                       Events.AddHandler (this, 
"DownloadProgressChanged", progress_changed_proxy);
+                               events.AddHandler 
(DownloadProgressChangedEvent, value);
+                       }
+                       remove {
+                               events.RemoveHandler 
(DownloadProgressChangedEvent, value);
+                               if (events[DownloadProgressChangedEvent] == 
null)
+                                       Events.RemoveHandler (this, 
"DownloadProgressChanged", progress_changed_proxy);
+                       }
+               }
+
+               public event ErrorEventHandler DownloadFailed {
+                       add {
+                               if (events[DownloadFailedEvent] == null)
+                                       Events.AddHandler (this, 
"DownloadFailed", failed_proxy);
+                               events.AddHandler (DownloadFailedEvent, value);
+                       }
+                       remove {
+                               events.RemoveHandler (DownloadFailedEvent, 
value);
+                               if (events[DownloadFailedEvent] == null)
+                                       Events.RemoveHandler (this, 
"DownloadFailed", failed_proxy);
+                       }
+               }
+
+
+               static UnmanagedEventHandler completed_proxy = new 
UnmanagedEventHandler (UnmanagedCompleted);
+               static void UnmanagedCompleted (IntPtr target, IntPtr calldata, 
IntPtr closure)
+               {
+                       Downloader dl = (Downloader)GCHandle.FromIntPtr 
(closure).Target;
+                       dl.InvokeEmptyEvent (CompletedEvent);
+               }
+
+               static UnmanagedEventHandler progress_changed_proxy = new 
UnmanagedEventHandler (UnmanagedDownloadProgressChanged);
+               static void UnmanagedDownloadProgressChanged (IntPtr target, 
IntPtr calldata, IntPtr closure)
+               {
+                       Downloader dl = (Downloader)GCHandle.FromIntPtr 
(closure).Target;
+                       dl.InvokeEmptyEvent (DownloadProgressChangedEvent);
+               }
+
+               void InvokeEmptyEvent (object eventkey)
+               {
+                       EventHandler h = (EventHandler)events[eventkey];
+                       if (h != null)
+                               h (this, EventArgs.Empty);
+               }
+
+               static UnmanagedEventHandler failed_proxy = new 
UnmanagedEventHandler (UnmanagedDownloadFailed);
+               static void UnmanagedDownloadFailed (IntPtr target, IntPtr 
calldata, IntPtr closure)
+               {
+                       Downloader dl = (Downloader)GCHandle.FromIntPtr 
(closure).Target;
+
+                       string filename = Marshal.PtrToStringAuto (calldata);
+                       ErrorEventArgs eea = new ErrorEventArgs (4001, 
filename, ErrorType.DownloadError);
+
+                       dl.InvokeDownloadFailed (eea);
+               }
+
+               void InvokeDownloadFailed (ErrorEventArgs eea)
+               {
+                       ErrorEventHandler h = 
(ErrorEventHandler)events[DownloadFailedEvent];
+                       if (h != null)
+                               h (this, eea);
+               }
                
                internal override Kind GetKind ()
                {

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to