|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include <stdlib.h> |
|
6 #include "nsIStorageStream.h" |
|
7 #include "nsIInputStream.h" |
|
8 #include "nsIOutputStream.h" |
|
9 #include "nsCOMPtr.h" |
|
10 |
|
11 int main() |
|
12 { |
|
13 char kData[4096]; |
|
14 memset(kData, 0, sizeof(kData)); |
|
15 |
|
16 nsresult rv; |
|
17 nsCOMPtr<nsIStorageStream> stor; |
|
18 |
|
19 rv = NS_NewStorageStream(4096, UINT32_MAX, getter_AddRefs(stor)); |
|
20 if (NS_FAILED(rv)) |
|
21 return -1; |
|
22 |
|
23 nsCOMPtr<nsIOutputStream> out; |
|
24 rv = stor->GetOutputStream(0, getter_AddRefs(out)); |
|
25 if (NS_FAILED(rv)) |
|
26 return -1; |
|
27 |
|
28 uint32_t n; |
|
29 |
|
30 rv = out->Write(kData, sizeof(kData), &n); |
|
31 if (NS_FAILED(rv)) |
|
32 return -1; |
|
33 |
|
34 rv = out->Write(kData, sizeof(kData), &n); |
|
35 if (NS_FAILED(rv)) |
|
36 return -1; |
|
37 |
|
38 rv = out->Close(); |
|
39 if (NS_FAILED(rv)) |
|
40 return -1; |
|
41 |
|
42 out = nullptr; |
|
43 |
|
44 nsCOMPtr<nsIInputStream> in; |
|
45 rv = stor->NewInputStream(0, getter_AddRefs(in)); |
|
46 if (NS_FAILED(rv)) |
|
47 return -1; |
|
48 |
|
49 char buf[4096]; |
|
50 |
|
51 // consume contents of input stream |
|
52 do { |
|
53 rv = in->Read(buf, sizeof(buf), &n); |
|
54 if (NS_FAILED(rv)) |
|
55 return -1; |
|
56 } while (n != 0); |
|
57 |
|
58 rv = in->Close(); |
|
59 if (NS_FAILED(rv)) |
|
60 return -1; |
|
61 in = nullptr; |
|
62 |
|
63 // now, write 3 more full 4k segments + 11 bytes, starting at 8192 |
|
64 // total written equals 20491 bytes |
|
65 |
|
66 rv = stor->GetOutputStream(8192, getter_AddRefs(out)); |
|
67 if (NS_FAILED(rv)) |
|
68 return -1; |
|
69 |
|
70 rv = out->Write(kData, sizeof(kData), &n); |
|
71 if (NS_FAILED(rv)) |
|
72 return -1; |
|
73 |
|
74 rv = out->Write(kData, sizeof(kData), &n); |
|
75 if (NS_FAILED(rv)) |
|
76 return -1; |
|
77 |
|
78 rv = out->Write(kData, sizeof(kData), &n); |
|
79 if (NS_FAILED(rv)) |
|
80 return -1; |
|
81 |
|
82 rv = out->Write(kData, 11, &n); |
|
83 if (NS_FAILED(rv)) |
|
84 return -1; |
|
85 |
|
86 rv = out->Close(); |
|
87 if (NS_FAILED(rv)) |
|
88 return -1; |
|
89 |
|
90 out = nullptr; |
|
91 |
|
92 // now, read all |
|
93 rv = stor->NewInputStream(0, getter_AddRefs(in)); |
|
94 if (NS_FAILED(rv)) |
|
95 return -1; |
|
96 |
|
97 // consume contents of input stream |
|
98 do { |
|
99 rv = in->Read(buf, sizeof(buf), &n); |
|
100 if (NS_FAILED(rv)) |
|
101 return -1; |
|
102 } while (n != 0); |
|
103 |
|
104 rv = in->Close(); |
|
105 if (NS_FAILED(rv)) |
|
106 return -1; |
|
107 in = nullptr; |
|
108 |
|
109 return 0; |
|
110 } |