diff options
| author | Stefano Karapetsas <[email protected]> | 2013-04-27 20:33:21 +0200 | 
|---|---|---|
| committer | Stefano Karapetsas <[email protected]> | 2013-04-27 20:33:21 +0200 | 
| commit | 0ccbc83f09c65cdb252c63ee110bac7e91f4c7bd (patch) | |
| tree | 85befc9e4e4568c2cc0d5960f3dbb1d55b647223 | |
| parent | 360c4652feef85e15c936d9da9d3c49b081cd502 (diff) | |
| download | atril-0ccbc83f09c65cdb252c63ee110bac7e91f4c7bd.tar.bz2 atril-0ccbc83f09c65cdb252c63ee110bac7e91f4c7bd.tar.xz | |
Remove broken impress backend
| -rw-r--r-- | backend/Makefile.am | 4 | ||||
| -rw-r--r-- | backend/impress/Makefile.am | 57 | ||||
| -rw-r--r-- | backend/impress/common.h | 40 | ||||
| -rw-r--r-- | backend/impress/document.c | 140 | ||||
| -rw-r--r-- | backend/impress/f_oasis.c | 170 | ||||
| -rw-r--r-- | backend/impress/f_oo13.c | 181 | ||||
| -rw-r--r-- | backend/impress/iksemel.c | 1882 | ||||
| -rw-r--r-- | backend/impress/iksemel.h | 402 | ||||
| -rw-r--r-- | backend/impress/imposter.h | 84 | ||||
| -rw-r--r-- | backend/impress/impress-document.c | 548 | ||||
| -rw-r--r-- | backend/impress/impress-document.h | 39 | ||||
| -rw-r--r-- | backend/impress/impressdocument.atril-backend.in | 4 | ||||
| -rw-r--r-- | backend/impress/internal.h | 85 | ||||
| -rw-r--r-- | backend/impress/r_back.c | 46 | ||||
| -rw-r--r-- | backend/impress/r_draw.c | 120 | ||||
| -rw-r--r-- | backend/impress/r_geometry.c | 208 | ||||
| -rw-r--r-- | backend/impress/r_gradient.c | 387 | ||||
| -rw-r--r-- | backend/impress/r_style.c | 111 | ||||
| -rw-r--r-- | backend/impress/r_text.c | 386 | ||||
| -rw-r--r-- | backend/impress/render.c | 54 | ||||
| -rw-r--r-- | backend/impress/zip.c | 349 | ||||
| -rw-r--r-- | backend/impress/zip.h | 18 | ||||
| -rw-r--r-- | configure.ac | 20 | ||||
| -rw-r--r-- | po/POTFILES.in | 3 | 
24 files changed, 0 insertions, 5338 deletions
| diff --git a/backend/Makefile.am b/backend/Makefile.am index ab1663d7..ef76c4ee 100644 --- a/backend/Makefile.am +++ b/backend/Makefile.am @@ -34,10 +34,6 @@ if ENABLE_XPS      SUBDIRS += xps  endif -if ENABLE_IMPRESS -     SUBDIRS += impress -endif -  EXTRA_DIST = \  	backend.symbols diff --git a/backend/impress/Makefile.am b/backend/impress/Makefile.am deleted file mode 100644 index 17dafce0..00000000 --- a/backend/impress/Makefile.am +++ /dev/null @@ -1,57 +0,0 @@ -AM_CPPFLAGS =					\ -	-I$(top_srcdir)				\ -	-I$(top_srcdir)/libdocument		\ -	-DMATELOCALEDIR=\"$(datadir)/locale\"	\ -	-DATRILDATADIR=\""$(datadir)"\"	\ -	-DATRIL_COMPILATION			\ -	$(BACKEND_CFLAGS)			\ -	$(WARN_CFLAGS)				\ -	$(DISABLE_DEPRECATED) - -backend_LTLIBRARIES = libimpressdocument.la - -libimpressdocument_la_SOURCES =	\ -	$(IMPOSTER_SOURCE_FILES)	\ -	$(IMPOSTER_INCLUDE_FILES)	\ -	impress-document.c		\ -	impress-document.h - -IMPOSTER_SOURCE_FILES =			\ -	document.c			\ -	f_oasis.c			\ -	f_oo13.c			\ -	iksemel.c			\ -	r_back.c			\ -	r_draw.c			\ -	render.c			\ -	r_geometry.c			\ -	r_gradient.c			\ -	r_style.c			\ -	r_text.c			\ -	zip.c -IMPOSTER_INCLUDE_FILES =		\ -	common.h			\ -	iksemel.h			\ -	imposter.h			\ -	internal.h			\ -	zip.h -IMPOSTER_RENDER_SOURCE_FILES =		\ -	render.c -IMPOSTER_RENDER_INCLUDE_FILES =		\ -	render.h - -libimpressdocument_la_LDFLAGS = $(BACKEND_LIBTOOL_FLAGS) -libimpressdocument_la_LIBADD =				\ -	$(top_builddir)/libdocument/libatrildocument.la     \ -	$(BACKEND_LIBS) -lz - -backend_in_files = impressdocument.atril-backend.in -backend_DATA = $(backend_in_files:.atril-backend.in=.atril-backend) - -EXTRA_DIST = $(backend_in_files) - -CLEANFILES = $(backend_DATA) - -@EV_INTLTOOL_ATRIL_BACKEND_RULE@ - --include $(top_srcdir)/git.mk diff --git a/backend/impress/common.h b/backend/impress/common.h deleted file mode 100644 index 73e4ac19..00000000 --- a/backend/impress/common.h +++ /dev/null @@ -1,40 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#ifndef COMMON_H -#define COMMON_H 1 - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <sys/types.h> -#include <stdio.h> - -#ifdef STDC_HEADERS -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#elif HAVE_STRINGS_H -#include <strings.h> -#endif - -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif - -#ifdef HAVE_ERRNO_H -#include <errno.h> -#endif -#ifndef errno -extern int errno; -#endif - -#include <iksemel.h> -#include "imposter.h" - - -#endif	/* COMMON_H */ diff --git a/backend/impress/document.c b/backend/impress/document.c deleted file mode 100644 index b01c0e18..00000000 --- a/backend/impress/document.c +++ /dev/null @@ -1,140 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -static iks * -_imp_load_xml(ImpDoc *doc, const char *xmlfile) -{ -	int e; -	iks *x; - -	x = zip_load_xml (doc->zfile, xmlfile, &e); -	return x; -} - -ImpDoc * -imp_open(const char *filename, int *err) -{ -	ImpDoc *doc; -	int e; - -	doc = calloc(1, sizeof(ImpDoc)); -	if (!doc) { -		*err = IMP_NOMEM; -		return NULL; -	} - -	doc->stack = iks_stack_new(sizeof(ImpPage) * 32, 0); -	if (!doc->stack) { -		*err = IMP_NOMEM; -		imp_close(doc); -		return NULL; -	} - -	doc->zfile = zip_open(filename, &e); -	if (e) { -		*err = IMP_NOTZIP; -		imp_close(doc); -		return NULL; -	} - -	doc->content = _imp_load_xml(doc, "content.xml"); -	doc->styles = _imp_load_xml(doc, "styles.xml"); -	doc->meta = _imp_load_xml(doc, "meta.xml"); - -	if (!doc->content || !doc->styles) { -		*err = IMP_BADDOC; -		imp_close(doc); -		return NULL; -	} - -	e = _imp_oo13_load(doc); -	if (e && e != IMP_NOTIMP) { -		*err = e; -		imp_close(doc); -		return NULL; -	} - -	if (e == IMP_NOTIMP) { -		e = _imp_oasis_load(doc); -		if (e) { -			*err = e; -			imp_close(doc); -			return NULL; -		} -	} - -	return doc; -} - -int -imp_nr_pages(ImpDoc *doc) -{ -	return doc->nr_pages; -} - -ImpPage * -imp_get_page(ImpDoc *doc, int page_no) -{ -	if (page_no == IMP_LAST_PAGE) { -		return doc->last_page; -	} else { -		ImpPage *page; -		if (page_no < 0 || page_no > doc->nr_pages) return NULL; -		for (page = doc->pages; page_no; --page_no) { -			page = page->next; -		} -		return page; -	} -} - -ImpPage * -imp_next_page(ImpPage *page) -{ -	return page->next; -} - -ImpPage * -imp_prev_page(ImpPage *page) -{ -	return page->prev; -} - -int -imp_get_page_no(ImpPage *page) -{ -	return page->nr; -} - -const char * -imp_get_page_name(ImpPage *page) -{ -	return page->name; -} - -void * -imp_get_xml(ImpDoc *doc, const char *filename) -{ -	if (strcmp(filename, "content.xml") == 0) -		return doc->content; -	else if (strcmp(filename, "styles.xml") == 0) -		return doc->styles; -	else if (strcmp(filename, "meta.xml") == 0) -		return doc->meta; -	else -		return NULL; -} - -void -imp_close(ImpDoc *doc) -{ -	if (doc->stack) iks_stack_delete(doc->stack); -	if (doc->zfile) zip_close(doc->zfile); -	free(doc); -} diff --git a/backend/impress/f_oasis.c b/backend/impress/f_oasis.c deleted file mode 100644 index 8fe6ee1a..00000000 --- a/backend/impress/f_oasis.c +++ /dev/null @@ -1,170 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -static void -render_object(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	char *tag, *t; -	ImpColor fg; - -	tag = iks_name(node); -	if (strcmp(tag, "draw:g") == 0) { -		iks *x; -		for (x = iks_first_tag(node); x; x = iks_next_tag(x)) { -			render_object(ctx, drw_data, x); -		} -	} else if (strcmp(tag, "draw:frame") == 0) { -		iks *x; -		for (x = iks_first_tag(node); x; x = iks_next_tag(x)) { -			render_object(ctx, drw_data, x); -		} -	} else if (strcmp(tag, "draw:line") == 0) { -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		ctx->drw->set_fg_color(drw_data, &fg); -		ctx->drw->draw_line(drw_data, -			r_get_x(ctx, node, "svg:x1"), r_get_y(ctx, node, "svg:y1"), -			r_get_x(ctx, node, "svg:x2"), r_get_y(ctx, node, "svg:y2") -		); -	} else if (strcmp(tag, "draw:rect") == 0) { -		int x, y, w, h, r = 0; -		char *t; -		x = r_get_x(ctx, node, "svg:x"); -		y = r_get_y(ctx, node, "svg:y"); -		w = r_get_x(ctx, node, "svg:width"); -		h = r_get_y(ctx, node, "svg:height"); -		t = r_get_style(ctx, node, "draw:corner-radius"); -		if (t) r = atof(t) * ctx->fact_x; -		if (r_get_style(ctx, node, "draw:fill")) { -			r_get_color(ctx, node, "draw:fill-color", &fg); -			ctx->drw->set_fg_color(drw_data, &fg); -			_imp_draw_rect(ctx, drw_data, 1, x, y, w, h, r); -		} -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		ctx->drw->set_fg_color(drw_data, &fg); -		_imp_draw_rect(ctx, drw_data, 0, x, y, w, h, r); -		r_text(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:ellipse") == 0 || strcmp(tag, "draw:circle") == 0) { -		int sa, ea, fill = 0; -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		sa = r_get_angle(node, "draw:start-angle", 0); -		ea = r_get_angle(node, "draw:end-angle", 360); -		if (ea > sa) ea = ea - sa; else ea = 360 + ea - sa; -		t = r_get_style(ctx, node, "draw:fill"); -		if (t) fill = 1; -		ctx->drw->set_fg_color(drw_data, &fg); -		ctx->drw->draw_arc(drw_data, -			fill, -			r_get_x(ctx, node, "svg:x"), r_get_y(ctx, node, "svg:y"), -			r_get_x(ctx, node, "svg:width"), r_get_y(ctx, node, "svg:height"), -			sa, ea -		); -	} else if (strcmp(tag, "draw:polygon") == 0) { -		// FIXME: -		r_polygon(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:text-box") == 0) { -		// FIXME: -		r_text(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:image") == 0) { -		char *name; - -		name = iks_find_attrib(node, "xlink:href"); -		if (!name) return; -		if (name[0] == '#') ++name; - -		_imp_draw_image(ctx, drw_data, -			name, -			r_get_x(ctx, node, "svg:x"), -			r_get_y(ctx, node, "svg:y"), -			r_get_x(ctx, node, "svg:width"), -			r_get_y(ctx, node, "svg:height") -		); -	} else { -		printf("Unknown element: %s\n", tag); -	} -} - -static void -render_page(ImpRenderCtx *ctx, void *drw_data) -{ -	iks *x; -	char *element; -	int i; - -	i = _imp_fill_back(ctx, drw_data, ctx->page->page); -	element = iks_find_attrib(ctx->page->page, "draw:master-page-name"); -	if (element) { -		x = iks_find_with_attrib( -			iks_find(ctx->page->doc->styles, "office:master-styles"), -			"style:master-page", "style:name", element -		); -		if (x) { -			if (i == 0) _imp_fill_back(ctx, drw_data, x); -			for (x = iks_first_tag(x); x; x = iks_next_tag(x)) { -				if (iks_find_attrib(x, "presentation:class")) -					continue; -				render_object(ctx, drw_data, x); -			} -		} -	} -	for (x = iks_first_tag(ctx->page->page); x; x = iks_next_tag(x)) { -		render_object(ctx, drw_data, x); -	} -} - -static void -get_geometry(ImpRenderCtx *ctx) -{ -	char *tmp; -	iks *x, *y; - -	tmp = iks_find_attrib(ctx->page->page, "draw:master-page-name"); -	x = iks_find(ctx->page->doc->styles, "office:master-styles"); -	y = iks_find_with_attrib(x, "style:master-page", "style:name", tmp); -	x = iks_find(ctx->page->doc->styles, "office:automatic-styles"); -	y = iks_find_with_attrib(x, "style:page-layout", "style:name", -		iks_find_attrib(y, "style:page-layout-name")); -	ctx->cm_w = atof(iks_find_attrib(iks_find(y, "style:page-layout-properties"), "fo:page-width")); -	ctx->cm_h = atof(iks_find_attrib(iks_find(y, "style:page-layout-properties"), "fo:page-height")); -} - -int -_imp_oasis_load(ImpDoc *doc) -{ -	ImpPage *page; -	iks *x, *pres; -	int i; - -	pres = iks_find(iks_find(doc->content, "office:body"), "office:presentation"); -	if (!pres) return IMP_NOTIMP; - -	x = iks_find(pres, "draw:page"); -	if (!x) return IMP_NOTIMP; -	i = 0; -	for (; x; x = iks_next_tag(x)) { -		if (strcmp(iks_name(x), "draw:page") == 0) { -			page = iks_stack_alloc(doc->stack, sizeof(ImpPage)); -			if (!page) return IMP_NOMEM; -			memset(page, 0, sizeof(ImpPage)); -			page->page = x; -			page->nr = ++i; -			page->name = iks_find_attrib(x, "draw:name"); -			page->doc = doc; -			if (!doc->pages) doc->pages = page; -			page->prev = doc->last_page; -			if (doc->last_page) doc->last_page->next = page; -			doc->last_page = page; -		} -	} -	doc->nr_pages = i; -	doc->get_geometry = get_geometry; -	doc->render_page = render_page; - -	return 0; -} diff --git a/backend/impress/f_oo13.c b/backend/impress/f_oo13.c deleted file mode 100644 index 7bfeeb53..00000000 --- a/backend/impress/f_oo13.c +++ /dev/null @@ -1,181 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -//	{ "draw:text-box", r_text }, -//	{ "draw:connector", r_line }, -//	{ "draw:polyline", r_polyline }, -//	{ "draw:polygon", r_polygon }, -//	{ "draw:path", r_path }, - -static void -render_object(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	char *tag, *t; -	ImpColor fg; - -	tag = iks_name(node); -	if (strcmp(tag, "draw:g") == 0) { -		iks *x; -		for (x = iks_first_tag(node); x; x = iks_next_tag(x)) { -			render_object(ctx, drw_data, x); -		} -	} else if (strcmp(tag, "draw:line") == 0) { -		int x1, y1, x2, y2; -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		ctx->drw->set_fg_color(drw_data, &fg); -		x1 = r_get_x(ctx, node, "svg:x1"); -		y1 = r_get_y(ctx, node, "svg:y1"); -		x2 = r_get_x(ctx, node, "svg:x2"); -		y2 = r_get_y(ctx, node, "svg:y2"); -		ctx->drw->draw_line(drw_data, x1, y1, x2, y2); -		if (r_get_style(ctx, node, "draw:marker-start")) { -			_imp_draw_line_end(ctx, drw_data, 0, 0, x2, y2, x1, y1); -		} -		if (r_get_style(ctx, node, "draw:marker-end")) { -			_imp_draw_line_end(ctx, drw_data, 0, 0, x1, y1, x2, y2); -		} -	} else if (strcmp(tag, "draw:rect") == 0) { -		int x, y, w, h, r = 0; -		char *t; -		x = r_get_x(ctx, node, "svg:x"); -		y = r_get_y(ctx, node, "svg:y"); -		w = r_get_x(ctx, node, "svg:width"); -		h = r_get_y(ctx, node, "svg:height"); -		t = r_get_style(ctx, node, "draw:corner-radius"); -		if (t) r = atof(t) * ctx->fact_x; -		t = r_get_style(ctx, node, "draw:fill"); -		if (t && strcmp(t, "none") != 0) { -			r_get_color(ctx, node, "draw:fill-color", &fg); -			ctx->drw->set_fg_color(drw_data, &fg); -			_imp_draw_rect(ctx, drw_data, 1, x, y, w, h, r); -		} -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		ctx->drw->set_fg_color(drw_data, &fg); -		_imp_draw_rect(ctx, drw_data, 0, x, y, w, h, r); -		r_text(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:ellipse") == 0 || strcmp(tag, "draw:circle") == 0) { -		int sa, ea, fill = 0; -		r_get_color(ctx, node, "svg:stroke-color", &fg); -		sa = r_get_angle(node, "draw:start-angle", 0); -		ea = r_get_angle(node, "draw:end-angle", 360); -		if (ea > sa) ea = ea - sa; else ea = 360 + ea - sa; -		t = r_get_style(ctx, node, "draw:fill"); -		if (t) fill = 1; -		ctx->drw->set_fg_color(drw_data, &fg); -		ctx->drw->draw_arc(drw_data, -			fill, -			r_get_x(ctx, node, "svg:x"), r_get_y(ctx, node, "svg:y"), -			r_get_x(ctx, node, "svg:width"), r_get_y(ctx, node, "svg:height"), -			sa, ea -		); -	} else if (strcmp(tag, "draw:polygon") == 0) { -		// FIXME: -		r_polygon(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:text-box") == 0) { -		// FIXME: -		r_text(ctx, drw_data, node); -	} else if (strcmp(tag, "draw:image") == 0) { -		char *name; - -		name = iks_find_attrib(node, "xlink:href"); -		if (!name) return; -		if (name[0] == '#') ++name; - -		_imp_draw_image(ctx, drw_data, -			name, -			r_get_x(ctx, node, "svg:x"), -			r_get_y(ctx, node, "svg:y"), -			r_get_x(ctx, node, "svg:width"), -			r_get_y(ctx, node, "svg:height") -		); -	} else { -		printf("Unknown element: %s\n", tag); -	} -} - -static void -render_page(ImpRenderCtx *ctx, void *drw_data) -{ -	iks *x; -	char *element; -	int i; - -	i = _imp_fill_back(ctx, drw_data, ctx->page->page); -	element = iks_find_attrib(ctx->page->page, "draw:master-page-name"); -	if (element) { -		x = iks_find_with_attrib( -			iks_find(ctx->page->doc->styles, "office:master-styles"), -			"style:master-page", "style:name", element -		); -		if (x) { -			if (i == 0) _imp_fill_back(ctx, drw_data, x); -			for (x = iks_first_tag(x); x; x = iks_next_tag(x)) { -				if (iks_find_attrib(x, "presentation:class")) -					continue; -				render_object(ctx, drw_data, x); -			} -		} -	} -	for (x = iks_first_tag(ctx->page->page); x; x = iks_next_tag(x)) { -		render_object(ctx, drw_data, x); -	} -} - -static void -get_geometry(ImpRenderCtx *ctx) -{ -	char *tmp; -	iks *x, *y; - -	tmp = iks_find_attrib(ctx->page->page, "draw:master-page-name"); -	x = iks_find(ctx->page->doc->styles, "office:master-styles"); -	y = iks_find_with_attrib(x, "style:master-page", "style:name", tmp); -	x = iks_find(ctx->page->doc->styles, "office:automatic-styles"); -	y = iks_find_with_attrib(x, "style:page-master", "style:name", -		iks_find_attrib(y, "style:page-master-name")); -	ctx->cm_w = atof(iks_find_attrib(iks_find(y, "style:properties"), "fo:page-width")); -	ctx->cm_h = atof(iks_find_attrib(iks_find(y, "style:properties"), "fo:page-height")); -} - -int -_imp_oo13_load(ImpDoc *doc) -{ -	ImpPage *page; -	char *class; -	iks *x; -	int i; - -	class = iks_find_attrib(doc->content, "office:class"); -	if (iks_strcmp(class, "presentation") != 0) return IMP_NOTIMP; - -	x = iks_find(iks_find(doc->content, "office:body"), "draw:page"); -	if (!x) return IMP_NOTIMP; -	i = 0; -	for (; x; x = iks_next_tag(x)) { -		if (strcmp(iks_name(x), "draw:page") == 0) { -			page = iks_stack_alloc(doc->stack, sizeof(ImpPage)); -			if (!page) return IMP_NOMEM; -			memset(page, 0, sizeof(ImpPage)); -			page->page = x; -			page->nr = ++i; -			page->name = iks_find_attrib(x, "draw:name"); -			page->doc = doc; -			if (!doc->pages) doc->pages = page; -			page->prev = doc->last_page; -			if (doc->last_page) doc->last_page->next = page; -			doc->last_page = page; -		} -	} -	doc->nr_pages = i; -	doc->get_geometry = get_geometry; -	doc->render_page = render_page; - -	return 0; -} diff --git a/backend/impress/iksemel.c b/backend/impress/iksemel.c deleted file mode 100644 index 9908e132..00000000 --- a/backend/impress/iksemel.c +++ /dev/null @@ -1,1882 +0,0 @@ -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2003 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -/* minimum sax buffer size */ -#define SAX_BUFFER_MIN_SIZE 128 - -/* sax parser structure plus extra data of dom parser */ -#define DEFAULT_DOM_CHUNK_SIZE 256 - -/* sax parser structure plus extra data of stream parser */ -#define DEFAULT_STREAM_CHUNK_SIZE 256 - -/* iks structure, its data, child iks structures, for stream parsing */ -#define DEFAULT_IKS_CHUNK_SIZE 1024 - -/* iks structure, its data, child iks structures, for file parsing */ -#define DEFAULT_DOM_IKS_CHUNK_SIZE 2048 - -/* rule structure and from/to/id/ns strings */ -#define DEFAULT_RULE_CHUNK_SIZE 128 - -/* file is read by blocks with this size */ -#define FILE_IO_BUF_SIZE 4096 - -/* network receive buffer */ -#define NET_IO_BUF_SIZE 4096 -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2003 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#include <config.h> -#include <errno.h> - -#include "common.h" -#include "iksemel.h" - -/*****  malloc wrapper  *****/ - -static void *(*my_malloc_func)(size_t size); -static void (*my_free_func)(void *ptr); - -void * -iks_malloc (size_t size) -{ -	if (my_malloc_func) -		return my_malloc_func (size); -	else -		return malloc (size); -} - -void -iks_free (void *ptr) -{ -	if (my_free_func) -		my_free_func (ptr); -	else -		free (ptr); -} - -void -iks_set_mem_funcs (void *(*malloc_func)(size_t size), void (*free_func)(void *ptr)) -{ -	my_malloc_func = malloc_func; -	my_free_func = free_func; -} - -/*****  NULL-safe Functions  *****/ - -char * -iks_strdup (const char *src) -{ -	if (src) return strdup(src); -	return NULL; -} - -char * -iks_strcat (char *dest, const char *src) -{ -	size_t len; - -	if (!src) return dest; - -	len = strlen (src); -	memcpy (dest, src, len); -	dest[len] = '\0'; -	return dest + len; -} - -int -iks_strcmp (const char *a, const char *b) -{ -	if (!a || !b) return -1; -	return strcmp (a, b); -} - -int -iks_strcasecmp (const char *a, const char *b) -{ -	if (!a || !b) return -1; -	return strcasecmp (a, b); -} - -int -iks_strncmp (const char *a, const char *b, size_t n) -{ -	if (!a || !b) return -1; -	return strncmp (a, b, n); -} - -int -iks_strncasecmp (const char *a, const char *b, size_t n) -{ -	if (!a || !b) return -1; -	return strncasecmp (a, b, n); -} - -size_t -iks_strlen (const char *src) -{ -	if (!src) return 0; -	return strlen (src); -} - -/*****  XML Escaping  *****/ - -char * -iks_escape (ikstack *s, char *src, size_t len) -{ -	char *ret; -	int i, j, nlen; - -	if (!src || !s) return NULL; -	if (len == -1) len = strlen (src); - -	nlen = len; -	for (i=0; i<len; i++) { -		switch (src[i]) { -		case '&': nlen += 4; break; -		case '<': nlen += 3; break; -		case '>': nlen += 3; break; -		case '\'': nlen += 5; break; -		case '"': nlen += 5; break; -		} -	} -	if (len == nlen) return src; - -	ret = iks_stack_alloc (s, nlen + 1); -	if (!ret) return NULL; - -	for (i=j=0; i<len; i++) { -		switch (src[i]) { -		case '&': memcpy (&ret[j], "&", 5); j += 5; break; -		case '\'': memcpy (&ret[j], "'", 6); j += 6; break; -		case '"': memcpy (&ret[j], """, 6); j += 6; break; -		case '<': memcpy (&ret[j], "<", 4); j += 4; break; -		case '>': memcpy (&ret[j], ">", 4); j += 4; break; -		default: ret[j++] = src[i]; -		} -	} -	ret[j] = '\0'; - -	return ret; -} - -char * -iks_unescape (ikstack *s, char *src, size_t len) -{ -	int i,j; -	char *ret; - -	if (!s || !src) return NULL; -	if (!strchr (src, '&')) return src; -	if (len == -1) len = strlen (src); - -	ret = iks_stack_alloc (s, len + 1); -	if (!ret) return NULL; - -	for (i=j=0; i<len; i++) { -		if (src[i] == '&') { -			i++; -			if (strncmp (&src[i], "amp;", 4) == 0) { -				ret[j] = '&'; -				i += 3; -			} else if (strncmp (&src[i], "quot;", 5) == 0) { -				ret[j] = '"'; -				i += 4; -			} else if (strncmp (&src[i], "apos;", 5) == 0) { -				ret[j] = '\''; -				i += 4; -			} else if (strncmp (&src[i], "lt;", 3) == 0) { -				ret[j] = '<'; -				i += 2; -			} else if (strncmp (&src[i], "gt;", 3) == 0) { -				ret[j] = '>'; -				i += 2; -			} else { -				ret[j] = src[--i]; -			} -		} else { -			ret[j] = src[i]; -		} -		j++; -	} -	ret[j] = '\0'; - -	return ret; -} -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2004 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#include "common.h" -#include "iksemel.h" - -struct align_test { char a; double b; }; -#define DEFAULT_ALIGNMENT  ((size_t) ((char *) &((struct align_test *) 0)->b - (char *) 0)) -#define ALIGN_MASK ( DEFAULT_ALIGNMENT - 1 ) -#define MIN_CHUNK_SIZE ( DEFAULT_ALIGNMENT * 8 ) -#define MIN_ALLOC_SIZE DEFAULT_ALIGNMENT -#define ALIGN(x) ( (x) + (DEFAULT_ALIGNMENT - ( (x) & ALIGN_MASK)) ) - -typedef struct ikschunk_struct { -	struct ikschunk_struct *next; -	size_t size; -	size_t used; -	size_t last; -	char data[4]; -} ikschunk; - -struct ikstack_struct { -	size_t allocated; -	ikschunk *meta; -	ikschunk *data; -}; - -static ikschunk * -find_space (ikstack *s, ikschunk *c, size_t size) -{ -	/* FIXME: dont use *2 after over allocated chunks */ -	while (1) { -		if (c->size - c->used >= size) return c; -		if (!c->next) { -			if ((c->size * 2) > size) size = c->size * 2; -			c->next = iks_malloc (sizeof (ikschunk) + size); -			if (!c->next) return NULL; -			s->allocated += sizeof (ikschunk) + size; -			c = c->next; -			c->next = NULL; -			c->size = size; -			c->used = 0; -			c->last = (size_t) -1; -			return c; -		} -		c = c->next; -	} -	return NULL; -} - -ikstack * -iks_stack_new (size_t meta_chunk, size_t data_chunk) -{ -	ikstack *s; -	size_t len; - -	if (meta_chunk < MIN_CHUNK_SIZE) meta_chunk = MIN_CHUNK_SIZE; -	if (meta_chunk & ALIGN_MASK) meta_chunk = ALIGN (meta_chunk); -	if (data_chunk < MIN_CHUNK_SIZE) data_chunk = MIN_CHUNK_SIZE; -	if (data_chunk & ALIGN_MASK) data_chunk = ALIGN (data_chunk); - -	len = sizeof (ikstack) + meta_chunk + data_chunk + (sizeof (ikschunk) * 2); -	s = iks_malloc (len); -	if (!s) return NULL; -	s->allocated = len; -	s->meta = (ikschunk *) ((char *) s + sizeof (ikstack)); -	s->meta->next = NULL; -	s->meta->size = meta_chunk; -	s->meta->used = 0; -	s->meta->last = (size_t) -1; -	s->data = (ikschunk *) ((char *) s + sizeof (ikstack) + sizeof (ikschunk) + meta_chunk); -	s->data->next = NULL; -	s->data->size = data_chunk; -	s->data->used = 0; -	s->data->last = (size_t) -1; -	return s; -} - -void * -iks_stack_alloc (ikstack *s, size_t size) -{ -	ikschunk *c; -	void *mem; - -	if (size < MIN_ALLOC_SIZE) size = MIN_ALLOC_SIZE; -	if (size & ALIGN_MASK) size = ALIGN (size); - -	c = find_space (s, s->meta, size); -	if (!c) return NULL; -	mem = c->data + c->used; -	c->used += size; -	return mem; -} - -char * -iks_stack_strdup (ikstack *s, const char *src, size_t len) -{ -	ikschunk *c; -	char *dest; - -	if (!src) return NULL; -	if (0 == len) len = strlen (src); - -	c = find_space (s, s->data, len + 1); -	if (!c) return NULL; -	dest = c->data + c->used; -	c->last = c->used; -	c->used += len + 1; -	memcpy (dest, src, len); -	dest[len] = '\0'; -	return dest; -} - -char * -iks_stack_strcat (ikstack *s, char *old, size_t old_len, const char *src, size_t src_len) -{ -	char *ret; -	ikschunk *c; - -	if (!old) { -		return iks_stack_strdup (s, src, src_len); -	} -	if (0 == old_len) old_len = strlen (old); -	if (0 == src_len) src_len = strlen (src); - -	for (c = s->data; c; c = c->next) { -		if (c->data + c->last == old) break; -	} -	if (!c) { -		c = find_space (s, s->data, old_len + src_len + 1); -		if (!c) return NULL; -		ret = c->data + c->used; -		c->last = c->used; -		c->used += old_len + src_len + 1; -		memcpy (ret, old, old_len); -		memcpy (ret + old_len, src, src_len); -		ret[old_len + src_len] = '\0'; -		return ret; -	} - -	if (c->size - c->used > src_len) { -		ret = c->data + c->last; -		memcpy (ret + old_len, src, src_len); -		c->used += src_len; -		ret[old_len + src_len] = '\0'; -	} else { -		/* FIXME: decrease c->used before moving string to new place */ -		c = find_space (s, s->data, old_len + src_len + 1); -		if (!c) return NULL; -		c->last = c->used; -		ret = c->data + c->used; -		memcpy (ret, old, old_len); -		c->used += old_len; -		memcpy (c->data + c->used, src, src_len); -		c->used += src_len; -		c->data[c->used] = '\0'; -		c->used++; -	} -	return ret; -} - -void -iks_stack_stat (ikstack *s, size_t *allocated, size_t *used) -{ -	ikschunk *c; - -	if (allocated) { -		*allocated = s->allocated; -	} -	if (used) { -		*used = 0; -		for (c = s->meta; c; c = c->next) { -			(*used) += c->used; -		} -		for (c = s->data; c; c = c->next) { -			(*used) += c->used; -		} -	} -} - -void -iks_stack_delete (ikstack *s) -{ -	ikschunk *c, *tmp; - -	c = s->meta->next; -	while (c) { -		tmp = c->next; -		iks_free (c); -		c = tmp; -	} -	c = s->data->next; -	while (c) { -		tmp = c->next; -		iks_free (c); -		c = tmp; -	} -	iks_free (s); -} -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2004 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#include "common.h" -#include "iksemel.h" - -enum cons_e { -	C_CDATA = 0, -	C_TAG_START, -	C_TAG, -	C_TAG_END, -	C_ATTRIBUTE, -	C_ATTRIBUTE_1, -	C_ATTRIBUTE_2, -	C_VALUE, -	C_VALUE_APOS, -	C_VALUE_QUOT, -	C_WHITESPACE, -	C_ENTITY, -	C_COMMENT, -	C_COMMENT_1, -	C_COMMENT_2, -	C_COMMENT_3, -	C_MARKUP, -	C_MARKUP_1, -	C_SECT, -	C_SECT_CDATA, -	C_SECT_CDATA_1, -	C_SECT_CDATA_2, -	C_SECT_CDATA_3, -	C_SECT_CDATA_4, -	C_SECT_CDATA_C, -	C_SECT_CDATA_E, -	C_SECT_CDATA_E2, -	C_PI -}; - -/* if you add a variable here, dont forget changing iks_parser_reset */ -struct iksparser_struct { -	ikstack *s; -	void *user_data; -	iksTagHook *tagHook; -	iksCDataHook *cdataHook; -	iksDeleteHook *deleteHook; -	/* parser context */ -	char *stack; -	size_t stack_pos; -	size_t stack_max; - -	enum cons_e context; -	enum cons_e oldcontext; - -	char *tag_name; -	enum ikstagtype tagtype; - -	unsigned int attmax; -	unsigned int attcur; -	int attflag; -	char **atts; -	int valflag; - -	unsigned int entpos; -	char entity[8]; - -	unsigned long nr_bytes; -	unsigned long nr_lines; - -	int uni_max; -	int uni_len; -}; - -iksparser * -iks_sax_new (void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook) -{ -	iksparser *prs; - -	prs = iks_malloc (sizeof (iksparser)); -	if (NULL == prs) return NULL; -	memset (prs, 0, sizeof (iksparser)); -	prs->user_data = user_data; -	prs->tagHook = tagHook; -	prs->cdataHook = cdataHook; -	return prs; -} - -iksparser * -iks_sax_extend (ikstack *s, void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook, iksDeleteHook *deleteHook) -{ -	iksparser *prs; - -	prs = iks_stack_alloc (s, sizeof (iksparser)); -	if (NULL == prs) return NULL; -	memset (prs, 0, sizeof (iksparser)); -	prs->s = s; -	prs->user_data = user_data; -	prs->tagHook = tagHook; -	prs->cdataHook = cdataHook; -	prs->deleteHook = deleteHook; -	return prs; -} - -ikstack * -iks_parser_stack (iksparser *prs) -{ -	return prs->s; -} - -void * -iks_user_data (iksparser *prs) -{ -	return prs->user_data; -} - -unsigned long -iks_nr_bytes (iksparser *prs) -{ -	return prs->nr_bytes; -} - -unsigned long -iks_nr_lines (iksparser *prs) -{ -	return prs->nr_lines; -} - -#define IS_WHITESPACE(x) ' ' == (x) || '\t' == (x) || '\r' == (x) || '\n' == (x) -#define NOT_WHITESPACE(x) ' ' != (x) && '\t' != (x) && '\r' != (x) && '\n' != (x) - -static int -stack_init (iksparser *prs) -{ -	prs->stack = iks_malloc (128); -	if (!prs->stack) return 0; -	prs->stack_max = 128; -	prs->stack_pos = 0; -	return 1; -} - -static int -stack_expand (iksparser *prs, int len) -{ -	size_t need; -	off_t diff; -	char *tmp; -	need = len - (prs->stack_max - prs->stack_pos); -	if (need < prs->stack_max) { -		need = prs->stack_max * 2; -	} else { -		need = prs->stack_max + (need * 1.2); -	} -	tmp = iks_malloc (need); -	if (!tmp) return 0; -	diff = tmp - prs->stack; -	memcpy (tmp, prs->stack, prs->stack_max); -	iks_free (prs->stack); -	prs->stack = tmp; -	prs->stack_max = need; -	prs->tag_name += diff; -	if (prs->attflag != 0) { -		int i = 0; -		while (i < (prs->attmax * 2)) { -			if (prs->atts[i]) prs->atts[i] += diff; -			i++; -		} -	} -	return 1; -} - -#define STACK_INIT \ -	if (NULL == prs->stack && 0 == stack_init (prs)) return IKS_NOMEM - -#define STACK_PUSH_START (prs->stack + prs->stack_pos) - -#define STACK_PUSH(buf,len) \ -{ \ -	char *sbuf = (buf); \ -	size_t slen = (len); \ -	if (prs->stack_max - prs->stack_pos <= slen) { \ -		if (0 == stack_expand (prs, slen)) return IKS_NOMEM; \ -	} \ -	memcpy (prs->stack + prs->stack_pos, sbuf, slen); \ -	prs->stack_pos += slen; \ -} - -#define STACK_PUSH_END \ -{ \ -	if (prs->stack_pos >= prs->stack_max) { \ -		if (0 == stack_expand (prs, 1)) return IKS_NOMEM; \ -	} \ -	prs->stack[prs->stack_pos] = '\0'; \ -	prs->stack_pos++; \ -} - -static enum ikserror -sax_core (iksparser *prs, char *buf, int len) -{ -	enum ikserror err; -	int pos = 0, old = 0, re, stack_old = -1; -	unsigned char c; - -	while (pos < len) { -		re = 0; -		c = buf[pos]; -		if (0 == c || 0xFE == c || 0xFF == c) return IKS_BADXML; -		if (prs->uni_max) { -			if ((c & 0xC0) != 0x80) return IKS_BADXML; -			prs->uni_len++; -			if (prs->uni_len == prs->uni_max) prs->uni_max = 0; -			goto cont; -		} else { -			if (c & 0x80) { -				unsigned char mask; -				if ((c & 0x60) == 0x40) { -					prs->uni_max = 2; -					mask = 0x1F; -				} else if ((c & 0x70) == 0x60) { -					prs->uni_max = 3; -					mask = 0x0F; -				} else if ((c & 0x78) == 0x70) { -					prs->uni_max = 4; -					mask = 0x07; -				} else if ((c & 0x7C) == 0x78) { -					prs->uni_max = 5; -					mask = 0x03; -				} else if ((c & 0x7E) == 0x7C) { -					prs->uni_max = 6; -					mask = 0x01; -				} else { -					return IKS_BADXML; -				} -				if ((c & mask) == 0) return IKS_BADXML; -				prs->uni_len = 1; -				if (stack_old == -1) stack_old = pos; -				goto cont; -			} -		} - -		switch (prs->context) { -			case C_CDATA: -				if ('&' == c) { -					if (old < pos && prs->cdataHook) { -						err = prs->cdataHook (prs->user_data, &buf[old], pos - old); -						if (IKS_OK != err) return err; -					} -					prs->context = C_ENTITY; -					prs->entpos = 0; -					break; -				} -				if ('<' == c) { -					if (old < pos && prs->cdataHook) { -						err = prs->cdataHook (prs->user_data, &buf[old], pos - old); -						if (IKS_OK != err) return err; -					} -					STACK_INIT; -					prs->tag_name = STACK_PUSH_START; -					if (!prs->tag_name) return IKS_NOMEM; -					prs->context = C_TAG_START; -				} -				break; - -			case C_TAG_START: -				prs->context = C_TAG; -				if ('/' == c) { -					prs->tagtype = IKS_CLOSE; -					break; -				} -				if ('?' == c) { -					prs->context = C_PI; -					break; -				} -				if ('!' == c) { -					prs->context = C_MARKUP; -					break; -				} -				prs->tagtype = IKS_OPEN; -				stack_old = pos; -				break; - -			case C_TAG: -				if (IS_WHITESPACE(c)) { -					if (IKS_CLOSE == prs->tagtype) -						prs->oldcontext = C_TAG_END; -					else -						prs->oldcontext = C_ATTRIBUTE; -					prs->context = C_WHITESPACE; -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					break; -				} -				if ('/' == c) { -					if (IKS_CLOSE == prs->tagtype) return IKS_BADXML; -					prs->tagtype = IKS_SINGLE; -					prs->context = C_TAG_END; -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					break; -				} -				if ('>' == c) { -					prs->context = C_TAG_END; -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					re = 1; -				} -				if (stack_old == -1) stack_old = pos; -				break; - -			case C_TAG_END: -				if (c != '>') return IKS_BADXML; -				if (prs->tagHook) { -					char **tmp; -					if (prs->attcur == 0) tmp = NULL; else tmp = prs->atts; -					err = prs->tagHook (prs->user_data, prs->tag_name, tmp, prs->tagtype); -					if (IKS_OK != err) return err; -				} -				prs->stack_pos = 0; -				stack_old = -1; -				prs->attcur = 0; -				prs->attflag = 0; -				prs->context = C_CDATA; -				old = pos + 1; -				break; - -			case C_ATTRIBUTE: -				if ('/' == c) { -					prs->tagtype = IKS_SINGLE; -					prs->context = C_TAG_END; -					break; -				} -				if ('>' == c) { -					prs->context = C_TAG_END; -					re = 1; -					break; -				} -				if (!prs->atts) { -					prs->attmax = 12; -					prs->atts = iks_malloc (sizeof(char *) * 2 * 12); -					if (!prs->atts) return IKS_NOMEM; -					memset (prs->atts, 0, sizeof(char *) * 2 * 12); -					prs->attcur = 0; -				} else { -					if (prs->attcur >= (prs->attmax * 2)) { -						void *tmp; -						prs->attmax += 12; -						tmp = iks_malloc (sizeof(char *) * (2 * prs->attmax + 1)); -						if (!tmp) return IKS_NOMEM; -						memset (tmp, 0, sizeof(char *) * (2 * prs->attmax + 1)); -						memcpy (tmp, prs->atts, sizeof(char *) * prs->attcur); -						iks_free (prs->atts); -						prs->atts = tmp; -					} -				} -				prs->attflag = 1; -				prs->atts[prs->attcur] = STACK_PUSH_START; -				stack_old = pos; -				prs->context = C_ATTRIBUTE_1; -				break; - -			case C_ATTRIBUTE_1: -				if ('=' == c) { -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					prs->context = C_VALUE; -					break; -				} -				if (stack_old == -1) stack_old = pos; -				break; - -			case C_ATTRIBUTE_2: -				if ('/' == c) { -					prs->tagtype = IKS_SINGLE; -					prs->atts[prs->attcur] = NULL; -					prs->context = C_TAG_END; -					break; -				} -				if ('>' == c) { -					prs->atts[prs->attcur] = NULL; -					prs->context = C_TAG_END; -					re = 1; -					break; -				} -				prs->context = C_ATTRIBUTE; -				re = 1; -				break; - -			case C_VALUE: -				prs->atts[prs->attcur + 1] = STACK_PUSH_START; -				if ('\'' == c) { -					prs->context = C_VALUE_APOS; -					break; -				} -				if ('"' == c) { -					prs->context = C_VALUE_QUOT; -					break; -				} -				return IKS_BADXML; - -			case C_VALUE_APOS: -				if ('\'' == c) { -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					prs->oldcontext = C_ATTRIBUTE_2; -					prs->context = C_WHITESPACE; -					prs->attcur += 2; -				} -				if (stack_old == -1) stack_old = pos; -				break; - -			case C_VALUE_QUOT: -				if ('"' == c) { -					if (stack_old != -1) STACK_PUSH (buf + stack_old, pos - stack_old); -					stack_old = -1; -					STACK_PUSH_END; -					prs->oldcontext = C_ATTRIBUTE_2; -					prs->context = C_WHITESPACE; -					prs->attcur += 2; -				} -				if (stack_old == -1) stack_old = pos; -				break; - -			case C_WHITESPACE: -				if (NOT_WHITESPACE(c)) { -					prs->context = prs->oldcontext; -					re = 1; -				} -				break; - -			case C_ENTITY: -				if (';' == c) { -					char hede[2]; -					char t = '?'; -					prs->entity[prs->entpos] = '\0'; -					if (strcmp(prs->entity, "amp") == 0) -						t = '&'; -					else if (strcmp(prs->entity, "quot") == 0) -						t = '"'; -					else if (strcmp(prs->entity, "apos") == 0) -						t = '\''; -					else if (strcmp(prs->entity, "lt") == 0) -						t = '<'; -					else if (strcmp(prs->entity, "gt") == 0) -						t = '>'; -					old = pos + 1; -					hede[0] = t; -					if (prs->cdataHook) { -						err = prs->cdataHook (prs->user_data, &hede[0], 1); -						if (IKS_OK != err) return err; -					} -					prs->context = C_CDATA; -				} else { -					prs->entity[prs->entpos++] = buf[pos]; -					if (prs->entpos > 7) return IKS_BADXML; -				} -				break; - -			case C_COMMENT: -				if ('-' != c) return IKS_BADXML; -				prs->context = C_COMMENT_1; -				break; - -			case C_COMMENT_1: -				if ('-' == c) prs->context = C_COMMENT_2; -				break; - -			case C_COMMENT_2: -				if ('-' == c) -					prs->context = C_COMMENT_3; -				else -					prs->context = C_COMMENT_1; -				break; - -			case C_COMMENT_3: -				if ('>' != c) return IKS_BADXML; -				prs->context = C_CDATA; -				old = pos + 1; -				break; - -			case C_MARKUP: -				if ('[' == c) { -					prs->context = C_SECT; -					break; -				} -				if ('-' == c) { -					prs->context = C_COMMENT; -					break; -				} -				prs->context = C_MARKUP_1; - -			case C_MARKUP_1: -				if ('>' == c) { -					old = pos + 1; -					prs->context = C_CDATA; -				} -				break; - -			case C_SECT: -				if ('C' == c) { -					prs->context = C_SECT_CDATA; -					break; -				} -				return IKS_BADXML; - -			case C_SECT_CDATA: -				if ('D' != c) return IKS_BADXML; -				prs->context = C_SECT_CDATA_1; -				break; - -			case C_SECT_CDATA_1: -				if ('A' != c) return IKS_BADXML; -				prs->context = C_SECT_CDATA_2; -				break; - -			case C_SECT_CDATA_2: -				if ('T' != c) return IKS_BADXML; -				prs->context = C_SECT_CDATA_3; -				break; - -			case C_SECT_CDATA_3: -				if ('A' != c) return IKS_BADXML; -				prs->context = C_SECT_CDATA_4; -				break; - -			case C_SECT_CDATA_4: -				if ('[' != c) return IKS_BADXML; -				old = pos + 1; -				prs->context = C_SECT_CDATA_C; -				break; - -			case C_SECT_CDATA_C: -				if (']' == c) { -					prs->context = C_SECT_CDATA_E; -					if (prs->cdataHook && old < pos) { -						err = prs->cdataHook (prs->user_data, &buf[old], pos - old); -						if (IKS_OK != err) return err; -					} -				} -				break; - -			case C_SECT_CDATA_E: -				if (']' == c) { -					prs->context = C_SECT_CDATA_E2; -				} else { -					if (prs->cdataHook) { -						err = prs->cdataHook (prs->user_data, "]", 1); -						if (IKS_OK != err) return err; -					} -					old = pos; -					prs->context = C_SECT_CDATA_C; -				} -				break; - -			case C_SECT_CDATA_E2: -				if ('>' == c) { -					old = pos + 1; -					prs->context = C_CDATA; -				} else { -					if (prs->cdataHook) { -						err = prs->cdataHook (prs->user_data, "]]", 2); -						if (IKS_OK != err) return err; -					} -					old = pos; -					prs->context = C_SECT_CDATA_C; -				} -				break; - -			case C_PI: -				old = pos + 1; -				if ('>' == c) prs->context = C_CDATA; -				break; -		} -cont: -		if (0 == re) { -			pos++; -			prs->nr_bytes++; -			if ('\n' == c) prs->nr_lines++; -		} -	} - -	if (stack_old != -1) -		STACK_PUSH (buf + stack_old, pos - stack_old); - -	err = IKS_OK; -	if (prs->cdataHook && (prs->context == C_CDATA || prs->context == C_SECT_CDATA_C) && old < pos) -		err = prs->cdataHook (prs->user_data, &buf[old], pos - old); -	return err; -} - -int -iks_parse (iksparser *prs, const char *data, size_t len, int finish) -{ -	if (!data) return IKS_OK; -	if (len == 0) len = strlen (data); -	return sax_core (prs, (char *) data, len); -} - -void -iks_parser_reset (iksparser *prs) -{ -	if (prs->deleteHook) prs->deleteHook (prs->user_data); -	prs->stack_pos = 0; -	prs->context = 0; -	prs->oldcontext = 0; -	prs->tagtype = 0; -	prs->attcur = 0; -	prs->attflag = 0; -	prs->valflag = 0; -	prs->entpos = 0; -	prs->nr_bytes = 0; -	prs->nr_lines = 0; -	prs->uni_max = 0; -	prs->uni_len = 0; -} - -void -iks_parser_delete (iksparser *prs) -{ -	if (prs->deleteHook) prs->deleteHook (prs->user_data); -	if (prs->stack) iks_free (prs->stack); -	if (prs->atts) iks_free (prs->atts); -	if (prs->s) iks_stack_delete (prs->s); else iks_free (prs); -} -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2004 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#include "common.h" -#include "iksemel.h" - -#define IKS_COMMON \ -	struct iks_struct *next, *prev; \ -	struct iks_struct *parent; \ -	enum ikstype type; \ -	ikstack *s - -struct iks_struct { -	IKS_COMMON; -}; - -struct iks_tag { -	IKS_COMMON; -	struct iks_struct *children, *last_child; -	struct iks_struct *attribs, *last_attrib; -	char *name; -}; - -#define IKS_TAG_NAME(x) ((struct iks_tag *) (x) )->name -#define IKS_TAG_CHILDREN(x) ((struct iks_tag *) (x) )->children -#define IKS_TAG_LAST_CHILD(x) ((struct iks_tag *) (x) )->last_child -#define IKS_TAG_ATTRIBS(x) ((struct iks_tag *) (x) )->attribs -#define IKS_TAG_LAST_ATTRIB(x) ((struct iks_tag *) (x) )->last_attrib - -struct iks_cdata { -	IKS_COMMON; -	char *cdata; -	size_t len; -}; - -#define IKS_CDATA_CDATA(x) ((struct iks_cdata *) (x) )->cdata -#define IKS_CDATA_LEN(x) ((struct iks_cdata *) (x) )->len - -struct iks_attrib { -	IKS_COMMON; -	char *name; -	char *value; -}; - -#define IKS_ATTRIB_NAME(x) ((struct iks_attrib *) (x) )->name -#define IKS_ATTRIB_VALUE(x) ((struct iks_attrib *) (x) )->value - -/*****  Node Creating & Deleting  *****/ - -iks * -iks_new (const char *name) -{ -	ikstack *s; -	iks *x; - -	s = iks_stack_new (sizeof (struct iks_tag) * 6, 256); -	if (!s) return NULL; -	x = iks_new_within (name, s); -	if (!x) { -		iks_stack_delete (s); -		return NULL; -	} -	return x; -} - -iks * -iks_new_within (const char *name, ikstack *s) -{ -	iks *x; -	size_t len; - -	if (name) len = sizeof (struct iks_tag); else len = sizeof (struct iks_cdata); -	x = iks_stack_alloc (s, len); -	if (!x) return NULL; -	memset (x, 0, len); -	x->s = s; -	x->type = IKS_TAG; -	if (name) { -		IKS_TAG_NAME (x) = iks_stack_strdup (s, name, 0); -		if (!IKS_TAG_NAME (x)) return NULL; -	} -	return x; -} - -iks * -iks_insert (iks *x, const char *name) -{ -	iks *y; - -	if (!x) return NULL; - -	y = iks_new_within (name, x->s); -	if (!y) return NULL; -	y->parent = x; -	if (!IKS_TAG_CHILDREN (x)) IKS_TAG_CHILDREN (x) = y; -	if (IKS_TAG_LAST_CHILD (x)) { -		IKS_TAG_LAST_CHILD (x)->next = y; -		y->prev = IKS_TAG_LAST_CHILD (x); -	} -	IKS_TAG_LAST_CHILD (x) = y; -	return y; -} - -iks * -iks_insert_cdata (iks *x, const char *data, size_t len) -{ -	iks *y; - -	if(!x || !data) return NULL; -	if(len == 0) len = strlen (data); - -	y = IKS_TAG_LAST_CHILD (x); -	if (y && y->type == IKS_CDATA) { -		IKS_CDATA_CDATA (y) = iks_stack_strcat (x->s, IKS_CDATA_CDATA (y), IKS_CDATA_LEN (y), data, len); -		IKS_CDATA_LEN (y) += len; -	} else { -		y = iks_insert (x, NULL); -		if (!y) return NULL; -		y->type = IKS_CDATA; -		IKS_CDATA_CDATA (y) = iks_stack_strdup (x->s, data, len); -		if (!IKS_CDATA_CDATA (y)) return NULL; -		IKS_CDATA_LEN (y) = len; -	} -	return y; -} - -iks * -iks_insert_attrib (iks *x, const char *name, const char *value) -{ -	iks *y; -	size_t len; - -	if (!x) return NULL; - -	y = IKS_TAG_ATTRIBS (x); -	while (y) { -		if (strcmp (name, IKS_ATTRIB_NAME (y)) == 0) break; -		y = y->next; -	} -	if (NULL == y) { -		if (!value) return NULL; -		y = iks_stack_alloc (x->s, sizeof (struct iks_attrib)); -		if (!y) return NULL; -		memset (y, 0, sizeof (struct iks_attrib)); -		y->type = IKS_ATTRIBUTE; -		IKS_ATTRIB_NAME (y) = iks_stack_strdup (x->s, name, 0); -		y->parent = x; -		if (!IKS_TAG_ATTRIBS (x)) IKS_TAG_ATTRIBS (x) = y; -		if (IKS_TAG_LAST_ATTRIB (x)) { -			IKS_TAG_LAST_ATTRIB (x)->next = y; -			y->prev = IKS_TAG_LAST_ATTRIB (x); -		} -		IKS_TAG_LAST_ATTRIB (x) = y; -	} - -	if (value) { -		len = strlen (value); -		IKS_ATTRIB_VALUE (y) = iks_stack_strdup (x->s, value, len); -		if (!IKS_ATTRIB_VALUE (y)) return NULL; -	} else { -		if (y->next) y->next->prev = y->prev; -		if (y->prev) y->prev->next = y->next; -		if (IKS_TAG_ATTRIBS (x) == y) IKS_TAG_ATTRIBS (x) = y->next; -		if (IKS_TAG_LAST_ATTRIB (x) == y) IKS_TAG_LAST_ATTRIB (x) = y->prev; -	} - -	return y; -} - -iks * -iks_insert_node (iks *x, iks *y) -{ -	y->parent = x; -	if (!IKS_TAG_CHILDREN (x)) IKS_TAG_CHILDREN (x) = y; -	if (IKS_TAG_LAST_CHILD (x)) { -		IKS_TAG_LAST_CHILD (x)->next = y; -		y->prev = IKS_TAG_LAST_CHILD (x); -	} -	IKS_TAG_LAST_CHILD (x) = y; -	return y; -} - -void -iks_hide (iks *x) -{ -	iks *y; - -	if (!x) return; - -	if (x->prev) x->prev->next = x->next; -	if (x->next) x->next->prev = x->prev; -	y = x->parent; -	if (y) { -		if (IKS_TAG_CHILDREN (y) == x) IKS_TAG_CHILDREN (y) = x->next; -		if (IKS_TAG_LAST_CHILD (y) == x) IKS_TAG_LAST_CHILD (y) = x->prev; -	} -} - -void -iks_delete (iks *x) -{ -	if (x) iks_stack_delete (x->s); -} - -/*****  Node Traversing  *****/ - -iks * -iks_next (iks *x) -{ -	if (x) return x->next; -	return NULL; -} - -iks * -iks_next_tag (iks *x) -{ -	if (x) { -		while (1) { -			x = x->next; -			if (NULL == x) break; -			if (IKS_TAG == x->type) return x; -		} -	} -	return NULL; -} - -iks * -iks_prev (iks *x) -{ -	if (x) return x->prev; -	return NULL; -} - -iks * -iks_prev_tag (iks *x) -{ -	if (x) { -		while (1) { -			x = x->prev; -			if (NULL == x) break; -			if (IKS_TAG == x->type) return x; -		} -	} -	return NULL; -} - -iks * -iks_parent (iks *x) -{ -	if (x) return x->parent; -	return NULL; -} - -iks * -iks_root (iks *x) -{ -	if (x) { -		while (x->parent) -			x = x->parent; -	} -	return x; -} - -iks * -iks_child (iks *x) -{ -	if (x) return IKS_TAG_CHILDREN (x); -	return NULL; -} - -iks * -iks_first_tag (iks *x) -{ -	if (x) { -		x = IKS_TAG_CHILDREN (x); -		while (x) { -			if (IKS_TAG == x->type) return x; -			x = x->next; -		} -	} -	return NULL; -} - -iks * -iks_attrib (iks *x) -{ -	if (x) return IKS_TAG_ATTRIBS (x); -	return NULL; -} - -iks * -iks_find (iks *x, const char *name) -{ -	iks *y; - -	if (!x) return NULL; -	y = IKS_TAG_CHILDREN (x); -	while (y) { -		if (IKS_TAG == y->type && IKS_TAG_NAME (y) && strcmp (IKS_TAG_NAME (y), name) == 0) return y; -		y = y->next; -	} -	return NULL; -} - -char * -iks_find_cdata (iks *x, const char *name) -{ -	iks *y; - -	y = iks_find (x, name); -	if (!y) return NULL; -	y = IKS_TAG_CHILDREN (y); -	if (!y || IKS_CDATA != y->type) return NULL; -	return IKS_CDATA_CDATA (y); -} - -char * -iks_find_attrib (iks *x, const char *name) -{ -	iks *y; - -	if (!x) return NULL; - -	y = IKS_TAG_ATTRIBS (x); -	while (y) { -		if (IKS_ATTRIB_NAME (y) && strcmp (IKS_ATTRIB_NAME (y), name) == 0) -			return IKS_ATTRIB_VALUE (y); -		y = y->next; -	} -	return NULL; -} - -iks * -iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value) -{ -	iks *y; - -	if (NULL == x) return NULL; - -	if (tagname) { -		for (y = IKS_TAG_CHILDREN (x); y; y = y->next) { -			if (IKS_TAG == y->type -				&& strcmp (IKS_TAG_NAME (y), tagname) == 0 -				&& iks_strcmp (iks_find_attrib (y, attrname), value) == 0) { -					return y; -			} -		} -	} else { -		for (y = IKS_TAG_CHILDREN (x); y; y = y->next) { -			if (IKS_TAG == y->type -				&& iks_strcmp (iks_find_attrib (y, attrname), value) == 0) { -					return y; -			} -		} -	} -	return NULL; -} - -/*****  Node Information  *****/ - -ikstack * -iks_stack (iks *x) -{ -	if (x) return x->s; -	return NULL; -} - -enum ikstype -iks_type (iks *x) -{ -	if (x) return x->type; -	return IKS_NONE; -} - -char * -iks_name (iks *x) -{ -	if (x) { -		if (IKS_TAG == x->type) -			return IKS_TAG_NAME (x); -		else -			return IKS_ATTRIB_NAME (x); -	} -	return NULL; -} - -char * -iks_cdata (iks *x) -{ -	if (x) { -		if (IKS_CDATA == x->type) -			return IKS_CDATA_CDATA (x); -		else -			return IKS_ATTRIB_VALUE (x); -	} -	return NULL; -} - -size_t -iks_cdata_size (iks *x) -{ -	if (x) return IKS_CDATA_LEN (x); -	return 0; -} - -int -iks_has_children (iks *x) -{ -	if (x && IKS_TAG == x->type && IKS_TAG_CHILDREN (x)) return 1; -	return 0; -} - -int -iks_has_attribs (iks *x) -{ -	if (x && IKS_TAG == x->type && IKS_TAG_ATTRIBS (x)) return 1; -	return 0; -} - -/*****  Serializing  *****/ - -static size_t -escape_size (char *src, size_t len) -{ -	size_t sz; -	char c; -	int i; - -	sz = 0; -	for (i = 0; i < len; i++) { -		c = src[i]; -		switch (c) { -			case '&': sz += 5; break; -			case '\'': sz += 6; break; -			case '"': sz += 6; break; -			case '<': sz += 4; break; -			case '>': sz += 4; break; -			default: sz++; break; -		} -	} -	return sz; -} - -static char * -my_strcat (char *dest, char *src, size_t len) -{ -	if (0 == len) len = strlen (src); -	memcpy (dest, src, len); -	return dest + len; -} - -static char * -escape (char *dest, char *src, size_t len) -{ -	char c; -	int i; -	int j = 0; - -	for (i = 0; i < len; i++) { -		c = src[i]; -		if ('&' == c || '<' == c || '>' == c || '\'' == c || '"' == c) { -			if (i - j > 0) dest = my_strcat (dest, src + j, i - j); -			j = i + 1; -			switch (c) { -			case '&': dest = my_strcat (dest, "&", 5); break; -			case '\'': dest = my_strcat (dest, "'", 6); break; -			case '"': dest = my_strcat (dest, """, 6); break; -			case '<': dest = my_strcat (dest, "<", 4); break; -			case '>': dest = my_strcat (dest, ">", 4); break; -			} -		} -	} -	if (i - j > 0) dest = my_strcat (dest, src + j, i - j); -	return dest; -} - -char * -iks_string (ikstack *s, iks *x) -{ -	size_t size; -	int level, dir; -	iks *y, *z; -	char *ret, *t; - -	if (!x) return NULL; - -	if (x->type == IKS_CDATA) { -		if (s) { -			return iks_stack_strdup (s, IKS_CDATA_CDATA (x), IKS_CDATA_LEN (x)); -		} else { -			ret = iks_malloc (IKS_CDATA_LEN (x)); -			memcpy (ret, IKS_CDATA_CDATA (x), IKS_CDATA_LEN (x)); -			return ret; -		} -	} - -	size = 0; -	level = 0; -	dir = 0; -	y = x; -	while (1) { -		if (dir==0) { -			if (y->type == IKS_TAG) { -				size++; -				size += strlen (IKS_TAG_NAME (y)); -				for (z = IKS_TAG_ATTRIBS (y); z; z = z->next) { -					size += 4 + strlen (IKS_ATTRIB_NAME (z)) -						+ escape_size (IKS_ATTRIB_VALUE (z), strlen (IKS_ATTRIB_VALUE (z))); -				} -				if (IKS_TAG_CHILDREN (y)) { -					size++; -					y = IKS_TAG_CHILDREN (y); -					level++; -					continue; -				} else { -					size += 2; -				} -			} else { -				size += escape_size (IKS_CDATA_CDATA (y), IKS_CDATA_LEN (y)); -			} -		} -		z = y->next; -		if (z) { -			if (0 == level) { -				if (IKS_TAG_CHILDREN (y)) size += 3 + strlen (IKS_TAG_NAME (y)); -				break; -			} -			y = z; -			dir = 0; -		} else { -			y = y->parent; -			level--; -			if (level >= 0) size += 3 + strlen (IKS_TAG_NAME (y)); -			if (level < 1) break; -			dir = 1; -		} -	} - -	if (s) ret = iks_stack_alloc (s, size + 1); -	else ret = iks_malloc (size + 1); - -	if (!ret) return NULL; - -	t = ret; -	level = 0; -	dir = 0; -	while (1) { -		if (dir==0) { -			if (x->type == IKS_TAG) { -				*t++ = '<'; -				t = my_strcat (t, IKS_TAG_NAME (x), 0); -				y = IKS_TAG_ATTRIBS (x); -				while (y) { -					*t++ = ' '; -					t = my_strcat (t, IKS_ATTRIB_NAME (y), 0); -					*t++ = '='; -					*t++ = '\''; -					t = escape (t, IKS_ATTRIB_VALUE (y), strlen (IKS_ATTRIB_VALUE (y))); -					*t++ = '\''; -					y = y->next; -				} -				if (IKS_TAG_CHILDREN (x)) { -					*t++ = '>'; -					x = IKS_TAG_CHILDREN (x); -					level++; -					continue; -				} else { -					*t++ = '/'; -					*t++ = '>'; -				} -			} else { -				t = escape (t, IKS_CDATA_CDATA (x), IKS_CDATA_LEN (x)); -			} -		} -		y = x->next; -		if (y) { -			if (0 == level) { -				if (IKS_TAG_CHILDREN (x)) { -					*t++ = '<'; -					*t++ = '/'; -					t = my_strcat (t, IKS_TAG_NAME (x), 0); -					*t++ = '>'; -				} -				break; -			} -			x = y; -			dir = 0; -		} else { -			x = x->parent; -			level--; -			if (level >= 0) { -					*t++ = '<'; -					*t++ = '/'; -					t = my_strcat (t, IKS_TAG_NAME (x), 0); -					*t++ = '>'; -				} -			if (level < 1) break; -			dir = 1; -		} -	} -	*t = '\0'; - -	return ret; -} - -/*****  Copying  *****/ - -iks * -iks_copy_within (iks *x, ikstack *s) -{ -	int level=0, dir=0; -	iks *copy = NULL; -	iks *cur = NULL; -	iks *y; - -	while (1) { -		if (dir == 0) { -			if (x->type == IKS_TAG) { -				if (copy == NULL) { -					copy = iks_new_within (IKS_TAG_NAME (x), s); -					cur = copy; -				} else { -					cur = iks_insert (cur, IKS_TAG_NAME (x)); -				} -				for (y = IKS_TAG_ATTRIBS (x); y; y = y->next) { -					iks_insert_attrib (cur, IKS_ATTRIB_NAME (y), IKS_ATTRIB_VALUE (y)); -				} -				if (IKS_TAG_CHILDREN (x)) { -					x = IKS_TAG_CHILDREN (x); -					level++; -					continue; -				} else { -					cur = cur->parent; -				} -			} else { -				iks_insert_cdata (cur, IKS_CDATA_CDATA (x), IKS_CDATA_LEN (x)); -			} -		} -		y = x->next; -		if (y) { -			if (0 == level) break; -			x = y; -			dir = 0; -		} else { -			if (level < 2) break; -			level--; -			x = x->parent; -			cur = cur->parent; -			dir = 1; -		} -	} -	return copy; -} - -iks * -iks_copy (iks *x) -{ -	return iks_copy_within (x, iks_stack_new (sizeof (struct iks_tag) * 6, 256)); -} -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2003 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#include "common.h" -#include "iksemel.h" - -struct dom_data { -	iks **iksptr; -	iks *current; -	size_t chunk_size; -}; - -static int -tagHook (struct dom_data *data, char *name, char **atts, int type) -{ -	iks *x; - -	if (IKS_OPEN == type || IKS_SINGLE == type) { -		if (data->current) { -			x = iks_insert (data->current, name); -		} else { -			ikstack *s; -			s = iks_stack_new (data->chunk_size, data->chunk_size); -			x = iks_new_within (name, s); -		} -		if (atts) { -			int i=0; -			while (atts[i]) { -				iks_insert_attrib (x, atts[i], atts[i+1]); -				i += 2; -			} -		} -		data->current = x; -	} -	if (IKS_CLOSE == type || IKS_SINGLE == type) { -		x = iks_parent (data->current); -		if (x) -			data->current = x; -		else { -			*(data->iksptr) = data->current; -			data->current = NULL; -		} -	} -	return IKS_OK; -} - -static int -cdataHook (struct dom_data *data, char *cdata, size_t len) -{ -	if (data->current) iks_insert_cdata (data->current, cdata, len); -	return IKS_OK; -} - -static void -deleteHook (struct dom_data *data) -{ -	if (data->current) iks_delete (data->current); -	data->current = NULL; -} - -iksparser * -iks_dom_new (iks **iksptr) -{ -	ikstack *s; -	struct dom_data *data; - -	*iksptr = NULL; -	s = iks_stack_new (DEFAULT_DOM_CHUNK_SIZE, 0); -	if (!s) return NULL; -	data = iks_stack_alloc (s, sizeof (struct dom_data)); -	data->iksptr = iksptr; -	data->current = NULL; -	data->chunk_size = DEFAULT_DOM_IKS_CHUNK_SIZE; -	return iks_sax_extend (s, data, (iksTagHook *) tagHook, (iksCDataHook *) cdataHook, (iksDeleteHook *) deleteHook); -} - -void -iks_set_size_hint (iksparser *prs, size_t approx_size) -{ -	size_t cs; -	struct dom_data *data = iks_user_data (prs); - -	cs = approx_size / 10; -	if (cs < DEFAULT_DOM_IKS_CHUNK_SIZE) cs = DEFAULT_DOM_IKS_CHUNK_SIZE; -	data->chunk_size = cs; -} - -iks * -iks_tree (const char *xml_str, size_t len, int *err) -{ -	iksparser *prs; -	iks *x; -	int e; - -	if (0 == len) len = strlen (xml_str); -	prs = iks_dom_new (&x); -	if (!prs) { -		if (err) *err = IKS_NOMEM; -		return NULL; -	} -	e = iks_parse (prs, xml_str, len, 1); -	if (err) *err = e; -	iks_parser_delete (prs); -	return x; -} - -int -iks_load (const char *fname, iks **xptr) -{ -	iksparser *prs; -	char *buf; -	FILE *f; -	int len, done = 0; -	int ret; - -	*xptr = NULL; - -	buf = iks_malloc (FILE_IO_BUF_SIZE); -	if (!buf) return IKS_NOMEM; -	ret = IKS_NOMEM; -	prs = iks_dom_new (xptr); -	if (prs) { -		f = fopen (fname, "r"); -		if (f) { -			while (0 == done) { -				len = fread (buf, 1, FILE_IO_BUF_SIZE, f); -				if (len < FILE_IO_BUF_SIZE) { -					if (0 == feof (f)) { -						ret = IKS_FILE_RWERR; -						len = 0; -					} -					done = 1; -				} -				if (len > 0) { -					int e; -					e = iks_parse (prs, buf, len, done); -					if (IKS_OK != e) { -						ret = e; -						break; -					} -					if (done) ret = IKS_OK; -				} -			} -			fclose (f); -		} else { -			if (ENOENT == errno) ret = IKS_FILE_NOFILE; -			else ret = IKS_FILE_NOACCESS; -		} -		iks_parser_delete (prs); -	} -	iks_free (buf); -	return ret; -} - -int -iks_save (const char *fname, iks *x) -{ -	FILE *f; -	char *data; -	int ret; - -	ret = IKS_NOMEM; -	data = iks_string (NULL, x); -	if (data) { -		ret = IKS_FILE_NOACCESS; -		f = fopen (fname, "w"); -		if (f) { -			ret = IKS_FILE_RWERR; -			if (fputs (data, f) >= 0) ret = IKS_OK; -			fclose (f); -		} -		iks_free (data); -	} -	return ret; -} diff --git a/backend/impress/iksemel.h b/backend/impress/iksemel.h deleted file mode 100644 index 66c87d61..00000000 --- a/backend/impress/iksemel.h +++ /dev/null @@ -1,402 +0,0 @@ -/* iksemel (XML parser for Jabber) -** Copyright (C) 2000-2004 Gurer Ozen <[email protected]> -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU Lesser General Public License. -*/ - -#ifndef IKSEMEL_H -#define IKSEMEL_H 1 - -#ifdef __cplusplus -#include <cstddef>	/* size_t for C++ */ -extern "C" { -#else -#include <stddef.h>	/* size_t for C */ -#endif - -/*****  object stack  *****/ - -struct ikstack_struct; -typedef struct ikstack_struct ikstack; - -ikstack *iks_stack_new (size_t meta_chunk, size_t data_chunk); -void *iks_stack_alloc (ikstack *s, size_t size); -char *iks_stack_strdup (ikstack *s, const char *src, size_t len); -char *iks_stack_strcat (ikstack *s, char *old, size_t old_len, const char *src, size_t src_len); -void iks_stack_stat (ikstack *s, size_t *allocated, size_t *used); -void iks_stack_delete (ikstack *s); - -/*****  utilities  *****/ - -void *iks_malloc (size_t size); -void iks_free (void *ptr); -void iks_set_mem_funcs (void *(*malloc_func)(size_t size), void (*free_func)(void *ptr)); - -char *iks_strdup (const char *src); -char *iks_strcat (char *dest, const char *src); -int iks_strcmp (const char *a, const char *b); -int iks_strcasecmp (const char *a, const char *b); -int iks_strncmp (const char *a, const char *b, size_t n); -int iks_strncasecmp (const char *a, const char *b, size_t n); -size_t iks_strlen (const char *src); -char *iks_escape (ikstack *s, char *src, size_t len); -char *iks_unescape (ikstack *s, char *src, size_t len); - -/*****  dom tree  *****/ - -enum ikstype { -	IKS_NONE = 0, -	IKS_TAG, -	IKS_ATTRIBUTE, -	IKS_CDATA -}; - -struct iks_struct; -typedef struct iks_struct iks; - -iks *iks_new (const char *name); -iks *iks_new_within (const char *name, ikstack *s); -iks *iks_insert (iks *x, const char *name); -iks *iks_insert_cdata (iks *x, const char *data, size_t len); -iks *iks_insert_attrib (iks *x, const char *name, const char *value); -iks *iks_insert_node (iks *x, iks *y); -void iks_hide (iks *x); -void iks_delete (iks *x); -iks *iks_next (iks *x); -iks *iks_next_tag (iks *x); -iks *iks_prev (iks *x); -iks *iks_prev_tag (iks *x); -iks *iks_parent (iks *x); -iks *iks_root (iks *x); -iks *iks_child (iks *x); -iks *iks_first_tag (iks *x); -iks *iks_attrib (iks *x); -iks *iks_find (iks *x, const char *name); -char *iks_find_cdata (iks *x, const char *name); -char *iks_find_attrib (iks *x, const char *name); -iks *iks_find_with_attrib (iks *x, const char *tagname, const char *attrname, const char *value); -ikstack *iks_stack (iks *x); -enum ikstype iks_type (iks *x); -char *iks_name (iks *x); -char *iks_cdata (iks *x); -size_t iks_cdata_size (iks *x); -int iks_has_children (iks *x); -int iks_has_attribs (iks *x); -char *iks_string (ikstack *s, iks *x); -iks *iks_copy (iks *x); -iks *iks_copy_within (iks *x, ikstack *s); - -/*****  sax parser  *****/ - -enum ikserror { -	IKS_OK = 0, -	IKS_NOMEM, -	IKS_BADXML, -	IKS_HOOK -}; - -enum ikstagtype { -	IKS_OPEN, -	IKS_CLOSE, -	IKS_SINGLE -}; - -typedef int (iksTagHook)(void *user_data, char *name, char **atts, int type); -typedef int (iksCDataHook)(void *user_data, char *data, size_t len); -typedef void (iksDeleteHook)(void *user_data); - -struct iksparser_struct; -typedef struct iksparser_struct  iksparser; - -iksparser *iks_sax_new (void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook); -iksparser *iks_sax_extend (ikstack *s, void *user_data, iksTagHook *tagHook, iksCDataHook *cdataHook, iksDeleteHook *deleteHook); -ikstack *iks_parser_stack (iksparser *prs); -void *iks_user_data (iksparser *prs); -unsigned long iks_nr_bytes (iksparser *prs); -unsigned long iks_nr_lines (iksparser *prs); -int iks_parse (iksparser *prs, const char *data, size_t len, int finish); -void iks_parser_reset (iksparser *prs); -void iks_parser_delete (iksparser *prs); - -/*****  dom parser  *****/ - -enum iksfileerror { -	IKS_FILE_NOFILE = 4, -	IKS_FILE_NOACCESS, -	IKS_FILE_RWERR -}; - -iksparser *iks_dom_new (iks **iksptr); -void iks_set_size_hint (iksparser *prs, size_t approx_size); -iks *iks_tree (const char *xml_str, size_t len, int *err); -int iks_load (const char *fname, iks **xptr); -int iks_save (const char *fname, iks *x); - -/*****  transport layer  *****/ - -typedef void (iksTClose)(void *socket); -typedef int (iksTConnect)(iksparser *prs, void **socketptr, const char *server, int port); -typedef int (iksTSend)(void *socket, const char *data, size_t len); -typedef int (iksTRecv)(void *socket, char *buffer, size_t buf_len, int timeout); -typedef int (iksTConnectFD)(iksparser *prs, void **socketptr, void *fd); -typedef void *(iksTGetFD)(void *socket); - -enum iksasyncevents { -	IKS_ASYNC_RESOLVED, -	IKS_ASYNC_CONNECTED, -	IKS_ASYNC_WRITE, -	IKS_ASYNC_WRITTEN, -	IKS_ASYNC_READ, -	IKS_ASYNC_CLOSED, -	IKS_ASYNC_ERROR -}; - -typedef int (iksAsyncNotify)(void *user_data, int event, void *event_data); -typedef int (iksTConnectAsync)(iksparser *prs, void **socketptr, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func); - -typedef struct ikstransport_struct { -	/* basic api, connect can be NULL if one of the other connect funcs are used */ -	iksTConnect *connect; -	iksTSend *send; -	iksTRecv *recv; -	iksTClose *close; -	/* optional fd api */ -	iksTConnectFD *connect_fd; -	iksTGetFD *get_fd; -	/* optional async api */ -	iksTConnectAsync *connect_async; -} ikstransport; - -extern ikstransport iks_default_transport; - -/*****  stream parser  *****/ - -enum iksneterror { -	IKS_NET_NODNS = 4, -	IKS_NET_NOSOCK, -	IKS_NET_NOCONN, -	IKS_NET_RWERR, -	IKS_NET_NOTSUPP, -	IKS_NET_TLSFAIL -}; - -enum iksnodetype { -	IKS_NODE_START, -	IKS_NODE_NORMAL, -	IKS_NODE_ERROR, -	IKS_NODE_STOP -}; - -enum ikssasltype { -	IKS_SASL_PLAIN, -	IKS_SASL_DIGEST_MD5 -}; - -#define IKS_JABBER_PORT 5222 - -typedef int (iksStreamHook)(void *user_data, int type, iks *node); -typedef void (iksLogHook)(void *user_data, const char *data, size_t size, int is_incoming); - -iksparser *iks_stream_new (char *name_space, void *user_data, iksStreamHook *streamHook); -void *iks_stream_user_data (iksparser *prs); -void iks_set_log_hook (iksparser *prs, iksLogHook *logHook); -int iks_connect_tcp (iksparser *prs, const char *server, int port); -int iks_connect_fd (iksparser *prs, int fd); -int iks_connect_via (iksparser *prs, const char *server, int port, const char *server_name); -int iks_connect_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans); -int iks_connect_async (iksparser *prs, const char *server, int port, void *notify_data, iksAsyncNotify *notify_func); -int iks_connect_async_with (iksparser *prs, const char *server, int port, const char *server_name, ikstransport *trans, void *notify_data, iksAsyncNotify *notify_func); -int iks_fd (iksparser *prs); -int iks_recv (iksparser *prs, int timeout); -int iks_send_header (iksparser *prs, const char *to); -int iks_send (iksparser *prs, iks *x); -int iks_send_raw (iksparser *prs, const char *xmlstr); -void iks_disconnect (iksparser *prs); -int iks_has_tls (void); -int iks_is_secure (iksparser *prs); -int iks_start_tls (iksparser *prs); -int iks_start_sasl (iksparser *prs, enum ikssasltype type, char *username, char *pass); - -/*****  jabber  *****/ - -#define IKS_NS_CLIENT     "jabber:client" -#define IKS_NS_SERVER     "jabber:server" -#define IKS_NS_AUTH       "jabber:iq:auth" -#define IKS_NS_AUTH_0K    "jabber:iq:auth:0k" -#define IKS_NS_REGISTER   "jabber:iq:register" -#define IKS_NS_ROSTER     "jabber:iq:roster" -#define IKS_NS_XROSTER	"jabber:x:roster" -#define IKS_NS_OFFLINE    "jabber:x:offline" -#define IKS_NS_AGENT      "jabber:iq:agent" -#define IKS_NS_AGENTS     "jabber:iq:agents" -#define IKS_NS_BROWSE     "jabber:iq:browse" -#define IKS_NS_CONFERENCE "jabber:iq:conference" -#define IKS_NS_DELAY      "jabber:x:delay" -#define IKS_NS_VERSION    "jabber:iq:version" -#define IKS_NS_TIME       "jabber:iq:time" -#define IKS_NS_VCARD      "vcard-temp" -#define IKS_NS_PRIVATE    "jabber:iq:private" -#define IKS_NS_SEARCH     "jabber:iq:search" -#define IKS_NS_OOB        "jabber:iq:oob" -#define IKS_NS_XOOB       "jabber:x:oob" -#define IKS_NS_ADMIN      "jabber:iq:admin" -#define IKS_NS_FILTER     "jabber:iq:filter" -#define IKS_NS_GATEWAY    "jabber:iq:gateway" -#define IKS_NS_LAST       "jabber:iq:last" -#define IKS_NS_SIGNED     "jabber:x:signed" -#define IKS_NS_ENCRYPTED  "jabber:x:encrypted" -#define IKS_NS_ENVELOPE   "jabber:x:envelope" -#define IKS_NS_EVENT      "jabber:x:event" -#define IKS_NS_EXPIRE     "jabber:x:expire" -#define IKS_NS_XHTML      "http://www.w3.org/1999/xhtml" -#define IKS_NS_XMPP_SASL  "urn:ietf:params:xml:ns:xmpp-sasl" -#define IKS_NS_XMPP_BIND  "urn:ietf:params:xml:ns:xmpp-bind" -#define IKS_NS_XMPP_SESSION  "urn:ietf:params:xml:ns:xmpp-session" - -#define IKS_ID_USER 1 -#define IKS_ID_SERVER 2 -#define IKS_ID_RESOURCE 4 -#define IKS_ID_PARTIAL IKS_ID_USER | IKS_ID_SERVER -#define IKS_ID_FULL IKS_ID_USER | IKS_ID_SERVER | IKS_ID_RESOURCE - -#define IKS_STREAM_STARTTLS                   1 -#define IKS_STREAM_SESSION                    2 -#define IKS_STREAM_BIND                       4 -#define IKS_STREAM_SASL_PLAIN                 8 -#define IKS_STREAM_SASL_MD5                  16 - -typedef struct iksid_struct { -	char *user; -	char *server; -	char *resource; -	char *partial; -	char *full; -} iksid; - -iksid *iks_id_new (ikstack *s, const char *jid); -int iks_id_cmp (iksid *a, iksid *b, int parts); - -enum ikspaktype { -	IKS_PAK_NONE = 0, -	IKS_PAK_MESSAGE, -	IKS_PAK_PRESENCE, -	IKS_PAK_IQ, -	IKS_PAK_S10N -}; - -enum iksubtype { -	IKS_TYPE_NONE = 0, -	IKS_TYPE_ERROR, - -	IKS_TYPE_CHAT, -	IKS_TYPE_GROUPCHAT, -	IKS_TYPE_HEADLINE, - -	IKS_TYPE_GET, -	IKS_TYPE_SET, -	IKS_TYPE_RESULT, - -	IKS_TYPE_SUBSCRIBE, -	IKS_TYPE_SUBSCRIBED, -	IKS_TYPE_UNSUBSCRIBE, -	IKS_TYPE_UNSUBSCRIBED, -	IKS_TYPE_PROBE, -	IKS_TYPE_AVAILABLE, -	IKS_TYPE_UNAVAILABLE -}; - -enum ikshowtype { -	IKS_SHOW_UNAVAILABLE = 0, -	IKS_SHOW_AVAILABLE, -	IKS_SHOW_CHAT, -	IKS_SHOW_AWAY, -	IKS_SHOW_XA, -	IKS_SHOW_DND -}; - -typedef struct ikspak_struct { -	iks *x; -	iksid *from; -	iks *query; -	char *ns; -	char *id; -	enum ikspaktype type; -	enum iksubtype subtype; -	enum ikshowtype show; -} ikspak; - -ikspak *iks_packet (iks *x); - -iks *iks_make_auth (iksid *id, const char *pass, const char *sid); -iks *iks_make_msg (enum iksubtype type, const char *to, const char *body); -iks *iks_make_s10n (enum iksubtype type, const char *to, const char *msg); -iks *iks_make_pres (enum ikshowtype show, const char *status); -iks *iks_make_iq (enum iksubtype type, const char *xmlns); -iks *iks_make_resource_bind(iksid *id); -iks *iks_make_session(void); -int iks_stream_features(iks *x); - -/*****  jabber packet filter  *****/ - -#define IKS_RULE_DONE 0 -#define IKS_RULE_ID 1 -#define IKS_RULE_TYPE 2 -#define IKS_RULE_SUBTYPE 4 -#define IKS_RULE_FROM 8 -#define IKS_RULE_FROM_PARTIAL 16 -#define IKS_RULE_NS 32 - -enum iksfilterret { -	IKS_FILTER_PASS, -	IKS_FILTER_EAT -}; - -typedef int (iksFilterHook)(void *user_data, ikspak *pak); - -struct iksfilter_struct; -typedef struct iksfilter_struct iksfilter; -struct iksrule_struct; -typedef struct iksrule_struct iksrule; - -iksfilter *iks_filter_new (void); -iksrule *iks_filter_add_rule (iksfilter *f, iksFilterHook *filterHook, void *user_data, ...); -void iks_filter_remove_rule (iksfilter *f, iksrule *rule); -void iks_filter_remove_hook (iksfilter *f, iksFilterHook *filterHook); -void iks_filter_packet (iksfilter *f, ikspak *pak); -void iks_filter_delete (iksfilter *f); - -/*****  sha1  *****/ - -struct iksha_struct; -typedef struct iksha_struct iksha; - -iksha *iks_sha_new (void); -void iks_sha_reset (iksha *sha); -void iks_sha_hash (iksha *sha, const unsigned char *data, size_t len, int finish); -void iks_sha_print (iksha *sha, char *hash); -void iks_sha_delete (iksha *sha); -void iks_sha (const char *data, char *hash); - -/*****  md5  *****/ - -struct ikmd5_struct; -typedef struct iksmd5_struct iksmd5; - -iksmd5 *iks_md5_new(void); -void iks_md5_reset(iksmd5 *md5); -void iks_md5_hash(iksmd5 *md5, const unsigned char *data, size_t slen, int finish); -void iks_md5_delete(iksmd5 *md5); -void iks_md5_print(iksmd5 *md5, char *buf); -void iks_md5_digest(iksmd5 *md5, unsigned char *digest); -void iks_md5(const char *data, char *buf); - -/*****  base64  *****/ - -char *iks_base64_decode(const char *buf); -char *iks_base64_encode(const char *buf, int len); - -#ifdef __cplusplus -} -#endif - -#endif  /* IKSEMEL_H */ diff --git a/backend/impress/imposter.h b/backend/impress/imposter.h deleted file mode 100644 index 50c87f2c..00000000 --- a/backend/impress/imposter.h +++ /dev/null @@ -1,84 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#ifndef IMPOSTER_H -#define IMPOSTER_H - -#include <sys/types.h> - -enum { -	IMP_OK = 0, -	IMP_NOMEM, -	IMP_NOTZIP, -	IMP_BADZIP, -	IMP_BADDOC, -	IMP_NOTIMP -}; - -struct ImpDoc_struct; -typedef struct ImpDoc_struct ImpDoc; - -struct ImpPage_struct; -typedef struct ImpPage_struct ImpPage; - -typedef struct ImpPointStruct { -	int x; -	int y; -} ImpPoint; - -typedef struct ImpColorStruct { -	int red; -	int green; -	int blue; -} ImpColor; - -#define IMP_NORMAL 0 -#define IMP_BOLD 1 -#define IMP_ITALIC 2 -#define IMP_UNDERLINE 4 - -typedef struct ImpDrawer_struct { -	void (*get_size)(void *drw_data, int *w, int *h); -	void (*set_fg_color)(void *drw_data, ImpColor *color); -	void (*draw_line)(void *drw_data, int x1, int y1, int x2, int y2); -	void (*draw_rect)(void *drw_data, int fill, int x, int y, int w, int h); -	void (*draw_polygon)(void *drw_data, int fill, ImpPoint *pts, int nr_pts); -	void (*draw_arc)(void *drw_data, int fill, int x, int y, int w, int h, int sa, int ea); -	void (*draw_bezier)(void *drw_data, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3); -	void *(*open_image)(void *drw_data, const unsigned char *pix, size_t size); -	void (*get_image_size)(void *drw_data, void *img_data, int *w, int *h); -	void *(*scale_image)(void *drw_data, void *img_data, int w, int h); -	void (*draw_image)(void *drw_data, void *img_data, int x, int y, int w, int h); -	void (*close_image)(void *drw_data, void *img_data); -	void (*get_text_size)(void *drw_data, const char *text, size_t len, int size, int styles, int *w, int *h); -	void (*draw_text)(void *drw_data, int x, int y, const char *text, size_t len, int size, int styles); -} ImpDrawer; - -struct ImpRenderCtx_struct; -typedef struct ImpRenderCtx_struct ImpRenderCtx; - -#define IMP_LAST_PAGE -1 - -ImpDoc *imp_open(const char *filename, int *err); -int imp_nr_pages(ImpDoc *doc); -ImpPage *imp_get_page(ImpDoc *doc, int page_no); -void imp_close(ImpDoc *doc); - -void *imp_get_xml(ImpDoc *doc, const char *filename); - -ImpPage *imp_next_page(ImpPage *page); -ImpPage *imp_prev_page(ImpPage *page); -int imp_get_page_no(ImpPage *page); -const char *imp_get_page_name(ImpPage *page); - -ImpRenderCtx *imp_create_context(const ImpDrawer *drw); -void imp_context_set_page(ImpRenderCtx *ctx, ImpPage *page); -void imp_context_set_step(ImpRenderCtx *ctx, int step); -void imp_render(ImpRenderCtx *ctx, void *drw_data); -void imp_delete_context(ImpRenderCtx *ctx); - - -#endif	/* IMPOSTER_H */ diff --git a/backend/impress/impress-document.c b/backend/impress/impress-document.c deleted file mode 100644 index 5254a881..00000000 --- a/backend/impress/impress-document.c +++ /dev/null @@ -1,548 +0,0 @@ -/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; c-indent-level: 8 -*- */ -/* - * Copyright (C) 2005, Jonathan Blandford <[email protected]> - * Copyright (C) 2005, Bastien Nocera <[email protected]> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#include "config.h" - -#include <string.h> - -#include <glib/gi18n-lib.h> -#include <gtk/gtk.h> - -#include "imposter.h" -#include "impress-document.h" - -#include "ev-document-misc.h" -#include "ev-document-thumbnails.h" - -struct _ImpressDocumentClass -{ -  EvDocumentClass parent_class; -}; - -struct _ImpressDocument -{ -  EvDocument parent_instance; - -  ImpDoc *imp; -  ImpRenderCtx *ctx; - -  GMutex *mutex; -  GdkPixmap *pixmap; -  GdkGC *gc; -  PangoContext *pango_ctx; - -  /* Only used while rendering inside the mainloop */ -  int pagenum; -  GdkPixbuf *pixbuf; -  GCond *cond; -}; - -#define PAGE_WIDTH 1024 -#define PAGE_HEIGHT 768 - -typedef struct _ImpressDocumentClass ImpressDocumentClass; - -static void impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface); - -EV_BACKEND_REGISTER_WITH_CODE (ImpressDocument, impress_document, -		         { -			   EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, -							   impress_document_document_thumbnails_iface_init); -			 }); - -/* Renderer */ -static void -imp_render_draw_bezier_real (GdkDrawable *d, GdkGC *gc, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) -{ -  int x, y, nx, ny; -  int ax, bx, cx, ay, by, cy; -  double t, t2, t3; - -  x = x0; -  y = y0; - -  cx = 3 * (x1 - x0); -  bx = 3 * (x2 - x1) - cx; -  ax = x3 - x0 - cx - bx; -  cy = 3 * (y1 - y0); -  by = 3 * (y2 - y1) - cy; -  ay = y3 - y0 - cy - by; - -  for (t = 0; t < 1; t += 0.01) { -    t2 = t * t; -    t3 = t2 * t; -    nx = ax * t3 + bx * t2 + cx * t + x0; -    ny = ay * t3 + by * t2 + cy * t + y0; -    gdk_draw_line (d, gc, x, y, nx, ny); -    x = nx; -    y = ny; -  } -} - -static void -imp_render_get_size(void *drw_data, int *w, int *h) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -	#if GTK_CHECK_VERSION(3, 0, 0) -		*w = gdk_window_get_width(impress_document->pixmap); -		*h = gdk_window_get_height(impress_document->pixmap); -	#else -		gdk_drawable_get_size(impress_document->pixmap, w, h); -	#endif -} - -static void -imp_render_set_fg_color(void *drw_data, ImpColor *color) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); -  GdkColor c; - -  c.red = color->red; -  c.green = color->green; -  c.blue = color->blue; -  gdk_gc_set_rgb_fg_color(impress_document->gc, &c); -} - -static void -imp_render_draw_line(void *drw_data, int x1, int y1, int x2, int y2) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -  gdk_draw_line(impress_document->pixmap, impress_document->gc, x1, y1, x2, y2); -} - -static void -imp_render_draw_rect(void *drw_data, int fill, int x, int y, int w, int h) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -  gdk_draw_rectangle(impress_document->pixmap, impress_document->gc, fill, x, y, w, h); -} - -static void -imp_render_draw_polygon(void *drw_data, int fill, ImpPoint *pts, int nr_pts) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -  gdk_draw_polygon(impress_document->pixmap, impress_document->gc, fill, (GdkPoint *)pts, nr_pts); -} - -static void -imp_render_draw_arc(void *drw_data, int fill, int x, int y, int w, int h, int sa, int ea) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -  gdk_draw_arc(impress_document->pixmap, impress_document->gc, fill, x, y, w, h, sa * 64, ea * 64); -} - -static void -imp_render_draw_bezier(void *drw_data, int x0, int y0, int x1, int y1, int x2, int y2, int x3, int y3) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); - -  imp_render_draw_bezier_real (impress_document->pixmap, impress_document->gc, x0, y0, x1, y1, x2, y2, x3, y3); -} - -static void * -imp_render_open_image(void *drw_data, const unsigned char *pix, size_t size) -{ -  GdkPixbufLoader *gpl; -  GdkPixbuf *pb; - -  gpl = gdk_pixbuf_loader_new(); -  gdk_pixbuf_loader_write(gpl, pix, size, NULL); -  gdk_pixbuf_loader_close(gpl, NULL); -  pb = gdk_pixbuf_loader_get_pixbuf(gpl); -  return pb; -} - -static void -imp_render_get_image_size(void *drw_data, void *img_data, int *w, int *h) -{ -  GdkPixbuf *pb = (GdkPixbuf *) img_data; - -  *w = gdk_pixbuf_get_width(pb); -  *h = gdk_pixbuf_get_height(pb); -} - -static void * -imp_render_scale_image(void *drw_data, void *img_data, int w, int h) -{ -  GdkPixbuf *pb = (GdkPixbuf *) img_data; - -  return gdk_pixbuf_scale_simple(pb, w, h, GDK_INTERP_BILINEAR); -} - -static void -imp_render_draw_image(void *drw_data, void *img_data, int x, int y, int w, int h) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); -  GdkPixbuf *pb = (GdkPixbuf *) img_data; - -  gdk_draw_pixbuf(impress_document->pixmap, impress_document->gc, pb, 0, 0, x, y, w, h, GDK_RGB_DITHER_NONE, 0, 0); -} - -static void -imp_render_close_image(void *drw_data, void *img_data) -{ -  GdkPixbuf *pb = (GdkPixbuf *) img_data; - -  g_object_unref(G_OBJECT(pb)); -} - -static char * -imp_render_markup(const char *text, size_t len, int styles, int size) -{ -  double scr_mm, scr_px, dpi; -  char *esc; -  char *ret; -  int sz; - -  scr_mm = gdk_screen_get_height_mm(gdk_screen_get_default()); -  scr_px = gdk_screen_get_height(gdk_screen_get_default()); -  dpi = (scr_px / scr_mm) * 25.4; -  sz = (int) ((double) size * 72.0 * PANGO_SCALE / dpi); -  esc = g_markup_escape_text(text, len); -  ret = g_strdup_printf("<span size ='%d'>%s</span>", sz, esc); -  g_free(esc); -  return ret; -} - -static void -imp_render_get_text_size(void *drw_data, const char *text, size_t len, int size, int styles, int *w, int *h) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); -  PangoLayout *lay; -  int pw, ph; -  char *m; - -  g_return_if_fail (impress_document->pango_ctx != NULL); - -  lay = pango_layout_new(impress_document->pango_ctx); -  m = imp_render_markup(text, len, styles, size); -  pango_layout_set_markup(lay, m, strlen(m)); -  pango_layout_get_size(lay, &pw, &ph); -  g_object_unref(lay); -  g_free(m); -  *w = pw / PANGO_SCALE; -  *h = ph / PANGO_SCALE; -} - -static void -imp_render_draw_text(void *drw_data, int x, int y, const char *text, size_t len, int size, int styles) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (drw_data); -  PangoLayout *lay; -  char *m; - -  g_return_if_fail (impress_document->pango_ctx != NULL); - -  lay = pango_layout_new(impress_document->pango_ctx); -  m = imp_render_markup(text, len, styles, size); -  pango_layout_set_markup(lay, m, strlen(m)); -  gdk_draw_layout(impress_document->pixmap, impress_document->gc, x, y, lay); -  g_object_unref(lay); -  g_free(m); -} - -static const ImpDrawer imp_render_functions = { -  imp_render_get_size, -  imp_render_set_fg_color, -  imp_render_draw_line, -  imp_render_draw_rect, -  imp_render_draw_polygon, -  imp_render_draw_arc, -  imp_render_draw_bezier, -  imp_render_open_image, -  imp_render_get_image_size, -  imp_render_scale_image, -  imp_render_draw_image, -  imp_render_close_image, -  imp_render_get_text_size, -  imp_render_draw_text -}; - -/* Document interface */ -static gboolean -impress_document_load (EvDocument  *document, -		    const char  *uri, -		    GError     **error) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (document); -  gchar *filename; -  ImpDoc *imp; -  int err; - -  /* FIXME: Could we actually load uris ? */ -  filename = g_filename_from_uri (uri, NULL, error); -  if (!filename) -    return FALSE; - -  imp = imp_open (filename, &err); -  g_free (filename); - -  if (!imp) -    { -      g_set_error_literal (error, -                           EV_DOCUMENT_ERROR, -                           EV_DOCUMENT_ERROR_INVALID, -                           _("Invalid document")); -      return FALSE; -    } -  impress_document->imp = imp; - -  return TRUE; -} - -static gboolean -impress_document_save (EvDocument  *document, -                       const char  *uri, -                       GError     **error) -{ -        g_set_error_literal (error, -                             EV_DOCUMENT_ERROR, -                             EV_DOCUMENT_ERROR_INVALID, -                             "Not supported"); -	return FALSE; -} - -static int -impress_document_get_n_pages (EvDocument  *document) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (document); - -  g_return_val_if_fail (IMPRESS_IS_DOCUMENT (document), 0); -  g_return_val_if_fail (impress_document->imp != NULL, 0); - -  return imp_nr_pages (impress_document->imp); -} - -static void -impress_document_get_page_size (EvDocument   *document, -				EvPage       *page, -				double       *width, -				double       *height) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (document); - -  g_return_if_fail (IMPRESS_IS_DOCUMENT (document)); -  g_return_if_fail (impress_document->imp != NULL); - -  //FIXME -  *width = PAGE_WIDTH; -  *height = PAGE_HEIGHT; -} - -static gboolean -imp_render_get_from_drawable (ImpressDocument *impress_document) -{ -  ImpPage *page; - -  page = imp_get_page (impress_document->imp, impress_document->pagenum); - -  g_return_val_if_fail (page != NULL, FALSE); - -  ev_document_doc_mutex_lock (); -  imp_context_set_page (impress_document->ctx, page); -  imp_render (impress_document->ctx, impress_document); -  ev_document_doc_mutex_unlock (); - -  impress_document->pixbuf = gdk_pixbuf_get_from_drawable (NULL, -					 GDK_DRAWABLE (impress_document->pixmap), -					 NULL, -					 0, 0, -					 0, 0, -					 PAGE_WIDTH, PAGE_HEIGHT); - -  g_cond_broadcast (impress_document->cond); -  return FALSE; -} - -static GdkPixbuf * -impress_document_render_pixbuf (EvDocument      *document, -				EvRenderContext *rc) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (document); -  GdkPixbuf       *pixbuf; - -  g_return_val_if_fail (IMPRESS_IS_DOCUMENT (document), NULL); -  g_return_val_if_fail (impress_document->imp != NULL, NULL); - -  impress_document->pagenum = rc->page->index; - -  g_mutex_lock (impress_document->mutex); -  impress_document->cond = g_cond_new (); - -  ev_document_fc_mutex_unlock (); -  ev_document_doc_mutex_unlock (); -  g_idle_add ((GSourceFunc) imp_render_get_from_drawable, impress_document); -  g_cond_wait (impress_document->cond, impress_document->mutex); -  g_cond_free (impress_document->cond); -  ev_document_doc_mutex_lock (); -  ev_document_fc_mutex_lock (); - -  g_mutex_unlock (impress_document->mutex); - -  pixbuf = impress_document->pixbuf; -  impress_document->pixbuf = NULL; - -  return pixbuf; -} - -static cairo_surface_t * -impress_document_render (EvDocument      *document, -			 EvRenderContext *rc) -{ -  GdkPixbuf *pixbuf; -  cairo_surface_t *surface, *scaled_surface; - -  pixbuf = impress_document_render_pixbuf (document, rc); - -  /* FIXME: impress backend should be ported to cairo */ -  surface = ev_document_misc_surface_from_pixbuf (pixbuf); -  g_object_unref (pixbuf); - -  scaled_surface = ev_document_misc_surface_rotate_and_scale (surface, -							      (PAGE_WIDTH * rc->scale) + 0.5, -							      (PAGE_HEIGHT * rc->scale) + 0.5, -							      rc->rotation); -  cairo_surface_destroy (surface); - -  return scaled_surface; -} - -static void -impress_document_finalize (GObject *object) -{ -  ImpressDocument *impress_document = IMPRESS_DOCUMENT (object); - -  if (impress_document->mutex) -    g_mutex_free (impress_document->mutex); - -  if (impress_document->imp) -    imp_close (impress_document->imp); - -  if (impress_document->ctx) -    imp_delete_context (impress_document->ctx); - -  if (impress_document->pango_ctx) -    g_object_unref (impress_document->pango_ctx); - -  if (impress_document->pixmap) -    g_object_unref (G_OBJECT (impress_document->pixmap)); - -  if (impress_document->gc) -    g_object_unref (impress_document->gc); - -  G_OBJECT_CLASS (impress_document_parent_class)->finalize (object); -} - -static void -impress_document_class_init (ImpressDocumentClass *klass) -{ -  GObjectClass    *gobject_class = G_OBJECT_CLASS (klass); -  EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass); - -  gobject_class->finalize = impress_document_finalize; - -  ev_document_class->load = impress_document_load; -  ev_document_class->save = impress_document_save; -  ev_document_class->get_n_pages = impress_document_get_n_pages; -  ev_document_class->get_page_size = impress_document_get_page_size; -  ev_document_class->render = impress_document_render; -} - -static GdkPixbuf * -impress_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, -					   EvRenderContext      *rc, -					   gboolean              border) -{ -  GdkPixbuf *pixbuf; -  GdkPixbuf *scaled_pixbuf; - -  pixbuf = impress_document_render_pixbuf (EV_DOCUMENT (document), rc); -  scaled_pixbuf = gdk_pixbuf_scale_simple (pixbuf, -					   (PAGE_WIDTH * rc->scale), -					   (PAGE_HEIGHT * rc->scale), -					   GDK_INTERP_BILINEAR); -  g_object_unref (pixbuf); - -  if (border) -    { -      GdkPixbuf *tmp_pixbuf = scaled_pixbuf; - -      scaled_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf); -      g_object_unref (tmp_pixbuf); -    } - -  return scaled_pixbuf; -} - -static void -impress_document_thumbnails_get_dimensions (EvDocumentThumbnails *document, -					    EvRenderContext      *rc, -					    gint                 *width, -					    gint                 *height) -{ -  gdouble page_width, page_height; - -  impress_document_get_page_size (EV_DOCUMENT (document), -				  rc->page, -				  &page_width, &page_height); - -  if (rc->rotation == 90 || rc->rotation == 270) -    { -      *width = (gint) (page_height * rc->scale); -      *height = (gint) (page_width * rc->scale); -    } -  else -    { -      *width = (gint) (page_width * rc->scale); -      *height = (gint) (page_height * rc->scale); -    } -} - -static void -impress_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface) -{ -  iface->get_thumbnail = impress_document_thumbnails_get_thumbnail; -  iface->get_dimensions = impress_document_thumbnails_get_dimensions; -} - -static void -impress_document_init (ImpressDocument *impress_document) -{ -  GdkWindow *window; - -  impress_document->mutex = g_mutex_new (); -  impress_document->ctx = imp_create_context(&imp_render_functions); - -  window = gdk_screen_get_root_window (gdk_screen_get_default ()); - -  impress_document->pixmap = gdk_pixmap_new (window, -					     PAGE_WIDTH, PAGE_HEIGHT, -1); -  impress_document->gc = gdk_gc_new (impress_document->pixmap); -  impress_document->pango_ctx = gdk_pango_context_get_for_screen (gdk_screen_get_default ()); -} - -/* - * vim: sw=2 ts=8 cindent noai bs=2 - */ diff --git a/backend/impress/impress-document.h b/backend/impress/impress-document.h deleted file mode 100644 index ac6469c9..00000000 --- a/backend/impress/impress-document.h +++ /dev/null @@ -1,39 +0,0 @@ - -/* pdfdocument.h: Implementation of EvDocument for impresss - * Copyright (C) 2005, Jonathan Blandford <[email protected]> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef __IMPRESS_DOCUMENT_H__ -#define __IMPRESS_DOCUMENT_H__ - -#include "ev-document.h" - -G_BEGIN_DECLS - -#define IMPRESS_TYPE_DOCUMENT             (impress_document_get_type ()) -#define IMPRESS_DOCUMENT(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), IMPRESS_TYPE_DOCUMENT, ImpressDocument)) -#define IMPRESS_IS_DOCUMENT(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), IMPRESS_TYPE_DOCUMENT)) - -typedef struct _ImpressDocument ImpressDocument; - -GType                 impress_document_get_type (void) G_GNUC_CONST; - -G_MODULE_EXPORT GType register_atril_backend   (GTypeModule *module); -      -G_END_DECLS - -#endif /* __IMPRESS_DOCUMENT_H__ */ diff --git a/backend/impress/impressdocument.atril-backend.in b/backend/impress/impressdocument.atril-backend.in deleted file mode 100644 index 074c1afd..00000000 --- a/backend/impress/impressdocument.atril-backend.in +++ /dev/null @@ -1,4 +0,0 @@ -[Atril Backend] -Module=impressdocument -_TypeDescription=Impress Slides -MimeType=application/vnd.sun.xml.impress;application/vnd.oasis.opendocument.presentation; diff --git a/backend/impress/internal.h b/backend/impress/internal.h deleted file mode 100644 index eb99c3ec..00000000 --- a/backend/impress/internal.h +++ /dev/null @@ -1,85 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include "zip.h" - -#ifndef INTERNAL_H -#define INTERNAL_H - -struct ImpDoc_struct { -	ikstack *stack; -	zip *zfile; -	iks *content; -	iks *styles; -	iks *meta; -	ImpPage *pages; -	ImpPage *last_page; -	int nr_pages; -	void (*get_geometry)(ImpRenderCtx *ctx); -	void (*render_page)(ImpRenderCtx *ctx, void *drw_data); -}; - -struct ImpPage_struct { -	struct ImpPage_struct *next; -	struct ImpPage_struct *prev; -	ImpDoc *doc; -	iks *page; -	const char *name; -	int nr; -}; - -struct ImpRenderCtx_struct { -	const ImpDrawer *drw; -	ImpPage *page; -	iks *content; -	iks *styles; -	iks *last_element; -	int step; -	int pix_w, pix_h; -	double cm_w, cm_h; -	double fact_x, fact_y; -}; - -char *r_get_style (ImpRenderCtx *ctx, iks *node, char *attr); -int r_get_color(ImpRenderCtx *ctx, iks *node, char *name, ImpColor *ic); -void r_parse_color(const char *color, ImpColor *ic); -int r_get_x (ImpRenderCtx *ctx, iks *node, char *name); -int r_get_y (ImpRenderCtx *ctx, iks *node, char *name); -int r_get_angle (iks *node, char *name, int def); - -enum { -	IMP_LE_NONE = 0, -	IMP_LE_ARROW, -	IMP_LE_SQUARE, -	IMP_LE_DIMENSION, -	IMP_LE_DOUBLE_ARROW, -	IMP_LE_SMALL_ARROW, -	IMP_LE_ROUND_ARROW, -	IMP_LE_SYM_ARROW, -	IMP_LE_LINE_ARROW, -	IMP_LE_ROUND_LARGE_ARROW, -	IMP_LE_CIRCLE, -	IMP_LE_SQUARE_45, -	IMP_LE_CONCAVE_ARROW -}; - -void _imp_draw_rect(ImpRenderCtx *ctx, void *drw_data, int fill, int x, int y, int w, int h, int round); -void _imp_draw_line_end(ImpRenderCtx *ctx, void *drw_data, int type, int size, int x, int y, int x2, int y2); -void _imp_draw_image(ImpRenderCtx *ctx, void *drw_data, const char *name, int x, int y, int w, int h); -void _imp_tile_image(ImpRenderCtx *ctx, void *drw_data, const char *name, int x, int y, int w, int h); - -int _imp_fill_back(ImpRenderCtx *ctx, void *drw_data, iks *node); -void r_text(ImpRenderCtx *ctx, void *drw_data, iks *node); -void r_polygon(ImpRenderCtx *ctx, void *drw_data, iks *node); -void r_circle(ImpRenderCtx *ctx, void *drw_data, iks *node); -void r_polyline(ImpRenderCtx *ctx, void *drw_data, iks *node); -void r_draw_gradient (ImpRenderCtx *ctx, void *drw_data, iks *node); - -int _imp_oo13_load(ImpDoc *doc); -int _imp_oasis_load(ImpDoc *doc); - - -#endif	/* INTERNAL_H */ diff --git a/backend/impress/r_back.c b/backend/impress/r_back.c deleted file mode 100644 index 3f050d9e..00000000 --- a/backend/impress/r_back.c +++ /dev/null @@ -1,46 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -int -_imp_fill_back(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	ImpColor col; -	char *type; -	char *stil, *gfx; -	iks *x; - -	type = r_get_style(ctx, node, "draw:fill"); -	if (type == 0) return 0; - -	if (strcmp(type, "solid") == 0) { -		if (r_get_color(ctx, node, "draw:fill-color", &col)) { -			ctx->drw->set_fg_color(drw_data, &col); -		} -		ctx->drw->draw_rect(drw_data, 1, 0, 0, ctx->pix_w, ctx->pix_h); -	} else if (strcmp (type, "bitmap") == 0) { -		stil = r_get_style(ctx, node, "draw:fill-image-name"); -		x = iks_find_with_attrib(iks_find(ctx->styles, "office:styles"), -			"draw:fill-image", "draw:name", stil -		); -		gfx = iks_find_attrib(x, "xlink:href"); -		if (gfx) { -			if (iks_strcmp(r_get_style(ctx, node, "style:repeat"), "stretch") == 0) { -				_imp_draw_image(ctx, drw_data, gfx, 0, 0, ctx->pix_w, ctx->pix_h); -			} else { -				_imp_tile_image(ctx, drw_data, gfx, 0, 0, ctx->pix_w, ctx->pix_h); -			} -		} -	} else if (strcmp(type, "gradient") == 0) { -		r_draw_gradient(ctx, drw_data, node); -	} else { -		return 0; -	} -	return 1; -} diff --git a/backend/impress/r_draw.c b/backend/impress/r_draw.c deleted file mode 100644 index aad1655e..00000000 --- a/backend/impress/r_draw.c +++ /dev/null @@ -1,120 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" -#include <math.h> - -void -_imp_draw_rect(ImpRenderCtx *ctx, void *drw_data, int fill, int x, int y, int w, int h, int round) -{ -	int a; - -	if (0 == round) { -		ctx->drw->draw_rect(drw_data, fill, x, y, w, h); -		return; -	} - -	ctx->drw->draw_arc(drw_data, fill, -		x, y, round, round, 90, 90); -	ctx->drw->draw_arc(drw_data, fill, -		x + w - round, y, round, round, 0, 90); -	ctx->drw->draw_arc(drw_data, fill, -		x + w - round, y + h - round, round, round, 270, 90); -	ctx->drw->draw_arc(drw_data, fill, -		x, y + h - round, round, round, 180, 90); - -	a = round / 2; -	if (fill) { -		ctx->drw->draw_rect(drw_data, 1, x + a, y, w - a - a, h); -		ctx->drw->draw_rect(drw_data, 1, x, y + a, w, h - a - a); -		return; -	} -	ctx->drw->draw_line(drw_data, x + a, y, x + w - a, y); -	ctx->drw->draw_line(drw_data, x + a, y + h, x + w - a, y + h); -	ctx->drw->draw_line(drw_data, x, y + a, x, y + h - a); -	ctx->drw->draw_line(drw_data, x + w, y + a, x + w, y + h - a); -} - -void -_imp_draw_line_end(ImpRenderCtx *ctx, void *drw_data, int type, int size, int x, int y, int x2, int y2) -{ -	ImpPoint pts[4]; -	double ia, a; - -	// FIXME: different types and sizes - -	pts[0].x = x2; -	pts[0].y = y2; - -	ia = 20 * 3.14 * 2 / 360; - -	if (x2-x == 0) { -		if (y < y2) a = 3.14 + (3.14 / 2); else a = (3.14 / 2); -	} else if (y2-y == 0) { -		if (x < x2) a = 3.14; else a = 0; -	} else -		a = atan ((y2-y) / (x2-x)) - 3.14; - -	pts[1].x = x2 + 0.3 * ctx->fact_x * cos (a - ia); -	pts[1].y = y2 + 0.3 * ctx->fact_y * sin (a - ia); - -	pts[2].x = x2 + 0.3 * ctx->fact_x * cos (a + ia); -	pts[2].y = y2 + 0.3 * ctx->fact_y * sin (a + ia); - -	ctx->drw->draw_polygon(drw_data, 1, pts, 3); -} - -void -_imp_draw_image(ImpRenderCtx *ctx, void *drw_data, const char *name, int x, int y, int w, int h) -{ -	void *img1, *img2; -	char *pix; -	size_t len; - -	len = zip_get_size(ctx->page->doc->zfile, name); -	pix = malloc(len); -	if (!pix) return; -	zip_load(ctx->page->doc->zfile, name, pix); - -	img1 = ctx->drw->open_image(drw_data, pix, len); -	free(pix); -	if (!img1) return; -	img2 = ctx->drw->scale_image(drw_data, img1, w, h); -	if (img2) { -		ctx->drw->draw_image(drw_data, img2, x, y, w, h); -		ctx->drw->close_image(drw_data, img2); -	} -	ctx->drw->close_image(drw_data, img1); -} - -void -_imp_tile_image(ImpRenderCtx *ctx, void *drw_data, const char *name, int x, int y, int w, int h) -{ -	void *img1; -	char *pix; -	size_t len; -	int gx, gy, gw, gh; - -	len = zip_get_size(ctx->page->doc->zfile, name); -	pix = malloc(len); -	if (!pix) return; -	zip_load(ctx->page->doc->zfile, name, pix); - -	img1 = ctx->drw->open_image(drw_data, pix, len); -	free(pix); -	if (!img1) return; - -	ctx->drw->get_image_size(drw_data, img1, &gw, &gh); -	for (gx = x; gx < w; gx += gw) { -		for (gy = y; gy < h; gy += gh) { -			ctx->drw->draw_image(drw_data, img1, gx, gy, gw, gh); -		} -	} - -	ctx->drw->close_image(drw_data, img1); -} diff --git a/backend/impress/r_geometry.c b/backend/impress/r_geometry.c deleted file mode 100644 index 4819821a..00000000 --- a/backend/impress/r_geometry.c +++ /dev/null @@ -1,208 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" -#include <math.h> - -void -r_parse_color(const char *color, ImpColor *ic) -{ -	unsigned int cval; - -	if (1 != sscanf(color, "#%X", &cval)) return; - -	ic->red = (cval & 0xFF0000) >> 8; -	ic->green = cval & 0x00FF00; -	ic->blue = (cval & 0xFF) << 8; -} - -int -r_get_color(ImpRenderCtx *ctx, iks *node, char *name, ImpColor *ic) -{ -	char *color; - -	color = r_get_style(ctx, node, name); -	if (!color) return 0; -	r_parse_color(color, ic); - -	return 1; -} - -static void -fg_color(ImpRenderCtx *ctx, void *drw_data, iks *node, char *name) -{ -	ImpColor ic; - -	if (r_get_color(ctx, node, name, &ic)) { -		ctx->drw->set_fg_color(drw_data, &ic); -	} -} - -int -r_get_x (ImpRenderCtx *ctx, iks *node, char *name) -{ -	char *val; - -	val = iks_find_attrib (node, name); -	if (!val) return 0; -	return atof (val) * ctx->fact_x; -} - -int -r_get_y (ImpRenderCtx *ctx, iks *node, char *name) -{ -	char *val; - -	val = iks_find_attrib (node, name); -	if (!val) return 0; -	return atof (val) * ctx->fact_y; -} - -int -r_get_angle (iks *node, char *name, int def) -{ -	char *tmp; - -	tmp = iks_find_attrib (node, name); -	if (!tmp) return def; -	return atof (tmp); -} - -static int x, y, w, h; -static int px, py, pw, ph; - -static void -r_get_viewbox (iks *node) -{ -	char *tmp; - -	tmp = iks_find_attrib (node, "svg:viewBox"); -	if (!tmp) return; -	sscanf (tmp, "%d %d %d %d", &px, &py, &pw, &ph); -} - -void -r_polygon(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	char *data; -	ImpPoint *points; -	int i, cnt, j; -	int num; -	int fill = 1; - -	data = r_get_style (ctx, node, "draw:fill"); -	if (!data || strcmp (data, "solid") != 0) fill = 0; - -	x = r_get_x (ctx, node, "svg:x"); -	y = r_get_y (ctx, node, "svg:y"); -	w = r_get_x (ctx, node, "svg:width"); -	h = r_get_y (ctx, node, "svg:height"); -	r_get_viewbox (node); - -	data = iks_find_attrib (node, "draw:points"); -	points = malloc (sizeof (ImpPoint) * strlen (data) / 4); - -	cnt = 0; -	j = 0; -	num = -1; -	for (i = 0; data[i]; i++) { -		if (data[i] >= '0' && data[i] <= '9') { -			if (num == -1) num = i; -		} else { -			if (num != -1) { -				if (j == 0) { -					points[cnt].x = atoi (data + num); -					j = 1; -				} else { -					points[cnt++].y = atoi (data + num); -					j = 0; -				} -				num = -1; -			} -		} -	} -	if (num != -1) { -		if (j == 0) { -			points[cnt].x = atoi (data + num); -		} else { -			points[cnt++].y = atoi (data + num); -		} -	} -	for (i = 0; i < cnt; i++) { -		points[i].x = x + points[i].x * w / pw; -		points[i].y = y + points[i].y * h / ph; -	} - -	if (fill) { -		fg_color(ctx, drw_data, node, "draw:fill-color"); -		ctx->drw->draw_polygon(drw_data, 1, points, cnt); -	} -	fg_color(ctx, drw_data, node, "svg:stroke-color"); -	ctx->drw->draw_polygon(drw_data, 0, points, cnt); - -	free (points); -} - -void -r_polyline(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	char *data; -	ImpPoint *points; -	int i, cnt, j; -	int num; -	int pen_x, pen_y; - -	x = r_get_x (ctx, node, "svg:x"); -	y = r_get_y (ctx, node, "svg:y"); -	w = r_get_x (ctx, node, "svg:width"); -	h = r_get_y (ctx, node, "svg:height"); -	r_get_viewbox (node); - -	data = iks_find_attrib (node, "draw:points"); -	points = malloc (sizeof (ImpPoint) * strlen (data) / 4); - -	cnt = 0; -	j = 0; -	num = -1; -	for (i = 0; data[i]; i++) { -		if (data[i] >= '0' && data[i] <= '9') { -			if (num == -1) num = i; -		} else { -			if (num != -1) { -				if (j == 0) { -					points[cnt].x = atoi (data + num); -					j = 1; -				} else { -					points[cnt++].y = atoi (data + num); -					j = 0; -				} -				num = -1; -			} -		} -	} -	if (num != -1) { -		if (j == 0) { -			points[cnt].x = atoi (data + num); -		} else { -			points[cnt++].y = atoi (data + num); -		} -	} - -	pen_x = x + points[0].x * w /pw; -	pen_y = y + points[0].y * h / ph; -	fg_color(ctx, drw_data, node, "svg:stroke-color"); -	for (i = 1; i < cnt; i++) { -		int tx, ty; -		tx = x + points[i].x * w / pw; -		ty = y + points[i].y * h / ph; -		ctx->drw->draw_line(drw_data, pen_x, pen_y, tx, ty); -		pen_x = tx; -		pen_y = ty; -	} -	free (points); -} diff --git a/backend/impress/r_gradient.c b/backend/impress/r_gradient.c deleted file mode 100644 index 79636fe2..00000000 --- a/backend/impress/r_gradient.c +++ /dev/null @@ -1,387 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" -#include <math.h> - -#define GRAD_LINEAR 0 -#define GRAD_AXIAL 1 -#define GRAD_SQUARE 2 -#define GRAD_RECTANGULAR 3 -#define GRAD_RADIAL 4 -#define GRAD_ELLIPTICAL 5 - -typedef struct Gradient_s { -	int type; -	ImpColor start; -	int start_intensity; -	ImpColor end; -	int end_intensity; -	int angle; -	int border; -	int steps; -	int offset_x; -	int offset_y; -} Gradient; - -typedef struct Rectangle_s { -	int Left; -	int Top; -	int Right; -	int Bottom; -} Rectangle; - -static void -poly_rotate (ImpPoint *poly, int n, int cx, int cy, double fAngle) -{ -	int i; -	long nX, nY; - -	for (i = 0; i < n; i++) { -		nX = poly->x - cx; -		nY = poly->y - cy; -		poly->x = (cos(fAngle) * nX + sin(fAngle) * nY) + cx; -		poly->y = - (sin(fAngle)* nX - cos(fAngle) * nY) + cy; -		poly++; -	} -} - -static void -r_draw_gradient_simple (ImpRenderCtx *ctx, void *drw_data, Gradient *grad) -{ -	Rectangle rRect = { 0, 0, ctx->pix_w - 1, ctx->pix_h - 1 }; -	Rectangle aRect, aFullRect; -	ImpPoint poly[4], tempoly[2]; -	ImpColor gcol; -	double fW, fH, fDX, fDY, fAngle; -	double fScanLine, fScanInc; -	long redSteps, greenSteps, blueSteps; -	long nBorder; -	int i, nSteps, nSteps2; -	int cx, cy; - -	cx = rRect.Left + (rRect.Right - rRect.Left) / 2; -	cy = rRect.Top + (rRect.Bottom - rRect.Top) / 2; - -	aRect = rRect; -	aRect.Top--; aRect.Left--; aRect.Bottom++; aRect.Right++; -	fW = rRect.Right - rRect.Left; -	fH = rRect.Bottom - rRect.Top; -	fAngle = (((double) grad->angle) * 3.14 / 1800.0); -	fDX = fW * fabs (cos (fAngle)) + fH * fabs (sin (fAngle)); -	fDY = fH * fabs (cos (fAngle)) + fW * fabs (sin (fAngle)); -	fDX = (fDX - fW) * 0.5 - 0.5; -	fDY = (fDY - fH) * 0.5 - 0.5; -	aRect.Left -= fDX; -	aRect.Right += fDX; -	aRect.Top -= fDY; -	aRect.Bottom += fDY; -	aFullRect = aRect; - -	nBorder = grad->border * (aRect.Bottom - aRect.Top) / 100; -	if (grad->type == GRAD_LINEAR) { -		aRect.Top += nBorder; -	} else { -		nBorder >>= 1; -		aRect.Top += nBorder; -		aRect.Bottom -= nBorder; -	} - -	if (aRect.Top > (aRect.Bottom - 1)) -		aRect.Top = aRect.Bottom - 1; - -	poly[0].x = aFullRect.Left; -	poly[0].y = aFullRect.Top; -	poly[1].x = aFullRect.Right; -	poly[1].y = aFullRect.Top; -	poly[2].x = aRect.Right; -	poly[2].y = aRect.Top; -	poly[3].x = aRect.Left; -	poly[3].y = aRect.Top; -	poly_rotate (&poly[0], 4, cx, cy, fAngle); - -	redSteps = grad->end.red - grad->start.red; -	greenSteps = grad->end.green - grad->start.green; -	blueSteps = grad->end.blue - grad->start.blue; -	nSteps = grad->steps; -	if (nSteps == 0) { -		long mr; -		mr = aRect.Bottom - aRect.Top; -		if (mr < 50) -			nSteps = mr / 2; -		else -			nSteps = mr / 4; -		mr = abs(redSteps); -		if (abs(greenSteps) > mr) mr = abs(greenSteps); -		if (abs(blueSteps) > mr) mr = abs(blueSteps); -		if (mr < nSteps) nSteps = mr; -	} - -	if (grad->type == GRAD_AXIAL) { -		if (nSteps & 1) nSteps++; -		nSteps2 = nSteps + 2; -		gcol = grad->end; -		redSteps <<= 1; -		greenSteps <<= 1; -		blueSteps <<= 1; -	} else { -		nSteps2 = nSteps + 1; -		gcol = grad->start; -	} - -	fScanLine = aRect.Top; -	fScanInc  = (double)(aRect.Bottom - aRect.Top) / (double)nSteps; - -	for (i = 0; i < nSteps2; i++) { -		// draw polygon -		ctx->drw->set_fg_color(drw_data, &gcol); -		ctx->drw->draw_polygon(drw_data, 1, &poly[0], 4); -		// calc next polygon -		aRect.Top = (long)(fScanLine += fScanInc); -		if (i == nSteps) { -			tempoly[0].x = aFullRect.Left; -			tempoly[0].y = aFullRect.Bottom; -			tempoly[1].x = aFullRect.Right; -			tempoly[1].y = aFullRect.Bottom; -		} else { -			tempoly[0].x = aRect.Left; -			tempoly[0].y = aRect.Top; -			tempoly[1].x = aRect.Right; -			tempoly[1].y = aRect.Top; -		} -		poly_rotate (&tempoly[0], 2, cx, cy, fAngle); -		poly[0] = poly[3]; -		poly[1] = poly[2]; -		poly[2] = tempoly[1]; -		poly[3] = tempoly[0]; -		// calc next color -		if (grad->type == GRAD_LINEAR) { -			gcol.red = grad->start.red + ((redSteps * i) / nSteps2); -			gcol.green = grad->start.green + ((greenSteps * i) / nSteps2); -			gcol.blue = grad->start.blue + ((blueSteps * i) / nSteps2); -		} else { -			if (i >= nSteps) { -				gcol.red = grad->end.red; -				gcol.green = grad->end.green; -				gcol.blue = grad->end.blue; -			} else { -				if (i <= (nSteps / 2)) { -					gcol.red = grad->end.red - ((redSteps * i) / nSteps2); -					gcol.green = grad->end.green - ((greenSteps * i) / nSteps2); -					gcol.blue = grad->end.blue - ((blueSteps * i) / nSteps2); -				} else { -					int i2 = i - nSteps / 2; -					gcol.red = grad->start.red + ((redSteps * i2) / nSteps2); -					gcol.green = grad->start.green + ((greenSteps * i2) / nSteps2); -					gcol.blue = grad->start.blue + ((blueSteps * i2) / nSteps2); -				} -			} -		} -	} -} - -static void -r_draw_gradient_complex (ImpRenderCtx *ctx, void *drw_data, Gradient *grad) -{ -	Rectangle rRect = { 0, 0, ctx->pix_w - 1, ctx->pix_h - 1 }; -	Rectangle aRect = rRect; -	ImpColor gcol; -	ImpPoint poly[4]; -	double fAngle = (((double) grad->angle) * 3.14 / 1800.0); -	long redSteps, greenSteps, blueSteps; -	long nZW, nZH; -	long bX, bY; -	long sW, sH; -	long cx, cy; -	int i; -	long nSteps; -	double sTop, sLeft, sRight, sBottom, sInc; -	int minRect; - -	redSteps = grad->end.red - grad->start.red; -	greenSteps = grad->end.green - grad->start.green; -	blueSteps = grad->end.blue - grad->start.blue; - -	if (grad->type == GRAD_SQUARE || grad->type == GRAD_RECTANGULAR) { -		double fW = aRect.Right - aRect.Left; -		double fH = aRect.Bottom - aRect.Top; -		double fDX = fW * fabs (cos (fAngle)) + fH * fabs (sin (fAngle)); -		double fDY = fH * fabs (cos (fAngle)) + fW * fabs (sin (fAngle)); -		fDX = (fDX - fW) * 0.5 - 0.5; -		fDY = (fDY - fH) * 0.5 - 0.5; -		aRect.Left -= fDX; -		aRect.Right += fDX; -		aRect.Top -= fDY; -		aRect.Bottom += fDY; -	} - -	sW = aRect.Right - aRect.Left; -	sH = aRect.Bottom - aRect.Top; - -	if (grad->type == GRAD_SQUARE) { -		if (sW > sH) sH = sW; else sW = sH; -	} else if (grad->type == GRAD_RADIAL) { -		sW = 0.5 + sqrt ((double)sW*(double)sW + (double)sH*(double)sH); -		sH = sW; -	} else if (grad->type == GRAD_ELLIPTICAL) { -		sW = 0.5 + (double)sW * 1.4142; -		sH = 0.5 + (double)sH * 1.4142; -	} - -	nZW = (aRect.Right - aRect.Left) * grad->offset_x / 100; -	nZH = (aRect.Bottom - aRect.Top) * grad->offset_y / 100; -	bX = grad->border * sW / 100; -	bY = grad->border * sH / 100; -	cx = aRect.Left + nZW; -	cy = aRect.Top + nZH; - -	sW -= bX; -	sH -= bY; - -	aRect.Left = cx - ((aRect.Right - aRect.Left) >> 1); -	aRect.Top = cy - ((aRect.Bottom - aRect.Top) >> 1); - -	nSteps = grad->steps; -	minRect = aRect.Right - aRect.Left; -	if (aRect.Bottom - aRect.Top < minRect) minRect = aRect.Bottom - aRect.Top; -	if (nSteps == 0) { -		long mr; -		if (minRect < 50) -			nSteps = minRect / 2; -		else -			nSteps = minRect / 4; -		mr = abs(redSteps); -		if (abs(greenSteps) > mr) mr = abs(greenSteps); -		if (abs(blueSteps) > mr) mr = abs(blueSteps); -		if (mr < nSteps) nSteps = mr; -	} - -	sLeft = aRect.Left; -	sTop = aRect.Top; -	sRight = aRect.Right; -	sBottom = aRect.Bottom; -	sInc = (double) minRect / (double) nSteps * 0.5; - -	gcol = grad->start; -	poly[0].x = rRect.Left; -	poly[0].y = rRect.Top; -	poly[1].x = rRect.Right; -	poly[1].y = rRect.Top; -	poly[2].x = rRect.Right; -	poly[2].y = rRect.Bottom; -	poly[3].x = rRect.Left; -	poly[3].y = rRect.Bottom; -	ctx->drw->set_fg_color(drw_data, &gcol); -	ctx->drw->draw_polygon(drw_data, 1, &poly[0], 4); - -	for (i = 0; i < nSteps; i++) { -		aRect.Left = (long) (sLeft += sInc); -		aRect.Top = (long) (sTop += sInc); -		aRect.Right = (long) (sRight -= sInc); -		aRect.Bottom = (long) (sBottom -= sInc); -		if (aRect.Bottom - aRect.Top < 2 || aRect.Right - aRect.Left < 2) -			break; - -		gcol.red = grad->start.red + (redSteps * (i+1) / nSteps); -		gcol.green = grad->start.green + (greenSteps * (i+1) / nSteps); -		gcol.blue = grad->start.blue + (blueSteps * (i+1) / nSteps); -		ctx->drw->set_fg_color(drw_data, &gcol); - -		if (grad->type == GRAD_RADIAL || grad->type == GRAD_ELLIPTICAL) { -			ctx->drw->draw_arc(drw_data, 1, aRect.Left, aRect.Top, -				aRect.Right - aRect.Left, aRect.Bottom - aRect.Top, -				0, 360); -		} else { -			poly[0].x = aRect.Left; -			poly[0].y = aRect.Top; -			poly[1].x = aRect.Right; -			poly[1].y = aRect.Top; -			poly[2].x = aRect.Right; -			poly[2].y = aRect.Bottom; -			poly[3].x = aRect.Left; -			poly[3].y = aRect.Bottom; -			poly_rotate (&poly[0], 4, cx, cy, fAngle); -			ctx->drw->draw_polygon(drw_data, 1, &poly[0], 4); -		} -	} -} - -void -r_draw_gradient (ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -//	GdkGC *gc; -	Gradient grad; -	char *stil, *tmp; -	iks *x; - -	stil = r_get_style (ctx, node, "draw:fill-gradient-name"); -	x = iks_find_with_attrib (iks_find (ctx->styles, "office:styles"), -		"draw:gradient", "draw:name", stil); -	if (x) { -		memset (&grad, 0, sizeof (Gradient)); -		grad.type = -1; -		grad.offset_x = 50; -		grad.offset_y = 50; - -		tmp = iks_find_attrib (x, "draw:start-color"); -		if (tmp) r_parse_color (tmp, &grad.start); -		tmp = iks_find_attrib (x, "draw:start-intensity"); -		if (tmp) { -			int val = atoi (tmp); -			grad.start.red = grad.start.red * val / 100; -			grad.start.green = grad.start.green * val / 100; -			grad.start.blue = grad.start.blue * val / 100; -		} -		tmp = iks_find_attrib (x, "draw:end-color"); -		if (tmp) r_parse_color (tmp, &grad.end); -		tmp = iks_find_attrib (x, "draw:end-intensity"); -		if (tmp) { -			int val = atoi (tmp); -			grad.end.red = grad.end.red * val / 100; -			grad.end.green = grad.end.green * val / 100; -			grad.end.blue = grad.end.blue * val / 100; -		} -		tmp = iks_find_attrib (x, "draw:angle"); -		if (tmp) grad.angle = atoi(tmp) % 3600; -		tmp = iks_find_attrib (x, "draw:border"); -		if (tmp) grad.border = atoi(tmp); -		tmp = r_get_style (ctx, node, "draw:gradient-step-count"); -		if (tmp) grad.steps = atoi (tmp); -		tmp = iks_find_attrib (x, "draw:cx"); -		if (tmp) grad.offset_x = atoi (tmp); -		tmp = iks_find_attrib (x, "draw:cy"); -		if (tmp) grad.offset_y = atoi (tmp); -		tmp = iks_find_attrib (x, "draw:style"); -		if (iks_strcmp (tmp, "linear") == 0) -			grad.type = GRAD_LINEAR; -		else if (iks_strcmp (tmp, "axial") == 0) -			grad.type = GRAD_AXIAL; -		else if (iks_strcmp (tmp, "radial") == 0) -			grad.type = GRAD_RADIAL; -		else if (iks_strcmp (tmp, "rectangular") == 0) -			grad.type = GRAD_RECTANGULAR; -		else if (iks_strcmp (tmp, "ellipsoid") == 0) -			grad.type = GRAD_ELLIPTICAL; -		else if (iks_strcmp (tmp, "square") == 0) -			grad.type = GRAD_SQUARE; - -		if (grad.type == -1) return; - -//		gc = ctx->gc; -//		ctx->gc = gdk_gc_new (ctx->d); -//		gdk_gc_copy (ctx->gc, gc); - -		if (grad.type == GRAD_LINEAR || grad.type == GRAD_AXIAL) -			r_draw_gradient_simple (ctx, drw_data, &grad); -		else -			r_draw_gradient_complex (ctx, drw_data, &grad); - -//		g_object_unref (ctx->gc); -//		ctx->gc = gc; -	} -} diff --git a/backend/impress/r_style.c b/backend/impress/r_style.c deleted file mode 100644 index 39ee9c62..00000000 --- a/backend/impress/r_style.c +++ /dev/null @@ -1,111 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -static char * -get_style(ImpRenderCtx *ctx, iks *node, char *style, char *attr) -{ -	char *ret; -	iks *x; - -	if (!style) return NULL; - -	if (iks_root (node) == ctx->content) { -		x = iks_find_with_attrib (iks_find (ctx->content, "office:automatic-styles"), -			"style:style", "style:name", style); -	} else { -		x = iks_find_with_attrib (iks_find (ctx->styles, "office:automatic-styles"), -			"style:style", "style:name", style); -	} -	if (!x) return NULL; - -	while (x) { -		ret = iks_find_attrib (iks_find (x, "style:properties"), attr); -		if (ret) return ret; -		ret = iks_find_attrib (iks_find (x, "style:text-properties"), attr); -		if (ret) return ret; -		ret = iks_find_attrib (iks_find (x, "style:paragraph-properties"), attr); -		if (ret) return ret; -		ret = iks_find_attrib (iks_find (x, "style:graphic-properties"), attr); -		if (ret) return ret; -		ret = iks_find_attrib (iks_find (x, "style:drawing-page-properties"), attr); -		if (ret) return ret; - -		style = iks_find_attrib (x, "style:parent-style-name"); -		if (!style) return NULL; - -		x = iks_find_with_attrib (iks_find (ctx->styles, "office:styles"), -			"style:style", "style:name", style); - -	} -	return NULL; -} - -char * -r_get_style (ImpRenderCtx *ctx, iks *node, char *attr) -{ -	char *ret, *s; -	iks *x; - -	ret = iks_find_attrib (node, attr); -	if (ret) return ret; - -	for (x = node; x; x = iks_parent (x)) { -		s = iks_find_attrib (x, "text:style-name"); -		ret = get_style (ctx, node, s, attr); -		if (ret) return ret; -		s = iks_find_attrib (x, "presentation:style-name"); -		ret = get_style (ctx, node, s, attr); -		if (ret) return ret; -		s = iks_find_attrib (x, "draw:style-name"); -		ret = get_style (ctx, node, s, attr); -		if (ret) return ret; -	} -	return NULL; -} - -#if 0 -static iks * -get_style_x (ImpRenderCtx *ctx, iks *node, char *style, char *attr) -{ -	iks *x; - -	if (!style) return NULL; - -	if (iks_root (node) == ctx->content) { -		x = iks_find_with_attrib (iks_find (ctx->content, "office:automatic-styles"), -			"text:list-style", "style:name", style); -	} else { -		x = iks_find_with_attrib (iks_find (ctx->styles, "office:automatic-styles"), -			"text:list-style", "style:name", style); -	} -	return x; -} - -static iks * -r_get_bullet (ImpRenderCtx *ctx, iks *node, char *attr) -{ -	iks *ret; -	char *s; -	iks *x; - -	for (x = node; x; x = iks_parent (x)) { -		s = iks_find_attrib (x, "text:style-name"); -		ret = get_style_x (ctx, node, s, attr); -		if (ret) return ret; -		s = iks_find_attrib (x, "presentation:style-name"); -		ret = get_style_x (ctx, node, s, attr); -		if (ret) return ret; -		s = iks_find_attrib (x, "draw:style-name"); -		ret = get_style_x (ctx, node, s, attr); -		if (ret) return ret; -	} -	return NULL; -} -#endif diff --git a/backend/impress/r_text.c b/backend/impress/r_text.c deleted file mode 100644 index 4b89bcad..00000000 --- a/backend/impress/r_text.c +++ /dev/null @@ -1,386 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -struct Span { -	struct Span *next; -	int x, y; -	int w, h; -	char *text; -	int len; -	int size; -	int styles; -	ImpColor fg; -}; - -struct Line { -	struct Line *next; -	struct Span *spans; -	struct Span *last_span; -	int x, y; -	int w, h; -}; - -struct Layout { -	ikstack *s; -	int x, y, w, h; -	int tw, th; -	struct Line *lines; -	struct Line *last_line; -	char spaces[128]; -}; - -static struct Line * -add_line(struct Layout *lay) -{ -	struct Line *line; - -	line = iks_stack_alloc(lay->s, sizeof(struct Line)); -	memset(line, 0, sizeof(struct Line)); - -	if (!lay->lines) lay->lines = line; -	if (lay->last_line) lay->last_line->next = line; -	lay->last_line = line; - -	return line; -} - -static struct Span * -add_span(struct Layout *lay, char *text, int len, int size, int styles) -{ -	struct Line *line; -	struct Span *span; - -	span = iks_stack_alloc(lay->s, sizeof(struct Span)); -	memset(span, 0, sizeof(struct Span)); -	span->text = text; -	span->len = len; -	span->size = size; -	span->styles = styles; - -	line = lay->last_line; -	if (!line) line = add_line(lay); -	if (line->spans) { -		span->x = line->last_span->x + line->last_span->w; -		span->y = line->last_span->y; -	} else { -		span->x = line->x; -		span->y = line->y; -	} - -	if (!line->spans) line->spans = span; -	if (line->last_span) line->last_span->next = span; -	line->last_span = span; - -	return span; -} - -static void -calc_sizes(ImpRenderCtx *ctx, void *drw_data, struct Layout *lay) -{ -	struct Line *line; -	struct Span *span; - -	for (line = lay->lines; line; line = line->next) { -		for (span = line->spans; span; span = span->next) { -			ctx->drw->get_text_size(drw_data, -				span->text, span->len, -				span->size, span->styles, -				&span->w, &span->h -			); -			line->w += span->w; -			if (span->h > line->h) line->h = span->h; -		} -		if (line->w > lay->tw) lay->tw = line->w; -		lay->th += line->h; -	} -} - -static void -calc_pos(ImpRenderCtx *ctx, struct Layout *lay) -{ -	struct Line *line; -	struct Span *span; -	int x, y, x2; - -	x = lay->x; -	y = lay->y; -	for (line = lay->lines; line; line = line->next) { -		line->x = x; -		line->y = y; -		y += line->h; -		x2 = x; -		for (span = line->spans; span; span = span->next) { -			span->x = x2; -			span->y = y; -			x2 += span->w; -		} -	} -} - -static void -_imp_draw_layout(ImpRenderCtx *ctx, void *drw_data, struct Layout *lay) -{ -	struct Line *line; -	struct Span *span; - -	for (line = lay->lines; line; line = line->next) { -		for (span = line->spans; span; span = span->next) { -			ctx->drw->set_fg_color(drw_data, &span->fg); -			ctx->drw->draw_text(drw_data, -				span->x, span->y, -				span->text, span->len, -				span->size, -				span->styles -			); -		} -	} -} - -static void -text_span(ImpRenderCtx *ctx, struct Layout *lay, iks *node, char *text, size_t len) -{ -	struct Span *span; -	double cm; -	char *attr, *t, *s; -	int px = 0, cont = 1; -	int styles = IMP_NORMAL; - -	attr = r_get_style(ctx, node, "fo:font-size"); -	if (attr) { -		cm = atof(attr); -		if (strstr(attr, "pt")) cm = cm * 2.54 / 102; -		px = cm * ctx->fact_y; -	} -	attr = r_get_style(ctx, node, "fo:font-weight"); -	if (attr && strcmp(attr, "bold") == 0) styles |= IMP_BOLD; -	attr = r_get_style(ctx, node, "style:text-underline"); -	if (attr && strcmp(attr, "single") == 0) styles |= IMP_UNDERLINE; -	attr = r_get_style(ctx, node, "fo:font-style"); -	if (attr && strcmp(attr, "italic") == 0) styles |= IMP_ITALIC; - -	t = text; -	while (cont) { -		s = strchr(t, '\n'); -		if (s) { -			int len2 = s - t; -			span = add_span(lay, t, len2, px, styles); -			t = s + 1; -			len -= len2; -			add_line(lay); -		} else { -			span = add_span(lay, text, len, px, styles); -			cont = 0; -		} -		r_get_color(ctx, node, "fo:color", &span->fg); -	} -} - -static void -text_p(ImpRenderCtx *ctx, struct Layout *lay, iks *node) -{ -	iks *n, *n2; - -	add_line(lay); -	for (n = iks_child(node); n; n = iks_next(n)) { -		if (iks_type(n) == IKS_CDATA) { -			text_span(ctx, lay, node, iks_cdata(n), iks_cdata_size(n)); -		} else if (iks_strcmp(iks_name(n), "text:span") == 0) { -			for (n2 = iks_child(n); n2; n2 = iks_next(n2)) { -				if (iks_type(n2) == IKS_CDATA) { -					text_span(ctx, lay, n2, iks_cdata(n2), iks_cdata_size(n2)); -				} else if (iks_strcmp(iks_name(n2), "text:s") == 0) { -					char *attr; -					int c = 1; -					attr = iks_find_attrib(n2, "text:c"); -					if (attr) c = atoi(attr); -					if (c > 127) { -						c = 127; -						puts("bork bork"); -					} -					text_span(ctx, lay, n, lay->spaces, c); -				} else if (iks_strcmp(iks_name(n2), "text:a") == 0) { -					text_span(ctx, lay, n, iks_cdata(iks_child(n2)), iks_cdata_size(iks_child(n2))); -				} else if (iks_strcmp(iks_name(n2), "text:tab-stop") == 0) { -					text_span(ctx, lay, n, "\t", 1); -				} else if (iks_strcmp(iks_name(n2), "text:page-number") == 0) { -					char buf[8]; -					sprintf(buf, "%d", ctx->page->nr); -					text_span(ctx, lay, n, iks_stack_strdup(lay->s, buf, 0), strlen(buf)); -				} -			} -		} else if (iks_strcmp(iks_name(n), "text:line-break") == 0) { -			add_line(lay); -		} else if (iks_strcmp(iks_name(n), "text:a") == 0) { -			text_span(ctx, lay, n, iks_cdata(iks_child(n)), iks_cdata_size(iks_child(n))); -		} else if (iks_strcmp(iks_name(n), "text:page-number") == 0) { -			char buf[8]; -			sprintf(buf, "%d", ctx->page->nr); -			text_span(ctx, lay, n, iks_stack_strdup(lay->s, buf, 0), strlen(buf)); -		} -	} -} - -static void -text_list(ImpRenderCtx *ctx, struct Layout *lay, iks *node) -{ -	iks *n, *n2; - -	for (n = iks_first_tag(node); n; n = iks_next_tag(n)) { -		for (n2 = iks_first_tag(n); n2; n2 = iks_next_tag(n2)) { -			if (strcmp(iks_name(n2), "text:p") == 0) { -				text_p(ctx, lay, n2); -			} else if (strcmp(iks_name(n2), "text:ordered-list") == 0) { -				text_list(ctx, lay, n2); -			} else if (strcmp(iks_name(n2), "text:unordered-list") == 0) { -				text_list(ctx, lay, n2); -			} else if (strcmp(iks_name(n2), "text:list") == 0) { -				text_list(ctx, lay, n2); -			} -		} -	} -} - -void -r_text(ImpRenderCtx *ctx, void *drw_data, iks *node) -{ -	struct Layout lay; -	iks *n; - -	memset(&lay, 0, sizeof(struct Layout)); -	memset(&lay.spaces, ' ', 128); -	lay.s = iks_stack_new(sizeof(struct Span) * 16, 0); -	lay.x = r_get_x(ctx, node, "svg:x"); -	lay.y = r_get_y(ctx, node, "svg:y"); -	lay.w = r_get_y(ctx, node, "svg:width"); -	lay.h = r_get_y(ctx, node, "svg:height"); - -	for (n = iks_first_tag(node); n; n = iks_next_tag(n)) { -		if (strcmp(iks_name(n), "text:p") == 0) { -			text_p(ctx, &lay, n); -		} else if (strcmp(iks_name(n), "text:ordered-list") == 0) { -			text_list(ctx, &lay, n); -		} else if (strcmp(iks_name(n), "text:unordered-list") == 0) { -			text_list(ctx, &lay, n); -		} else if (strcmp(iks_name(n), "text:list") == 0) { -			text_list(ctx, &lay, n); -		} -	} - -	calc_sizes(ctx, drw_data, &lay); -	calc_pos(ctx, &lay); -	_imp_draw_layout(ctx, drw_data, &lay); - -	iks_stack_delete(lay.s); -} -/* -static void -text_span (render_ctx *ctx, text_ctx *tc, struct layout_s *lout, iks *node, char *text, int len) -{ -	if (tc->bullet_flag && tc->bullet_sz) size = tc->bullet_sz; else size = r_get_font_size (ctx, tc, node); -} - -static int -is_animated (render_ctx *ctx, text_ctx *tc, iks *node) -{ -	if (!ctx->step_mode) return 0; -	if (!tc->id) return 0; -	while (strcmp (iks_name (node), "draw:page") != 0 -		&& strcmp (iks_name (node), "style:master-page") != 0) -			node = iks_parent (node); -	node = iks_find (node, "presentation:animations"); -	if (!node) return 0; -	if (iks_find_with_attrib (node, "presentation:show-text", "draw:shape-id", tc->id)) return 1; -	return 0; -} - -static void -text_p (render_ctx *ctx, text_ctx *tc, iks *node) -{ -	if (is_animated (ctx, tc, node) && ctx->step_cnt >= ctx->step) lout->flag = 0; -	ctx->step_cnt++; - -	attr = r_get_style (ctx, node, "text:enable-numbering"); -	if (attr && strcmp (attr, "true") == 0) { -		if (iks_child (node) && tc->bullet) { -			tc->bullet_flag = 1; -			text_span (ctx, tc, lout, node, tc->bullet, strlen (tc->bullet)); -			text_span (ctx, tc, lout, node, " ", 1); -			tc->bullet_flag = 0; -		} -	} - -	if (!lout->text) { -lout->h = 0; -attr = r_get_style (ctx, node, "fo:line-height"); -if (attr) { -	int ratio = atoi (attr); -	lout->lh = ratio; -} else { -	lout->lh = 100; -} -tc->layouts = g_list_append (tc->layouts, lout); -//		g_object_unref (lout->play); -//		iks_stack_delete (s); -		return; -	} - -	attr = r_get_style (ctx, node, "fo:text-align"); -	if (attr) { -		if (strcmp (attr, "center") == 0) -			pango_layout_set_alignment (lout->play, PANGO_ALIGN_CENTER); -		else if (strcmp (attr, "end") == 0) -			pango_layout_set_alignment (lout->play, PANGO_ALIGN_RIGHT); -	} -	pango_layout_set_width (lout->play, tc->w * PANGO_SCALE); -	pango_layout_set_markup (lout->play, lout->text, lout->text_len); -	pango_layout_get_pixel_size (lout->play, &lout->w, &lout->h); -	attr = r_get_style (ctx, node, "fo:line-height"); -	if (attr) { -		int ratio = atoi (attr); -		lout->lh = ratio; -	} else { -		lout->lh = 100; -	} -	tc->layouts = g_list_append (tc->layouts, lout); -} - -static void -find_bullet (render_ctx *ctx, text_ctx *tc, iks *node) -{ -	iks *x; -	char *t; -	x = r_get_bullet (ctx, node, "text:list-level-style-bullet"); -	x = iks_find (x, "text:list-level-style-bullet"); -	t = iks_find_attrib (x, "text:bullet-char"); -	if (t) tc->bullet = t; else tc->bullet = "*"; -	x = iks_find (x, "style:properties"); -	t = iks_find_attrib (x, "fo:font-size"); -	if (t) tc->bullet_sz = tc->last_sz * atoi (t) / 100; -	else tc->bullet_sz = 0; -} - -void -r_text (render_ctx *ctx, iks *node) -{ -	tc.id = iks_find_attrib (node, "draw:id"); -	ctx->step_cnt = 0; -	for (n = iks_first_tag (node); n; n = iks_next_tag (n)) { -		if (strcmp (iks_name (n), "text:p") == 0) { -			text_p (ctx, &tc, n); -		} else if (strcmp (iks_name (n), "text:ordered-list") == 0) { -			text_list (ctx, &tc, n); -		} else if (strcmp (iks_name (n), "text:unordered-list") == 0) { -			find_bullet (ctx, &tc, n); -			text_list (ctx, &tc, n); -			tc.bullet = 0; -		} -	} - -*/ diff --git a/backend/impress/render.c b/backend/impress/render.c deleted file mode 100644 index 67b80756..00000000 --- a/backend/impress/render.c +++ /dev/null @@ -1,54 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "internal.h" - -ImpRenderCtx * -imp_create_context(const ImpDrawer *drw) -{ -	ImpRenderCtx *ctx; - -	ctx = calloc(1, sizeof(ImpRenderCtx)); -	if (!ctx) return NULL; -	ctx->drw = drw; -	return ctx; -} - -void -imp_context_set_page(ImpRenderCtx *ctx, ImpPage *page) -{ -	ctx->page = page; -	ctx->content = page->doc->content; -	ctx->styles = page->doc->styles; -} - -void -imp_context_set_step(ImpRenderCtx *ctx, int step) -{ -	ctx->step = step; -} - -void -imp_render(ImpRenderCtx *ctx, void *drw_data) -{ -	// find drawing area size -	ctx->drw->get_size(drw_data, &ctx->pix_w, &ctx->pix_h); -	// find page size -	ctx->page->doc->get_geometry(ctx); -	// calculate ratio -	ctx->fact_x = ctx->pix_w / ctx->cm_w; -	ctx->fact_y = ctx->pix_h / ctx->cm_h; -	// call renderer -	ctx->page->doc->render_page(ctx, drw_data); -} - -void -imp_delete_context(ImpRenderCtx *ctx) -{ -	free(ctx); -} diff --git a/backend/impress/zip.c b/backend/impress/zip.c deleted file mode 100644 index b1f25c8c..00000000 --- a/backend/impress/zip.c +++ /dev/null @@ -1,349 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -#include <config.h> -#include "common.h" -#include "zip.h" -#include <zlib.h> -#define _(x) x - -typedef unsigned long ulong; - -enum { -	ZIP_OK = 0, -	ZIP_NOMEM, -	ZIP_NOSIG, -	ZIP_BADZIP, -	ZIP_NOMULTI, -	ZIP_EOPEN, -	ZIP_EREAD, -	ZIP_NOFILE -}; - -struct zipfile { -	struct zipfile *next; -	char *name; -	ulong crc; -	ulong zip_size; -	ulong real_size; -	ulong pos; -}; - -struct zip_struct { -	FILE *f; -	struct zipfile *files; -	ulong cd_pos; -	ulong cd_size; -	ulong cd_offset; -	ulong head_size; -	ulong rem_size; -	ulong nr_files; -}; - -char * -zip_error (int err) -{ -	char *ret; - -	switch (err) { -		case ZIP_OK: -			ret = _("No error"); -			break; -		case ZIP_NOMEM: -			ret = _("Not enough memory"); -			break; -		case ZIP_NOSIG: -			ret = _("Cannot find ZIP signature"); -			break; -		case ZIP_BADZIP: -			ret = _("Invalid ZIP file"); -			break; -		case ZIP_NOMULTI: -			ret = _("Multi file ZIPs are not supported"); -			break; -		case ZIP_EOPEN: -			ret = _("Cannot open the file"); -			break; -		case ZIP_EREAD: -			ret = _("Cannot read data from file"); -			break; -		case ZIP_NOFILE: -			ret = _("Cannot find file in the ZIP archive"); -			break; -		default: -			ret = _("Unknown error"); -			break; -	} -	return ret; -} - -static int -find_cd (zip *z) -{ -	FILE *f; -	char *buf; -	ulong size, pos, i, flag; - -	f = z->f; -	if (fseek (f, 0, SEEK_END) != 0) return 1; -	size = ftell (f); -	if (size < 0xffff) pos = 0; else pos = size - 0xffff; -	buf = malloc (size - pos + 1); -	if (!buf) return 1; -	if (fseek (f, pos, SEEK_SET) != 0) { -		free (buf); -		return 1; -	} -	if (fread (buf, size - pos, 1, f) != 1) { -		free (buf); -		return 1; -	} -	flag = 0; -	for (i = size - pos - 3; i > 0; i--) { -		if (buf[i] == 0x50 && buf[i+1] == 0x4b && buf[i+2] == 0x05 && buf[i+3] == 0x06) { -			z->cd_pos = i + pos; -			flag = 1; -			break; -		} -	} -	free (buf); -	if (flag != 1) return 1; -	return 0; -} - -static unsigned long -get_long (unsigned char *buf) -{ -	return buf[0] + (buf[1] << 8) + (buf[2] << 16) + (buf[3] << 24); -} - -static unsigned long -get_word (unsigned char *buf) -{ -	return buf[0] + (buf[1] << 8); -} - -static int -list_files (zip *z) -{ -	unsigned char buf[46]; -	struct zipfile *zfile; -	ulong pat, fn_size; -	int nr = 0; - -	pat = z->cd_offset; -	while (nr < z->nr_files) { -		fseek (z->f, pat + z->head_size, SEEK_SET); - -		if (fread (buf, 46, 1, z->f) != 1) return ZIP_EREAD; -		if (get_long (buf) != 0x02014b50) return ZIP_BADZIP; - -		zfile = malloc (sizeof (struct zipfile)); -		if (!zfile) return ZIP_NOMEM; -		memset (zfile, 0, sizeof (struct zipfile)); - -		zfile->crc = get_long (buf + 16); -		zfile->zip_size = get_long (buf + 20); -		zfile->real_size = get_long (buf + 24); -		fn_size = get_word (buf + 28); -		zfile->pos = get_long (buf + 42); - -		zfile->name = malloc (fn_size + 1); -		if (!zfile->name) { -			free (zfile); -			return ZIP_NOMEM; -		} -		fread (zfile->name, fn_size, 1, z->f); -		zfile->name[fn_size] = '\0'; - -		zfile->next = z->files; -		z->files = zfile; - -		pat += 0x2e + fn_size + get_word (buf + 30) + get_word (buf + 32); -		nr++; -	} -	return ZIP_OK; -} - -zip * -zip_open (const char *fname, int *err) -{ -	unsigned char buf[22]; -	zip *z; -	FILE *f; - -	f = fopen (fname, "rb"); -	if (NULL == f) { -		*err = ZIP_EOPEN; -		return NULL; -	} - -	z = malloc (sizeof (zip)); -	memset (z, 0, sizeof (zip)); -	z->f = f; - -	if (find_cd (z)) { -		zip_close (z); -		*err = ZIP_NOSIG; -		return NULL; -	} - -	fseek (f, z->cd_pos, SEEK_SET); -	if (fread (buf, 22, 1, f) != 1) { -		zip_close (z); -		*err = ZIP_EREAD; -		return NULL; -	} -	z->nr_files = get_word (buf + 10); -	if (get_word (buf + 8) != z->nr_files) { -		zip_close (z); -		*err =  ZIP_NOMULTI; -		return NULL; -	} -	z->cd_size = get_long (buf + 12); -	z->cd_offset = get_long (buf + 16); -	z->rem_size = get_word (buf + 20); -	z->head_size = z->cd_pos - (z->cd_offset + z->cd_size); - -	*err = list_files (z); -	if (*err != ZIP_OK) { -		zip_close (z); -		return NULL; -	} - -	*err = ZIP_OK; -	return z; -} - -void -zip_close (zip *z) -{ -	struct zipfile *zfile, *tmp; - -	zfile = z->files; -	while (zfile) { -		tmp = zfile->next; -		if (zfile->name) free (zfile->name); -		free (zfile); -		zfile = tmp; -	} -	z->files = NULL; -	if (z->f) fclose (z->f); -	z->f = NULL; -} - -static struct zipfile * -find_file (zip *z, const char *name) -{ -	struct zipfile *zfile; - -	zfile = z->files; -	while (zfile) { -		if (strcmp (zfile->name, name) == 0) return zfile; -		zfile = zfile->next; -	} -	return NULL; -} - -static int -seek_file (zip *z, struct zipfile *zfile) -{ -	unsigned char buf[30]; - -	fseek (z->f, zfile->pos + z->head_size, SEEK_SET); -	if (fread (buf, 30, 1, z->f) != 1) return ZIP_EREAD; -	if (get_long (buf) != 0x04034b50) return ZIP_BADZIP; -	fseek (z->f, get_word (buf + 26) + get_word (buf + 28), SEEK_CUR); -	return ZIP_OK; -} - -iks * -zip_load_xml (zip *z, const char *name, int *err) -{ -	iksparser *prs; -	char *real_buf; -	iks *x; -	struct zipfile *zfile; - -	*err = ZIP_OK; - -	zfile = find_file (z, name); -	if (!zfile) { -		*err = ZIP_NOFILE; -		return NULL; -	} - -	seek_file (z, zfile); - -	real_buf = malloc (zfile->real_size + 1); -	if (zfile->zip_size < zfile->real_size) { -		char *zip_buf; -		z_stream zs; -		zs.zalloc = NULL; -		zs.zfree = NULL; -		zs.opaque = NULL; -		zip_buf = malloc (zfile->zip_size); -		fread (zip_buf, zfile->zip_size, 1, z->f); -		zs.next_in = zip_buf; -		zs.avail_in = zfile->zip_size; -		zs.next_out = real_buf; -		zs.avail_out = zfile->real_size; -		inflateInit2 (&zs, -MAX_WBITS); -		inflate (&zs, Z_FINISH); -		inflateEnd (&zs); -		free (zip_buf); -	} else { -		fread (real_buf, zfile->real_size, 1, z->f); -	} - -	real_buf[zfile->real_size] = '\0'; -	prs = iks_dom_new (&x); -	iks_parse (prs, real_buf, zfile->real_size, 1); -	iks_parser_delete (prs); -	free (real_buf); -	return x; -} - -unsigned long zip_get_size (zip *z, const char *name) -{ -	struct zipfile *zf; - -	zf = find_file (z, name); -	if (!zf) return 0; -	return zf->real_size; -} - -int zip_load (zip *z, const char *name, char *buf) -{ -	struct zipfile *zfile; - -	zfile = find_file (z, name); -	if (!zfile) return ZIP_NOFILE; - -	seek_file (z, zfile); - -	if (zfile->zip_size < zfile->real_size) { -		char *zip_buf; -		z_stream zs; -		zs.zalloc = NULL; -		zs.zfree = NULL; -		zs.opaque = NULL; -		zip_buf = malloc (zfile->zip_size); -		fread (zip_buf, zfile->zip_size, 1, z->f); -		zs.next_in = zip_buf; -		zs.avail_in = zfile->zip_size; -		zs.next_out = buf; -		zs.avail_out = zfile->real_size; -		inflateInit2 (&zs, -MAX_WBITS); -		inflate (&zs, Z_FINISH); -		inflateEnd (&zs); -		free (zip_buf); -	} else { -		fread (buf, zfile->real_size, 1, z->f); -	} - -	return ZIP_OK; -} diff --git a/backend/impress/zip.h b/backend/impress/zip.h deleted file mode 100644 index 23ff3631..00000000 --- a/backend/impress/zip.h +++ /dev/null @@ -1,18 +0,0 @@ -/* imposter (OO.org Impress viewer) -** Copyright (C) 2003-2005 Gurer Ozen -** This code is free software; you can redistribute it and/or -** modify it under the terms of GNU General Public License. -*/ - -struct zip_struct; -typedef struct zip_struct zip; - -char *zip_error (int err); - -zip *zip_open (const char *fname, int *err); -void zip_close (zip *z); - -iks *zip_load_xml (zip *z, const char *name, int *err); - -unsigned long zip_get_size (zip *z, const char *name); -int zip_load (zip *z, const char *name, char *buf); diff --git a/configure.ac b/configure.ac index 673097b9..20c48281 100644 --- a/configure.ac +++ b/configure.ac @@ -673,21 +673,6 @@ AM_CONDITIONAL(ENABLE_XPS, test x$enable_xps = xyes)  dnl ================== End of XPS checks =================================================== -dnl ================== impress book checks =================================================== - -AC_ARG_ENABLE(impress, -    [AS_HELP_STRING([--enable-impress], -                    [Compile with support for impress presentations])], -    [enable_impress=$enableval], -    [enable_impress=no]) - -if test "x$enable_impress" = "xyes"; then -    AC_DEFINE([ENABLE_IMPRESS], [1], [Enable support for impress.]) -fi -AM_CONDITIONAL(ENABLE_IMPRESS, test x$enable_impress = xyes) - -dnl ================== End of impress book checks ============================================ -  dnl =================== Mime types list ====================================================  if test "x$enable_pdf" = "xyes" ; then @@ -714,9 +699,6 @@ fi  if test "x$enable_xps" = "xyes"; then      ATRIL_MIME_TYPES="${ATRIL_MIME_TYPES}application/oxps;application/vnd.ms-xpsdocument;"  fi -if test "x$enable_impress" = "xyes"; then -    ATRIL_MIME_TYPES="${ATRIL_MIME_TYPES}application/vnd.sun.xml.impress;application/vnd.oasis.opendocument.presentation;" -fi  AC_SUBST(ATRIL_MIME_TYPES)  AC_CHECK_FUNC(localtime_r, AC_DEFINE(HAVE_LOCALTIME_R, 1, [Defines if localtime_r is available on your system])) @@ -791,7 +773,6 @@ backend/comics/Makefile  backend/djvu/Makefile  backend/dvi/Makefile  backend/dvi/mdvi-lib/Makefile -backend/impress/Makefile  backend/pdf/Makefile  backend/pixbuf/Makefile  backend/ps/Makefile @@ -881,5 +862,4 @@ Configure summary:      Pixbuf Backend.....:    $enable_pixbuf      Comics Backend.....:    $enable_comics      XPS Backend........:    $enable_xps -    Impress Backend....:    $enable_impress  " diff --git a/po/POTFILES.in b/po/POTFILES.in index d94ff923..62dd53a7 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,9 +9,6 @@ backend/dvi/dvi-document.c  [type: gettext/ini] backend/dvi/dvidocument.atril-backend.in  backend/pdf/ev-poppler.cc  [type: gettext/ini] backend/pdf/pdfdocument.atril-backend.in -backend/impress/impress-document.c -[type: gettext/ini] backend/impress/impressdocument.atril-backend.in -backend/impress/zip.c  backend/ps/ev-spectre.c  [type: gettext/ini] backend/ps/psdocument.atril-backend.in  backend/tiff/tiff-document.c | 
