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