Browse Source

adding some i18n support

doc_update_sequoia
Volker Birk 6 years ago
parent
commit
a144239cc4
5 changed files with 167 additions and 179 deletions
  1. +133
    -5
      src/pEpEngine.c
  2. +31
    -1
      src/pEpEngine.h
  3. +2
    -0
      src/pEp_internal.h
  4. +1
    -1
      test/Makefile
  5. +0
    -172
      test/msg4.asc

+ 133
- 5
src/pEpEngine.c View File

@ -21,6 +21,8 @@ DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
static const char *sql_mark_as_compromized;
static const char *sql_crashdump;
static const char *sql_blacklist_keys;
static const char *sql_languagelist;
static const char *sql_i18n_token;
bool in_first = false;
@ -210,6 +212,10 @@ DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
sql_crashdump = "select timestamp, title, entity, description, comment"
" from log order by timestamp desc limit ?1 ;";
sql_languagelist = "select lang, name from i18n_language order by lang ;";
sql_i18n_token = "select phrase from i18n_token where lang = ?1 and id = ?2 ;";
}
int_result = sqlite3_prepare_v2(_session->db, sql_log, (int)strlen(sql_log),
@ -256,6 +262,14 @@ DYNAMIC_API PEP_STATUS init(PEP_SESSION *session)
(int)strlen(sql_crashdump), &_session->crashdump, NULL);
assert(int_result == SQLITE_OK);
int_result = sqlite3_prepare_v2(_session->system_db, sql_languagelist,
(int)strlen(sql_languagelist), &_session->languagelist, NULL);
assert(int_result == SQLITE_OK);
int_result = sqlite3_prepare_v2(_session->system_db, sql_i18n_token,
(int)strlen(sql_i18n_token), &_session->i18n_token, NULL);
assert(int_result == SQLITE_OK);
status = init_cryptotech(_session, in_first);
if (status != PEP_STATUS_OK)
goto pep_error;
@ -1094,11 +1108,11 @@ DYNAMIC_API PEP_STATUS get_crashdump_log(
return PEP_ILLEGAL_VALUE;
int limit = maxlines ? maxlines : CRASHDUMP_DEFAULT_LINES;
const char *timestamp;
const char *title;
const char *entity;
const char *desc;
const char *comment;
const char *timestamp = NULL;
const char *title = NULL;
const char *entity = NULL;
const char *desc = NULL;
const char *comment = NULL;
sqlite3_reset(session->crashdump);
sqlite3_bind_int(session->crashdump, 1, limit);
@ -1159,3 +1173,117 @@ the_end:
return status;
}
DYNAMIC_API PEP_STATUS get_languagelist(
PEP_SESSION session,
char **languages
)
{
PEP_STATUS status = PEP_STATUS_OK;
char *_languages= NULL;
assert(session);
assert(languages);
if (!(session && languages))
return PEP_ILLEGAL_VALUE;
const char *lang = NULL;
const char *name = NULL;
sqlite3_reset(session->languagelist);
int result;
do {
result = sqlite3_step(session->languagelist);
switch (result) {
case SQLITE_ROW:
lang = (const char *) sqlite3_column_text(session->languagelist, 0);
name = (const char *) sqlite3_column_text(session->languagelist, 1);
_languages = _concat_string(_languages, lang, ',');
if (_languages == NULL)
goto enomem;
_languages = _concat_string(_languages, name, '\n');
if (_languages == NULL)
goto enomem;
break;
case SQLITE_DONE:
break;
default:
status = PEP_UNKNOWN_ERROR;
result = SQLITE_DONE;
}
} while (result != SQLITE_DONE);
sqlite3_reset(session->languagelist);
if (status == PEP_STATUS_OK)
*languages = _languages;
goto the_end;
enomem:
status = PEP_OUT_OF_MEMORY;
the_end:
return status;
}
DYNAMIC_API PEP_STATUS get_phrase(
PEP_SESSION session,
const char *lang,
int phrase_id,
char **phrase
)
{
PEP_STATUS status = PEP_STATUS_OK;
*phrase = NULL;
assert(session && lang && lang[0] && lang[1] && lang[2] == 0 &&
phrase_id >= 0 && phrase);
if (!(session && lang && lang[0] && lang[1] && lang[2] == 0 &&
phrase_id >= 0 && phrase))
return PEP_ILLEGAL_VALUE;
sqlite3_reset(session->i18n_token);
sqlite3_bind_text(session->i18n_token, 1, lang, -1, SQLITE_STATIC);
sqlite3_bind_int(session->i18n_token, 2, phrase_id);
const char *_phrase = NULL;
int result;
result = sqlite3_step(session->i18n_token);
switch (result) {
case SQLITE_ROW:
_phrase = (const char *) sqlite3_column_text(session->i18n_token, 0);
break;
case SQLITE_DONE:
status = PEP_PHRASE_NOT_FOUND;
break;
default:
status = PEP_UNKNOWN_ERROR;
}
sqlite3_reset(session->i18n_token);
if (status == PEP_STATUS_OK) {
*phrase = strdup(_phrase);
if (*phrase == NULL)
goto enomem;
}
goto the_end;
enomem:
status = PEP_OUT_OF_MEMORY;
the_end:
return status;
}

