mirror of
https://github.com/netsurf-browser/netsurf
synced 2024-11-22 06:21:45 +03:00
move the fallback text for about handler into messages handler
This commit is contained in:
parent
4b0c3f0efe
commit
4eb06ad2cf
@ -79,25 +79,6 @@ struct about_handlers {
|
|||||||
bool hidden; /**< If entry should be hidden in listing */
|
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
|
* issue fetch callbacks with locking
|
||||||
@ -740,7 +721,6 @@ get_authentication_description(struct nsurl *url,
|
|||||||
char *url_s;
|
char *url_s;
|
||||||
size_t url_l;
|
size_t url_l;
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
int slen;
|
|
||||||
const char *key;
|
const char *key;
|
||||||
|
|
||||||
res = nsurl_get(url, NSURL_HOST, &url_s, &url_l);
|
res = nsurl_get(url, NSURL_HOST, &url_s, &url_l);
|
||||||
@ -755,24 +735,47 @@ get_authentication_description(struct nsurl *url,
|
|||||||
}
|
}
|
||||||
|
|
||||||
str = messages_get_buff(key, url_s, realm);
|
str = messages_get_buff(key, url_s, realm);
|
||||||
|
if (str != NULL) {
|
||||||
NSLOG(netsurf, INFO,
|
NSLOG(netsurf, INFO,
|
||||||
"key:%s url:%s realm:%s str:%s", key, url_s, realm, str);
|
"key:%s url:%s realm:%s str:%s",
|
||||||
|
key, url_s, realm, str);
|
||||||
if ((str != NULL) && (strcmp(key, str) != 0)) {
|
|
||||||
*out_str = str;
|
*out_str = str;
|
||||||
} else {
|
} else {
|
||||||
/* no message so fallback */
|
res = NSERROR_NOMEM;
|
||||||
slen = snprintf(str, 0, authentication_description_fallback,
|
}
|
||||||
url_s, realm) + 1;
|
|
||||||
str = malloc(slen);
|
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) {
|
if (str == NULL) {
|
||||||
res = NSERROR_NOMEM;
|
res = NSERROR_NOMEM;
|
||||||
} else {
|
} else {
|
||||||
snprintf(str, slen, authentication_description_fallback,
|
|
||||||
url_s, realm);
|
|
||||||
*out_str = str;
|
*out_str = str;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
free(url_s);
|
free(url_s);
|
||||||
|
|
||||||
@ -948,56 +951,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
|
* Handler to generate about scheme privacy query page
|
||||||
*
|
*
|
||||||
@ -1064,7 +1017,6 @@ static bool fetch_about_query_privacy_handler(struct fetch_about_context *ctx)
|
|||||||
|
|
||||||
res = get_query_description(siteurl,
|
res = get_query_description(siteurl,
|
||||||
"PrivacyDescription",
|
"PrivacyDescription",
|
||||||
privacy_description_fallback,
|
|
||||||
&description);
|
&description);
|
||||||
if (res == NSERROR_OK) {
|
if (res == NSERROR_OK) {
|
||||||
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
|
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,
|
res = get_query_description(siteurl,
|
||||||
"TimeoutDescription",
|
"TimeoutDescription",
|
||||||
timeout_description_fallback,
|
|
||||||
&description);
|
&description);
|
||||||
if (res == NSERROR_OK) {
|
if (res == NSERROR_OK) {
|
||||||
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
|
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,
|
res = get_query_description(siteurl,
|
||||||
"FetchErrorDescription",
|
"FetchErrorDescription",
|
||||||
fetcherror_description_fallback,
|
|
||||||
&description);
|
&description);
|
||||||
if (res == NSERROR_OK) {
|
if (res == NSERROR_OK) {
|
||||||
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
|
res = ssenddataf(ctx, "<div><p>%s</p></div>", description);
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#
|
#
|
||||||
# The split-messages tool requires keys for all languages to be
|
# The split-messages tool requires keys for all languages to be
|
||||||
# grouped together but language order is not important. If a key for a
|
# 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)
|
# instead (currently en)
|
||||||
#
|
#
|
||||||
# If you find something tagged 'all', but it is only relevant to a specific
|
# 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
|
# Fetch error interface
|
||||||
# =======================
|
# =======================
|
||||||
#
|
#
|
||||||
en.all.FetchErrorTitle:Error occured fetching page
|
en.all.FetchErrorTitle:Error occurred fetching page
|
||||||
en.all.FetchErrorDescription:An error occoured when connecting to %s
|
en.all.FetchErrorDescription:An error occurred when connecting to %s
|
||||||
|
|
||||||
|
|
||||||
# SSL certificate viewer
|
# SSL certificate viewer
|
||||||
|
@ -118,8 +118,7 @@ START_TEST(message_get_buff_test)
|
|||||||
ck_assert_int_eq(res, NSERROR_OK);
|
ck_assert_int_eq(res, NSERROR_OK);
|
||||||
|
|
||||||
buf = messages_get_buff("DefinitelyNotAKey");
|
buf = messages_get_buff("DefinitelyNotAKey");
|
||||||
ck_assert_str_eq(buf, "DefinitelyNotAKey");
|
ck_assert(buf == NULL);
|
||||||
free(buf);
|
|
||||||
|
|
||||||
buf = messages_get_buff("NoMemory");
|
buf = messages_get_buff("NoMemory");
|
||||||
ck_assert_str_eq(buf, "NetSurf is running out of memory. Please free some memory and try again.");
|
ck_assert_str_eq(buf, "NetSurf is running out of memory. Please free some memory and try again.");
|
||||||
|
@ -347,10 +347,12 @@ const char *hash_get(struct hash_table *ht, const char *key)
|
|||||||
h = hash_string_fnv(key, &key_length);
|
h = hash_string_fnv(key, &key_length);
|
||||||
c = h % ht->nchains;
|
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) &&
|
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 e->pairing + key_length + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -42,10 +42,68 @@
|
|||||||
/** Messages are stored in a fixed-size hash table. */
|
/** Messages are stored in a fixed-size hash table. */
|
||||||
#define HASH_SIZE 101
|
#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;
|
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.
|
* Read keys and values from messages file.
|
||||||
*
|
*
|
||||||
@ -66,7 +124,7 @@ static nserror messages_load_ctx(const char *path, struct hash_table **ctx)
|
|||||||
return hash_add_file(*ctx, path);
|
return hash_add_file(*ctx, path);
|
||||||
}
|
}
|
||||||
|
|
||||||
nctx = hash_create(HASH_SIZE);
|
nctx = messages_create_ctx(HASH_SIZE);
|
||||||
if (nctx == NULL) {
|
if (nctx == NULL) {
|
||||||
NSLOG(netsurf, INFO,
|
NSLOG(netsurf, INFO,
|
||||||
"Unable to create hash table for messages file %s",
|
"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 */
|
/* exported interface documented in messages.h */
|
||||||
nserror messages_add_from_file(const char *path)
|
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 */
|
/* ensure the hash table is initialised */
|
||||||
if (messages_hash == NULL) {
|
if (messages_hash == NULL) {
|
||||||
messages_hash = hash_create(HASH_SIZE);
|
messages_hash = messages_create_ctx(HASH_SIZE);
|
||||||
}
|
}
|
||||||
if (messages_hash == NULL) {
|
if (messages_hash == NULL) {
|
||||||
NSLOG(netsurf, INFO, "Unable to create hash table");
|
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);
|
return hash_add_inline(messages_hash, data, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* exported interface documented in messages.h */
|
/* exported interface documented in messages.h */
|
||||||
char *messages_get_buff(const char *key, ...)
|
char *messages_get_buff(const char *key, ...)
|
||||||
{
|
{
|
||||||
@ -165,7 +209,17 @@ char *messages_get_buff(const char *key, ...)
|
|||||||
int buff_len = 0;
|
int buff_len = 0;
|
||||||
va_list ap;
|
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);
|
va_start(ap, key);
|
||||||
buff_len = vsnprintf(buff, buff_len, msg_fmt, ap);
|
buff_len = vsnprintf(buff, buff_len, msg_fmt, ap);
|
||||||
|
@ -16,7 +16,8 @@
|
|||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/**
|
||||||
|
* \file
|
||||||
* Localised message support (interface).
|
* Localised message support (interface).
|
||||||
*
|
*
|
||||||
* The messages module loads a file of keys and associated strings, and
|
* 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.
|
* file table. Use the _ctx versions of the functions to do this.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _NETSURF_UTILS_MESSAGES_H_
|
#ifndef NETSURF_UTILS_MESSAGES_H_
|
||||||
#define _NETSURF_UTILS_MESSAGES_H_
|
#define NETSURF_UTILS_MESSAGES_H_
|
||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
@ -92,11 +93,10 @@ const char *messages_get_sslcode(ssl_cert_err code);
|
|||||||
*
|
*
|
||||||
* \param key key of message
|
* \param key key of message
|
||||||
* \param ... message parameters
|
* \param ... message parameters
|
||||||
* \return buffer containing formatted message text or NULL if memory
|
* \return buffer containing formatted message text or NULL if key is
|
||||||
* is unavailable. The caller owns the returned buffer and is
|
* unavailable or memory allocation failed. The caller owns the
|
||||||
* responsible for freeing it.
|
* returned buffer and is responsible for freeing it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
char *messages_get_buff(const char *key, ...);
|
char *messages_get_buff(const char *key, ...);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user