Skip to content

Commit b07d99c

Browse files
committed
refactor: make custom proto apis comply with the original style
1 parent 43b2322 commit b07d99c

File tree

3 files changed

+49
-28
lines changed

3 files changed

+49
-28
lines changed

app/src/main/jni/librime_jni/proto.cc

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,24 +12,28 @@
1212

1313
using namespace rime;
1414

15-
RIME_PROTO_OBJ rime_commit_proto(RimeSessionId session_id) {
15+
void rime_commit_proto(RimeSessionId session_id,
16+
RIME_PROTO_BUILDER *commit_builder) {
1617
an<Session> session(Service::instance().GetSession(session_id));
17-
if (!session) return nullptr;
18+
if (!session) return;
1819
auto env = GlobalRef->AttachEnv();
1920
const string &commit_text(session->commit_text());
20-
RIME_PROTO_OBJ commit =
21-
env->NewObject(GlobalRef->CommitProto, GlobalRef->CommitProtoInit,
22-
*JString(env, commit_text));
23-
session->ResetCommitText();
24-
return commit;
21+
if (!commit_text.empty()) {
22+
auto *commit = (jobject *)commit_builder;
23+
*commit = env->NewObject(GlobalRef->CommitProto, GlobalRef->CommitProtoInit,
24+
*JString(env, commit_text));
25+
session->ResetCommitText();
26+
}
2527
}
2628

27-
RIME_PROTO_OBJ rime_context_proto(RimeSessionId session_id) {
29+
void rime_context_proto(RimeSessionId session_id,
30+
RIME_PROTO_BUILDER *context_builder) {
2831
an<Session> session = Service::instance().GetSession(session_id);
29-
if (!session) return nullptr;
32+
if (!session) return;
3033
Context *ctx = session->context();
31-
if (!ctx) return nullptr;
34+
if (!ctx) return;
3235
auto env = GlobalRef->AttachEnv();
36+
auto *context = (jobject *)context_builder;
3337
jobject composition = env->NewObject(GlobalRef->CompositionProto,
3438
GlobalRef->CompositionProtoDefault);
3539
if (ctx->IsComposing()) {
@@ -94,19 +98,22 @@ RIME_PROTO_OBJ rime_context_proto(RimeSessionId session_id) {
9498
*JRef<jobjectArray>(env, dest_labels));
9599
}
96100
}
97-
return env->NewObject(GlobalRef->ContextProto, GlobalRef->ContextProtoInit,
98-
*JRef(env, composition), *JRef(env, menu),
99-
*JString(env, ctx->input()), ctx->caret_pos());
101+
*context =
102+
env->NewObject(GlobalRef->ContextProto, GlobalRef->ContextProtoInit,
103+
*JRef(env, composition), *JRef(env, menu),
104+
*JString(env, ctx->input()), ctx->caret_pos());
100105
}
101106

102-
RIME_PROTO_OBJ rime_status_proto(RimeSessionId session_id) {
107+
void rime_status_proto(RimeSessionId session_id,
108+
RIME_PROTO_BUILDER *status_builder) {
103109
an<Session> session(Service::instance().GetSession(session_id));
104-
if (!session) return nullptr;
110+
if (!session) return;
105111
Schema *schema = session->schema();
106112
Context *ctx = session->context();
107-
if (!schema || !ctx) return nullptr;
113+
if (!schema || !ctx) return;
108114
auto env = GlobalRef->AttachEnv();
109-
return env->NewObject(
115+
auto *status = (jobject *)status_builder;
116+
*status = env->NewObject(
110117
GlobalRef->StatusProto, GlobalRef->StatusProtoInit,
111118
*JString(env, schema->schema_id()), *JString(env, schema->schema_name()),
112119
Service::instance().disabled(), ctx->IsComposing(),

app/src/main/jni/librime_jni/proto.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
#pragma once
22

3-
#include <jni.h>
43
#include <rime_api.h>
54

65
#ifdef __cplusplus
76
extern "C" {
87
#endif
98

109
//! For passing pointer to jni object as opaque pointer through C API.
11-
#define RIME_PROTO_OBJ jobject
10+
#define RIME_PROTO_BUILDER void
1211

1312
typedef struct rime_proto_api_t {
1413
int data_size;
1514

16-
RIME_PROTO_OBJ (*commit_proto)(RimeSessionId session_id);
17-
RIME_PROTO_OBJ (*context_proto)(RimeSessionId session_id);
18-
RIME_PROTO_OBJ (*status_proto)(RimeSessionId session_id);
15+
void (*commit_proto)(RimeSessionId session_id,
16+
RIME_PROTO_BUILDER* commit_builder);
17+
void (*context_proto)(RimeSessionId session_id,
18+
RIME_PROTO_BUILDER* context_builder);
19+
void (*status_proto)(RimeSessionId session_id,
20+
RIME_PROTO_BUILDER* status_builder);
1921
} RimeProtoApi;
2022

2123
#ifdef __cplusplus

app/src/main/jni/librime_jni/rime_jni.cc

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,17 @@ class Rime {
7777

7878
void clearComposition() { rime->clear_composition(session()); }
7979

80-
RIME_PROTO_OBJ commitProto() { return proto->commit_proto(session()); }
80+
void commitProto(RIME_PROTO_BUILDER *builder) {
81+
proto->commit_proto(session(), builder);
82+
}
8183

82-
RIME_PROTO_OBJ contextProto() { return proto->context_proto(session()); }
84+
void contextProto(RIME_PROTO_BUILDER *builder) {
85+
proto->context_proto(session(), builder);
86+
}
8387

84-
RIME_PROTO_OBJ statusProto() { return proto->status_proto(session()); }
88+
void statusProto(RIME_PROTO_BUILDER *builder) {
89+
proto->status_proto(session(), builder);
90+
}
8591

8692
void setOption(std::string_view key, bool value) {
8793
rime->set_option(session(), key.data(), value);
@@ -269,17 +275,23 @@ Java_com_osfans_trime_core_Rime_clearRimeComposition(JNIEnv *env,
269275
// output
270276
extern "C" JNIEXPORT jobject JNICALL
271277
Java_com_osfans_trime_core_Rime_getRimeCommit(JNIEnv *env, jclass /* thiz */) {
272-
return Rime::Instance().commitProto();
278+
jobject proto = nullptr;
279+
Rime::Instance().commitProto(&proto);
280+
return proto;
273281
}
274282

275283
extern "C" JNIEXPORT jobject JNICALL
276284
Java_com_osfans_trime_core_Rime_getRimeContext(JNIEnv *env, jclass /* thiz */) {
277-
return Rime::Instance().contextProto();
285+
jobject proto = nullptr;
286+
Rime::Instance().contextProto(&proto);
287+
return proto;
278288
}
279289

280290
extern "C" JNIEXPORT jobject JNICALL
281291
Java_com_osfans_trime_core_Rime_getRimeStatus(JNIEnv *env, jclass /* thiz */) {
282-
return Rime::Instance().statusProto();
292+
jobject proto = nullptr;
293+
Rime::Instance().statusProto(&proto);
294+
return proto;
283295
}
284296

285297
// runtime options

0 commit comments

Comments
 (0)