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