Author: toshok
Date: 2007-07-12 15:26:44 -0400 (Thu, 12 Jul 2007)
New Revision: 81894

Modified:
   trunk/moon/src/ChangeLog
   trunk/moon/src/downloader.cpp
   trunk/moon/src/downloader.h
   trunk/moon/src/media.cpp
   trunk/moon/src/media.h
Log:
2007-07-12  Chris Toshok  <[EMAIL PROTECTED]>

        * downloader.h, downloader.cpp: make the Downloader object a bit
        more C++ friendly, and make all the private data private.

        Also, take this opportunity to switch to using RegisterEvent/Emit
        to generate events, instead of the custom listeners.  This will
        let JS hook up to the events.

        * media.h, media.cpp: track the downloader changes.



Modified: trunk/moon/src/ChangeLog
===================================================================
--- trunk/moon/src/ChangeLog    2007-07-12 19:18:50 UTC (rev 81893)
+++ trunk/moon/src/ChangeLog    2007-07-12 19:26:44 UTC (rev 81894)
@@ -1,3 +1,14 @@
+2007-07-12  Chris Toshok  <[EMAIL PROTECTED]>
+
+       * downloader.h, downloader.cpp: make the Downloader object a bit
+       more C++ friendly, and make all the private data private.
+
+       Also, take this opportunity to switch to using RegisterEvent/Emit
+       to generate events, instead of the custom listeners.  This will
+       let JS hook up to the events.
+
+       * media.h, media.cpp: track the downloader changes.
+
 2007-07-11  Jackson Harper  <[EMAIL PROTECTED]>
 
        * collection.cpp: Comment out the namescope merging stuff for now,

Modified: trunk/moon/src/downloader.cpp
===================================================================
--- trunk/moon/src/downloader.cpp       2007-07-12 19:18:50 UTC (rev 81893)
+++ trunk/moon/src/downloader.cpp       2007-07-12 19:26:44 UTC (rev 81894)
@@ -52,17 +52,16 @@
 
 downloader_create_state_func Downloader::create_state = NULL;
 downloader_destroy_state_func Downloader::destroy_state = NULL;
-downloader_open_func Downloader::open = NULL;
-downloader_send_func Downloader::send = NULL;
-downloader_abort_func Downloader::abort = NULL;
+downloader_open_func Downloader::open_func = NULL;
+downloader_send_func Downloader::send_func = NULL;
+downloader_abort_func Downloader::abort_func = NULL;
 
-struct Listener {
-       downloader_event_notify notify;
-       gpointer closure;
-};
-
 Downloader::Downloader ()
 {
+       CompletedEvent               = RegisterEvent ("Completed");
+       DownloadProgressChangedEvent = RegisterEvent 
("DownloadProgressChanged");
+       DownloadFailedEvent          = RegisterEvent ("DownloadFailed");
+
        downloader_state = Downloader::create_state (this);
        notify_size = NULL;
        filename = NULL;
@@ -70,7 +69,6 @@
        this->write = NULL;
        file_size = -2;
        total = 0;
-       downloader_events = NULL;
        part_hash = NULL;
 }
 
@@ -84,13 +82,6 @@
 {
        Downloader::destroy_state (downloader_state);
 
-       GSList *l;
-       for (l = downloader_events; l; l = l->next){
-               Listener *listener = (Listener *) l->data;
-
-               delete listener;
-       }
-       g_slist_free (l);
        g_free (filename);
 
        // Delete temporary files.
@@ -101,20 +92,20 @@
 }
 
 void
-downloader_abort (Downloader *dl)
+Downloader::Abort ()
 {
-       dl->abort (dl->downloader_state);
+       abort_func (downloader_state);
 }
 
 void *
-downloader_get_response_text (Downloader *dl, char* PartName, uint64_t *size)
+Downloader::GetResponseText (char* PartName, uint64_t *size)
 {
        FILE *f = NULL;
        struct stat buf;
        long n = 0;
        void *data = NULL;
 
-       char *fname = downloader_get_response_file (dl, PartName);
+       char *fname = GetResponseFile (PartName);
        if (fname == NULL)
                return NULL;
 
@@ -148,8 +139,8 @@
        return NULL;
 }
 
