@@ -10,6 +10,7 @@ import 'package:device_info/device_info.dart';
10
10
import 'package:ffi/ffi.dart' ;
11
11
import 'package:flutter/foundation.dart' ;
12
12
import 'package:flutter/services.dart' ;
13
+ import 'package:synchronized/synchronized.dart' as sync;
13
14
import 'package:path_provider/path_provider.dart' ;
14
15
import 'package:violet/component/downloadable.dart' ;
15
16
@@ -30,18 +31,18 @@ class NativeDownloadTask {
30
31
31
32
NativeDownloadTask ({this .id, this .url, this .fullpath, this .header});
32
33
33
- static NativeDownloadTask fromDownloadTask (DownloadTask task) {
34
+ static NativeDownloadTask fromDownloadTask (int taskId, DownloadTask task) {
34
35
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;
38
39
if (task.headers != null ) {
39
40
task.headers.entries.forEach ((element) {
40
41
header[element.key.toLowerCase ()] = element.value;
41
42
});
42
43
}
43
44
return NativeDownloadTask (
44
- id: task. taskId,
45
+ id: taskId,
45
46
url: task.url,
46
47
fullpath: task.downloadPath,
47
48
header: header,
@@ -50,7 +51,7 @@ class NativeDownloadTask {
50
51
51
52
String toString () {
52
53
return jsonEncode ({
53
- "id" : 1 ,
54
+ "id" : id ,
54
55
"url" : url,
55
56
"fullpath" : fullpath,
56
57
"header" : header,
@@ -64,6 +65,9 @@ class NativeDownloader {
64
65
DownloaderDispose downloaderDispose;
65
66
DownloaderStatus downloaderStatus;
66
67
DownloaderAppend downloaderAppend;
68
+ List <DownloadTask > downloadTasks = List <DownloadTask >();
69
+
70
+ sync .Lock lock = sync .Lock ();
67
71
68
72
Future <void > init () async {
69
73
final soPath = await _checkSharedLibrary ();
@@ -85,7 +89,7 @@ class NativeDownloader {
85
89
.lookup <NativeFunction <downloader_append>>("downloader_append" )
86
90
.asFunction ();
87
91
88
- downloaderInit (8 );
92
+ downloaderInit (32 );
89
93
}
90
94
91
95
static NativeDownloader _instance;
@@ -98,16 +102,46 @@ class NativeDownloader {
98
102
return _instance;
99
103
}
100
104
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
+ });
104
126
}
105
127
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
+ });
111
145
});
112
146
}
113
147
0 commit comments