feat: RsProcess

This commit is contained in:
2024-04-16 22:34:50 +08:00
parent 90ff0025d6
commit 603ef46f10
16 changed files with 1456 additions and 226 deletions

View File

@ -1,18 +0,0 @@
// This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.32.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
Stream<String> startProcess(
{required String executable,
required List<String> arguments,
required String workingDirectory,
dynamic hint}) =>
RustLib.instance.api.startProcess(
executable: executable,
arguments: arguments,
workingDirectory: workingDirectory,
hint: hint);

View File

@ -0,0 +1,74 @@
// This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.32.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
// Rust type: RustOpaqueNom<flutter_rust_bridge::for_generated::rust_async::RwLock<RsProcess>>
@sealed
class RsProcess extends RustOpaque {
RsProcess.dcoDecode(List<dynamic> wire) : super.dcoDecode(wire, _kStaticData);
RsProcess.sseDecode(int ptr, int externalSizeOnNative)
: super.sseDecode(ptr, externalSizeOnNative, _kStaticData);
static final _kStaticData = RustArcStaticData(
rustArcIncrementStrongCount:
RustLib.instance.api.rust_arc_increment_strong_count_RsProcess,
rustArcDecrementStrongCount:
RustLib.instance.api.rust_arc_decrement_strong_count_RsProcess,
rustArcDecrementStrongCountPtr:
RustLib.instance.api.rust_arc_decrement_strong_count_RsProcessPtr,
);
int? getPid({dynamic hint}) =>
RustLib.instance.api.rsProcessGetPid(that: this, hint: hint);
factory RsProcess({dynamic hint}) =>
RustLib.instance.api.rsProcessNew(hint: hint);
Stream<RsProcessStreamData> start(
{required String executable,
required List<String> arguments,
required String workingDirectory,
dynamic hint}) =>
RustLib.instance.api.rsProcessStart(
that: this,
executable: executable,
arguments: arguments,
workingDirectory: workingDirectory,
hint: hint);
Future<void> write({required String data, dynamic hint}) =>
RustLib.instance.api.rsProcessWrite(that: this, data: data, hint: hint);
}
class RsProcessStreamData {
final RsProcessStreamDataType dataType;
final String data;
const RsProcessStreamData({
required this.dataType,
required this.data,
});
@override
int get hashCode => dataType.hashCode ^ data.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RsProcessStreamData &&
runtimeType == other.runtimeType &&
dataType == other.dataType &&
data == other.data;
}
enum RsProcessStreamDataType {
output,
error,
exit,
;
}

View File

