|
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
|
2 /* vim: set sw=2 ts=8 et tw=80 : */ |
|
3 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
4 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
6 |
|
7 #ifndef _RemoteOpenFileChild_h |
|
8 #define _RemoteOpenFileChild_h |
|
9 |
|
10 #include "mozilla/Attributes.h" |
|
11 #include "mozilla/dom/TabChild.h" |
|
12 #include "mozilla/net/PRemoteOpenFileChild.h" |
|
13 #include "nsICachedFileDescriptorListener.h" |
|
14 #include "nsILocalFile.h" |
|
15 #include "nsIRemoteOpenFileListener.h" |
|
16 |
|
17 namespace mozilla { |
|
18 |
|
19 namespace ipc { |
|
20 class FileDescriptor; |
|
21 } |
|
22 |
|
23 namespace net { |
|
24 |
|
25 /** |
|
26 * RemoteOpenFileChild: a thin wrapper around regular nsIFile classes that does |
|
27 * IPC to open a file handle on parent instead of child. Used when we can't |
|
28 * open file handle on child (don't have permission), but we don't want the |
|
29 * overhead of shipping all I/O traffic across IPDL. Example: JAR files. |
|
30 * |
|
31 * To open a file handle with this class, AsyncRemoteFileOpen() must be called |
|
32 * first. After the listener's OnRemoteFileOpenComplete() is called, if the |
|
33 * result is NS_OK, nsIFile.OpenNSPRFileDesc() may be called--once--to get the |
|
34 * file handle. |
|
35 * |
|
36 * Note that calling Clone() on this class results in the filehandle ownership |
|
37 * being passed on to the new RemoteOpenFileChild. I.e. if |
|
38 * OnRemoteFileOpenComplete is called and then Clone(), OpenNSPRFileDesc() will |
|
39 * work in the cloned object, but not in the original. |
|
40 * |
|
41 * This class should only be instantiated in a child process. |
|
42 * |
|
43 */ |
|
44 class RemoteOpenFileChild MOZ_FINAL |
|
45 : public PRemoteOpenFileChild |
|
46 , public nsIFile |
|
47 , public nsIHashable |
|
48 , public nsICachedFileDescriptorListener |
|
49 { |
|
50 typedef mozilla::dom::TabChild TabChild; |
|
51 typedef mozilla::ipc::FileDescriptor FileDescriptor; |
|
52 |
|
53 public: |
|
54 RemoteOpenFileChild() |
|
55 : mNSPRFileDesc(nullptr) |
|
56 , mAsyncOpenCalled(false) |
|
57 , mNSPROpenCalled(false) |
|
58 {} |
|
59 |
|
60 virtual ~RemoteOpenFileChild(); |
|
61 |
|
62 NS_DECL_THREADSAFE_ISUPPORTS |
|
63 NS_DECL_NSIFILE |
|
64 NS_DECL_NSIHASHABLE |
|
65 |
|
66 // aRemoteOpenUri must be scheme 'remoteopenfile://': otherwise looks like |
|
67 // a file:// uri. |
|
68 nsresult Init(nsIURI* aRemoteOpenUri, nsIURI* aAppUri); |
|
69 |
|
70 // Send message to parent to tell it to open file handle for file. |
|
71 // TabChild is required, for IPC security. |
|
72 // Note: currently only PR_RDONLY is supported for 'flags' |
|
73 nsresult AsyncRemoteFileOpen(int32_t aFlags, |
|
74 nsIRemoteOpenFileListener* aListener, |
|
75 nsITabChild* aTabChild); |
|
76 |
|
77 void ReleaseIPDLReference() |
|
78 { |
|
79 Release(); |
|
80 } |
|
81 |
|
82 private: |
|
83 RemoteOpenFileChild(const RemoteOpenFileChild& other); |
|
84 |
|
85 protected: |
|
86 void AddIPDLReference() |
|
87 { |
|
88 AddRef(); |
|
89 } |
|
90 |
|
91 virtual bool Recv__delete__(const FileDescriptor&) MOZ_OVERRIDE; |
|
92 |
|
93 virtual void OnCachedFileDescriptor(const nsAString& aPath, |
|
94 const FileDescriptor& aFD) MOZ_OVERRIDE; |
|
95 |
|
96 void HandleFileDescriptorAndNotifyListener(const FileDescriptor&, |
|
97 bool aFromRecvDelete); |
|
98 |
|
99 void NotifyListener(nsresult aResult); |
|
100 |
|
101 // regular nsIFile object, that we forward most calls to. |
|
102 nsCOMPtr<nsIFile> mFile; |
|
103 nsCOMPtr<nsIURI> mURI; |
|
104 nsCOMPtr<nsIURI> mAppURI; |
|
105 nsCOMPtr<nsIRemoteOpenFileListener> mListener; |
|
106 nsRefPtr<TabChild> mTabChild; |
|
107 PRFileDesc* mNSPRFileDesc; |
|
108 bool mAsyncOpenCalled; |
|
109 bool mNSPROpenCalled; |
|
110 }; |
|
111 |
|
112 } // namespace net |
|
113 } // namespace mozilla |
|
114 |
|
115 #endif // _RemoteOpenFileChild_h |