-static char *
-ll_downloader_get_response_file (Downloader *dl, char *PartName)
+char *
+Downloader::ll_downloader_get_response_file (char *PartName)
 {
        int fd = -1;
        char buffer [32*1024];
@@ -157,17 +148,17 @@
        char *file = NULL;
        FILE *f = NULL;
 
-       if (dl->filename == NULL)
+       if (filename == NULL)
                return NULL;
 
        // Null or empty, get the original file.
        if (PartName == NULL || *PartName == 0)
-               return g_strdup (dl->filename);
+               return g_strdup (filename);
 
        //
        // Open zip file
        //
-       unzFile zipfile = unzOpen (dl->filename);
+       unzFile zipfile = unzOpen (filename);
        if (zipfile == NULL)
                return NULL;
 
@@ -215,43 +206,90 @@
        return file;
 }
 
-//
-// Returns the filename that holds that given file.
-// 
-// Return values:
-//   A newly allocated string containing the filename.
-//
-char *
-downloader_get_response_file (Downloader *dl, char *PartName)
+char*
+Downloader::GetResponseFile (char *PartName)
 {
-       if (dl->part_hash != NULL){
-               char *fname = (char*) g_hash_table_lookup (dl->part_hash, 
PartName);
+       if (part_hash != NULL){
+               char *fname = (char*) g_hash_table_lookup (part_hash, PartName);
                if (fname != NULL)
                        return g_strdup (fname);
        }
 
-       char *part = ll_downloader_get_response_file (dl, PartName);
+       char *part = ll_downloader_get_response_file (PartName);
        if (part != NULL && PartName != NULL && *PartName != 0){
-               if (dl->part_hash == NULL)
-                       dl->part_hash = g_hash_table_new_full (g_str_hash, 
g_str_equal, g_free, g_free);
-               g_hash_table_insert (dl->part_hash, g_strdup (PartName), 
g_strdup (part));
+               if (part_hash == NULL)
+                       part_hash = g_hash_table_new_full (g_str_hash, 
g_str_equal, g_free, g_free);
+               g_hash_table_insert (part_hash, g_strdup (PartName), g_strdup 
(part));
        }
        return part;
 }
 
 void
-downloader_open (Downloader *dl, char *verb, char *URI, bool Async)
+Downloader::Open (char *verb, char *URI, bool Async)
 {
-       dl->open (verb, URI, Async, dl->downloader_state);
+       open_func (verb, URI, Async, downloader_state);
 }
 
 void
-downloader_send (Downloader *dl)
+Downloader::Send ()
 {
-       dl->started = true;
-       dl->send (dl->downloader_state);
+       started = true;
+       send_func (downloader_state);
 }
 
+//
+// A zero write means that we are done
+//
+void
+Downloader::Write (guchar *buf, gsize offset, gsize n)
+{
+       if (write)
+               write (buf, offset, n, consumer_closure);
+       
+       // Update progress
+       total += n;
+       double p;
+       if (file_size >= 0)
+               p = total / (double) file_size;
+       else 
+               p = 0;
+
+       SetValue (Downloader::DownloadProgressProperty, Value (p));
+
+       Emit (DownloadProgressChangedEvent);
+}
+
+void
+Downloader::NotifyFinished (const char *fname)
+{
+       filename = g_strdup (fname);
+       
+       // HACK, we should provide the status code
+       SetValue (Downloader::StatusProperty, Value (200));
+       Emit (CompletedEvent, (gpointer)fname);
+}
+
+void
+Downloader::NotifyFailed (const char *msg)
+{
+       // dl->SetValue (Downloader::StatusProperty, Value (400))
+       // For some reason the status is 0, not updated on errors?
+       Emit (DownloadFailedEvent, (gpointer)msg);
+}
+
+void
+Downloader::NotifySize (int64_t size)
+{
+       file_size = size;
+
+       if (notify_size)
+               notify_size (size, consumer_closure);
+
+       SetValue (Downloader::DownloadProgressProperty, Value (0.0));
+
+       Emit (DownloadProgressChangedEvent);
+}
+
 bool
 Downloader::Started ()
 {
@@ -274,6 +312,67 @@
        this->consumer_closure = data;
 }
 
+void
+Downloader::SetFunctions (downloader_create_state_func create_state,
+                         downloader_destroy_state_func destroy_state,
+                         downloader_open_func open,
+                         downloader_send_func send,
+                         downloader_abort_func abort,
+                         bool only_if_not_set)
+{
+       if (only_if_not_set &&
+           (Downloader::create_state != NULL ||
+            Downloader::destroy_state != NULL ||
+            Downloader::open_func != NULL ||
+            Downloader::send_func != NULL ||
+            Downloader::abort_func != NULL))
+         return;
+
+       Downloader::create_state = create_state;
+       Downloader::destroy_state = destroy_state;
+       Downloader::open_func = open;
+       Downloader::send_func = send;
+       Downloader::abort_func = abort;
+}
+
+
+void
+downloader_abort (Downloader *dl)
+{
+       dl->Abort ();
+}
+
+//
+// Returns the filename that holds that given file.
+// 
+// Return values:
+//   A newly allocated string containing the filename.
+//
+char *
+downloader_get_response_file (Downloader *dl, char *PartName)
+{
+       return dl->GetResponseFile (PartName);
+}
+
+
+void *
+downloader_get_response_text (Downloader *dl, char* PartName, uint64_t *size)
+{
+       return dl->GetResponseText (PartName, size);
+}
+
+void
+downloader_open (Downloader *dl, char *verb, char *URI, bool Async)
+{
+       dl->Open (verb, URI, Async);
+}
+
+void
+downloader_send (Downloader *dl)
+{
+       dl->Send ();
+}
+
 Downloader*
 downloader_new (void)
 {
@@ -286,89 +385,35 @@
                               downloader_send_func send,
                               downloader_abort_func abort)
 {
-       Downloader::create_state = create_state;
-       Downloader::destroy_state = destroy_state;
-       Downloader::open = open;
-       Downloader::send = send;
-       Downloader::abort = abort;
+       Downloader::SetFunctions (create_state,
+                                 destroy_state,
+                                 open, send, abort, false);
 }
 
-static void
-downloader_notify (Downloader *dl, int msg, void *extra)
-{
-       GSList *l;
-
-       for (l = dl->downloader_events; l; l = l->next){
-               Listener *listener = (Listener *) l->data;
-
-               listener->notify (msg, listener->closure, extra);
-       }
-}
-
-//
-// A zero write means that we are done
-//
 void
 downloader_write (Downloader *dl, guchar *buf, gsize offset, gsize n)
 {
-       if (dl->write)
-               dl->write (buf, offset, n, dl->consumer_closure);
-       
-       // Update progress
-       dl->total += n;
-       double p;
-       if (dl->file_size >= 0)
-               p = dl->total / (double) dl->file_size;
-       else 
-               p = 0;
-
-       dl->SetValue (Downloader::DownloadProgressProperty, Value (p));
-
-       downloader_notify (dl, Downloader::NOTIFY_PROGRESS_CHANGED, NULL);
+       dl->Write (buf, offset, n);
 }
 
 void
 downloader_notify_finished (Downloader *dl, const char *fname)
 {
-       dl->filename = g_strdup (fname);
-       
-       // HACK, we should provide the status code
-       dl->SetValue (Downloader::StatusProperty, Value (200));
-       downloader_notify (dl, Downloader::NOTIFY_COMPLETED, (void *) fname);
+       dl->NotifyFinished (fname);
 }
 
 void
 downloader_notify_error (Downloader *dl, const char *msg)
 {
-       // dl->SetValue (Downloader::StatusProperty, Value (400))
-       // For some reason the status is 0, not updated on errors?
-       
-       downloader_notify (dl, Downloader::NOTIFY_DOWNLOAD_FAILED, (void *) 
msg);
+       dl->NotifyFailed (msg);
 }
 
 void
 downloader_notify_size (Downloader *dl, int64_t size)
 {
-       dl->file_size = size;
-
-       if (dl->notify_size)
-               dl->notify_size (size, dl->consumer_closure);
-
-       dl->SetValue (Downloader::DownloadProgressProperty, Value (0.0));
-
-       downloader_notify (dl, Downloader::NOTIFY_PROGRESS_CHANGED, NULL);
+       dl->NotifySize (size);
 }
 
-void  
-downloader_want_events (Downloader *dl, downloader_event_notify event_notify, 
gpointer closure)
-{
-       Listener *l = new Listener ();
-       l->notify = event_notify;
-       l->closure = closure;
-
-       dl->downloader_events = g_slist_append (dl->downloader_events, l);
-}
-
 void 
 dummy_downloader_write (guchar *buf, gsize offset, gsize n, gpointer cb_data)
 {
@@ -429,13 +474,10 @@
        Downloader::StatusTextProperty = DependencyObject::Register 
(Type::DOWNLOADER, "StatusText", Type::STRING);
        Downloader::UriProperty = DependencyObject::Register (Type::DOWNLOADER, 
"Uri", Type::STRING);
 
-       if (Downloader::create_state == NULL && Downloader::destroy_state == 
NULL && Downloader::open ==  NULL && 
-               Downloader::send == NULL && Downloader::abort == NULL)
-               downloader_set_functions (
-                       dummy_downloader_create_state,
-                       dummy_downloader_destroy_state,
-                       dummy_downloader_open,
-                       dummy_downloader_send,
-                       dummy_downloader_abort);
+       Downloader::SetFunctions (dummy_downloader_create_state,
+                                 dummy_downloader_destroy_state,
+                                 dummy_downloader_open,
+                                 dummy_downloader_send,
+                                 dummy_downloader_abort, true);
 }
 

Modified: trunk/moon/src/downloader.h
===================================================================
--- trunk/moon/src/downloader.h 2007-07-12 19:18:50 UTC (rev 81893)
+++ trunk/moon/src/downloader.h 2007-07-12 19:26:44 UTC (rev 81894)
@@ -32,16 +32,6 @@
 typedef void     (*downloader_send_func)(gpointer state);
 typedef void     (*downloader_abort_func)(gpointer state);
 
-//
-// downloader_event_notify:
-//    @kind:    indicates the kind of operation that we are being notified 
about
-//    @cb_data: callback data, this is the closure value passed to 
SetWriteFunc.
-//    @extra:   Depends on the value of kind:
-//              kind == NOTIFY_COMPLETED, extra = filename that holds the full 
downloaded data
-//              kind == NOTIFY_DOWNLOAD_FAILED, extra = error message to 
provide on ErrorArgs
-//
-typedef void     (*downloader_event_notify) (int kind, gpointer cb_data, 
gpointer extra);
-
 class Downloader : public DependencyObject {
  public:
        Downloader ();
@@ -49,13 +39,34 @@
 
        virtual Type::Kind GetObjectType () { return Type::DOWNLOADER; };       
 
+       void Abort ();
+       void* GetResponseText (char* Partname, uint64_t *size);
+       void Open (char *verb, char *URI, bool Async);
+       void Send ();
+
        static DependencyProperty *DownloadProgressProperty;
        static DependencyProperty *ResponseTextProperty;
        static DependencyProperty *StatusProperty;
        static DependencyProperty *StatusTextProperty;
        static DependencyProperty *UriProperty;
 
+       // Events you can AddHandler to
+       int CompletedEvent;
+       int DownloadProgressChangedEvent;
+       int DownloadFailedEvent;
 
+
+
+       // the following is stuff not exposed by C#/js, but is useful
+       // when writing unmanaged code for downloader implementations
+       // or data sinks.
+
+       char* GetResponseFile (char *PartName);
+       void Write (guchar *buf, gsize offset, gsize n);
+       void NotifyFinished (const char *fname);
+       void NotifyFailed (const char *msg);
+       void NotifySize (int64_t size);
+
        // This is called by the consumer of the downloaded data (the
        // Image class for instance)
        void SetWriteFunc (downloader_write_func write,
@@ -68,15 +79,14 @@
                                  downloader_destroy_state_func destroy_state,
                                  downloader_open_func open,
                                  downloader_send_func send,
-                                 downloader_abort_func abort);
+                                 downloader_abort_func abort,
+                                 bool only_if_not_set);
 
-       enum EventKind {
-               NOTIFY_COMPLETED,
-               NOTIFY_PROGRESS_CHANGED,
-               NOTIFY_DOWNLOAD_FAILED
-       };
+       bool Started ();
+       bool Completed ();
 
-       GSList *downloader_events;
+
+ private:
        GHashTable *part_hash;
 
        int64_t file_size;
@@ -95,13 +105,11 @@
 
        static downloader_create_state_func create_state;
        static downloader_destroy_state_func destroy_state;
-       static downloader_open_func open;
-       static downloader_send_func send;
-       static downloader_abort_func abort;
+       static downloader_open_func open_func;
+       static downloader_send_func send_func;
+       static downloader_abort_func abort_func;
 
-       bool Started ();
-       bool Completed ();
-
+       char * ll_downloader_get_response_file (char *PartName);
 };
 
 Downloader* downloader_new (void);
