Home | History | Annotate | Download | only in base
      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