@@ -11,7 +11,8 @@ use crate::backend::ui::{FileDialogResult, FileFilter};
11
11
use crate :: string:: { AvmString , StringContext } ;
12
12
use gc_arena:: barrier:: unlock;
13
13
use gc_arena:: lock:: Lock ;
14
- use gc_arena:: { Collect , Gc , Mutation } ;
14
+ use gc_arena:: { Collect , Gc } ;
15
+ use ruffle_macros:: istr;
15
16
use url:: Url ;
16
17
17
18
// There are two undocumented functions in FileReference: convertToPPT and deleteConvertedPPT.
@@ -32,6 +33,9 @@ impl<'gc> FileReferenceObject<'gc> {
32
33
activation : & mut Activation < ' _ , ' gc > ,
33
34
dialog_result : & dyn FileDialogResult ,
34
35
) {
36
+ let mc = activation. gc ( ) ;
37
+ let write = Gc :: write ( mc, self . 0 ) ;
38
+
35
39
self . 0 . is_initialised . set ( true ) ;
36
40
37
41
let date_proto = activation. context . avm1 . prototypes ( ) . date_constructor ;
@@ -40,7 +44,7 @@ impl<'gc> FileReferenceObject<'gc> {
40
44
activation,
41
45
& [ ( creation_time. timestamp_millis ( ) as f64 ) . into ( ) ] ,
42
46
) {
43
- self . set_creation_date ( activation . gc ( ) , Some ( obj) ) ;
47
+ unlock ! ( write , FileReferenceData , creation_date ) . set ( Some ( obj) ) ;
44
48
}
45
49
}
46
50
@@ -49,39 +53,41 @@ impl<'gc> FileReferenceObject<'gc> {
49
53
activation,
50
54
& [ ( modification_time. timestamp_millis ( ) as f64 ) . into ( ) ] ,
51
55
) {
52
- self . set_modification_date ( activation . gc ( ) , Some ( obj) ) ;
56
+ unlock ! ( write , FileReferenceData , modification_date ) . set ( Some ( obj) ) ;
53
57
}
54
58
}
55
59
56
- self . 0 . file_type . replace ( dialog_result. file_type ( ) ) ;
57
- self . 0 . name . replace ( dialog_result. file_name ( ) ) ;
58
- self . 0 . size . replace ( dialog_result. size ( ) ) ;
59
- self . 0 . creator . replace ( dialog_result. creator ( ) ) ;
60
- self . 0 . data . replace ( dialog_result. contents ( ) . to_vec ( ) ) ;
61
- }
60
+ let file_type = dialog_result
61
+ . file_type ( )
62
+ . map ( |s| AvmString :: new_utf8 ( mc, s) ) ;
63
+ unlock ! ( write, FileReferenceData , file_type) . set ( file_type) ;
62
64
63
- fn set_creation_date ( self , gc : & ' gc Mutation < ' gc > , creation_date : Option < Object < ' gc > > ) {
64
- unlock ! ( Gc :: write( gc, self . 0 ) , FileReferenceData , creation_date) . set ( creation_date) ;
65
- }
65
+ let file_name = dialog_result
66
+ . file_name ( )
67
+ . map ( |s| AvmString :: new_utf8 ( mc, s) ) ;
68
+ unlock ! ( write, FileReferenceData , name) . set ( file_name) ;
69
+
70
+ let creator = dialog_result. creator ( ) . map ( |s| AvmString :: new_utf8 ( mc, s) ) ;
71
+ unlock ! ( write, FileReferenceData , creator) . set ( creator) ;
66
72
67
- fn set_modification_date ( self , gc : & ' gc Mutation < ' gc > , modification_date : Option < Object < ' gc > > ) {
68
- unlock ! ( Gc :: write ( gc , self . 0 ) , FileReferenceData , modification_date ) . set ( modification_date ) ;
73
+ self . 0 . size . replace ( dialog_result . size ( ) ) ;
74
+ self . 0 . data . replace ( dialog_result . contents ( ) . to_vec ( ) ) ;
69
75
}
70
76
}
71
77
72
- #[ derive( Default , Clone , Collect ) ]
78
+ #[ derive( Clone , Default , Collect ) ]
73
79
#[ collect( no_drop) ]
74
80
pub struct FileReferenceData < ' gc > {
75
81
/// Has this object been initialised from a dialog
76
82
is_initialised : Cell < bool > ,
77
83
78
84
creation_date : Lock < Option < Object < ' gc > > > ,
79
- creator : RefCell < Option < String > > ,
85
+ creator : Lock < Option < AvmString < ' gc > > > ,
80
86
modification_date : Lock < Option < Object < ' gc > > > ,
81
- name : RefCell < Option < String > > ,
82
- post_data : RefCell < String > ,
87
+ name : Lock < Option < AvmString < ' gc > > > ,
88
+ post_data : Lock < Option < AvmString < ' gc > > > ,
83
89
size : Cell < Option < u64 > > ,
84
- file_type : RefCell < Option < String > > ,
90
+ file_type : Lock < Option < AvmString < ' gc > > > ,
85
91
86
92
/// The contents of the referenced file
87
93
/// We track this here so that it can be referenced in FileReference.upload
@@ -114,26 +120,23 @@ pub fn creation_date<'gc>(
114
120
. 0
115
121
. creation_date
116
122
. get ( )
117
- . map_or ( Value :: Undefined , |x| x . into ( ) ) ) ;
123
+ . map_or ( Value :: Undefined , Into :: into) ) ;
118
124
}
119
125
120
126
Ok ( Value :: Undefined )
121
127
}
122
128
123
129
pub fn creator < ' gc > (
124
- activation : & mut Activation < ' _ , ' gc > ,
130
+ _activation : & mut Activation < ' _ , ' gc > ,
125
131
this : Object < ' gc > ,
126
132
_args : & [ Value < ' gc > ] ,
127
133
) -> Result < Value < ' gc > , Error < ' gc > > {
128
134
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
129
135
return Ok ( file_ref
130
136
. 0
131
137
. creator
132
- . borrow ( )
133
- . as_ref ( )
134
- . map_or ( Value :: Undefined , |x| {
135
- AvmString :: new_utf8 ( activation. gc ( ) , x) . into ( )
136
- } ) ) ;
138
+ . get ( )
139
+ . map_or ( Value :: Undefined , Into :: into) ) ;
137
140
}
138
141
139
142
Ok ( Value :: Undefined )
@@ -149,26 +152,19 @@ pub fn modification_date<'gc>(
149
152
. 0
150
153
. modification_date
151
154
. get ( )
152
- . map_or ( Value :: Undefined , |x| x . into ( ) ) ) ;
155
+ . map_or ( Value :: Undefined , Into :: into) ) ;
153
156
}
154
157
155
158
Ok ( Value :: Undefined )
156
159
}
157
160
158
161
pub fn name < ' gc > (
159
- activation : & mut Activation < ' _ , ' gc > ,
162
+ _activation : & mut Activation < ' _ , ' gc > ,
160
163
this : Object < ' gc > ,
161
164
_args : & [ Value < ' gc > ] ,
162
165
) -> Result < Value < ' gc > , Error < ' gc > > {
163
166
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
164
- return Ok ( file_ref
165
- . 0
166
- . name
167
- . borrow ( )
168
- . as_ref ( )
169
- . map_or ( Value :: Undefined , |x| {
170
- AvmString :: new_utf8 ( activation. gc ( ) , x) . into ( )
171
- } ) ) ;
167
+ return Ok ( file_ref. 0 . name . get ( ) . map_or ( Value :: Undefined , Into :: into) ) ;
172
168
}
173
169
174
170
Ok ( Value :: Undefined )
@@ -180,9 +176,8 @@ pub fn post_data<'gc>(
180
176
_args : & [ Value < ' gc > ] ,
181
177
) -> Result < Value < ' gc > , Error < ' gc > > {
182
178
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
183
- return Ok (
184
- AvmString :: new_utf8 ( activation. gc ( ) , file_ref. 0 . post_data . borrow ( ) . clone ( ) ) . into ( ) ,
185
- ) ;
179
+ let post_data = file_ref. 0 . post_data . get ( ) ;
180
+ return Ok ( post_data. unwrap_or_else ( || istr ! ( "" ) ) . into ( ) ) ;
186
181
}
187
182
188
183
Ok ( Value :: Undefined )
@@ -199,7 +194,8 @@ pub fn set_post_data<'gc>(
199
194
. coerce_to_string ( activation) ?;
200
195
201
196
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
202
- file_ref. 0 . post_data . replace ( post_data. to_string ( ) ) ;
197
+ let write = Gc :: write ( activation. gc ( ) , file_ref. 0 ) ;
198
+ unlock ! ( write, FileReferenceData , post_data) . set ( Some ( post_data) ) ;
203
199
}
204
200
205
201
Ok ( Value :: Undefined )
@@ -211,26 +207,21 @@ pub fn size<'gc>(
211
207
_args : & [ Value < ' gc > ] ,
212
208
) -> Result < Value < ' gc > , Error < ' gc > > {
213
209
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
214
- return Ok ( file_ref. 0 . size . get ( ) . map_or ( Value :: Undefined , |x| x. into ( ) ) ) ;
210
+ let size = file_ref. 0 . size . get ( ) ;
211
+ return Ok ( size. map_or ( Value :: Undefined , Into :: into) ) ;
215
212
}
216
213
217
214
Ok ( Value :: Undefined )
218
215
}
219
216
220
217
pub fn file_type < ' gc > (
221
- activation : & mut Activation < ' _ , ' gc > ,
218
+ _activation : & mut Activation < ' _ , ' gc > ,
222
219
this : Object < ' gc > ,
223
220
_args : & [ Value < ' gc > ] ,
224
221
) -> Result < Value < ' gc > , Error < ' gc > > {
225
222
if let NativeObject :: FileReference ( file_ref) = this. native ( ) {
226
- return Ok ( file_ref
227
- . 0
228
- . file_type
229
- . borrow ( )
230
- . as_ref ( )
231
- . map_or ( Value :: Undefined , |x| {
232
- AvmString :: new_utf8 ( activation. gc ( ) , x) . into ( )
233
- } ) ) ;
223
+ let file_type = file_ref. 0 . file_type . get ( ) ;
224
+ return Ok ( file_type. map_or ( Value :: Undefined , Into :: into) ) ;
234
225
}
235
226
236
227
Ok ( Value :: Undefined )
@@ -401,17 +392,17 @@ pub fn upload<'gc>(
401
392
_ => return Ok ( false . into ( ) ) ,
402
393
}
403
394
395
+ let file_name = match file_reference. 0 . name . get ( ) {
396
+ Some ( name) => name. to_string ( ) ,
397
+ None => "file" . to_string ( ) ,
398
+ } ;
399
+
404
400
let process = activation. context . load_manager . upload_file (
405
401
activation. context . player . clone ( ) ,
406
402
this,
407
403
url_string,
408
404
file_reference. 0 . data . borrow ( ) . clone ( ) ,
409
- file_reference
410
- . 0
411
- . name
412
- . borrow ( )
413
- . clone ( )
414
- . unwrap_or_else ( || "file" . to_string ( ) ) ,
405
+ file_name,
415
406
) ;
416
407
417
408
activation. context . navigator . spawn_future ( process) ;
0 commit comments