downloadMessage method
Future<V2TimCallback>
downloadMessage({
- V2TimMessage? message,
- String? msgID,
- required int imageType,
- required bool isSnapshot,
- String? downloadPath,
Implementation
Future<V2TimCallback> downloadMessage({
V2TimMessage? message,
String? msgID,
required int imageType,
required bool isSnapshot,
String? downloadPath,
}) async {
if (!TIMManager.instance.isInitSDK()) {
return V2TimCallback(code: TIMErrCode.ERR_SDK_NOT_INITIALIZED.value, desc: "sdk not init");
}
final downloadKey = 'msgID-$imageType-$isSnapshot';
if (_downloadingMessageSet.contains(downloadKey)) {
print("message ID: $msgID, imageType: $imageType, isSnapshot: $isSnapshot is downloading");
return V2TimCallback(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: 'message is downloading');
}
if (message == null) {
if (msgID == null) {
return V2TimCallback(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: 'message and msgID are both empty');
} else {
V2TimValueCallback<List<V2TimMessage>> findResult = await findMessages(messageIDList: [msgID]);
if (findResult.code != TIMErrCode.ERR_SUCC.value) {
print("downloadMessage, find message failed");
return V2TimCallback(code: findResult.code, desc: findResult.desc);
}
List<V2TimMessage> msgList = findResult.data!;
if (msgList.isEmpty) {
print("downloadMessage, message not found");
return V2TimCallback(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "message not found");
}
message = msgList[0];
}
}
msgID = message.msgID ?? "";
if (!{MessageElemType.V2TIM_ELEM_TYPE_IMAGE, MessageElemType.V2TIM_ELEM_TYPE_VIDEO, MessageElemType.V2TIM_ELEM_TYPE_SOUND, MessageElemType.V2TIM_ELEM_TYPE_FILE}.contains(message.elemType)) {
print("downloadMessage, message does not support downloading");
return V2TimCallback(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "message does not support downloading");
}
V2TimMessageDownloadElemParam downloadParam = V2TimMessageDownloadElemParam(message: message, imageType: imageType, isSnapshot: isSnapshot);
if (downloadParam.downloadUrl.isEmpty || downloadParam.fileUUID.isEmpty) {
print("downloadMessage, message missing necessary download info");
return V2TimCallback(code: TIMErrCode.ERR_INVALID_PARAMETERS.value, desc: "message missing necessary download info");
}
String adjustDownloadPath = downloadPath ?? _getDefaultCachePath(message: message, imageType: imageType, isSnapshot: isSnapshot, downloadParam: downloadParam);
if (File(adjustDownloadPath).existsSync()) {
return V2TimCallback(code: TIMErrCode.ERR_SUCC.value, desc: "file: $adjustDownloadPath already exists!");
}
String userData = Tools.generateUserData('downloadMessage');
Completer<V2TimCallback> completer = Completer();
void handleApiCallback(Map jsonResult) {
V2TimValueCallback<dynamic> result = V2TimValueCallback<dynamic>.fromJson(jsonResult);
if (result.desc == 'downloading') {
Map<String, dynamic> processInfo = result.data ?? {};
if (processInfo.isNotEmpty) {
int currentSize = processInfo['msg_download_elem_result_current_size'] ?? 0;
int totalSize = processInfo['msg_download_elem_result_total_size'] ?? 0;
V2TimMessageDownloadProgress downloadProgress = V2TimMessageDownloadProgress(
isFinish: currentSize > 0 && currentSize == totalSize,
isError: result.code == TIMErrCode.ERR_SUCC.value,
msgID: msgID!,
currentSize: currentSize,
totalSize: totalSize,
type: imageType,
isSnapshot: isSnapshot,
path: adjustDownloadPath,
errorCode: result.code,
errorDesc: result.desc,
);
// 下载进度回调
_advancedMessageListener.onMessageDownloadProgressCallback(downloadProgress);
}
} else {
// 下载完成回调
_downloadingMessageSet.remove(downloadKey);
completer.complete(V2TimCallback(code: result.code, desc: result.desc));
}
}
NativeLibraryManager.timApiValueCallback2Future(userData, handleApiCallback);
_downloadingMessageSet.add(downloadKey);
Pointer<Char> pDownloadParam = Tools.string2PointerChar(json.encode(downloadParam.toJson()));
Pointer<Char> pDownloadPath = Tools.string2PointerChar(adjustDownloadPath);
Pointer<Void> pUserData = Tools.string2PointerVoid(userData);
NativeLibraryManager.bindings.DartDownloadElemToPath(pDownloadParam, pDownloadPath, pUserData);
return completer.future;
}