Author: jbevain
Date: 2007-09-04 15:24:44 -0400 (Tue, 04 Sep 2007)
New Revision: 85320

Modified:
   trunk/moon/src/ChangeLog
   trunk/moon/src/media.h
   trunk/moon/src/playlist.cpp
   trunk/moon/src/playlist.h
Log:
2007-09-04  Jb Evain  <[EMAIL PROTECTED]>

        * playlist.h, playlist.cpp: Work on the overall design.


Modified: trunk/moon/src/ChangeLog
===================================================================
--- trunk/moon/src/ChangeLog    2007-09-04 19:11:39 UTC (rev 85319)
+++ trunk/moon/src/ChangeLog    2007-09-04 19:24:44 UTC (rev 85320)
@@ -1,3 +1,7 @@
+2007-09-04  Jb Evain  <[EMAIL PROTECTED]>
+
+       * playlist.h, playlist.cpp: Work on the overall design.
+
 2007-09-04  Jeffrey Stedfast  <[EMAIL PROTECTED]>
 
        * brush.cpp (image_brush_create_pattern): Revert previous patch as

Modified: trunk/moon/src/media.h
===================================================================
--- trunk/moon/src/media.h      2007-09-04 19:11:39 UTC (rev 85319)
+++ trunk/moon/src/media.h      2007-09-04 19:24:44 UTC (rev 85320)
@@ -119,7 +119,6 @@
 double image_get_download_progress (Image *img);
 void   image_set_source (Image *img, DependencyObject *Downloader, const char 
*PartName);
 
-
 class MediaSource {
 protected:
        MediaElement *element;
@@ -137,7 +136,6 @@
        static MediaSource * CreateSource (MediaElement *element, char 
*source_name);
 };
 
-
 class SingleMedia : public MediaSource {
 public:
        SingleMedia (MediaElement *element, char *source_name);

Modified: trunk/moon/src/playlist.cpp
===================================================================
--- trunk/moon/src/playlist.cpp 2007-09-04 19:11:39 UTC (rev 85319)
+++ trunk/moon/src/playlist.cpp 2007-09-04 19:24:44 UTC (rev 85320)
@@ -10,10 +10,109 @@
 
 #include <glib.h>
 #include <gtk/gtk.h>
+#include <expat.h>
 
 #include "playlist.h"
 #include "downloader.h"
 
+// PlaylistContent
+
+PlaylistContent::PlaylistContent ()
+{
+       title = NULL;
+       author = NULL;
+       abstract = NULL;
+}
+
+PlaylistContent::~PlaylistContent ()
+{
+       g_free (title);
+       g_free (author);
+       g_free (abstract);
+}
+
+const char *
+PlaylistContent::GetTitle ()
+{
+       return title;
+}
+
+void
+PlaylistContent::SetTitle (char *title)
+{
+       this->title = title;
+}
+
+const char *
+PlaylistContent::GetAuthor ()
+{
+       return author;
+}
+
+void
+PlaylistContent::SetAuthor (char *author)
+{
+       this->author = author;
+}
+
+const char *
+PlaylistContent::GetAbstract ()
+{
+       return abstract;
+}
+
+void
+PlaylistContent::SetAbstract (char *abstract)
+{
+       this->abstract = abstract;
+}
+
+// PlaylistEntry
+
+PlaylistEntry::PlaylistEntry ()
+{
+       source = NULL;
+       start_time = 0;
+}
+
+PlaylistEntry::~PlaylistEntry ()
+{
+       g_free (source);
+}
+
+const char *
+PlaylistEntry::GetSource ()
+{
+       return source;
+}
+
+void
+PlaylistEntry::SetSource (char *source)
+{
+       this->source = source;
+}
+
+gint64
+PlaylistEntry::GetStartTime ()
+{
+       return start_time;
+}
+
+void
+PlaylistEntry::SetStartTime (gint64 start_time)
+{
+       this->start_time = start_time;
+}
+
+bool
+playlist_entry_free (List::Node *node, gpointer data)
+{
+       PlaylistEntry *entry = dynamic_cast<PlaylistEntry *> (node);
+       delete entry;
+
+       return true;
+}
+
 // Playlist
 
 Playlist::Playlist (MediaElement *element, char *source_name)
@@ -24,6 +123,8 @@
 
 Playlist::~Playlist ()
 {
+       items->ForEach (playlist_entry_free, NULL);
+
        delete items;
 }
 
@@ -33,7 +134,7 @@
        if (!Parse ())
                return false;
 
-       g_warning ("playlists are not implemented");
+       g_warning ("playlists are not implemented\n");
        return false;
 }
 
@@ -49,57 +150,67 @@
        return false;
 }
 
-void
-Playlist::parser_on_start_element (GMarkupParseContext *context, const gchar 
*element_name,
-                                                                  const gchar 
**attributes_names, const gchar **attributes_values,
-                                                                  gpointer 
user_data, GError **error)
+bool
+Playlist::Parse ()
 {
+       gchar *text;
+       gsize len;
+       bool error = false;
+
+       if (!g_file_get_contents (source_name, &text, &len, NULL))
+               return false;
+
+       PlaylistParser *parser = new PlaylistParser (this);
+       parser->Parse (text, len);
+
+       delete parser;
+       g_free (text);
+
+       return !error;
 }
 
