diff options
Diffstat (limited to 'net/base/network_change_notifier_win.cc')
-rw-r--r-- | net/base/network_change_notifier_win.cc | 73 |
1 files changed, 12 insertions, 61 deletions
diff --git a/net/base/network_change_notifier_win.cc b/net/base/network_change_notifier_win.cc index bed361c..e0e0892 100644 --- a/net/base/network_change_notifier_win.cc +++ b/net/base/network_change_notifier_win.cc @@ -5,84 +5,35 @@ #include "net/base/network_change_notifier_win.h" #include <iphlpapi.h> -#include <windows.h> #include <winsock2.h> -#include "base/basictypes.h" -#include "base/compiler_specific.h" -#include "base/logging.h" -#include "base/object_watcher.h" +#pragma comment(lib, "iphlpapi.lib") namespace net { -class NetworkChangeNotifierWin::Impl - : public base::ObjectWatcher::Delegate { - public: - explicit Impl(NetworkChangeNotifierWin* notifier); - virtual ~Impl(); - - void WatchForAddressChange(); - - // ObjectWatcher::Delegate methods: - - virtual void OnObjectSignaled(HANDLE object); - - private: - NetworkChangeNotifierWin* const notifier_; - base::ObjectWatcher addr_watcher_; - OVERLAPPED addr_overlapped_; - - DISALLOW_COPY_AND_ASSIGN(Impl); -}; - -NetworkChangeNotifierWin::Impl::Impl(NetworkChangeNotifierWin* notifier) - : notifier_(notifier) { - memset(&addr_overlapped_, 0, sizeof(addr_overlapped_)); +NetworkChangeNotifierWin::NetworkChangeNotifierWin() { + memset(&addr_overlapped_, 0, sizeof addr_overlapped_); addr_overlapped_.hEvent = WSACreateEvent(); } -NetworkChangeNotifierWin::Impl::~Impl() { +NetworkChangeNotifierWin::~NetworkChangeNotifierWin() { CancelIPChangeNotify(&addr_overlapped_); addr_watcher_.StopWatching(); WSACloseEvent(addr_overlapped_.hEvent); - memset(&addr_overlapped_, 0, sizeof(addr_overlapped_)); -} - -void NetworkChangeNotifierWin::Impl::WatchForAddressChange() { - HANDLE handle = NULL; - DWORD ret = NotifyAddrChange(&handle, &addr_overlapped_); - CHECK(ret == ERROR_IO_PENDING); - addr_watcher_.StartWatching(addr_overlapped_.hEvent, this); } -void NetworkChangeNotifierWin::Impl::OnObjectSignaled(HANDLE object) { - notifier_->OnIPAddressChanged(); +void NetworkChangeNotifierWin::OnObjectSignaled(HANDLE object) { + NotifyObserversOfIPAddressChange(); - // Start watching for further address changes. + // Start watching for the next address change. WatchForAddressChange(); } -NetworkChangeNotifierWin::NetworkChangeNotifierWin() - : impl_(new Impl(ALLOW_THIS_IN_INITIALIZER_LIST(this))) { - impl_->WatchForAddressChange(); -} -void NetworkChangeNotifierWin::OnIPAddressChanged() { - DCHECK(CalledOnValidThread()); - FOR_EACH_OBSERVER(Observer, observers_, OnIPAddressChanged()); -} - -void NetworkChangeNotifierWin::AddObserver(Observer* observer) { - DCHECK(CalledOnValidThread()); - observers_.AddObserver(observer); -} - -void NetworkChangeNotifierWin::RemoveObserver(Observer* observer) { - DCHECK(CalledOnValidThread()); - observers_.RemoveObserver(observer); -} - -NetworkChangeNotifierWin::~NetworkChangeNotifierWin() { - DCHECK(CalledOnValidThread()); +void NetworkChangeNotifierWin::WatchForAddressChange() { + HANDLE handle = NULL; + DWORD ret = NotifyAddrChange(&handle, &addr_overlapped_); + CHECK(ret == ERROR_IO_PENDING); + addr_watcher_.StartWatching(addr_overlapped_.hEvent, this); } } // namespace net |