@ -4,7 +4,7 @@
// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
import 'api/http_api.dart';
import 'api/process_api.dart';
import 'api/rs_process.dart';
import 'dart:async';
import 'dart:convert';
import 'frb_generated.io.dart' if (dart.library.html) 'frb_generated.web.dart';
@ -56,7 +56,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
String get codegenVersion => '2.0.0-dev.32';
@override
int get rustContentHash => 593879172;
int get rustContentHash => 333909092;
static const kDefaultExternalLibraryLoaderConfig =
ExternalLibraryLoaderConfig(
@ -82,11 +82,27 @@ abstract class RustLibApi extends BaseApi {
Future<void> setDefaultHeader(
{required Map<String, String> headers, dynamic hint});
Stream<String> startProcess(
{required String executable,
int? rsProcessGetPid({required RsProcess that, dynamic hint});
RsProcess rsProcessNew({dynamic hint});
Stream<RsProcessStreamData> rsProcessStart(
{required RsProcess that,
required String executable,
required List<String> arguments,
required String workingDirectory,
dynamic hint});
Future<void> rsProcessWrite(
{required RsProcess that, required String data, dynamic hint});
RustArcIncrementStrongCountFnType
get rust_arc_increment_strong_count_RsProcess;
RustArcDecrementStrongCountFnType
get rust_arc_decrement_strong_count_RsProcess;
CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RsProcessPtr;
}
class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
@ -201,43 +217,160 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
);
@override
Stream<String> startProcess(
{required String executable,
int? rsProcessGetPid({required RsProcess that, dynamic hint}) {
return handler.executeSync(SyncTask(
callFfi: () {
var arg0 =
cst_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
that);
return wire.wire_RsProcess_get_pid(arg0);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_opt_box_autoadd_u_32,
decodeErrorData: null,
),
constMeta: kRsProcessGetPidConstMeta,
argValues: [that],
apiImpl: this,
hint: hint,
));
}
TaskConstMeta get kRsProcessGetPidConstMeta => const TaskConstMeta(
debugName: "RsProcess_get_pid",
argNames: ["that"],
);
@override
RsProcess rsProcessNew({dynamic hint}) {
return handler.executeSync(SyncTask(
callFfi: () {
return wire.wire_RsProcess_new();
},
codec: DcoCodec(
decodeSuccessData:
dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess,
decodeErrorData: null,
),
constMeta: kRsProcessNewConstMeta,
argValues: [],
apiImpl: this,
hint: hint,
));
}
TaskConstMeta get kRsProcessNewConstMeta => const TaskConstMeta(
debugName: "RsProcess_new",
argNames: [],
);
@override
Stream<RsProcessStreamData> rsProcessStart(
{required RsProcess that,
required String executable,
required List<String> arguments,
required String workingDirectory,
dynamic hint}) {
final streamSink = RustStreamSink<String>();
final streamSink = RustStreamSink<RsProcessStreamData>();
unawaited(handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_String(executable);
var arg1 = cst_encode_list_String(arguments);
var arg2 = cst_encode_String(workingDirectory);
var arg3 = cst_encode_StreamSink_String_Dco(streamSink);
return wire.wire_start_process(port_, arg0, arg1, arg2, arg3);
var arg0 =
cst_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
that);
var arg1 = cst_encode_String(executable);
var arg2 = cst_encode_list_String(arguments);
var arg3 = cst_encode_String(workingDirectory);
var arg4 = cst_encode_StreamSink_rs_process_stream_data_Dco(streamSink);
return wire.wire_RsProcess_start(port_, arg0, arg1, arg2, arg3, arg4);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_unit,
decodeErrorData: null,
),
constMeta: kStartProcessConstMeta,
argValues: [executable, arguments, workingDirectory, streamSink],
constMeta: kRsProcessStartConstMeta,
argValues: [that, executable, arguments, workingDirectory, streamSink],
apiImpl: this,
hint: hint,
)));
return streamSink.stream;
}
TaskConstMeta get kStartProcessConstMeta => const TaskConstMeta(
debugName: "start_process",
argNames: ["executable", "arguments", "workingDirectory", "streamSink"],
TaskConstMeta get kRsProcessStartConstMeta => const TaskConstMeta(
debugName: "RsProcess_start",
argNames: [
"that",
"executable",
"arguments",
"workingDirectory",
"streamSink"
],
);
@override
Future<void> rsProcessWrite(
{required RsProcess that, required String data, dynamic hint}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 =
cst_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
that);
var arg1 = cst_encode_String(data);
return wire.wire_RsProcess_write(port_, arg0, arg1);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_unit,
decodeErrorData: null,
),
constMeta: kRsProcessWriteConstMeta,
argValues: [that, data],
apiImpl: this,
hint: hint,
));
}
TaskConstMeta get kRsProcessWriteConstMeta => const TaskConstMeta(
debugName: "RsProcess_write",
argNames: ["that", "data"],
);
RustArcIncrementStrongCountFnType
get rust_arc_increment_strong_count_RsProcess => wire
.rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess;
RustArcDecrementStrongCountFnType
get rust_arc_decrement_strong_count_RsProcess => wire
.rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess;
@protected
AnyhowException dco_decode_AnyhowException(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return AnyhowException(raw as String);
}
@protected
RsProcess
dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcess.dcoDecode(raw as List<dynamic>);
}
@protected
RsProcess
dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcess.dcoDecode(raw as List<dynamic>);
}
@protected
RsProcess
dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcess.dcoDecode(raw as List<dynamic>);
}
@protected
Map<String, String> dco_decode_Map_String_String(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -246,7 +379,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
@protected
RustStreamSink<String> dco_decode_StreamSink_String_Dco(dynamic raw) {
RsProcess
dco_decode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcess.dcoDecode(raw as List<dynamic>);
}
@protected
RustStreamSink<RsProcessStreamData>
dco_decode_StreamSink_rs_process_stream_data_Dco(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
throw UnimplementedError();
}
@ -257,6 +399,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw as String;
}
@protected
int dco_decode_box_autoadd_u_32(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw as int;
}
@protected
int dco_decode_box_autoadd_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -311,6 +459,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw == null ? null : dco_decode_String(raw);
}
@protected
int? dco_decode_opt_box_autoadd_u_32(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw == null ? null : dco_decode_box_autoadd_u_32(raw);
}
@protected
int? dco_decode_opt_box_autoadd_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -336,6 +490,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
);
}
@protected
RsProcessStreamData dco_decode_rs_process_stream_data(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 2)
throw Exception('unexpected arr length: expect 2 but see ${arr.length}');
return RsProcessStreamData(
dataType: dco_decode_rs_process_stream_data_type(arr[0]),
data: dco_decode_String(arr[1]),
);
}
@protected
RsProcessStreamDataType dco_decode_rs_process_stream_data_type(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcessStreamDataType.values[raw as int];
}
@protected
RustHttpResponse dco_decode_rust_http_response(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -359,6 +531,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw as int;
}
@protected
int dco_decode_u_32(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw as int;
}
@protected
int dco_decode_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
@ -377,6 +555,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return;
}
@protected
int dco_decode_usize(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return dcoDecodeI64OrU64(raw);
}
@protected
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -384,6 +568,33 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return AnyhowException(inner);
}
@protected
RsProcess
sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return RsProcess.sseDecode(
sse_decode_usize(deserializer), sse_decode_i_32(deserializer));
}
@protected
RsProcess
sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return RsProcess.sseDecode(
sse_decode_usize(deserializer), sse_decode_i_32(deserializer));
}
@protected
RsProcess
sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return RsProcess.sseDecode(
sse_decode_usize(deserializer), sse_decode_i_32(deserializer));
}
@protected
Map<String, String> sse_decode_Map_String_String(
SseDeserializer deserializer) {
@ -393,8 +604,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
@protected
RustStreamSink<String> sse_decode_StreamSink_String_Dco(
SseDeserializer deserializer) {
RsProcess
sse_decode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return RsProcess.sseDecode(
sse_decode_usize(deserializer), sse_decode_i_32(deserializer));
}
@protected
RustStreamSink<RsProcessStreamData>
sse_decode_StreamSink_rs_process_stream_data_Dco(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
throw UnimplementedError('Unreachable ()');
}
@ -406,6 +627,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return utf8.decoder.convert(inner);
}
@protected
int sse_decode_box_autoadd_u_32(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return (sse_decode_u_32(deserializer));
}
@protected
int sse_decode_box_autoadd_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -487,6 +714,17 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
}
@protected
int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
if (sse_decode_bool(deserializer)) {
return (sse_decode_box_autoadd_u_32(deserializer));
} else {
return null;
}
}
@protected
int? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -518,6 +756,23 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return (var_field0, var_field1);
}
@protected
RsProcessStreamData sse_decode_rs_process_stream_data(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_dataType = sse_decode_rs_process_stream_data_type(deserializer);
var var_data = sse_decode_String(deserializer);
return RsProcessStreamData(dataType: var_dataType, data: var_data);
}
@protected
RsProcessStreamDataType sse_decode_rs_process_stream_data_type(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var inner = sse_decode_i_32(deserializer);
return RsProcessStreamDataType.values[inner];
}
@protected
RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -544,6 +799,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return deserializer.buffer.getUint16();
}
@protected
int sse_decode_u_32(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getUint32();
}
@protected
int sse_decode_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -561,12 +822,50 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
// Codec=Sse (Serialization based), see doc to use other codecs
}
@protected
int sse_decode_usize(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getUint64();
}
@protected
bool sse_decode_bool(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getUint8() != 0;
}
@protected
int cst_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
// ignore: invalid_use_of_internal_member
return raw.cstEncode(move: true);
}
@protected
int cst_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
// ignore: invalid_use_of_internal_member
return raw.cstEncode(move: false);
}
@protected
int cst_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
// ignore: invalid_use_of_internal_member
return raw.cstEncode(move: false);
}
@protected
int cst_encode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
// ignore: invalid_use_of_internal_member
return raw.cstEncode();
}
@protected
int cst_encode_i_32(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
@ -585,12 +884,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return cst_encode_i_32(raw.index);
}
@protected
int cst_encode_rs_process_stream_data_type(RsProcessStreamDataType raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return cst_encode_i_32(raw.index);
}
@protected
int cst_encode_u_16(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return raw;
}
@protected
int cst_encode_u_32(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return raw;
}
@protected
int cst_encode_u_8(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
@ -603,6 +914,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return raw;
}
@protected
int cst_encode_usize(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return raw;
}
@protected
void sse_encode_AnyhowException(
AnyhowException self, SseSerializer serializer) {
@ -610,6 +927,30 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
throw UnimplementedError('Unreachable ()');
}
@protected
void
sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_usize(self.sseEncode(move: true), serializer);
}
@protected
void
sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_usize(self.sseEncode(move: false), serializer);
}
@protected
void
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_usize(self.sseEncode(move: false), serializer);
}
@protected
void sse_encode_Map_String_String(
Map<String, String> self, SseSerializer serializer) {
@ -619,13 +960,22 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
@protected
void sse_encode_StreamSink_String_Dco(
RustStreamSink<String> self, SseSerializer serializer) {
void
sse_encode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_usize(self.sseEncode(move: null), serializer);
}
@protected
void sse_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(
self.setupAndSerialize(
codec: DcoCodec(
decodeSuccessData: dco_decode_String, decodeErrorData: null)),
decodeSuccessData: dco_decode_rs_process_stream_data,
decodeErrorData: null)),
serializer);
}
@ -635,6 +985,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_list_prim_u_8_strict(utf8.encoder.convert(self), serializer);
}
@protected
void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_u_32(self, serializer);
}
@protected
void sse_encode_box_autoadd_u_64(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -708,6 +1064,16 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}
}
@protected
void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_bool(self != null, serializer);
if (self != null) {
sse_encode_box_autoadd_u_32(self, serializer);
}
}
@protected
void sse_encode_opt_box_autoadd_u_64(int? self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -737,6 +1103,21 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_String(self.$2, serializer);
}
@protected
void sse_encode_rs_process_stream_data(
RsProcessStreamData self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_rs_process_stream_data_type(self.dataType, serializer);
sse_encode_String(self.data, serializer);
}
@protected
void sse_encode_rs_process_stream_data_type(
RsProcessStreamDataType self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.index, serializer);
}
@protected
void sse_encode_rust_http_response(
RustHttpResponse self, SseSerializer serializer) {
@ -756,6 +1137,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
serializer.buffer.putUint16(self);
}
@protected
void sse_encode_u_32(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putUint32(self);
}
@protected
void sse_encode_u_64(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
@ -773,6 +1160,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
// Codec=Sse (Serialization based), see doc to use other codecs
}
@protected
void sse_encode_usize(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putUint64(self);
}
@protected
void sse_encode_bool(bool self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs

View File

@ -4,7 +4,7 @@
// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
import 'api/http_api.dart';
import 'api/process_api.dart';
import 'api/rs_process.dart';
import 'dart:async';
import 'dart:convert';
import 'dart:ffi' as ffi;
@ -20,18 +20,45 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
required super.portManager,
});
CrossPlatformFinalizerArg get rust_arc_decrement_strong_count_RsProcessPtr =>
wire._rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcessPtr;
@protected
AnyhowException dco_decode_AnyhowException(dynamic raw);
@protected
RsProcess
dco_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw);
@protected
RsProcess
dco_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw);
@protected
RsProcess
dco_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw);
@protected
Map<String, String> dco_decode_Map_String_String(dynamic raw);
@protected
RustStreamSink<String> dco_decode_StreamSink_String_Dco(dynamic raw);
RsProcess
dco_decode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
dynamic raw);
@protected
RustStreamSink<RsProcessStreamData>
dco_decode_StreamSink_rs_process_stream_data_Dco(dynamic raw);
@protected
String dco_decode_String(dynamic raw);
@protected
int dco_decode_box_autoadd_u_32(dynamic raw);
@protected
int dco_decode_box_autoadd_u_64(dynamic raw);
@ -59,6 +86,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
String? dco_decode_opt_String(dynamic raw);
@protected
int? dco_decode_opt_box_autoadd_u_32(dynamic raw);
@protected
int? dco_decode_opt_box_autoadd_u_64(dynamic raw);
@ -68,12 +98,21 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
(String, String) dco_decode_record_string_string(dynamic raw);
@protected
RsProcessStreamData dco_decode_rs_process_stream_data(dynamic raw);
@protected
RsProcessStreamDataType dco_decode_rs_process_stream_data_type(dynamic raw);
@protected
RustHttpResponse dco_decode_rust_http_response(dynamic raw);
@protected
int dco_decode_u_16(dynamic raw);
@protected
int dco_decode_u_32(dynamic raw);
@protected
int dco_decode_u_64(dynamic raw);
@ -83,20 +122,47 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void dco_decode_unit(dynamic raw);
@protected
int dco_decode_usize(dynamic raw);
@protected
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer);
@protected
RsProcess
sse_decode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer);
@protected
RsProcess
sse_decode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer);
@protected
RsProcess
sse_decode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer);
@protected
Map<String, String> sse_decode_Map_String_String(
SseDeserializer deserializer);
@protected
RustStreamSink<String> sse_decode_StreamSink_String_Dco(
SseDeserializer deserializer);
RsProcess
sse_decode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
SseDeserializer deserializer);
@protected
RustStreamSink<RsProcessStreamData>
sse_decode_StreamSink_rs_process_stream_data_Dco(
SseDeserializer deserializer);
@protected
String sse_decode_String(SseDeserializer deserializer);
@protected
int sse_decode_box_autoadd_u_32(SseDeserializer deserializer);
@protected
int sse_decode_box_autoadd_u_64(SseDeserializer deserializer);
@ -126,6 +192,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
String? sse_decode_opt_String(SseDeserializer deserializer);
@protected
int? sse_decode_opt_box_autoadd_u_32(SseDeserializer deserializer);
@protected
int? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer);
@ -136,12 +205,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
(String, String) sse_decode_record_string_string(
SseDeserializer deserializer);
@protected
RsProcessStreamData sse_decode_rs_process_stream_data(
SseDeserializer deserializer);
@protected
RsProcessStreamDataType sse_decode_rs_process_stream_data_type(
SseDeserializer deserializer);
@protected
RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer);
@protected
int sse_decode_u_16(SseDeserializer deserializer);
@protected
int sse_decode_u_32(SseDeserializer deserializer);
@protected
int sse_decode_u_64(SseDeserializer deserializer);
@ -151,6 +231,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void sse_decode_unit(SseDeserializer deserializer);
@protected
int sse_decode_usize(SseDeserializer deserializer);
@protected
bool sse_decode_bool(SseDeserializer deserializer);
@ -170,12 +253,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
}
@protected
ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_StreamSink_String_Dco(
RustStreamSink<String> raw) {
ffi.Pointer<wire_cst_list_prim_u_8_strict>
cst_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return cst_encode_String(raw.setupAndSerialize(
codec: DcoCodec(
decodeSuccessData: dco_decode_String, decodeErrorData: null)));
decodeSuccessData: dco_decode_rs_process_stream_data,
decodeErrorData: null)));
}
@protected
@ -184,6 +269,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
return cst_encode_list_prim_u_8_strict(utf8.encoder.convert(raw));
}
@protected
ffi.Pointer<ffi.Uint32> cst_encode_box_autoadd_u_32(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return wire.cst_new_box_autoadd_u_32(cst_encode_u_32(raw));
}
@protected
ffi.Pointer<ffi.Uint64> cst_encode_box_autoadd_u_64(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
@ -234,6 +325,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
return raw == null ? ffi.nullptr : cst_encode_String(raw);
}
@protected
ffi.Pointer<ffi.Uint32> cst_encode_opt_box_autoadd_u_32(int? raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return raw == null ? ffi.nullptr : cst_encode_box_autoadd_u_32(raw);
}
@protected
ffi.Pointer<ffi.Uint64> cst_encode_opt_box_autoadd_u_64(int? raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
@ -260,6 +357,13 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
wireObj.field1 = cst_encode_String(apiObj.$2);
}
@protected
void cst_api_fill_to_wire_rs_process_stream_data(
RsProcessStreamData apiObj, wire_cst_rs_process_stream_data wireObj) {
wireObj.data_type = cst_encode_rs_process_stream_data_type(apiObj.dataType);
wireObj.data = cst_encode_String(apiObj.data);
}
@protected
void cst_api_fill_to_wire_rust_http_response(
RustHttpResponse apiObj, wire_cst_rust_http_response wireObj) {
@ -273,6 +377,22 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
wireObj.data = cst_encode_opt_list_prim_u_8_strict(apiObj.data);
}
@protected
int cst_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw);
@protected
int cst_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw);
@protected
int cst_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw);
@protected
int cst_encode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess raw);
@protected
int cst_encode_i_32(int raw);
@ -282,30 +402,62 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
int cst_encode_my_method(MyMethod raw);
@protected
int cst_encode_rs_process_stream_data_type(RsProcessStreamDataType raw);
@protected
int cst_encode_u_16(int raw);
@protected
int cst_encode_u_32(int raw);
@protected
int cst_encode_u_8(int raw);
@protected
void cst_encode_unit(void raw);
@protected
int cst_encode_usize(int raw);
@protected
void sse_encode_AnyhowException(
AnyhowException self, SseSerializer serializer);
@protected
void
sse_encode_Auto_Owned_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer);
@protected
void
sse_encode_Auto_RefMut_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer);
@protected
void
sse_encode_Auto_Ref_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer);
@protected
void sse_encode_Map_String_String(
Map<String, String> self, SseSerializer serializer);
@protected
void sse_encode_StreamSink_String_Dco(
RustStreamSink<String> self, SseSerializer serializer);
void
sse_encode_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
RsProcess self, SseSerializer serializer);
@protected
void sse_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> self, SseSerializer serializer);
@protected
void sse_encode_String(String self, SseSerializer serializer);
@protected
void sse_encode_box_autoadd_u_32(int self, SseSerializer serializer);
@protected
void sse_encode_box_autoadd_u_64(int self, SseSerializer serializer);
@ -336,6 +488,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void sse_encode_opt_String(String? self, SseSerializer serializer);
@protected
void sse_encode_opt_box_autoadd_u_32(int? self, SseSerializer serializer);
@protected
void sse_encode_opt_box_autoadd_u_64(int? self, SseSerializer serializer);
@ -347,6 +502,14 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_record_string_string(
(String, String) self, SseSerializer serializer);
@protected
void sse_encode_rs_process_stream_data(
RsProcessStreamData self, SseSerializer serializer);
@protected
void sse_encode_rs_process_stream_data_type(
RsProcessStreamDataType self, SseSerializer serializer);
@protected
void sse_encode_rust_http_response(
RustHttpResponse self, SseSerializer serializer);
@ -354,6 +517,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void sse_encode_u_16(int self, SseSerializer serializer);
@protected
void sse_encode_u_32(int self, SseSerializer serializer);
@protected
void sse_encode_u_64(int self, SseSerializer serializer);
@ -363,6 +529,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected
void sse_encode_unit(void self, SseSerializer serializer);
@protected
void sse_encode_usize(int self, SseSerializer serializer);
@protected
void sse_encode_bool(bool self, SseSerializer serializer);
}
@ -499,15 +668,41 @@ class RustLibWire implements BaseWire {
late final _wire_set_default_header = _wire_set_default_headerPtr.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_record_string_string>)>();
void wire_start_process(
WireSyncRust2DartDco wire_RsProcess_get_pid(
int that,
) {
return _wire_RsProcess_get_pid(
that,
);
}
late final _wire_RsProcess_get_pidPtr =
_lookup<ffi.NativeFunction<WireSyncRust2DartDco Function(ffi.UintPtr)>>(
'frbgen_starcitizen_doctor_wire_RsProcess_get_pid');
late final _wire_RsProcess_get_pid = _wire_RsProcess_get_pidPtr
.asFunction<WireSyncRust2DartDco Function(int)>();
WireSyncRust2DartDco wire_RsProcess_new() {
return _wire_RsProcess_new();
}
late final _wire_RsProcess_newPtr =
_lookup<ffi.NativeFunction<WireSyncRust2DartDco Function()>>(
'frbgen_starcitizen_doctor_wire_RsProcess_new');
late final _wire_RsProcess_new =
_wire_RsProcess_newPtr.asFunction<WireSyncRust2DartDco Function()>();
void wire_RsProcess_start(
int port_,
int that,
ffi.Pointer<wire_cst_list_prim_u_8_strict> executable,
ffi.Pointer<wire_cst_list_String> arguments,
ffi.Pointer<wire_cst_list_prim_u_8_strict> working_directory,
ffi.Pointer<wire_cst_list_prim_u_8_strict> stream_sink,
) {
return _wire_start_process(
return _wire_RsProcess_start(
port_,
that,
executable,
arguments,
working_directory,
@ -515,23 +710,91 @@ class RustLibWire implements BaseWire {
);
}
late final _wire_start_processPtr = _lookup<
late final _wire_RsProcess_startPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.UintPtr,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_String>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_start_process');
late final _wire_start_process = _wire_start_processPtr.asFunction<
'frbgen_starcitizen_doctor_wire_RsProcess_start');
late final _wire_RsProcess_start = _wire_RsProcess_startPtr.asFunction<
void Function(
int,
int,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_String>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire_RsProcess_write(
int port_,
int that,
ffi.Pointer<wire_cst_list_prim_u_8_strict> data,
) {
return _wire_RsProcess_write(
port_,
that,
data,
);
}
late final _wire_RsProcess_writePtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Int64, ffi.UintPtr,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_RsProcess_write');
late final _wire_RsProcess_write = _wire_RsProcess_writePtr.asFunction<
void Function(int, int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void
rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
ffi.Pointer<ffi.Void> ptr,
) {
return _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
ptr,
);
}
late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcessPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>(
'frbgen_starcitizen_doctor_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess');
late final _rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess =
_rust_arc_increment_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcessPtr
.asFunction<void Function(ffi.Pointer<ffi.Void>)>();
void
rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
ffi.Pointer<ffi.Void> ptr,
) {
return _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess(
ptr,
);
}
late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcessPtr =
_lookup<ffi.NativeFunction<ffi.Void Function(ffi.Pointer<ffi.Void>)>>(
'frbgen_starcitizen_doctor_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess');
late final _rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcess =
_rust_arc_decrement_strong_count_RustOpaque_flutter_rust_bridgefor_generatedrust_asyncRwLockRsProcessPtr
.asFunction<void Function(ffi.Pointer<ffi.Void>)>();
ffi.Pointer<ffi.Uint32> cst_new_box_autoadd_u_32(
int value,
) {
return _cst_new_box_autoadd_u_32(
value,
);
}
late final _cst_new_box_autoadd_u_32Ptr =
_lookup<ffi.NativeFunction<ffi.Pointer<ffi.Uint32> Function(ffi.Uint32)>>(
'frbgen_starcitizen_doctor_cst_new_box_autoadd_u_32');
late final _cst_new_box_autoadd_u_32 = _cst_new_box_autoadd_u_32Ptr
.asFunction<ffi.Pointer<ffi.Uint32> Function(int)>();
ffi.Pointer<ffi.Uint64> cst_new_box_autoadd_u_64(
int value,
) {
@ -641,6 +904,13 @@ final class wire_cst_list_String extends ffi.Struct {
external int len;
}
final class wire_cst_rs_process_stream_data extends ffi.Struct {
@ffi.Int32()
external int data_type;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> data;
}
final class wire_cst_rust_http_response extends ffi.Struct {
@ffi.Uint16()
external int status_code;

View File

@ -1,8 +1,6 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/common/conf/binary_conf.dart';
import 'package:starcitizen_doctor/common/rust/api/process_api.dart'
as rs_process;
import 'dart:io';
import 'dart:math';
import 'package:aria2/aria2.dart';
@ -10,6 +8,7 @@ import 'package:flutter/foundation.dart';
import 'package:hive/hive.dart';
import 'package:starcitizen_doctor/api/api.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/rust/api/rs_process.dart';
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart';
@ -98,7 +97,9 @@ class Aria2cModel extends _$Aria2cModel {
dPrint("trackerList === $trackerList");
dPrint("Aria2cManager .----- aria2c start $port------");
final stream = rs_process.startProcess(
final rsp = RsProcess();
final stream = rsp.start(
executable: exePath,
arguments: [
"-V",
@ -122,16 +123,20 @@ class Aria2cModel extends _$Aria2cModel {
stream.listen((event) {
dPrint("Aria2cManager.rs_process event === $event");
if (event.startsWith("output:")) {
if (event.contains("IPv4 RPC: listening on TCP port")) {
_onLaunch(port, pwd, trackerList);
}
} else if (event.startsWith("error:")) {
state = state.copyWith(aria2c: null);
launchError = event;
} else if (event.startsWith("exit:")) {
state = state.copyWith(aria2c: null);
launchError = event;
switch (event.dataType) {
case RsProcessStreamDataType.output:
if (event.data.contains("IPv4 RPC: listening on TCP port")) {
_onLaunch(port, pwd, trackerList);
}
break;
case RsProcessStreamDataType.error:
launchError = event.data;
state = state.copyWith(aria2c: null);
break;
case RsProcessStreamDataType.exit:
launchError = event.data;
state = state.copyWith(aria2c: null);
break;
}
});

View File

@ -6,6 +6,7 @@ import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/common/conf/binary_conf.dart';
import 'package:starcitizen_doctor/common/rust/api/rs_process.dart';
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/data/app_unp4k_p4k_item_data.dart';
@ -29,7 +30,7 @@ class Unp4kcState with _$Unp4kcState {
@riverpod
class Unp4kCModel extends _$Unp4kCModel {
Process? _process;
RsProcess? _process;
@override
Unp4kcState build() {
@ -48,41 +49,50 @@ class Unp4kCModel extends _$Unp4kCModel {
await BinaryModuleConf.extractModule(
["unp4kc"], appGlobalState.applicationBinaryModuleDir!);
final exec = "$execDir\\unp4kc.exe";
final ps = await Process.start(exec, []);
StringBuffer stringBuffer = StringBuffer();
_process = ps;
ps.stdout.listen((event) async {
final eventStr = String.fromCharCodes(event);
stringBuffer.write(eventStr);
if (!eventStr.endsWith("\n")) return;
final str = stringBuffer.toString().trim();
stringBuffer.clear();
try {
final eventJson = await compute(json.decode, str);
_handleMessage(eventJson, ps);
} catch (e) {
dPrint("[unp4kc] json error: $e");
// final ps = await Process.start(exec, []);
// StringBuffer stringBuffer = StringBuffer();
_process = RsProcess();
final stream = _process?.start(
executable: exec, arguments: [], workingDirectory: execDir);
stream?.listen((event) async {
switch (event.dataType) {
case RsProcessStreamDataType.output:
try {
final eventJson = await compute(json.decode, event.data);
_handleMessage(eventJson);
} catch (e) {
dPrint("[unp4kc] json error: $e");
}
break;
case RsProcessStreamDataType.error:
dPrint("[unp4kc] stderr: ${event.data}");
break;
case RsProcessStreamDataType.exit:
dPrint("[unp4kc] exit: ${event.data}");
break;
}
});
ps.stderr.listen((event) {
final eventStr = String.fromCharCodes(event);
dPrint("[unp4kc] stderr: $eventStr");
});
state = state.copyWith(startUp: true);
ref.onDispose(() {
ps.kill();
dPrint("[unp4kc] kill ...");
final pid = _process?.getPid();
if (pid != null) {
Process.killPid(pid);
dPrint("[unp4kc] kill ...");
}
});
}
void _handleMessage(Map<String, dynamic> eventJson, Process ps) async {
void _handleMessage(Map<String, dynamic> eventJson) async {
final action = eventJson["action"];
final data = eventJson["data"];
final gamePath = getGamePath();
final gameP4kPath = "$gamePath\\Data.p4k";
switch (action.toString().trim()) {
case "info: startup":
ps.stdin.writeln(gameP4kPath);
_process?.write(data: "$gameP4kPath\n");
state = state.copyWith(endMessage: "正在读取P4K 文件 ...");
break;
case "data: P4K_Files":
@ -117,7 +127,6 @@ class Unp4kCModel extends _$Unp4kCModel {
openType = "image";
}
}
state = state.copyWith(
tempOpenFile: MapEntry(openType, filePath),
endMessage: "打开文件:$filePath");
@ -186,6 +195,6 @@ class Unp4kCModel extends _$Unp4kCModel {
}
outputPath = "$outputPath$filePath";
dPrint("extractFile .... $filePath");
_process?.stdin.writeln("$mode<:,:>$filePath<:,:>$outputPath");
_process?.write(data: "$mode<:,:>$filePath<:,:>$outputPath");
}
}