summaryrefslogtreecommitdiff
path: root/backend/epub/epub-document.c
diff options
context:
space:
mode:
Diffstat (limited to 'backend/epub/epub-document.c')
-rw-r--r--backend/epub/epub-document.c148
1 files changed, 121 insertions, 27 deletions
diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c
index 39c114e3..b61d2eac 100644
--- a/backend/epub/epub-document.c
+++ b/backend/epub/epub-document.c
@@ -23,6 +23,7 @@ typedef enum _xmlParseReturnType
typedef struct _contentListNode {
gchar* key ;
gchar* value ;
+ gint index ;
}contentListNode;
typedef struct _EpubDocumentClass EpubDocumentClass;
@@ -65,14 +66,6 @@ epub_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document,
}
static void
-epub_document_get_page_size (EvDocument *document,
- EvPage *page,
- double *width,
- double *height)
-{
-}
-
-static void
epub_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
EvRenderContext *rc,
gint *width,
@@ -80,9 +73,10 @@ epub_document_thumbnails_get_dimensions (EvDocumentThumbnails *document,
{
gdouble page_width, page_height;
- epub_document_get_page_size (EV_DOCUMENT (document), rc->page,
- &page_width, &page_height);
-
+ /*epub_document_get_page_size (EV_DOCUMENT (document), rc->page,
+ &page_width, &page_height);*/
+ page_width = 800 ;
+ page_width = 600 ;
if (rc->rotation == 90 || rc->rotation == 270) {
*width = (gint) (page_height * rc->scale);
*height = (gint) (page_width * rc->scale);
@@ -486,7 +480,7 @@ extract_one_file(EpubDocument* epub_document,GError ** error)
g_string_free(gfilepath,TRUE);
g_free(currentfilename);
g_free(buffer);
-
+ return TRUE;
}
static gboolean
@@ -585,7 +579,7 @@ get_uri_to_content(const gchar* uri,GError ** error,gchar* tmp_archive_dir)
{
GError * err = NULL ;
gchar* containerpath = g_filename_from_uri(uri,NULL,&err);
- GString* absolutepath = g_string_new(NULL);
+ GString* absolutepath ;
gchar* content_uri ;
xmlNodePtr rootfileNode ;
xmlChar* relativepath;
@@ -613,7 +607,7 @@ get_uri_to_content(const gchar* uri,GError ** error,gchar* tmp_archive_dir)
return NULL ;
}
- if ( set_xml_root_node("container") == FALSE) {
+ if ( set_xml_root_node((xmlChar*)"container") == FALSE) {
g_set_error_literal(error,
EV_DOCUMENT_ERROR,
@@ -622,7 +616,7 @@ get_uri_to_content(const gchar* uri,GError ** error,gchar* tmp_archive_dir)
return NULL ;
}
- if ( (rootfileNode = xml_get_pointer_to_node("rootfile","media-type","application/oebps-package+xml")) == NULL)
+ if ( (rootfileNode = xml_get_pointer_to_node((xmlChar*)"rootfile",(xmlChar*)"media-type",(xmlChar*)"application/oebps-package+xml")) == NULL)
{
g_set_error_literal(error,
EV_DOCUMENT_ERROR,
@@ -640,8 +634,8 @@ get_uri_to_content(const gchar* uri,GError ** error,gchar* tmp_archive_dir)
_("epub file is corrupt,no container"));
return NULL ;
}
- g_string_printf(absolutepath,"%s/%s",tmp_archive_dir,relativepath);
-
+ absolutepath = g_string_new(tmp_archive_dir);
+ g_string_append_printf(absolutepath,"/%s",relativepath);
content_uri = g_filename_to_uri(absolutepath->str,NULL,&err);
if ( !content_uri ) {
if (err) {
@@ -655,7 +649,7 @@ get_uri_to_content(const gchar* uri,GError ** error,gchar* tmp_archive_dir)
}
return NULL ;
}
- free(absolutepath);
+ g_string_free(absolutepath,TRUE);
return content_uri ;
}
@@ -665,7 +659,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
{
GList* newlist = NULL ;
GError * err = NULL ;
-
+ gint indexcounter= 1;
xmlNodePtr manifest,spine,itemrefptr,itemptr ;
gboolean errorflag = FALSE;
@@ -681,7 +675,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
return FALSE ;
}
- if ( set_xml_root_node("package") == FALSE) {
+ if ( set_xml_root_node((xmlChar*)"package") == FALSE) {
g_set_error_literal(error,
EV_DOCUMENT_ERROR,
@@ -690,7 +684,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
return FALSE ;
}
- if ( ( spine = xml_get_pointer_to_node("spine",NULL,NULL) )== NULL )
+ if ( ( spine = xml_get_pointer_to_node((xmlChar*)"spine",NULL,NULL) )== NULL )
{
g_set_error_literal(error,
EV_DOCUMENT_ERROR,
@@ -699,7 +693,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
return FALSE ;
}
- if ( ( manifest = xml_get_pointer_to_node("manifest",NULL,NULL) )== NULL )
+ if ( ( manifest = xml_get_pointer_to_node((xmlChar*)"manifest",NULL,NULL) )== NULL )
{
g_set_error_literal(error,
EV_DOCUMENT_ERROR,
@@ -711,7 +705,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
xmlretval = NULL ;
/*Get first instance of itemref from the spine*/
- xml_parse_children_of_node(spine,"itemref",NULL,NULL);
+ xml_parse_children_of_node(spine,(xmlChar*)"itemref",NULL,NULL);
if ( xmlretval != NULL )
itemrefptr = xmlretval ;
@@ -730,7 +724,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
if ( xmlStrcmp(itemrefptr->name,(xmlChar*)"itemref") == 0)
{
contentListNode* newnode = g_malloc0(sizeof(newnode));
- newnode->key = xml_get_data_from_node(itemrefptr,XML_ATTRIBUTE,(xmlChar*)"idref");
+ newnode->key = (gchar*)xml_get_data_from_node(itemrefptr,XML_ATTRIBUTE,(xmlChar*)"idref");
if ( newnode->key == NULL )
{
errorflag =TRUE;
@@ -748,7 +742,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
errorflag=TRUE;
break;
}
- relativepath = xml_get_data_from_node(itemptr,XML_ATTRIBUTE,(xmlChar*)"href");
+ relativepath = (gchar*)xml_get_data_from_node(itemptr,XML_ATTRIBUTE,(xmlChar*)"href");
g_string_assign(absolutepath,tmp_archive_dir);
g_string_append_printf(absolutepath,"/%s",relativepath);
newnode->value = g_filename_to_uri(absolutepath->str,NULL,&err);
@@ -757,6 +751,8 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
errorflag =TRUE;
break;
}
+
+ newnode->index = indexcounter++ ;
newlist = g_list_prepend(newlist,newnode);
}
itemrefptr = itemrefptr->next ;
@@ -781,7 +777,7 @@ setup_document_content_list(const gchar* content_uri, GError** error,gchar *tmp_
g_list_free_full(newlist,(GDestroyNotify)free_tree_nodes);
return NULL ;
}
-
+ newlist = g_list_reverse(newlist);
g_string_free(absolutepath,TRUE);
return newlist ;
@@ -823,6 +819,13 @@ epub_document_load (EvDocument* document,
return FALSE;
}
+ extract_epub_from_container (uri,epub_document,&err);
+
+ if ( err )
+ {
+ g_propagate_error( error,err );
+ return FALSE;
+ }
/*FIXME : can this be different, ever?*/
containerpath = g_string_new(epub_document->tmp_archive_dir);
g_string_append_printf(containerpath,"/META-INF/container.xml");
@@ -841,8 +844,13 @@ epub_document_load (EvDocument* document,
return FALSE;
}
+ xml_free_doc() ;
+
epub_document->contentList = setup_document_content_list (contentOpfUri,&err,epub_document->tmp_archive_dir);
+ if ( xmldocument != NULL )
+ xml_free_doc ();
+
if ( epub_document->contentList == NULL )
{
g_propagate_error(error,err);
@@ -875,6 +883,91 @@ epub_document_finalize (GObject *object)
G_OBJECT_CLASS (epub_document_parent_class)->finalize (object);
}
+static EvDocumentInfo*
+epub_document_get_info(EvDocument *document)
+{
+ EpubDocument *epub_document = EPUB_DOCUMENT(document);
+ GError *error = NULL ;
+ gchar* infofile ;
+ xmlNodePtr metanode ;
+ GString* buffer ;
+ gchar* archive_dir = epub_document->tmp_archive_dir;
+ GString* containerpath = g_string_new(epub_document->tmp_archive_dir);
+ g_string_append_printf(containerpath,"/META-INF/container.xml");
+ gchar* containeruri = g_filename_to_uri(containerpath->str,NULL,&error);
+ if ( error )
+ {
+ return NULL ;
+ }
+ gchar* uri = get_uri_to_content (containeruri,&error,archive_dir);
+ if ( error )
+ {
+ return NULL ;
+ }
+ EvDocumentInfo* epubinfo = g_new0 (EvDocumentInfo, 1);
+
+ if ( xmldocument != NULL )
+ xml_free_doc();
+
+ infofile = g_filename_from_uri(uri,NULL,&error);
+ if ( error )
+ return epubinfo;
+
+ open_xml_document(infofile);
+
+ set_xml_root_node((xmlChar*)"package");
+
+ metanode = xml_get_pointer_to_node((xmlChar*)"title",NULL,NULL);
+ if ( metanode == NULL )
+ epubinfo->title = NULL ;
+ else
+ epubinfo->title = (char*)xml_get_data_from_node(metanode,XML_KEYWORD,NULL);
+
+ metanode = xml_get_pointer_to_node((xmlChar*)"creator",NULL,NULL);
+ if ( metanode == NULL )
+ epubinfo->author = g_strdup("unknown");
+ else
+ epubinfo->author = xml_get_data_from_node(metanode,XML_KEYWORD,NULL);
+
+ metanode = xml_get_pointer_to_node((xmlChar*)"subject",NULL,NULL);
+ if ( metanode == NULL )
+ epubinfo->subject = g_strdup("unknown");
+ else
+ epubinfo->subject = xml_get_data_from_node(metanode,XML_KEYWORD,NULL);
+
+ buffer = g_string_new(xml_get_data_from_node (xmlroot,XML_ATTRIBUTE,(xmlChar*)"version"));
+ g_string_prepend(buffer,"epub ");
+ epubinfo->format = g_strdup(buffer->str);
+
+ /*FIXME: Add more of these as you write the corresponding modules*/
+ epubinfo->permissions = EV_DOCUMENT_PERMISSIONS_OK_TO_ADD_NOTES;
+
+ epubinfo->layout = EV_DOCUMENT_LAYOUT_SINGLE_PAGE;
+
+ metanode = xml_get_pointer_to_node((xmlChar*)"publisher",NULL,NULL);
+ if ( metanode == NULL )
+ epubinfo->creator = g_strdup("unknown");
+ else
+ epubinfo->creator = xml_get_data_from_node(metanode,XML_KEYWORD,NULL);
+
+ /*TODO : Add a function to get date*/
+ g_free(uri);
+ g_string_free(containerpath,TRUE);
+ g_string_free(buffer,TRUE);
+ return epubinfo ;
+}
+
+static EvPage*
+epub_document_get_page(EvDocument *document,
+ gint index)
+{
+ EpubDocument *epub_document = EPUB_DOCUMENT(document);
+ EvPage* page = ev_page_new(index);
+ contentListNode *listptr = g_list_nth_data (epub_document->contentList,--index);
+ page->backend_page = g_strdup(listptr->value);
+ return page ;
+}
+
static void
epub_document_class_init (EpubDocumentClass *klass)
{
@@ -886,6 +979,7 @@ epub_document_class_init (EpubDocumentClass *klass)
ev_document_class->load = epub_document_load;
ev_document_class->save = epub_document_save;
ev_document_class->get_n_pages = epub_document_get_n_pages;
- ev_document_class->get_page_size = epub_document_get_page_size;
ev_document_class->render = epub_document_render;
+ ev_document_class->get_info = epub_document_get_info;
+ ev_document_class->get_page = epub_document_get_page;
}