nsresult nsIOService::Init() { nsresult rv; // We need to get references to the DNS service so that we can shut it // down later. If we wait until the nsIOService is being shut down, // GetService will fail at that point. mDNSService = do_GetService(NS_DNSSERVICE_CONTRACTID, &rv); if (NS_FAILED(rv)) { NS_WARNING("failed to get DNS service"); return rv; } // XXX hack until xpidl supports error info directly (bug 13423) nsCOMPtr<nsIErrorService> errorService = do_GetService(NS_ERRORSERVICE_CONTRACTID); if (errorService) { errorService->RegisterErrorStringBundle(NS_ERROR_MODULE_NETWORK, NECKO_MSGS_URL); } else NS_WARNING("failed to get error service"); // setup our bad port list stuff for(int i=0; gBadPortList[i]; i++) mRestrictedPortList.AppendElement(gBadPortList[i]); // Further modifications to the port list come from prefs nsCOMPtr<nsIPrefBranch> prefBranch; GetPrefBranch(getter_AddRefs(prefBranch)); if (prefBranch) { prefBranch->AddObserver(PORT_PREF_PREFIX, this, true); prefBranch->AddObserver(AUTODIAL_PREF, this, true); prefBranch->AddObserver(MANAGE_OFFLINE_STATUS_PREF, this, true); PrefsChanged(prefBranch); } // Register for profile change notifications nsCOMPtr<nsIObserverService> observerService = mozilla::services::GetObserverService(); if (observerService) { observerService->AddObserver(this, kProfileChangeNetTeardownTopic, true); observerService->AddObserver(this, kProfileChangeNetRestoreTopic, true); observerService->AddObserver(this, kProfileDoChange, true); observerService->AddObserver(this, NS_XPCOM_SHUTDOWN_OBSERVER_ID, true); observerService->AddObserver(this, NS_NETWORK_LINK_TOPIC, true); } else NS_WARNING("failed to get observer service"); gIOService = this; InitializeNetworkLinkService(); return NS_OK; }
// nsIObserver interface NS_IMETHODIMP nsIOService::Observe(nsISupports *subject, const char *topic, const PRUnichar *data) { if (!strcmp(topic, NS_PREFBRANCH_PREFCHANGE_TOPIC_ID)) { nsCOMPtr<nsIPrefBranch> prefBranch = do_QueryInterface(subject); if (prefBranch) PrefsChanged(prefBranch, NS_ConvertUTF16toUTF8(data).get()); } else if (!strcmp(topic, kProfileChangeNetTeardownTopic)) { if (!mOffline) { SetOffline(true); mOfflineForProfileChange = true; } } else if (!strcmp(topic, kProfileChangeNetRestoreTopic)) { if (mOfflineForProfileChange) { mOfflineForProfileChange = false; if (!mManageOfflineStatus || NS_FAILED(TrackNetworkLinkStatusForOffline())) { SetOffline(false); } } } else if (!strcmp(topic, kProfileDoChange)) { if (data && NS_LITERAL_STRING("startup").Equals(data)) { // Lazy initialization of network link service (see bug 620472) InitializeNetworkLinkService(); // Set up the initilization flag regardless the actuall result. // If we fail here, we will fail always on. mNetworkLinkServiceInitialized = true; } } else if (!strcmp(topic, NS_XPCOM_SHUTDOWN_OBSERVER_ID)) { // Remember we passed XPCOM shutdown notification to prevent any // changes of the offline status from now. We must not allow going // online after this point. mShutdown = true; SetOffline(true); // Break circular reference. mProxyService = nullptr; } else if (!strcmp(topic, NS_NETWORK_LINK_TOPIC)) { if (!mOfflineForProfileChange && mManageOfflineStatus) { TrackNetworkLinkStatusForOffline(); } } return NS_OK; }
NS_IMETHODIMP nsIOService::SetManageOfflineStatus(bool aManage) { nsresult rv = NS_OK; InitializeNetworkLinkService(); bool wasManaged = mManageOfflineStatus; mManageOfflineStatus = aManage; if (mManageOfflineStatus && !wasManaged) { rv = TrackNetworkLinkStatusForOffline(); if (NS_FAILED(rv)) mManageOfflineStatus = false; } return rv; }
bool nsIOService::IsLinkUp() { InitializeNetworkLinkService(); if (!mNetworkLinkService) { // We cannot decide, assume the link is up return true; } bool isLinkUp; nsresult rv; rv = mNetworkLinkService->GetIsLinkUp(&isLinkUp); if (NS_FAILED(rv)) { return true; } return isLinkUp; }
NS_IMETHODIMP nsIOService::SetManageOfflineStatus(bool aManage) { nsresult rv = NS_OK; // SetManageOfflineStatus must throw when we fail to go from non-managed // to managed. Usually because there is no link monitoring service // available. Failure to do this switch is detected by a failure of // TrackNetworkLinkStatusForOffline(). When there is no network link // available during call to InitializeNetworkLinkService(), application is // put to offline mode. And when we change mMangeOfflineStatus to false // on the next line we get stuck on being offline even though the link // becomes later available. bool wasManaged = mManageOfflineStatus; mManageOfflineStatus = aManage; InitializeNetworkLinkService(); if (mManageOfflineStatus && !wasManaged) { rv = TrackNetworkLinkStatusForOffline(); if (NS_FAILED(rv)) mManageOfflineStatus = false; } return rv; }