+ 31
- 1
src/pEpEngine.h View File

@ -62,6 +62,8 @@ typedef enum {
PEP_CANNOT_CREATE_KEY = 0x0601,
PEP_CANNOT_SEND_KEY = 0x0602,
PEP_PHRASE_NOT_FOUND = 0x0701,
PEP_COMMIT_FAILED = 0xff01,
PEP_CANNOT_CREATE_TEMP_FILE = -5,
@ -694,7 +696,7 @@ DYNAMIC_API PEP_STATUS key_expired(
// parameters:
// session (in) session handle
// maxlines (in) maximum number of lines (0 for default)
// logdata (out) logdata
// logdata (out) logdata as string in double quoted CSV format
DYNAMIC_API PEP_STATUS get_crashdump_log(
PEP_SESSION session,
@ -703,6 +705,34 @@ DYNAMIC_API PEP_STATUS get_crashdump_log(
);
// get_languagelist() - get the last log messages out
//
// parameters:
// session (in) session handle
// languages (out) languages as string in double quoted CSV format
DYNAMIC_API PEP_STATUS get_languagelist(
PEP_SESSION session,
char **languages
);
// get_phrase() - get phrase in a dedicated language through i18n
//
// parameters:
// session (in) session handle
// lang (in) C string with ISO 639-1 language code
// phrase_id (in) id of phrase in i18n
// phrase (out) phrase as UTF-8 string
DYNAMIC_API PEP_STATUS get_phrase(
PEP_SESSION session,
const char *lang,
int phrase_id,
char **phrase
);
#ifdef __cplusplus
}
#endif

+ 2
- 0
src/pEp_internal.h View File

@ -98,6 +98,8 @@ typedef struct _pEpSession {
sqlite3_stmt *reset_trust;
sqlite3_stmt *crashdump;
sqlite3_stmt *blacklist_keys;
sqlite3_stmt *languagelist;
sqlite3_stmt *i18n_token;
examine_identity_t examine_identity;
void *examine_management;


+ 1
- 1
test/Makefile View File

@ -22,7 +22,7 @@ all: $(TARGET) $(UNIT_TESTS)
.PHONY: clean
clean:
rm -f *.o $(TARGET) *.a *~ $(UNIT_TESTS) pep_Dokument_Titel.pdf
rm -f *.o $(TARGET) *.a *~ $(UNIT_TESTS) pep_Dokument_Titel.pdf msg4.asc
rm -Rf *.dSYM
test: pEpEngineTest


+ 0
- 172
test/msg4.asc View File

@ -1,172 +0,0 @@
From: Outlook Test <outlooktest@dingens.org>
To: Volker Birk <vb@dingens.org>
Subject: pEp
X-pEp-Version: 1.0
MIME-Version: 1.0
Content-Type: multipart/encrypted; boundary="74b0dc5119495cff2ae8944a625558ec";
protocol="application/pgp-encrypted"
--74b0dc5119495cff2ae8944a625558ec
Content-Type: application/pgp-encrypted
Version: 1
--74b0dc5119495cff2ae8944a625558ec
Content-Type: application/octet-stream
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="msg.asc"
-----BEGIN PGP MESSAGE-----
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
=R4JX
-----END PGP MESSAGE-----
YAW8tu5u4a4YWEwHrYsur7dcR0s4Evz/k5R/1NyqRlA0s
7vBZWIEL+lQQWi7PkZaQUt2I83FUdIkBrENHadG7OkV0Z57Ck2FmCH0PVS6H2vKz
Fzl9gL1SwrOdgjUXMiDv6DpiqNQZhbFV0Zszm+jjaJ1LRqaA1MHoL+dMqq8s1N0x
MMQ18SszTHKa2LyrReBshvpjnfUZQTLNp2A033nb97mmrZ+tigVfUguEbb7sUI76
AnYGDps4RLJh62odiQ3fjIOKrdTdMgoON5RGebgHnRKlU3647NwKEjgO9zpFhAhd
ZRw5IVbEXNfRlFzdsfqrGx5vkZZrNKrd5wXN40GQQ2Kuxf4qviI9Lp0+z7z3nCJI
h6eqGQNn7XyMu
--74b0dc5119495cff2ae8944a625558ec--

Loading…
Cancel
Save