summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@kyllikki.org>2019-10-30 21:26:53 +0000
committerVincent Sanders <vince@kyllikki.org>2019-10-30 21:33:27 +0000
commit4eb06ad2cf2b7025974618be943dea9718d09319 (patch)
tree8f926311aca3505f901bb58ea8ed5106b9ef95db
parent4b0c3f0efef2239dd5d62a9e73eeec4037c056a4 (diff)
downloadnetsurf-4eb06ad2cf2b7025974618be943dea9718d09319.tar.gz
netsurf-4eb06ad2cf2b7025974618be943dea9718d09319.tar.bz2
move the fallback text for about handler into messages handler
-rw-r--r--content/fetchers/about.c126
-rw-r--r--resources/FatMessages6
-rw-r--r--test/messages.c3
-rw-r--r--utils/hashtable.c6
-rw-r--r--utils/messages.c92
-rw-r--r--utils/messages.h16
6 files changed, 127 insertions, 122 deletions
diff --git a/content/fetchers/about.c b/content/fetchers/about.c
index e98c6ec35..02bac8175 100644
--- a/content/fetchers/about.c
+++ b/content/fetchers/about.c
@@ -79,25 +79,6 @@ struct about_handlers {
bool hidden; /**< If entry should be hidden in listing */
};
-/**
- * authentication query description if messages fails to retrieve usable text
- */
-static const char *authentication_description_fallback = "The site %s is requesting your username and password. The realm is \"%s\"";
-
-/**
- * privacy query description if messages fails to retrieve usable text
- */
-static const char *privacy_description_fallback = "A privacy error occurred while communicating with %s this may be a site configuration error or an attempt to steal private information (passwords, messages or credit cards)";
-
-/**
- * timeout query description if messages fails to retrieve usable text
- */
-static const char *timeout_description_fallback = "A connection to %s could not be established. The site may be temporarily unavailable or too busy to respond.";
-
-/**
- * fetcherror query description if messages fails to retrieve usable text
- */
-static const char *fetcherror_description_fallback = "An error occoured when connecting to %s";
/**
* issue fetch callbacks with locking
@@ -740,7 +721,6 @@ get_authentication_description(struct nsurl *url,
char *url_s;
size_t url_l;
char *str = NULL;
- int slen;
const char *key;
res = nsurl_get(url, NSURL_HOST, &url_s, &url_l);
@@ -755,23 +735,46 @@ get_authentication_description(struct nsurl *url,
}
str = messages_get_buff(key, url_s, realm);
- NSLOG(netsurf, INFO,
- "key:%s url:%s realm:%s str:%s", key, url_s, realm, str);
-
- if ((str != NULL) && (strcmp(key, str) != 0)) {
+ if (str != NULL) {
+ NSLOG(netsurf, INFO,
+ "key:%s url:%s realm:%s str:%s",
+ key, url_s, realm, str);
*out_str = str;
} else {
- /* no message so fallback */
- slen = snprintf(str, 0, authentication_description_fallback,
- url_s, realm) + 1;
- str = malloc(slen);
- if (str == NULL) {
- res = NSERROR_NOMEM;
- } else {
- snprintf(str, slen, authentication_description_fallback,
- url_s, realm);
- *out_str = str;
- }
+ res = NSERROR_NOMEM;
+ }
+
+ free(url_s);
+
+ return res;
+}
+
+
+/**
+ * generate a generic query description
+ */
+static nserror
+get_query_description(struct nsurl *url,
+ const char *key,
+ char **out_str)
+{
+ nserror res;
+ char *url_s;
+ size_t url_l;
+ char *str = NULL;
+
+ /* get the host in question */
+ res = nsurl_get(url, NSURL_HOST, &url_s, &url_l);
+ if (res != NSERROR_OK) {
+ return res;
+ }
+
+ /* obtain the description with the url substituted */
+ str = messages_get_buff(key, url_s);
+ if (str == NULL) {
+ res = NSERROR_NOMEM;
+ } else {
+ *out_str = str;
}
free(url_s);
@@ -949,56 +952,6 @@ fetch_about_query_auth_handler_aborted:
/**
- * generate a query description
- */
-static nserror
-get_query_description(struct nsurl *url,
- const char *key,
- const char *fallback,
- char **out_str)
-{
- nserror res;
- char *url_s;
- size_t url_l;
- char *str = NULL;
-
- /* get the host in question */
- res = nsurl_get(url, NSURL_HOST, &url_s, &url_l);
- if (res != NSERROR_OK) {
- return res;
- }
-
- /* obtain the description with the url substituted */
- str = messages_get_buff(key, url_s);
- if ((str != NULL) && (strcmp(key, str) == 0)) {
- /* the returned string was simply the key */
- free(str);
- str = NULL;
- }
- if (str == NULL) {
- /* failed to get suitable translated message text so
- * fall back to basic english.
- */
- int slen;
- slen = snprintf(str, 0, fallback, url_s) + 1;
- str = malloc(slen);
- if (str != NULL) {
- snprintf(str, slen, fallback, url_s);
- }
- }
-
- if (str == NULL) {
- res = NSERROR_NOMEM;
- } else {
- *out_str = str;
- }
- free(url_s);
-
- return res;
-}
-
-
-/**
* Handler to generate about scheme privacy query page
*
* \param ctx The fetcher context.
@@ -1064,7 +1017,6 @@ static bool fetch_about_query_privacy_handler(struct fetch_about_context *ctx)
res = get_query_description(siteurl,
"PrivacyDescription",
- privacy_description_fallback,
&description);
if (res == NSERROR_OK) {
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
@@ -1187,7 +1139,6 @@ static bool fetch_about_query_timeout_handler(struct fetch_about_context *ctx)
res = get_query_description(siteurl,
"TimeoutDescription",
- timeout_description_fallback,
&description);
if (res == NSERROR_OK) {
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
@@ -1311,7 +1262,6 @@ fetch_about_query_fetcherror_handler(struct fetch_about_context *ctx)
res = get_query_description(siteurl,
"FetchErrorDescription",
- fetcherror_description_fallback,
&description);
if (res == NSERROR_OK) {
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
diff --git a/resources/FatMessages b/resources/FatMessages
index 06d61c942..5ebf60754 100644
--- a/resources/FatMessages
+++ b/resources/FatMessages
@@ -25,7 +25,7 @@
#
# The split-messages tool requires keys for all languages to be
# grouped together but language order is not important. If a key for a
-# specific language is ommited the default language value will be used
+# specific language is omitted the default language value will be used
# instead (currently en)
#
# If you find something tagged 'all', but it is only relevant to a specific
@@ -1099,8 +1099,8 @@ en.all.TryAgain: Try Again
# Fetch error interface
# =======================
#
-en.all.FetchErrorTitle:Error occured fetching page
-en.all.FetchErrorDescription:An error occoured when connecting to %s
+en.all.FetchErrorTitle:Error occurred fetching page
+en.all.FetchErrorDescription:An error occurred when connecting to %s
# SSL certificate viewer
diff --git a/test/messages.c b/test/messages.c
index ae82d1ede..3ec770a56 100644
--- a/test/messages.c
+++ b/test/messages.c
@@ -118,8 +118,7 @@ START_TEST(message_get_buff_test)
ck_assert_int_eq(res, NSERROR_OK);
buf = messages_get_buff("DefinitelyNotAKey");
- ck_assert_str_eq(buf, "DefinitelyNotAKey");
- free(buf);
+ ck_assert(buf == NULL);
buf = messages_get_buff("NoMemory");
ck_assert_str_eq(buf, "NetSurf is running out of memory. Please free some memory and try again.");
diff --git a/utils/hashtable.c b/utils/hashtable.c
index 4935d6b3f..aa162cbc4 100644
--- a/utils/hashtable.c
+++ b/utils/hashtable.c
@@ -347,10 +347,12 @@ const char *hash_get(struct hash_table *ht, const char *key)
h = hash_string_fnv(key, &key_length);
c = h % ht->nchains;
- for (e = ht->chain[c]; e; e = e->next)
+ for (e = ht->chain[c]; e; e = e->next) {
if ((key_length == e->key_length) &&
- (memcmp(key, e->pairing, key_length) == 0))
+ (memcmp(key, e->pairing, key_length) == 0)) {
return e->pairing + key_length + 1;
+ }
+ }
return NULL;
}
diff --git a/utils/messages.c b/utils/messages.c
index 197d45ea6..5525e18cc 100644
--- a/utils/messages.c
+++ b/utils/messages.c
@@ -42,11 +42,69 @@
/** Messages are stored in a fixed-size hash table. */
#define HASH_SIZE 101
-/** The hash table used to store the standard Messages file for the old API */
+/**
+ * The hash table used to store the standard Messages file for the old API
+ */
static struct hash_table *messages_hash = NULL;
/**
+ * Create a message context
+ *
+ * generate a message context populated with english fallbacks for
+ * some formatted messages.
+ */
+static struct hash_table *messages_create_ctx(int hash_size)
+{
+ struct hash_table *nctx;
+ const struct {
+ const char *key;
+ const char *value;
+ } fallback[] = {
+ { "LoginDescription",
+ "The site %s is requesting your username and password. "
+ "The realm is \"%s\""},
+ { "PrivacyDescription",
+ "A privacy error occurred while communicating with %s this "
+ "may be a site configuration error or an attempt to steal "
+ "private information (passwords, messages or credit cards)"},
+ { "TimeoutDescription",
+ "A connection to %s could not be established. The site may "
+ "be temporarily unavailable or too busy to respond."},
+ { "FetchErrorDescription",
+ "An error occurred when connecting to %s"},
+ { NULL, NULL}
+ };
+ nctx = hash_create(hash_size);
+
+ if (nctx != NULL) {
+ int floop;
+ for (floop = 0; fallback[floop].key != NULL; floop++) {
+ hash_add(nctx,
+ fallback[floop].key,
+ fallback[floop].value);
+ }
+ }
+
+ return nctx;
+}
+
+/**
+ * Free memory used by a messages hash.
+ * The context will not be valid after this function returns.
+ *
+ * \param ctx context of messages file to free
+ */
+static void messages_destroy_ctx(struct hash_table *ctx)
+{
+ if (ctx == NULL)
+ return;
+
+ hash_destroy(ctx);
+}
+
+
+/**
* Read keys and values from messages file.
*
* \param path pathname of messages file
@@ -66,7 +124,7 @@ static nserror messages_load_ctx(const char *path, struct hash_table **ctx)
return hash_add_file(*ctx, path);
}
- nctx = hash_create(HASH_SIZE);
+ nctx = messages_create_ctx(HASH_SIZE);
if (nctx == NULL) {
NSLOG(netsurf, INFO,
"Unable to create hash table for messages file %s",
@@ -115,21 +173,6 @@ messages_get_ctx(const char *key, struct hash_table *ctx)
}
-/**
- * Free memory used by a messages hash.
- * The context will not be valid after this function returns.
- *
- * \param ctx context of messages file to free
- */
-static void messages_destroy_ctx(struct hash_table *ctx)
-{
- if (ctx == NULL)
- return;
-
- hash_destroy(ctx);
-}
-
-
/* exported interface documented in messages.h */
nserror messages_add_from_file(const char *path)
{
@@ -148,7 +191,7 @@ nserror messages_add_from_inline(const uint8_t *data, size_t size)
{
/* ensure the hash table is initialised */
if (messages_hash == NULL) {
- messages_hash = hash_create(HASH_SIZE);
+ messages_hash = messages_create_ctx(HASH_SIZE);
}
if (messages_hash == NULL) {
NSLOG(netsurf, INFO, "Unable to create hash table");
@@ -157,6 +200,7 @@ nserror messages_add_from_inline(const uint8_t *data, size_t size)
return hash_add_inline(messages_hash, data, size);
}
+
/* exported interface documented in messages.h */
char *messages_get_buff(const char *key, ...)
{
@@ -165,7 +209,17 @@ char *messages_get_buff(const char *key, ...)
int buff_len = 0;
va_list ap;
- msg_fmt = messages_get_ctx(key, messages_hash);
+ assert(key != NULL);
+
+ if (messages_hash == NULL) {
+ return NULL;
+ }
+
+ msg_fmt = hash_get(messages_hash, key);
+
+ if (msg_fmt == NULL) {
+ return NULL;
+ }
va_start(ap, key);
buff_len = vsnprintf(buff, buff_len, msg_fmt, ap);
diff --git a/utils/messages.h b/utils/messages.h
index 635d6e8e4..5da35e4ad 100644
--- a/utils/messages.h
+++ b/utils/messages.h
@@ -16,7 +16,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-/** \file
+/**
+ * \file
* Localised message support (interface).
*
* The messages module loads a file of keys and associated strings, and
@@ -30,8 +31,8 @@
* file table. Use the _ctx versions of the functions to do this.
*/
-#ifndef _NETSURF_UTILS_MESSAGES_H_
-#define _NETSURF_UTILS_MESSAGES_H_
+#ifndef NETSURF_UTILS_MESSAGES_H_
+#define NETSURF_UTILS_MESSAGES_H_
#include <stdint.h>
@@ -90,13 +91,12 @@ const char *messages_get_sslcode(ssl_cert_err code);
/**
* Formatted message from a key in the global message hash.
*
- * \param key key of message
+ * \param key key of message
* \param ... message parameters
- * \return buffer containing formatted message text or NULL if memory
- * is unavailable. The caller owns the returned buffer and is
- * responsible for freeing it.
+ * \return buffer containing formatted message text or NULL if key is
+ * unavailable or memory allocation failed. The caller owns the
+ * returned buffer and is responsible for freeing it.
*/
-
char *messages_get_buff(const char *key, ...);
/**