// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // A thin wrapper around buzz::XmppClient that exposes weak pointers // so that users know when the buzz::XmppClient becomes invalid to use // (not necessarily only at destruction time). #ifndef JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_ #define JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_ #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/weak_ptr.h" #include "base/threading/non_thread_safe.h" #include "webrtc/libjingle/xmpp/xmppclient.h" namespace rtc { class TaskParent; } // namespace namespace notifier { // buzz::XmppClient's destructor isn't marked virtual, but it inherits // from rtc::Task, whose destructor *is* marked virtual, so we // can safely inherit from it. class WeakXmppClient : public buzz::XmppClient, public base::NonThreadSafe { public: explicit WeakXmppClient(rtc::TaskParent* parent); ~WeakXmppClient() override; // Returns a weak pointer that is invalidated when the XmppClient // becomes invalid to use. base::WeakPtr AsWeakPtr(); // Invalidates all weak pointers to this object. (This method is // necessary as calling Abort() does not always lead to Stop() being // called, so it's not a reliable way to cause an invalidation.) void Invalidate(); protected: void Stop() override; private: // We use our own WeakPtrFactory instead of inheriting from // SupportsWeakPtr since we want to invalidate in other places // besides the destructor. base::WeakPtrFactory weak_ptr_factory_; DISALLOW_COPY_AND_ASSIGN(WeakXmppClient); }; } // namespace notifier #endif // JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_