1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 // 5 // A thin wrapper around buzz::XmppClient that exposes weak pointers 6 // so that users know when the buzz::XmppClient becomes invalid to use 7 // (not necessarily only at destruction time). 8 9 #ifndef JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_ 10 #define JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_ 11 12 #include "base/basictypes.h" 13 #include "base/compiler_specific.h" 14 #include "base/memory/weak_ptr.h" 15 #include "base/threading/non_thread_safe.h" 16 #include "talk/xmpp/xmppclient.h" 17 18 namespace talk_base { 19 class TaskParent; 20 } // namespace 21 22 namespace notifier { 23 24 // buzz::XmppClient's destructor isn't marked virtual, but it inherits 25 // from talk_base::Task, whose destructor *is* marked virtual, so we 26 // can safely inherit from it. 27 class WeakXmppClient : public buzz::XmppClient, public base::NonThreadSafe { 28 public: 29 explicit WeakXmppClient(talk_base::TaskParent* parent); 30 31 virtual ~WeakXmppClient(); 32 33 // Returns a weak pointer that is invalidated when the XmppClient 34 // becomes invalid to use. 35 base::WeakPtr<WeakXmppClient> AsWeakPtr(); 36 37 // Invalidates all weak pointers to this object. (This method is 38 // necessary as calling Abort() does not always lead to Stop() being 39 // called, so it's not a reliable way to cause an invalidation.) 40 void Invalidate(); 41 42 protected: 43 virtual void Stop() OVERRIDE; 44 45 private: 46 // We use our own WeakPtrFactory instead of inheriting from 47 // SupportsWeakPtr since we want to invalidate in other places 48 // besides the destructor. 49 base::WeakPtrFactory<WeakXmppClient> weak_ptr_factory_; 50 51 DISALLOW_COPY_AND_ASSIGN(WeakXmppClient); 52 }; 53 54 } // namespace notifier 55 56 #endif // JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_ 57