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/. */
7 #include "nsISocketProvider.h"
9 #include "nsNSSComponent.h"
10 #include "nsSOCKSSocketProvider.h"
11 #include "nsSocketProviderService.h"
12 #include "nsSSLSocketProvider.h"
13 #include "nsTLSSocketProvider.h"
14 #include "nsUDPSocketProvider.h"
15 #include "mozilla/ClearOnShutdown.h"
17 mozilla::StaticRefPtr
<nsSocketProviderService
>
18 nsSocketProviderService::gSingleton
;
20 ////////////////////////////////////////////////////////////////////////////////
22 already_AddRefed
<nsISocketProviderService
>
23 nsSocketProviderService::GetOrCreate() {
24 RefPtr
<nsSocketProviderService
> inst
;
28 inst
= new nsSocketProviderService();
30 if (NS_IsMainThread()) {
31 mozilla::ClearOnShutdown(&gSingleton
);
33 NS_DispatchToMainThread(NS_NewRunnableFunction(
34 "net::nsSocketProviderService::GetOrCreate",
35 []() -> void { mozilla::ClearOnShutdown(&gSingleton
); }));
41 NS_IMPL_ISUPPORTS(nsSocketProviderService
, nsISocketProviderService
)
43 ////////////////////////////////////////////////////////////////////////////////
46 nsSocketProviderService::GetSocketProvider(const char* type
,
47 nsISocketProvider
** result
) {
48 nsCOMPtr
<nsISocketProvider
> inst
;
49 if (!nsCRT::strcmp(type
, "ssl") &&
50 (XRE_IsParentProcess() || XRE_IsSocketProcess()) &&
51 EnsureNSSInitializedChromeOrContent()) {
52 inst
= new nsSSLSocketProvider();
53 } else if (!nsCRT::strcmp(type
, "starttls") &&
54 (XRE_IsParentProcess() || XRE_IsSocketProcess()) &&
55 EnsureNSSInitializedChromeOrContent()) {
56 inst
= new nsTLSSocketProvider();
57 } else if (!nsCRT::strcmp(type
, "socks")) {
58 inst
= new nsSOCKSSocketProvider(NS_SOCKS_VERSION_5
);
59 } else if (!nsCRT::strcmp(type
, "socks4")) {
60 inst
= new nsSOCKSSocketProvider(NS_SOCKS_VERSION_4
);
61 } else if (!nsCRT::strcmp(type
, "udp")) {
62 inst
= new nsUDPSocketProvider();
64 return NS_ERROR_UNKNOWN_SOCKET_TYPE
;
70 ////////////////////////////////////////////////////////////////////////////////