+// PlaylistParser
+
+PlaylistParser::PlaylistParser (Playlist *playlist)
+{
+       this->playlist = playlist;
+
+       parser = XML_ParserCreate (NULL);
+
+       XML_SetElementHandler (parser, on_start_element, on_end_element);
+       XML_SetCharacterDataHandler (parser, on_text);
+}
+
+PlaylistParser::~PlaylistParser ()
+{
+       XML_ParserFree (parser);
+
+       g_free (base);
+}
+
 void
-Playlist::parser_on_end_element (GMarkupParseContext *context, const gchar 
*element_name,
-                                                                gpointer 
user_data, GError **error)
+PlaylistParser::on_start_element (gpointer user_data, const char *name, const 
char **attrs)
 {
+//     PlaylistParser *parser = reinterpret_cast<PlaylistParser *> (user_data);
 }
 
 void
-Playlist::parser_on_text (GMarkupParseContext *context, const gchar *text, 
gsize text_len,
-                                                gpointer user_data, GError 
**error)
+PlaylistParser::on_end_element (gpointer user_data, const char *name)
 {
+//     PlaylistParser *parser = reinterpret_cast<PlaylistParser *> (user_data);
 }
 
 void
-Playlist::parser_on_error (GMarkupParseContext *context, GError *error, 
gpointer user_data)
+PlaylistParser::on_text (gpointer user_data, const char *text, int len)
 {
+//     PlaylistParser *parser = reinterpret_cast<PlaylistParser *> (user_data);
 }
 
-bool
-Playlist::Parse ()
+void
+PlaylistParser::Parse (const char *text, int len)
 {
-       static const GMarkupParser PlaylistParser = {
-               parser_on_start_element,
-               parser_on_end_element,
-               parser_on_text,
-               NULL, // passthrough
-               parser_on_error,
-       };
+       if (XML_Parse (parser, text, len, TRUE))
+               return;
 
-       GMarkupParseContext *context;
-       gchar *text;
-       gsize len;
-       bool error = false;
-
-       if (!g_file_get_contents (source_name, &text, &len, NULL))
-               return false;
-
-       context = g_markup_parse_context_new (&PlaylistParser, 
(GMarkupParseFlags) 0, this, NULL);
-       if (!g_markup_parse_context_parse (context, text, len, NULL)) {
-               error = true;
-               g_markup_parse_context_end_parse (context, NULL);
-       }
-
-       g_markup_parse_context_free (context);
-       g_free (text);
-
-       return !error;
+       g_warning ("parsing error: %s\n", XML_ErrorString (XML_GetErrorCode 
(parser)));
 }

Modified: trunk/moon/src/playlist.h
===================================================================
--- trunk/moon/src/playlist.h   2007-09-04 19:11:39 UTC (rev 85319)
+++ trunk/moon/src/playlist.h   2007-09-04 19:24:44 UTC (rev 85320)
@@ -13,32 +13,72 @@
 
 G_BEGIN_DECLS
 
+#include <expat.h>
+
 #include "downloader.h"
 #include "media.h"
 
-class Playlist : public MediaSource {
-       List *items;
+class PlaylistContent {
+private:
+       char *title;
+       char *author;
+       char *abstract;
 public:
+       PlaylistContent ();
+       ~PlaylistContent ();
+
+       const char *GetTitle ();
+       void SetTitle (char *title);
+
+       const char *GetAuthor ();
+       void SetAuthor (char *author);
+
+       const char *GetAbstract ();
+       void SetAbstract (char *abstract);
+};
+
+class PlaylistEntry : public List::Node, public PlaylistContent {
+private:
+       char *source;
+       gint64 start_time;
+public:
+       PlaylistEntry ();
+       ~PlaylistEntry ();
+
+       const char *GetSource ();
+       void SetSource (char *file);
+
+       gint64 GetStartTime ();
+       void SetStartTime (gint64 start_time);
+};
+
+class Playlist : public MediaSource, public PlaylistContent {
+       List *items; // list of PlaylistEntries
+public:
        Playlist (MediaElement *element, char *source_name);
        virtual ~Playlist ();
-       
+
        virtual bool Open ();
 
        static bool IsPlaylistFile (const char *file_name);
 private:
        bool Parse ();
+};
 
-       static void parser_on_start_element (GMarkupParseContext *context, 
const gchar *element_name,
-                                                                               
  const gchar **attributes_names, const gchar **attributes_values,
-                                                                               
  gpointer user_data, GError **error);
+class PlaylistParser {
+private:
+       Playlist *playlist;
+       XML_Parser parser;
+       char *base;
 
-       static void parser_on_end_element (GMarkupParseContext *context, const 
gchar *element_name,
-                                                                               
gpointer user_data, GError **error);
+       static void on_start_element (gpointer user_data, const char *name, 
const char **attrs);
+       static void on_end_element (gpointer user_data, const char *name);
+       static void on_text (gpointer user_data, const char *text, int len);
+public:
+       PlaylistParser (Playlist *list);
+       ~PlaylistParser ();
 
-       static void parser_on_text (GMarkupParseContext *context, const gchar 
*text, gsize text_len,
-                                                                gpointer 
user_data, GError **error);
-
-       static void parser_on_error (GMarkupParseContext *context, GError 
*error, gpointer user_data);
+       void Parse (const char *text, int len);
 };
 
 G_END_DECLS

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

Reply via email to