@@ -118,8 +126,6 @@
 void  downloader_open              (Downloader *dl, char *verb, char *URI, 
bool Async);
 void  downloader_send              (Downloader *dl);
 
-void  downloader_want_events       (Downloader *dl, downloader_event_notify 
event_notify, gpointer closure);
-
 //
 // Used to push data to the consumer
 //

Modified: trunk/moon/src/media.cpp
===================================================================
--- trunk/moon/src/media.cpp    2007-07-12 19:18:50 UTC (rev 81893)
+++ trunk/moon/src/media.cpp    2007-07-12 19:26:44 UTC (rev 81894)
@@ -601,18 +601,18 @@
        downloader = (Downloader*) dl;
        downloader->ref ();
 
-       downloader_want_events (downloader, downloader_event, this);
+       downloader->AddHandler (downloader->CompletedEvent, 
downloader_complete, this);
 
        if (downloader->Started ()) {
                if (downloader->Completed ())
-                       DownloaderEvent (Downloader::NOTIFY_COMPLETED, NULL);
+                       DownloaderComplete ();
                
                UpdateProgress ();
        } else {
                downloader->SetWriteFunc (pixbuf_write, size_notify, this);
                
                // This is what actually triggers the download
-               downloader_send (downloader);
+               downloader->Send ();
        }
 }
 
