|
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #ifndef nsDOMFileReader_h__ |
|
7 #define nsDOMFileReader_h__ |
|
8 |
|
9 #include "mozilla/Attributes.h" |
|
10 #include "nsISupportsUtils.h" |
|
11 #include "nsString.h" |
|
12 #include "nsWeakReference.h" |
|
13 #include "nsIStreamListener.h" |
|
14 #include "nsIInterfaceRequestor.h" |
|
15 #include "nsJSUtils.h" |
|
16 #include "nsTArray.h" |
|
17 #include "nsIJSNativeInitializer.h" |
|
18 #include "prtime.h" |
|
19 #include "nsITimer.h" |
|
20 |
|
21 #include "nsIDOMFile.h" |
|
22 #include "nsIDOMFileReader.h" |
|
23 #include "nsIDOMFileList.h" |
|
24 #include "nsIInputStream.h" |
|
25 #include "nsCOMPtr.h" |
|
26 #include "nsIStreamLoader.h" |
|
27 #include "nsIChannel.h" |
|
28 |
|
29 #include "FileIOObject.h" |
|
30 |
|
31 class nsDOMFileReader : public mozilla::dom::FileIOObject, |
|
32 public nsIDOMFileReader, |
|
33 public nsIInterfaceRequestor, |
|
34 public nsSupportsWeakReference |
|
35 { |
|
36 typedef mozilla::ErrorResult ErrorResult; |
|
37 typedef mozilla::dom::GlobalObject GlobalObject; |
|
38 public: |
|
39 nsDOMFileReader(); |
|
40 virtual ~nsDOMFileReader(); |
|
41 |
|
42 NS_DECL_ISUPPORTS_INHERITED |
|
43 |
|
44 NS_DECL_NSIDOMFILEREADER |
|
45 |
|
46 NS_REALLY_FORWARD_NSIDOMEVENTTARGET(mozilla::DOMEventTargetHelper) |
|
47 |
|
48 // nsIInterfaceRequestor |
|
49 NS_DECL_NSIINTERFACEREQUESTOR |
|
50 |
|
51 // FileIOObject overrides |
|
52 virtual void DoAbort(nsAString& aEvent) MOZ_OVERRIDE; |
|
53 NS_IMETHOD DoOnStopRequest(nsIRequest* aRequest, nsISupports* aContext, |
|
54 nsresult aStatus, nsAString& aSuccessEvent, |
|
55 nsAString& aTerminationEvent) MOZ_OVERRIDE; |
|
56 NS_IMETHOD DoOnDataAvailable(nsIRequest* aRequest, nsISupports* aContext, |
|
57 nsIInputStream* aInputStream, uint64_t aOffset, |
|
58 uint32_t aCount) MOZ_OVERRIDE; |
|
59 |
|
60 nsPIDOMWindow* GetParentObject() const |
|
61 { |
|
62 return GetOwner(); |
|
63 } |
|
64 virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; |
|
65 |
|
66 // WebIDL |
|
67 static already_AddRefed<nsDOMFileReader> |
|
68 Constructor(const GlobalObject& aGlobal, ErrorResult& aRv); |
|
69 void ReadAsArrayBuffer(JSContext* aCx, nsIDOMBlob* aBlob, ErrorResult& aRv) |
|
70 { |
|
71 MOZ_ASSERT(aBlob); |
|
72 ReadFileContent(aCx, aBlob, EmptyString(), FILE_AS_ARRAYBUFFER, aRv); |
|
73 } |
|
74 void ReadAsText(nsIDOMBlob* aBlob, const nsAString& aLabel, ErrorResult& aRv) |
|
75 { |
|
76 MOZ_ASSERT(aBlob); |
|
77 ReadFileContent(nullptr, aBlob, aLabel, FILE_AS_TEXT, aRv); |
|
78 } |
|
79 void ReadAsDataURL(nsIDOMBlob* aBlob, ErrorResult& aRv) |
|
80 { |
|
81 MOZ_ASSERT(aBlob); |
|
82 ReadFileContent(nullptr, aBlob, EmptyString(), FILE_AS_DATAURL, aRv); |
|
83 } |
|
84 |
|
85 using FileIOObject::Abort; |
|
86 |
|
87 // Inherited ReadyState(). |
|
88 |
|
89 void GetResult(JSContext* aCx, JS::MutableHandle<JS::Value> aResult, |
|
90 ErrorResult& aRv); |
|
91 |
|
92 using FileIOObject::GetError; |
|
93 |
|
94 IMPL_EVENT_HANDLER(loadstart) |
|
95 using FileIOObject::GetOnprogress; |
|
96 using FileIOObject::SetOnprogress; |
|
97 IMPL_EVENT_HANDLER(load) |
|
98 using FileIOObject::GetOnabort; |
|
99 using FileIOObject::SetOnabort; |
|
100 using FileIOObject::GetOnerror; |
|
101 using FileIOObject::SetOnerror; |
|
102 IMPL_EVENT_HANDLER(loadend) |
|
103 |
|
104 void ReadAsBinaryString(nsIDOMBlob* aBlob, ErrorResult& aRv) |
|
105 { |
|
106 MOZ_ASSERT(aBlob); |
|
107 ReadFileContent(nullptr, aBlob, EmptyString(), FILE_AS_BINARY, aRv); |
|
108 } |
|
109 |
|
110 |
|
111 nsresult Init(); |
|
112 |
|
113 NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(nsDOMFileReader, |
|
114 FileIOObject) |
|
115 void RootResultArrayBuffer(); |
|
116 |
|
117 protected: |
|
118 enum eDataFormat { |
|
119 FILE_AS_ARRAYBUFFER, |
|
120 FILE_AS_BINARY, |
|
121 FILE_AS_TEXT, |
|
122 FILE_AS_DATAURL |
|
123 }; |
|
124 |
|
125 void ReadFileContent(JSContext* aCx, nsIDOMBlob* aBlob, |
|
126 const nsAString &aCharset, eDataFormat aDataFormat, |
|
127 ErrorResult& aRv); |
|
128 nsresult GetAsText(nsIDOMBlob *aFile, const nsACString &aCharset, |
|
129 const char *aFileData, uint32_t aDataLen, nsAString &aResult); |
|
130 nsresult GetAsDataURL(nsIDOMBlob *aFile, const char *aFileData, uint32_t aDataLen, nsAString &aResult); |
|
131 |
|
132 void FreeFileData() { |
|
133 moz_free(mFileData); |
|
134 mFileData = nullptr; |
|
135 mDataLen = 0; |
|
136 } |
|
137 |
|
138 char *mFileData; |
|
139 nsCOMPtr<nsIDOMBlob> mFile; |
|
140 nsCString mCharset; |
|
141 uint32_t mDataLen; |
|
142 |
|
143 eDataFormat mDataFormat; |
|
144 |
|
145 nsString mResult; |
|
146 nsCOMPtr<nsIPrincipal> mPrincipal; |
|
147 |
|
148 JS::Heap<JSObject*> mResultArrayBuffer; |
|
149 }; |
|
150 |
|
151 #endif |