From 15fb813808be78f0f40513a43cfb4b4d6bd447cb Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Sun, 2 Feb 2020 15:46:56 +0100 Subject: [PATCH] add provider db (#416) --- CHANGELOG.md | 3 ++ index.d.ts | 5 +++ lib/deltachat.js | 12 +++++++ src/module.c | 69 ++++++++++++++++++++++++++++++++++++ src/napi-macros-extensions.h | 4 +++ test/index.js | 14 ++++++++ 6 files changed, 107 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82cfcbad..8b551a65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ ## [Unreleased][unreleased] +### Added +- Add provider db + ## [1.0.0-beta.23.1] - 2019-01-29 ### Changed diff --git a/index.d.ts b/index.d.ts index cd1e2f6f..263230bf 100644 --- a/index.d.ts +++ b/index.d.ts @@ -146,5 +146,10 @@ export class DeltaChat { getContacts(listFlags: number, queryStr: string): Array; initiateKeyTransfer(cb: any): boolean; continueKeyTransfer(messageId: number, setupCode: string, cb: any): boolean; + getProviderFromEmail (email: string): { + before_login_hint: string, + overview_page: string, + status: number, + }; static getSystemInfo(): string; } \ No newline at end of file diff --git a/lib/deltachat.js b/lib/deltachat.js index 3b691079..6e41a509 100644 --- a/lib/deltachat.js +++ b/lib/deltachat.js @@ -463,6 +463,18 @@ class DeltaChat extends EventEmitter { ) } + getProviderFromEmail (email) { + const provider = binding.dcn_provider_new_from_email(this.dcn_context, email) + if (!provider) { + return undefined + } + return { + before_login_hint: binding.dcn_provider_get_before_login_hint(provider), + overview_page: binding.dcn_provider_get_overview_page(provider), + status: binding.dcn_provider_get_status(provider) + } + } + getSecurejoinQrCode (chatId) { debug(`getSecurejoinQrCode ${chatId}`) return binding.dcn_get_securejoin_qr(this.dcn_context, Number(chatId)) diff --git a/src/module.c b/src/module.c index 47341218..714d30fa 100644 --- a/src/module.c +++ b/src/module.c @@ -267,6 +267,14 @@ static void finalize_msg(napi_env env, void* data, void* hint) { } } +static void finalize_provider(napi_env env, void* data, void* hint) { + if (data) { + dc_provider_t* provider = (dc_provider_t*)data; + //TRACE("cleaning up provider"); + dc_provider_unref(provider); + } +} + /** * Helpers. */ @@ -2620,6 +2628,59 @@ NAPI_METHOD(dcn_perform_imap_jobs) { NAPI_RETURN_UNDEFINED(); } +NAPI_METHOD(dcn_provider_new_from_email) { + NAPI_ARGV(2); + NAPI_DCN_CONTEXT(); + NAPI_ARGV_UTF8_MALLOC(email, 1) + + //TRACE("calling.."); + napi_value result; + dc_provider_t* provider = dc_provider_new_from_email(dcn_context->dc_context, email); + + if (provider == NULL) { + NAPI_STATUS_THROWS(napi_get_null(env, &result)); + } else { + NAPI_STATUS_THROWS(napi_create_external(env, provider, finalize_provider, + NULL, &result)); + } + //TRACE("done"); + + return result; +} + +NAPI_METHOD(dcn_provider_get_overview_page) { + NAPI_ARGV(1); + NAPI_DC_PROVIDER(); + + //TRACE("calling.."); + char* overview_page = dc_provider_get_overview_page(dc_provider); + //TRACE("result %s", overview_page); + + NAPI_RETURN_AND_UNREF_STRING(overview_page); +} + +NAPI_METHOD(dcn_provider_get_before_login_hint) { + NAPI_ARGV(1); + NAPI_DC_PROVIDER(); + + //TRACE("calling.."); + char* before_login_hint = dc_provider_get_overview_page(dc_provider); + //TRACE("result %s", before_login_hint); + + NAPI_RETURN_AND_UNREF_STRING(before_login_hint); +} + +NAPI_METHOD(dcn_provider_get_status) { + NAPI_ARGV(1); + NAPI_DC_PROVIDER(); + + //TRACE("calling.."); + int status = dc_provider_get_status(dc_provider); + //TRACE("result %s", status); + + NAPI_RETURN_INT32(status) +} + NAPI_INIT() { /** * Main context @@ -2805,6 +2866,14 @@ NAPI_INIT() { NAPI_EXPORT_FUNCTION(dcn_set_location); NAPI_EXPORT_FUNCTION(dcn_get_locations); + /** + * dc_provider + */ + NAPI_EXPORT_FUNCTION(dcn_provider_new_from_email); + NAPI_EXPORT_FUNCTION(dcn_provider_get_overview_page); + NAPI_EXPORT_FUNCTION(dcn_provider_get_before_login_hint); + NAPI_EXPORT_FUNCTION(dcn_provider_get_status); + /** * dc_array */ diff --git a/src/napi-macros-extensions.h b/src/napi-macros-extensions.h index 4634aec6..b6e528ad 100644 --- a/src/napi-macros-extensions.h +++ b/src/napi-macros-extensions.h @@ -31,6 +31,10 @@ dc_msg_t* dc_msg; \ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_msg)); +#define NAPI_DC_PROVIDER() \ + dc_provider_t* dc_provider; \ + NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_provider)); + #define NAPI_DC_ARRAY() \ dc_array_t* dc_array; \ NAPI_STATUS_THROWS(napi_get_value_external(env, argv[0], (void**)&dc_array)); diff --git a/test/index.js b/test/index.js index 25d038ff..9cad1ed9 100644 --- a/test/index.js +++ b/test/index.js @@ -437,3 +437,17 @@ function dc (fn) { }) } } + +test('dc.getProviderFromEmail("example@example.com")', t => { + const dc = new DeltaChat() + const provider = dc.getProviderFromEmail('example@example.com') + + t.same(provider, { + before_login_hint: 'https://providers.delta.chat/example-com', + overview_page: 'https://providers.delta.chat/example-com', + status: 3 + }) + + dc.close() + t.end() +})