feat: direct call download api by cgo dart

This commit is contained in:
liwei committed 2024-12-02 00:39:28 +08:00
1 parent 467ada5500
commit 91dfd78b77
71 files changed
+6936 -1883

No files matched your search

@@ -0,0 +1,24 @@
import 'package:flutter/services.dart';
import '../libgopeed_interface.dart';
class LibgopeedChannel implements LibgopeedAbi {
static const _channel = MethodChannel('gopeed.com/libgopeed');
@override
Future<String> create(String cfg) async {
final result = await _channel.invokeMethod<String>('create', {
'cfg': cfg,
});
return result!;
}
@override
Future<String> invoke(int instance, String params) async {
final result = await _channel.invokeMethod<String>('invoke', {
'instance': instance,
'params': params,
});
return result!;
}
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,36 @@
import 'dart:async';
import 'package:ffi/ffi.dart';
import '../libgopeed_interface.dart';
import 'libgopeed_bind.dart';
class LibgopeedFFi implements LibgopeedAbi {
late LibgopeedBind _libgopeed;
LibgopeedFFi(LibgopeedBind libgopeed) {
_libgopeed = libgopeed;
}
@override
Future<String> create(String cfg) {
final cfgPtr = cfg.toNativeUtf8();
try {
final result = _libgopeed.Create(cfgPtr.cast());
return Future.value(result.cast<Utf8>().toDartString());
} finally {
calloc.free(cfgPtr);
}
}
@override
Future<String> invoke(int instance, String params) {
final paramsPtr = params.toNativeUtf8();
try {
final result = _libgopeed.Invoke(instance, paramsPtr.cast());
return Future.value(result.cast<Utf8>().toDartString());
} finally {
calloc.free(paramsPtr);
}
}
}
@@ -0,0 +1,83 @@
import 'package:dio/dio.dart';
import '../model/create_task.dart';
import '../model/create_task_batch.dart';
import '../model/downloader_config.dart';
import '../model/extension.dart';
import '../model/http_listen_result.dart';
import '../model/info.dart';
import '../model/install_extension.dart';
import '../model/request.dart';
import '../model/resolve_result.dart';
import '../model/switch_extension.dart';
import '../model/task.dart';
import '../model/task_filter.dart';
import '../model/update_check_extension_resp.dart';
import '../model/update_extension_settings.dart';
import 'model/start_config.dart';
abstract class LibgopeedAbi {
Future<String> create(String cfg);
Future<String> invoke(int instance, String params);
}
abstract class LibgopeedApi {
Future<void> init(StartConfig cfg);
Future<HttpListenResult> startHttp();
Future<void> stopHttp();
Future<void> restartHttp();
Future<Info> info();
Future<ResolveResult> resolve(Request request);
Future<String> createTask(CreateTask createTask);
Future<String> createTaskBatch(CreateTaskBatch createTask);
Future<void> pauseTask(String id);
Future<void> pauseTasks(TaskFilter? filter);
Future<void> continueTask(String id);
Future<void> continueTasks(TaskFilter? filter);
Future<void> deleteTask(String id, bool force);
Future<void> deleteTasks(TaskFilter? filter, bool force);
Future<Task> getTask(String id);
Future<List<Task>> getTasks(TaskFilter? filter);
Future<Map<String, dynamic>> getTaskStats(String id);
Future<DownloaderConfig> getConfig();
Future<void> putConfig(DownloaderConfig config);
Future<void> installExtension(InstallExtension installExtension);
Future<List<Extension>> getExtensions();
Future<void> updateExtensionSettings(
String identity, UpdateExtensionSettings updateExtensionSettings);
Future<void> switchExtension(
String identity, SwitchExtension switchExtension);
Future<void> deleteExtension(String identity);
Future<UpdateCheckExtensionResp> upgradeCheckExtension(String identity);
Future<void> upgradeExtension(String identity);
Future<void> close();
Future<Response<String>> proxyRequest<T>(String uri,
{data, Options? options});
}
@@ -0,0 +1,19 @@
import 'package:json_annotation/json_annotation.dart';
part 'invoke_request.g.dart';
@JsonSerializable()
class InvokeRequest {
String method;
List<String> params;
InvokeRequest({
this.method = '',
this.params = const [],
});
factory InvokeRequest.fromJson(Map<String, dynamic> json) =>
_$InvokeRequestFromJson(json);
Map<String, dynamic> toJson() => _$InvokeRequestToJson(this);
}
@@ -0,0 +1,22 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'invoke_request.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
InvokeRequest _$InvokeRequestFromJson(Map<String, dynamic> json) =>
InvokeRequest(
method: json['method'] as String? ?? '',
params: (json['params'] as List<dynamic>?)
?.map((e) => e as String)
.toList() ??
const [],
);
Map<String, dynamic> _$InvokeRequestToJson(InvokeRequest instance) =>
<String, dynamic>{
'method': instance.method,
'params': instance.params,
};
@@ -0,0 +1,19 @@
import 'package:json_annotation/json_annotation.dart';
part 'start_config.g.dart';
@JsonSerializable()
class StartConfig {
String storage;
String storageDir;
StartConfig({
this.storage = '',
this.storageDir = '',
});
factory StartConfig.fromJson(Map<String, dynamic> json) =>
_$StartConfigFromJson(json);
Map<String, dynamic> toJson() => _$StartConfigToJson(this);
}
@@ -0,0 +1,18 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'start_config.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
StartConfig _$StartConfigFromJson(Map<String, dynamic> json) => StartConfig(
storage: json['storage'] as String? ?? '',
storageDir: json['storageDir'] as String? ?? '',
);
Map<String, dynamic> _$StartConfigToJson(StartConfig instance) =>
<String, dynamic>{
'storage': instance.storage,
'storageDir': instance.storageDir,
};