From 63e92bed7a19eff6cd8b6fe10008f8596411353e Mon Sep 17 00:00:00 2001 From: d2weber <29163905+d2weber@users.noreply.github.com> Date: Mon, 18 May 2026 13:07:45 +0200 Subject: [PATCH] Add example c api usage --- example.cpp | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 example.cpp diff --git a/example.cpp b/example.cpp new file mode 100644 index 000000000..153756934 --- /dev/null +++ b/example.cpp @@ -0,0 +1,101 @@ +#include +#include +#include +#include + +#include "deltachat-jsonrpc/c/generated/dc_json_cjson.h" +#include "deltachat-jsonrpc/c/generated/rpc.hpp" +#include "../chatmail-core-2.43.0/deltachat.h" + +struct CffiTransport { + dc_jsonrpc_instance_t* jsonrpc; + char* buf_ = nullptr; + CffiTransport(dc_accounts_t* accounts) : jsonrpc(dc_jsonrpc_init(accounts)) {if (!jsonrpc) {std::abort();}} + CffiTransport(CffiTransport&& o) : jsonrpc(o.jsonrpc), buf_(o.buf_) { o.jsonrpc = nullptr; o.buf_ = nullptr; } + CffiTransport& operator=(CffiTransport&&) = delete; + CffiTransport(const CffiTransport&) = delete; + void send(const char* json) { dc_jsonrpc_request(jsonrpc, json); } + const char* read() { + if (buf_) { dc_str_unref(buf_); buf_ = nullptr; } + buf_ = dc_jsonrpc_next_response(jsonrpc); + if (!buf_) { dc_jsonrpc_unref(jsonrpc); jsonrpc = nullptr; return nullptr; } + return buf_; + } + ~CffiTransport() { if (buf_) dc_str_unref(buf_); if (jsonrpc) dc_jsonrpc_unref(jsonrpc); } + void close() { send("{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"get_system_info\"})\")"); } +}; + + +// struct StdioTransport { +// std::string buf_; +// void send(const char* json) { printf("%s\n", json); fflush(stdout); } +// const char* read() { +// if (!std::getline(std::cin, buf_)) return nullptr; +// return buf_.c_str(); +// } +// }; + +// struct CffiTransport { +// dc_jsonrpc_instance_t* jsonrpc; +// CffiTransport(dc_accounts_t* accounts) : jsonrpc(dc_jsonrpc_init(accounts)) {} +// void send(const char* json) { dc_jsonrpc_request(jsonrpc, json); } +// std::string read() { +// char* r = dc_jsonrpc_next_response(jsonrpc); +// if (!r) {dc_jsonrpc_unref(jsonrpc); return {};} +// std::string s(r); +// dc_str_unref(r); +// return s; +// } +// void close() { } +// }; +// ; + +void logger(std::string msg) { + std::cerr << msg << std::endl; +} + +int main() { + auto* raw_accounts = dc_accounts_new("my-accounts", 1); + + if (!raw_accounts) return -1; + dc::Rpc rpc(CffiTransport{raw_accounts}, logger); + dc_accounts_unref(raw_accounts); + + printf("arch: %s\n", rpc.get_system_info().find("arch")); + + auto account_ids = rpc.get_all_account_ids(); + printf("size 1: %zu\n", account_ids.size()); + auto acc_id = account_ids.size() == 0 ? rpc.add_account() : account_ids.view()[0]; + printf("acc_id: %u\n", acc_id); + + auto a = dc::ArrayString("is_chatmail", "addr"); + printf("a %zu\n", a.size()); + printf("a %i\n", bool(a)); + auto config = rpc.batch_get_config(acc_id, std::move(a)); + + printf("s: %zu\n", config.size()); + printf("c: %s\n", config._c->keys[0]); + printf("c: %s\n", config._c->values[0]); + printf("c: %s\n", config._c->keys[1]); + printf("c: %s\n", config._c->values[1]); + printf("c: %s\n", config.find("addr")._c); + + auto chat_id = rpc.secure_join(acc_id, "https://i.delta.chat/#AFE2503F3BDC9058CBEAB8AEBAA028AE86816AD5&v=3&i=_CmYTfzPFjM9JQV_R05mK4Qg&s=1F7dmW_qhOGytyFXUbo6who5&a=uxyjz202n%40nine.testrun.org&n=1"); + // auto chat_id = 12; + + auto e = rpc.get_next_event_batch(); + for (size_t i = 0; i < e.size(); ++i) { + printf("kind: %i\n", e[i].event()._c->kind); + } +// { +// printf("kind: %i\n", rpc.get_next_event().event()._c->kind); +// } + + auto y = rpc.send_msg(acc_id, chat_id, dc::MessageData(string_new("hi"), {}, {}, {}, {}, {}, {}, {}, {})); + // rpc.sleep(10); + + auto chat = rpc.get_full_chat_by_id(acc_id, chat_id); + printf("canSend: %s\n", chat.canSend() ? "yes" : "no"); + printf("isContactRequest: %s\n", chat.isContactRequest()? "yes" : "no"); +} +