summaryrefslogtreecommitdiff
path: root/gtk/viewdata.c
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2014-08-03 10:12:18 +0100
committerVincent Sanders <vince@kyllikki.org>2014-08-04 00:37:21 +0100
commitc4d1ece421b3c7fb5f0b13c042d124671734afe2 (patch)
treeb1d2a29cbaccfe6e3ac78109d4447c6c5ee7927e /gtk/viewdata.c
parent2353790a4519c39976f24c90ff64b4ecb9833823 (diff)
downloadnetsurf-c4d1ece421b3c7fb5f0b13c042d124671734afe2.tar.gz
netsurf-c4d1ece421b3c7fb5f0b13c042d124671734afe2.tar.bz2
extend viewdata to files and use it for box tree dump
Diffstat (limited to 'gtk/viewdata.c')
-rw-r--r--gtk/viewdata.c177
1 files changed, 151 insertions, 26 deletions
diff --git a/gtk/viewdata.c b/gtk/viewdata.c
index cb6e7c8de..1eb78ccf1 100644
--- a/gtk/viewdata.c
+++ b/gtk/viewdata.c
@@ -447,27 +447,95 @@ window_init(const char *title,
}
/**
- * create a new tab with page source
+ * open a window to dispaly an existing file.
+ */
+static nserror
+window_init_fname(const char *title,
+ const char *leafname,
+ const char *filename)
+{
+ nserror ret;
+ FILE *f;
+ char *ndata;
+ size_t ndata_len;
+
+ f = fopen(filename, "r");
+ if (f == NULL) {
+ return NSERROR_NOT_FOUND;
+ }
+ if (fseek(f, 0, SEEK_END) != 0) {
+ fclose(f);
+ return NSERROR_BAD_SIZE;
+ }
+
+ ndata_len = ftell(f);
+
+ if (fseek(f, 0, SEEK_SET) != 0) {
+ fclose(f);
+ return NSERROR_BAD_SIZE;
+ }
+
+ ndata = malloc(ndata_len);
+
+ fread(ndata, 1, ndata_len, f);
+
+ fclose(f);
+
+ ret = window_init(title, leafname, ndata, ndata_len);
+
+ free(ndata);
+
+ return ret;
+}
+
+/**
+ * open a new tab from an existing file.
+ */
+static nserror
+tab_init_fname(const char *title,
+ const char *leafname,
+ const char *fname)
+{
+ nsurl *url;
+ nserror ret;
+
+ /* Open tab on temporary file */
+ ret = netsurf_path_to_nsurl(fname, &url);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ /* open tab on temportary file */
+ ret = browser_window_create(BW_CREATE_TAB | BW_CREATE_HISTORY, url, NULL, NULL, NULL);
+ nsurl_unref(url);
+ if (ret != NSERROR_OK) {
+ return ret;
+ }
+
+ return NSERROR_OK;
+}
+
+/**
+ * create a new tab from data.
*/
static nserror
tab_init(const char *title,
- const char *filename,
+ const char *leafname,
char *ndata,
size_t ndata_len)
{
- nsurl *url;
nserror ret;
gchar *fname;
gint handle;
FILE *f;
- handle = g_file_open_tmp("nsgtksourceXXXXXX", &fname, NULL);
+ handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL);
if ((handle == -1) || (fname == NULL)) {
return NSERROR_SAVE_FAILED;
}
close(handle); /* in case it was binary mode */
- /* save data to temportary file */
+ /* save data to temporary file */
f = fopen(fname, "w");
if (f == NULL) {
warn_user(messages_get("gtkSourceTabError"), 0);
@@ -477,33 +545,23 @@ tab_init(const char *title,
fprintf(f, "%s", ndata);
fclose(f);
- /* Open tab on temporary file */
- ret = netsurf_path_to_nsurl(fname, &url);
- g_free(fname);
- if (ret != NSERROR_OK) {
- return ret;
- }
-
- /* open tab on temportary file */
- ret = browser_window_create(BW_CREATE_TAB | BW_CREATE_HISTORY, url, NULL, NULL, NULL);
- nsurl_unref(url);
- if (ret != NSERROR_OK) {
- return ret;
+ ret = tab_init_fname(title, leafname, fname);
+ if (ret == NSERROR_OK) {
+ free(ndata);
}
- free(ndata);
+ g_free(fname);
- return NSERROR_OK;
+ return ret;
}
/**
- * create a new tab with page source
+ * open an editor from an existing file.
*/
static nserror
-editor_init(const char *title,
- const char *filename,
- char *ndata,
- size_t ndata_len)
+editor_init_fname(const char *title,
+ const char *leafname,
+ const char *fname)
{
/* find user configured app for opening text/plain */
@@ -527,10 +585,48 @@ editor_init(const char *title,
*
* execute target app on saved data
*/
+ return NSERROR_OK;
+}
- free(ndata);
+/**
+ * create a new tab with page source
+ */
+static nserror
+editor_init(const char *title,
+ const char *leafname,
+ char *ndata,
+ size_t ndata_len)
+{
- return NSERROR_OK;
+ nserror ret;
+ gchar *fname;
+ gint handle;
+ FILE *f;
+
+ handle = g_file_open_tmp("nsgtkdataXXXXXX", &fname, NULL);
+ if ((handle == -1) || (fname == NULL)) {
+ return NSERROR_SAVE_FAILED;
+ }
+ close(handle); /* in case it was binary mode */
+
+ /* save data to temporary file */
+ f = fopen(fname, "w");
+ if (f == NULL) {
+ warn_user(messages_get("gtkSourceTabError"), 0);
+ g_free(fname);
+ return NSERROR_SAVE_FAILED;
+ }
+ fprintf(f, "%s", ndata);
+ fclose(f);
+
+ ret = editor_init_fname(title, leafname, fname);
+ if (ret == NSERROR_OK) {
+ free(ndata);
+ }
+
+ g_free(fname);
+
+ return ret;
}
/* exported interface documented in gtk/viewdata.h */
@@ -567,3 +663,32 @@ nsgtk_viewdata(const char *title,
return ret;
}
+
+/* exported interface documented in gtk/viewdata.h */
+nserror
+nsgtk_viewfile(const char *title,
+ const char *leafname,
+ const char *filename)
+{
+ nserror ret;
+
+ switch (nsoption_int(developer_view)) {
+ case 0:
+ ret = window_init_fname(title, leafname, filename);
+ break;
+
+ case 1:
+ ret = tab_init_fname(title, leafname, filename);
+ break;
+
+ case 2:
+ ret = editor_init_fname(title, leafname, filename);
+ break;
+
+ default:
+ ret = NSERROR_BAD_PARAMETER;
+ break;
+ }
+
+ return ret;
+}