michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef nsHostObjectProtocolHandler_h michael@0: #define nsHostObjectProtocolHandler_h michael@0: michael@0: #include "mozilla/Attributes.h" michael@0: #include "nsIProtocolHandler.h" michael@0: #include "nsIURI.h" michael@0: #include "nsCOMPtr.h" michael@0: #include "nsIInputStream.h" michael@0: michael@0: #define BLOBURI_SCHEME "blob" michael@0: #define MEDIASTREAMURI_SCHEME "mediastream" michael@0: #define MEDIASOURCEURI_SCHEME "mediasource" michael@0: #define FONTTABLEURI_SCHEME "moz-fonttable" michael@0: #define RTSPURI_SCHEME "rtsp" michael@0: michael@0: class nsIDOMBlob; michael@0: class nsIDOMMediaStream; michael@0: class nsIPrincipal; michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: class MediaSource; michael@0: } michael@0: } michael@0: michael@0: class nsHostObjectProtocolHandler : public nsIProtocolHandler michael@0: { michael@0: public: michael@0: nsHostObjectProtocolHandler(); michael@0: virtual ~nsHostObjectProtocolHandler() {} michael@0: NS_DECL_ISUPPORTS michael@0: michael@0: // nsIProtocolHandler methods, except for GetScheme which is only defined michael@0: // in subclasses. michael@0: NS_IMETHOD GetDefaultPort(int32_t *aDefaultPort) MOZ_OVERRIDE; michael@0: NS_IMETHOD GetProtocolFlags(uint32_t *aProtocolFlags) MOZ_OVERRIDE; michael@0: NS_IMETHOD NewURI(const nsACString & aSpec, const char * aOriginCharset, nsIURI *aBaseURI, nsIURI * *_retval) MOZ_OVERRIDE; michael@0: NS_IMETHOD NewChannel(nsIURI *aURI, nsIChannel * *_retval) MOZ_OVERRIDE; michael@0: NS_IMETHOD AllowPort(int32_t port, const char * scheme, bool *_retval) MOZ_OVERRIDE; michael@0: michael@0: static nsresult GenerateURIString(const nsACString &aScheme, michael@0: nsACString &aUri); michael@0: michael@0: // Methods for managing uri->object mapping michael@0: // AddDataEntry creates the URI with the given scheme and returns it in aUri michael@0: static nsresult AddDataEntry(const nsACString& aScheme, michael@0: nsISupports* aObject, michael@0: nsIPrincipal* aPrincipal, michael@0: nsACString& aUri); michael@0: static void RemoveDataEntry(const nsACString& aUri); michael@0: static nsIPrincipal* GetDataEntryPrincipal(const nsACString& aUri); michael@0: static void Traverse(const nsACString& aUri, nsCycleCollectionTraversalCallback& aCallback); michael@0: michael@0: private: michael@0: static void Init(void); michael@0: }; michael@0: michael@0: class nsBlobProtocolHandler : public nsHostObjectProtocolHandler michael@0: { michael@0: public: michael@0: NS_IMETHOD GetScheme(nsACString &result) MOZ_OVERRIDE; michael@0: }; michael@0: michael@0: class nsMediaStreamProtocolHandler : public nsHostObjectProtocolHandler michael@0: { michael@0: public: michael@0: NS_IMETHOD GetScheme(nsACString &result) MOZ_OVERRIDE; michael@0: }; michael@0: michael@0: class nsMediaSourceProtocolHandler : public nsHostObjectProtocolHandler michael@0: { michael@0: public: michael@0: NS_IMETHOD GetScheme(nsACString &result) MOZ_OVERRIDE; michael@0: }; michael@0: michael@0: class nsFontTableProtocolHandler : public nsHostObjectProtocolHandler michael@0: { michael@0: public: michael@0: NS_IMETHOD GetScheme(nsACString &result); michael@0: NS_IMETHOD NewURI(const nsACString & aSpec, const char * aOriginCharset, nsIURI *aBaseURI, nsIURI * *_retval); michael@0: }; michael@0: michael@0: inline bool IsBlobURI(nsIURI* aUri) michael@0: { michael@0: bool isBlob; michael@0: return NS_SUCCEEDED(aUri->SchemeIs(BLOBURI_SCHEME, &isBlob)) && isBlob; michael@0: } michael@0: michael@0: inline bool IsRtspURI(nsIURI* aUri) michael@0: { michael@0: bool isRtsp; michael@0: return NS_SUCCEEDED(aUri->SchemeIs(RTSPURI_SCHEME, &isRtsp)) && isRtsp; michael@0: } michael@0: michael@0: inline bool IsMediaStreamURI(nsIURI* aUri) michael@0: { michael@0: bool isStream; michael@0: return NS_SUCCEEDED(aUri->SchemeIs(MEDIASTREAMURI_SCHEME, &isStream)) && isStream; michael@0: } michael@0: michael@0: inline bool IsMediaSourceURI(nsIURI* aUri) michael@0: { michael@0: bool isMediaSource; michael@0: return NS_SUCCEEDED(aUri->SchemeIs(MEDIASOURCEURI_SCHEME, &isMediaSource)) && isMediaSource; michael@0: } michael@0: michael@0: inline bool IsFontTableURI(nsIURI* aUri) michael@0: { michael@0: bool isFont; michael@0: return NS_SUCCEEDED(aUri->SchemeIs(FONTTABLEURI_SCHEME, &isFont)) && isFont; michael@0: } michael@0: michael@0: extern nsresult michael@0: NS_GetStreamForBlobURI(nsIURI* aURI, nsIInputStream** aStream); michael@0: michael@0: extern nsresult michael@0: NS_GetStreamForMediaStreamURI(nsIURI* aURI, nsIDOMMediaStream** aStream); michael@0: michael@0: extern nsresult michael@0: NS_GetSourceForMediaSourceURI(nsIURI* aURI, mozilla::dom::MediaSource** aSource); michael@0: michael@0: #define NS_BLOBPROTOCOLHANDLER_CID \ michael@0: { 0xb43964aa, 0xa078, 0x44b2, \ michael@0: { 0xb0, 0x6b, 0xfd, 0x4d, 0x1b, 0x17, 0x2e, 0x66 } } michael@0: michael@0: #define NS_MEDIASTREAMPROTOCOLHANDLER_CID \ michael@0: { 0x27d1fa24, 0x2b73, 0x4db3, \ michael@0: { 0xab, 0x48, 0xb9, 0x83, 0x83, 0x40, 0xe0, 0x81 } } michael@0: michael@0: #define NS_MEDIASOURCEPROTOCOLHANDLER_CID \ michael@0: { 0x12ef31fc, 0xa8fb, 0x4661, \ michael@0: { 0x9a, 0x63, 0xfb, 0x61, 0x04,0x5d, 0xb8, 0x61 } } michael@0: michael@0: #define NS_FONTTABLEPROTOCOLHANDLER_CID \ michael@0: { 0x3fc8f04e, 0xd719, 0x43ca, \ michael@0: { 0x9a, 0xd0, 0x18, 0xee, 0x32, 0x02, 0x11, 0xf2 } } michael@0: michael@0: #endif /* nsHostObjectProtocolHandler_h */