@@ -623,24 +623,22 @@
 }
 
 void
-Image::DownloaderEvent (int kind, void *extra)
+Image::DownloaderComplete ()
 {
-       if (kind == Downloader::NOTIFY_COMPLETED) {
-               char *file = downloader_get_response_file (downloader, 
part_name);
-               CreateSurface (file);
-               g_free (file);
+       char *file = downloader_get_response_file (downloader, part_name);
+       CreateSurface (file);
+       g_free (file);
 
-               if (GetValueNoDefault (FrameworkElement::WidthProperty) == NULL)
-                       SetValue (FrameworkElement::WidthProperty, (double) 
surface->width);
+       if (GetValueNoDefault (FrameworkElement::WidthProperty) == NULL)
+               SetValue (FrameworkElement::WidthProperty, (double) 
surface->width);
 
-               if (GetValueNoDefault (FrameworkElement::HeightProperty) == 
NULL)
-                       SetValue (FrameworkElement::HeightProperty, (double) 
surface->height);
+       if (GetValueNoDefault (FrameworkElement::HeightProperty) == NULL)
+               SetValue (FrameworkElement::HeightProperty, (double) 
surface->height);
 
-               if (brush)
-                       brush->OnPropertyChanged 
(ImageBrush::DownloadProgressProperty);
-               else 
-                       Invalidate ();
-       }
+       if (brush)
+               brush->OnPropertyChanged (ImageBrush::DownloadProgressProperty);
+       else 
+               Invalidate ();
 }
 
 #ifdef WORDS_BIGENDIAN
@@ -771,9 +769,9 @@
 }
 
 void
-Image::downloader_event (int kind, gpointer data, gpointer extra)
+Image::downloader_complete (EventObject *sender, gpointer calldata, gpointer 
closure)
 {
-       ((Image*)data)->DownloaderEvent (kind, extra);
+       ((Image*)closure)->DownloaderComplete ();
 }
 
 void

Modified: trunk/moon/src/media.h
===================================================================
--- trunk/moon/src/media.h      2007-07-12 19:18:50 UTC (rev 81893)
+++ trunk/moon/src/media.h      2007-07-12 19:26:44 UTC (rev 81894)
@@ -86,10 +86,10 @@
 
        // downloader callbacks
        void PixbufWrite (guchar *bug, gsize offset, gsize count);
-       void DownloaderEvent (int kind, void *extra);
+       void DownloaderComplete ();
        void UpdateProgress ();
        static void pixbuf_write (guchar *buf, gsize offset, gsize count, 
gpointer data);
-       static void downloader_event (int kind, gpointer data, gpointer extra);
+       static void downloader_complete (EventObject *sender, gpointer 
calldata, gpointer closure);
        static void size_notify (int64_t size, gpointer data);
 
        Downloader *downloader;

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

Reply via email to