/*
* about: URI scheme
*
* Copyright (C) 2017 Patrick McDermott
*
* This file is part of Marquee.
*
* Marquee 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 3 of the License, or
* (at your option) any later version.
*
* Marquee 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 Marquee. If not, see .
*/
#include
#include
#include "about.h"
#include "application.h"
#include "about/paths.h"
static GHashTable *
parse_query_string(gchar *str)
{
GHashTable *hash_table;
gchar *key;
gchar *val;
hash_table = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, g_free);
while (*str) {
key = str;
for (; *str && *str != '='; ++str);
if (!*str) {
g_hash_table_insert(hash_table,
g_uri_unescape_string(key, NULL), NULL);
break;
}
*str = '\0';
val = ++str;
for (; *str && *str != '&'; ++str);
if (!*str) {
g_hash_table_insert(hash_table,
g_uri_unescape_string(key, NULL),
g_uri_unescape_string(val, NULL));
break;
}
*str = '\0';
g_hash_table_insert(hash_table,
g_uri_unescape_string(key, NULL),
g_uri_unescape_string(val, NULL));
++str;
}
return hash_table;
}
void
mq_about_request(WebKitURISchemeRequest *request, MqApplication *application)
{
const gchar *path;
gchar *query_str;
GHashTable *query;
path = webkit_uri_scheme_request_get_path(request);
query_str = strchr(webkit_uri_scheme_request_get_uri(request), '?');
if (query_str && query_str[1]) {
query_str = g_strdup(query_str + 1);
query = parse_query_string(query_str);
g_free(query_str);
} else {
query = NULL;
}
if (g_strcmp0(path, "") == 0 || g_strcmp0(path, "version") == 0) {
mq_about_version_response(application, query, request);
} else if (g_strcmp0(path, "preferences") == 0) {
mq_about_preferences_response(application, query, request);
} else if (g_strcmp0(path, "marquee") == 0) {
mq_about_marquee_response(application, query, request);
} else {
return;
}
if (query) {
g_hash_table_unref(query);
}
}
void
mq_about_response(WebKitURISchemeRequest *request, gchar *contents)
{
gsize stream_length;
GInputStream *stream;
stream_length = strlen(contents);
stream = g_memory_input_stream_new_from_data(contents,
stream_length, g_free);
webkit_uri_scheme_request_finish(request, stream, stream_length,
"text/html");
g_object_unref(stream);
}
void
mq_about_redirect(WebKitURISchemeRequest *request, const gchar *uri)
{
WebKitWebView *web_view;
web_view = webkit_uri_scheme_request_get_web_view(request);
webkit_web_view_load_request(web_view, webkit_uri_request_new(uri));
mq_about_response(request, g_strdup(""));
}