callExperimentalAPI method
Implementation
Future<V2TimValueCallback<Object>> callExperimentalAPI({
required String api,
Object? param,
}) async {
Map<String, dynamic> cJsonParam = {};
if (param is Map<String, dynamic>) {
cJsonParam = Map<String, dynamic>.from(param);
}
cJsonParam['request_internal_operation'] = api;
// C 层直接通过返回值传递数据,不走回调
if (api == 'internal_operation_get_login_account_type') {
Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
Pointer<Void> pUserData = Tools.string2PointerVoid('');
int accountType = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
Tools.freePointers([pCJsonParam, pUserData]);
return V2TimValueCallback<Object>(code: 0, desc: '', data: accountType);
}
// C 层同步操作,不会触发回调,直接返回结果
if (_syncExperimentalAPIs.contains(api)) {
Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
Pointer<Void> pUserData = Tools.string2PointerVoid('');
int result = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
Tools.freePointers([pCJsonParam, pUserData]);
if (result != TIMResult.TIM_SUCC.value) {
return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "invalid parameter");
}
return V2TimValueCallback<Object>(code: 0, desc: '');
}
// C 层异步操作,通过回调返回结果
String userData = Tools.generateUserData('callExperimentalAPI');
Completer<V2TimValueCallback<Object>> completer = Completer();
NativeLibraryManager.addTimValueCallback2Map<Object>(userData, completer);
Pointer<Char> pCJsonParam = Tools.string2PointerChar(json.encode(cJsonParam));
Pointer<Void> pUserData = Tools.string2PointerVoid(userData);
int result = NativeLibraryManager.bindings.DartCallExperimentalAPI(pCJsonParam, pUserData);
if (result != TIMResult.TIM_SUCC.value) {
NativeLibraryManager.removeTimCallbackFromMap(userData);
Tools.freePointers([pCJsonParam, pUserData]);
return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "invalid parameter");
}
return completer.future.timeout(
const Duration(seconds: 5),
onTimeout: () {
NativeLibraryManager.removeTimCallbackFromMap(userData);
Tools.freePointers([pCJsonParam, pUserData]);
return V2TimValueCallback<Object>(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "callExperimentalAPI timeout, api: $api");
},
).then((value) {
NativeLibraryManager.removeTimCallbackFromMap(userData);
Tools.freePointers([pCJsonParam, pUserData]);
return value;
});
}