Skip to content

Commit 99cc737

Browse files
committed
Implement demo app checks of writeStream()
1 parent 6860e84 commit 99cc737

File tree

3 files changed

+215
-22
lines changed

3 files changed

+215
-22
lines changed

RNFetchBlobWin/App.js

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,13 @@ const App: () => React$Node = () => {
4747
const [hashPathParam, setHashPathParam] = useState('');
4848
const [hashAlgValue, setHashAlgValue] = useState('md5');
4949

50+
const [writeParam, setWriteParam] = useState('');
51+
const [writeURIParam, setWriteURIParam] = useState('');
52+
const [writeEncodeParam, setWriteEncodeParam] = useState('utf8');
53+
54+
const [writeStreamParam, setWriteStreamParam] = useState('');
55+
const [writeEncodeStreamParam, setWriteStreamEncodeParam] = useState('utf8');
56+
5057
// Methods ********************************************************************
5158
// exists()
5259
const existsCall = () => {
@@ -223,6 +230,109 @@ const App: () => React$Node = () => {
223230
});
224231
}
225232

233+
234+
// writeFile()
235+
const writeFileCall = () => {
236+
if(writeParam.length > 0) {
237+
if(writeEncodeParam === 'uri') {
238+
if(writeURIParam.length > 0) {
239+
RNFetchBlob.fs.writeFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam,
240+
RNFetchBlob.fs.dirs.DocumentDir + '/' + writeURIParam,
241+
writeEncodeParam);
242+
}
243+
else {
244+
Alert.alert('uri path undefined');
245+
}
246+
}
247+
else if(writeEncodeParam === 'ascii') {
248+
RNFetchBlob.fs.writeFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam, [102,111,111], writeEncodeParam);
249+
}
250+
else {
251+
RNFetchBlob.fs.writeFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam, 'foo', writeEncodeParam);
252+
}
253+
}
254+
}
255+
256+
// appendFile()
257+
const appendFileCall = () => {
258+
if(writeParam.length > 0) {
259+
if(writeEncodeParam === 'uri') {
260+
if(writeURIParam.length > 0) {
261+
RNFetchBlob.fs.appendFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam,
262+
RNFetchBlob.fs.dirs.DocumentDir + '/' + writeURIParam,
263+
writeEncodeParam);
264+
}
265+
else {
266+
Alert.alert('uri path undefined');
267+
}
268+
}
269+
else if(writeEncodeParam === 'ascii') {
270+
RNFetchBlob.fs.appendFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam, [102,111,111], writeEncodeParam);
271+
}
272+
else {
273+
RNFetchBlob.fs.appendFile(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeParam, 'foo', writeEncodeParam);
274+
}
275+
}
276+
}
277+
278+
const writeStreamCall = () => {
279+
if(writeStreamParam.length > 0) {
280+
if(writeEncodeStreamParam === 'base64') {
281+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, false)
282+
.then((stream) => {
283+
stream.write('Zm9vIChXcml0ZSBCYXNlNjQpMQ==');
284+
stream.write('Zm9vIChXcml0ZSBCYXNlNjQpMg==');
285+
return stream.close();
286+
});
287+
}
288+
else if(writeEncodeStreamParam=== 'ascii') {
289+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, false)
290+
.then((stream) => {
291+
stream.write([102, 111, 111, 32, 40, 87, 114, 105, 116]);
292+
stream.write([ 101, 32, 97, 115, 99, 105, 105, 41]);
293+
return stream.close();
294+
});
295+
}
296+
else {
297+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, false)
298+
.then((stream) => {
299+
stream.write('foo (Write utf8)1');
300+
stream.write('foo (Write utf8)2');
301+
return stream.close();
302+
});
303+
}
304+
}
305+
}
306+
307+
const appendStreamCall = () => {
308+
if(writeStreamParam.length > 0) {
309+
if(writeEncodeStreamParam === 'base64') {
310+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, true)
311+
.then((stream) => {
312+
stream.write('Zm9vIChBcHBlbmQgQmFzZTY0KTE=');
313+
stream.write('Zm9vIChBcHBlbmQgQmFzZTY0KTI=');
314+
return stream.close();
315+
});
316+
}
317+
else if(writeEncodeStreamParam=== 'ascii') {
318+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, true)
319+
.then((stream) => {
320+
stream.write([102, 111, 111, 32, 40]);
321+
stream.write([65, 112, 112, 101, 110, 100, 32, 65, 83, 67, 73, 73, 41]);
322+
return stream.close();
323+
});
324+
}
325+
else {
326+
RNFetchBlob.fs.writeStream(RNFetchBlob.fs.dirs.DocumentDir + '/' + writeStreamParam, writeEncodeStreamParam, true)
327+
.then((stream) => {
328+
stream.write('foo (Append utf8)1');
329+
stream.write('foo (Append utf8)2');
330+
return stream.close();
331+
});
332+
}
333+
}
334+
}
335+
226336
// App ************************************************************************
227337
return (
228338
<>
@@ -506,6 +616,87 @@ const App: () => React$Node = () => {
506616
/>
507617
</View>
508618
</View>
619+
620+
<View style={styles.body}>
621+
<View style={styles.sectionContainer}>
622+
<Text style={styles.sectionTitle}>
623+
{"write - writeFile(), appendFile()"}
624+
</Text>
625+
<View style={styles.sectionDescription}>
626+
<TextInput style = {styles.input}
627+
placeholder = "Source path"
628+
onChangeText={writeParam => setWriteParam(writeParam)}
629+
placeholderTextColor = "#9a73ef"
630+
autoCapitalize = "none"
631+
/>
632+
<TextInput style = {styles.input}
633+
placeholder = "Source path"
634+
onChangeText={writeURIParam => setWriteURIParam(writeURIParam)}
635+
placeholderTextColor = "#9a73ef"
636+
autoCapitalize = "none"
637+
/>
638+
<Picker
639+
writeEncodeStreamParam={writeEncodeParam}
640+
onChangeText={readPositionParam => setReadPositionParam(readPositionParam)}
641+
style={{ height: 50, width: 150 }}
642+
onValueChange={(itemValue, itemIndex) => setWriteEncodeParam(itemValue)}
643+
>
644+
<Picker.Item label="UTF8" value="utf8" />
645+
<Picker.Item label="Base64" value="base64" />
646+
<Picker.Item label="ASCII" value="ascii" />
647+
<Picker.Item label="URI" value="uri" />
648+
</Picker>
649+
</View>
650+
<Button
651+
title="Write"
652+
color="#9a73ef"
653+
onPress={writeFileCall}
654+
/>
655+
<Button
656+
title="Append"
657+
color="#9a73ef"
658+
onPress={appendFileCall}
659+
/>
660+
</View>
661+
</View>
662+
663+
<View style={styles.body}>
664+
<View style={styles.sectionContainer}>
665+
<Text style={styles.sectionTitle}>
666+
{"WriteStream - writeStream()"}
667+
</Text>
668+
<View style={styles.sectionDescription}>
669+
<TextInput style = {styles.input}
670+
placeholder = "Source path"
671+
onChangeText={writeStreamParam => setWriteStreamParam(writeStreamParam)}
672+
placeholderTextColor = "#9a73ef"
673+
autoCapitalize = "none"
674+
/>
675+
676+
<Picker
677+
writeEncodeStreamParam={writeEncodeStreamParam}
678+
onChangeText={readPositionParam => setReadPositionParam(readPositionParam)}
679+
style={{ height: 50, width: 150 }}
680+
onValueChange={(itemValue, itemIndex) => setWriteStreamEncodeParam(itemValue)}
681+
>
682+
<Picker.Item label="UTF8" value="utf8" />
683+
<Picker.Item label="Base64" value="base64" />
684+
<Picker.Item label="ASCII" value="ascii" />
685+
<Picker.Item label="URI" value="uri" />
686+
</Picker>
687+
</View>
688+
<Button
689+
title="Write"
690+
color="#9a73ef"
691+
onPress={writeStreamCall}
692+
/>
693+
<Button
694+
title="Append"
695+
color="#9a73ef"
696+
onPress={appendStreamCall}
697+
/>
698+
</View>
699+
</View>
509700

510701
</ScrollView>
511702
</SafeAreaView>

RNFetchBlobWin/windows/RNFetchBlobWin/RNFetchBlob.cpp

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,9 @@ try
201201
else if (encoding.compare("uri") == 0)
202202
{
203203
winrt::hstring srcDirectoryPath, srcFileName;
204-
splitPath(path, srcDirectoryPath, srcFileName);
204+
splitPath(data, srcDirectoryPath, srcFileName);
205205
StorageFolder srcFolder{ co_await StorageFolder::GetFolderFromPathAsync(srcDirectoryPath) };
206-
StorageFile srcFile{ co_await StorageFile::GetFileFromPathAsync(srcFileName) };
206+
StorageFile srcFile{ co_await srcFolder.GetFileAsync(srcFileName) };
207207
buffer = co_await FileIO::ReadBufferAsync(srcFile);
208208
}
209209
else
@@ -287,28 +287,28 @@ winrt::fire_and_forget RNFetchBlob::writeStream(
287287
std::string encoding,
288288
bool append,
289289
std::function<void(std::string, std::string, std::string)> callback) noexcept
290-
try
290+
try
291291
{
292292
winrt::hstring directoryPath, fileName;
293293
splitPath(path, directoryPath, fileName);
294294
StorageFolder folder{ co_await StorageFolder::GetFolderFromPathAsync(directoryPath) };
295-
StorageFile file{ co_await folder.GetFileAsync(fileName) };
296-
295+
StorageFile file{ co_await folder.CreateFileAsync(fileName, CreationCollisionOption::OpenIfExists) };
296+
std::string temp{encoding};
297297
Streams::IRandomAccessStream stream{ co_await file.OpenAsync(FileAccessMode::ReadWrite) };
298298
if (append)
299299
{
300-
stream.Seek(UINT64_MAX);
300+
stream.Seek(stream.Size());
301301
}
302302
EncodingOptions encodingOption;
303-
if (encoding.compare("utf8"))
303+
if (encoding.compare("utf8") == 0)
304304
{
305305
encodingOption = EncodingOptions::UTF8;
306306
}
307-
else if (encoding.compare("base64"))
307+
else if (encoding.compare("base64") == 0)
308308
{
309309
encodingOption = EncodingOptions::BASE64;
310310
}
311-
else if (encoding.compare("ascii"))
311+
else if (encoding.compare("ascii") == 0)
312312
{
313313
encodingOption = EncodingOptions::ASCII;
314314
}
@@ -336,11 +336,11 @@ catch (const hresult_error& ex)
336336

337337

338338
// writeChunk
339-
winrt::fire_and_forget RNFetchBlob::writeChunk(
339+
void RNFetchBlob::writeChunk(
340340
std::string streamId,
341341
std::wstring data,
342342
std::function<void(std::string)> callback) noexcept
343-
try
343+
try
344344
{
345345
auto stream{ m_streamMap.find(streamId)->second };
346346
Streams::IBuffer buffer;
@@ -352,15 +352,20 @@ winrt::fire_and_forget RNFetchBlob::writeChunk(
352352
{
353353
buffer = Cryptography::CryptographicBuffer::DecodeFromBase64String(data);
354354
}
355-
co_await stream.streamInstance.ReadAsync(buffer, buffer.Length(), Streams::InputStreamOptions::None);
355+
else
356+
{
357+
callback("Invalid encoding type");
358+
return;
359+
}
360+
stream.streamInstance.WriteAsync(buffer).get(); //Calls it synchronously
356361
callback("");
357362
}
358363
catch (const hresult_error& ex)
359364
{
360365
callback(winrt::to_string(ex.message().c_str()));
361366
}
362367

363-
winrt::fire_and_forget RNFetchBlob::writeChunkArray(
368+
void RNFetchBlob::writeArrayChunk(
364369
std::string streamId,
365370
winrt::Microsoft::ReactNative::JSValueArray dataArray,
366371
std::function<void(std::string)> callback) noexcept
@@ -375,7 +380,7 @@ winrt::fire_and_forget RNFetchBlob::writeChunkArray(
375380
}
376381
Streams::IBuffer buffer{ CryptographicBuffer::CreateFromByteArray(data) };
377382

378-
co_await stream.streamInstance.ReadAsync(buffer, buffer.Length(), Streams::InputStreamOptions::None);
383+
stream.streamInstance.WriteAsync(buffer).get(); // Calls it synchronously
379384
callback("");
380385
}
381386
catch (const hresult_error& ex)
@@ -407,8 +412,7 @@ winrt::fire_and_forget RNFetchBlob::readStream(
407412
}
408413
else
409414
{
410-
//Wrong encoding yo
411-
415+
//Wrong encoding
412416
co_return;
413417
}
414418

@@ -439,8 +443,6 @@ winrt::fire_and_forget RNFetchBlob::readStream(
439443
{
440444
// TODO: Investigate returning wstrings as parameters
441445
winrt::hstring base64Content{ Cryptography::CryptographicBuffer::EncodeToBase64String(readBuffer) };
442-
//std::string base64Content{ winrt::to_string(Cryptography::CryptographicBuffer::EncodeToBase64String(readBuffer)) };
443-
//std::wstring base64Content{ Cryptography::CryptographicBuffer::EncodeToBase64String(readBuffer) };
444446
m_reactContext.CallJSFunction(L"RCTDeviceEventEmitter", L"emit", [&streamId, &base64Content](React::IJSValueWriter const& argWriter) {
445447
WriteValue(argWriter, streamId);
446448
argWriter.WriteObjectBegin();
@@ -972,7 +974,7 @@ void RNFetchBlob::removeSession(
972974
void RNFetchBlob::closeStream(
973975
std::string streamId,
974976
std::function<void(std::string)> callback) noexcept
975-
try
977+
try
976978
{
977979
auto stream{ m_streamMap.find(streamId)->second };
978980
stream.streamInstance.Close();

RNFetchBlobWin/windows/RNFetchBlobWin/RNFetchBlob.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ struct RNFetchBlob
7373

7474
// writeChunk
7575
REACT_METHOD(writeChunk);
76-
winrt::fire_and_forget RNFetchBlob::writeChunk(
76+
void RNFetchBlob::writeChunk(
7777
std::string streamId,
7878
std::wstring data,
7979
std::function<void(std::string)> callback) noexcept;
8080

81-
REACT_METHOD(writeChunkArray);
82-
winrt::fire_and_forget RNFetchBlob::writeChunkArray(
81+
REACT_METHOD(writeArrayChunk);
82+
void RNFetchBlob::writeArrayChunk(
8383
std::string streamId,
8484
winrt::Microsoft::ReactNative::JSValueArray dataArray,
8585
std::function<void(std::string)> callback) noexcept;

0 commit comments

Comments
 (0)