Skip to content

Commit 76fa296

Browse files
committed
(libviolet/downloader) Implements downloader ffi
1 parent c20d207 commit 76fa296

File tree

8 files changed

+79
-32
lines changed

8 files changed

+79
-32
lines changed
88.6 KB
Binary file not shown.
77.4 KB
Binary file not shown.

assets/libviolet/x86/libviolet.so

0 Bytes
Binary file not shown.

assets/libviolet/x86_64/libviolet.so

84.7 KB
Binary file not shown.

lib/pages/download/builtin_downloader.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:violet/component/downloadable.dart' as violetd;
1414

1515
class BuiltinDownloader {
1616
static const int maxDownloadCount = 2;
17-
static const int maxDownloadFileCount = 24;
17+
static const int maxDownloadFileCount = 8;
1818

1919
int _curDownloadCount = 0;
2020
int _curDonwloadFileCount = 0;

lib/pages/download/download_item_widget.dart

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ class _DownloadItemWidgetState extends State<DownloadItemWidget> {
167167
}
168168

169169
// Download
170-
var _timer = new Timer.periodic(Duration(seconds: 1), (Timer timer) {
170+
var _timer =
171+
new Timer.periodic(Duration(milliseconds: 100), (Timer timer) {
171172
setState(() {
172173
if (downloadSec / 1024 < 500.0)
173174
downloadSpeed = (downloadSec / 1024).toStringAsFixed(1) + " KB/S";
@@ -212,7 +213,7 @@ class _DownloadItemWidgetState extends State<DownloadItemWidget> {
212213
}
213214
_timer.cancel();
214215

215-
await (await BuiltinDownloader.getInstance()).returnDownload();
216+
// await (await BuiltinDownloader.getInstance()).returnDownload();
216217

217218
// Postprocess
218219

@@ -338,9 +339,9 @@ class _DownloadItemWidgetState extends State<DownloadItemWidget> {
338339
break;
339340

340341
case 3:
341-
state =
342-
'[$downloadedFileCount/$downloadTotalFileCount] ($downloadSpeed ${(download / 1024.0 / 1024.0).toStringAsFixed(1)} MB)';
343-
// state = '[$downloadedFileCount/$downloadTotalFileCount]';
342+
// state =
343+
// '[$downloadedFileCount/$downloadTotalFileCount] ($downloadSpeed ${(download / 1024.0 / 1024.0).toStringAsFixed(1)} MB)';
344+
state = '[$downloadedFileCount/$downloadTotalFileCount]';
344345
pp = Translations.instance.trans('progress') + ': ';
345346
break;
346347

lib/pages/download/native_downloader.dart

Lines changed: 49 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:device_info/device_info.dart';
1010
import 'package:ffi/ffi.dart';
1111
import 'package:flutter/foundation.dart';
1212
import 'package:flutter/services.dart';
13+
import 'package:synchronized/synchronized.dart' as sync;
1314
import 'package:path_provider/path_provider.dart';
1415
import 'package:violet/component/downloadable.dart';
1516

@@ -30,18 +31,18 @@ class NativeDownloadTask {
3031

3132
NativeDownloadTask({this.id, this.url, this.fullpath, this.header});
3233

33-
static NativeDownloadTask fromDownloadTask(DownloadTask task) {
34+
static NativeDownloadTask fromDownloadTask(int taskId, DownloadTask task) {
3435
var header = Map<String, String>();
35-
header['referer'] = task.referer;
36-
header['accept'] = task.accept;
37-
header['user-agent'] = task.userAgent;
36+
if (task.referer != null) header['referer'] = task.referer;
37+
if (task.accept != null) header['accept'] = task.accept;
38+
if (task.userAgent != null) header['user-agent'] = task.userAgent;
3839
if (task.headers != null) {
3940
task.headers.entries.forEach((element) {
4041
header[element.key.toLowerCase()] = element.value;
4142
});
4243
}
4344
return NativeDownloadTask(
44-
id: task.taskId,
45+
id: taskId,
4546
url: task.url,
4647
fullpath: task.downloadPath,
4748
header: header,
@@ -50,7 +51,7 @@ class NativeDownloadTask {
5051

5152
String toString() {
5253
return jsonEncode({
53-
"id": 1,
54+
"id": id,
5455
"url": url,
5556
"fullpath": fullpath,
5657
"header": header,
@@ -64,6 +65,9 @@ class NativeDownloader {
6465
DownloaderDispose downloaderDispose;
6566
DownloaderStatus downloaderStatus;
6667
DownloaderAppend downloaderAppend;
68+
List<DownloadTask> downloadTasks = List<DownloadTask>();
69+
70+
sync.Lock lock = sync.Lock();
6771

6872
Future<void> init() async {
6973
final soPath = await _checkSharedLibrary();
@@ -85,7 +89,7 @@ class NativeDownloader {
8589
.lookup<NativeFunction<downloader_append>>("downloader_append")
8690
.asFunction();
8791

88-
downloaderInit(8);
92+
downloaderInit(32);
8993
}
9094

9195
static NativeDownloader _instance;
@@ -98,16 +102,46 @@ class NativeDownloader {
98102
return _instance;
99103
}
100104

101-
void addTask(DownloadTask task) {
102-
downloaderAppend(
103-
Utf8.toUtf8(NativeDownloadTask.fromDownloadTask(task).toString()));
105+
NativeDownloader() {
106+
Future.delayed(Duration(seconds: 1)).then((value) async {
107+
// int prev = 0;
108+
while (true) {
109+
var x = Utf8.fromUtf8(downloaderStatus());
110+
// var y = int.parse(x.split('|')[2]);
111+
// print(x + ' ' + ((y - prev) / 1024.0).toString() + ' KB/S');
112+
// prev = y;
113+
var ll = x.split('|');
114+
if (ll.length == 5) {
115+
var complete = ll.last.split(',');
116+
complete.forEach((element) {
117+
int v = int.tryParse(element);
118+
if (v != null) {
119+
downloadTasks[v].completeCallback();
120+
}
121+
});
122+
}
123+
await Future.delayed(Duration(milliseconds: 100));
124+
}
125+
});
104126
}
105127

106-
void addTasks(List<DownloadTask> tasks) {
107-
tasks.forEach((task) {
108-
// print(NativeDownloadTask.fromDownloadTask(task).toString());
109-
downloaderAppend(
110-
Utf8.toUtf8(NativeDownloadTask.fromDownloadTask(task).toString()));
128+
Future<void> addTask(DownloadTask task) async {
129+
await lock.synchronized(() {
130+
downloadTasks.add(task);
131+
downloaderAppend(Utf8.toUtf8(
132+
NativeDownloadTask.fromDownloadTask(downloadTasks.length, task)
133+
.toString()));
134+
});
135+
}
136+
137+
Future<void> addTasks(List<DownloadTask> tasks) async {
138+
await lock.synchronized(() {
139+
tasks.forEach((task) {
140+
downloadTasks.add(task);
141+
downloaderAppend(Utf8.toUtf8(
142+
NativeDownloadTask.fromDownloadTask(downloadTasks.length - 1, task)
143+
.toString()));
144+
});
111145
});
112146
}
113147

libviolet/src/main.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,29 @@ pub extern fn downloader_dispose() {
8888

8989
#[no_mangle]
9090
pub extern fn downloader_status() -> *mut c_char {
91-
let completed: String = DOWNLOAD_COMPLETE_INFO.clone().lock().unwrap().iter().enumerate().fold(String::new(), |res, (i, ch)| {
92-
res + &format!("{},", ch)
93-
});
94-
95-
CString::new(format!("{}|{}|{}|{}|{}",
96-
DOWNLOAD_TOTAL_COUNT.load(Ordering::SeqCst),
97-
DOWNLOAD_COMPLETED_COUNT.load(Ordering::SeqCst),
98-
DOWNLOADED_BYTES.load(Ordering::SeqCst),
99-
DOWNLOAD_ERROR_COUNT.load(Ordering::SeqCst),
100-
completed
101-
)).unwrap().into_raw()
91+
let clone = DOWNLOAD_COMPLETE_INFO.clone();
92+
let mut complete = clone.lock().unwrap();
93+
94+
if complete.len() == 0 {
95+
return CString::new(format!("{}|{}|{}|{}",
96+
DOWNLOAD_TOTAL_COUNT.load(Ordering::SeqCst),
97+
DOWNLOAD_COMPLETED_COUNT.load(Ordering::SeqCst),
98+
DOWNLOADED_BYTES.load(Ordering::SeqCst),
99+
DOWNLOAD_ERROR_COUNT.load(Ordering::SeqCst),
100+
)).unwrap().into_raw()
101+
} else {
102+
let completed: String = complete.iter().enumerate().fold(String::new(), |res, (_i, ch)| {
103+
res + &format!("{},", ch)
104+
});
105+
complete.clear();
106+
return CString::new(format!("{}|{}|{}|{}|{}",
107+
DOWNLOAD_TOTAL_COUNT.load(Ordering::SeqCst),
108+
DOWNLOAD_COMPLETED_COUNT.load(Ordering::SeqCst),
109+
DOWNLOADED_BYTES.load(Ordering::SeqCst),
110+
DOWNLOAD_ERROR_COUNT.load(Ordering::SeqCst),
111+
completed
112+
)).unwrap().into_raw();
113+
}
102114
}
103115

104116
#[no_mangle]

0 commit comments

Comments
 (0)