summaryrefslogtreecommitdiff
path: root/chromium/jingle/notifier/base/weak_xmpp_client.h
blob: d56e04514ef1a37b4fab3217a28fbcc86eda0a1b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 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/basictypes.h"
#include "base/compiler_specific.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/non_thread_safe.h"
#include "talk/xmpp/xmppclient.h"

namespace talk_base {
class TaskParent;
}  // namespace

namespace notifier {

// buzz::XmppClient's destructor isn't marked virtual, but it inherits
// from talk_base::Task, whose destructor *is* marked virtual, so we
// can safely inherit from it.
class WeakXmppClient : public buzz::XmppClient, public base::NonThreadSafe {
 public:
  explicit WeakXmppClient(talk_base::TaskParent* parent);

  virtual ~WeakXmppClient();

  // Returns a weak pointer that is invalidated when the XmppClient
  // becomes invalid to use.
  base::WeakPtr<WeakXmppClient> 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:
  virtual 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<WeakXmppClient> weak_ptr_factory_;

  DISALLOW_COPY_AND_ASSIGN(WeakXmppClient);
};

}  // namespace notifier

#endif  // JINGLE_NOTIFIER_BASE_WEAK_XMPP_CLIENT_H_