1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Use of this source code is governed by a BSD-style license that can be
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// found in the LICENSE file.
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#ifndef NET_BASE_COMPLETION_CALLBACK_H__
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#define NET_BASE_COMPLETION_CALLBACK_H__
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h"
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace net {
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// A callback specialization that takes a single int parameter.  Usually this
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// is used to report a byte count or network error code.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttypedef Callback1<int>::Type CompletionCallback;
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Used to implement a CompletionCallback.
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class T>
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass CompletionCallbackImpl :
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public CallbackImpl< T, void (T::*)(int), Tuple1<int> > {
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CompletionCallbackImpl(T* obj, void (T::* meth)(int))
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : CallbackImpl< T, void (T::*)(int),
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                    Tuple1<int> >::CallbackImpl(obj, meth) {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// CancelableCompletionCallback is used for completion callbacks
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// which may outlive the target for the method dispatch. In such a case, the
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// provider of the callback calls Cancel() to mark the callback as
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// "canceled". When the canceled callback is eventually run it does nothing
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// other than to decrement the refcount to 0 and free the memory.
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scotttemplate <class T>
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass CancelableCompletionCallback :
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public CompletionCallbackImpl<T>,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    public base::RefCounted<CancelableCompletionCallback<T> > {
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott public:
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CancelableCompletionCallback(T* obj, void (T::* meth)(int))
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    : CompletionCallbackImpl<T>(obj, meth), is_canceled_(false) {
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void Cancel() {
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    is_canceled_ = true;
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  virtual void RunWithParams(const Tuple1<int>& params) {
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (is_canceled_) {
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      base::RefCounted<CancelableCompletionCallback<T> >::Release();
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    } else {
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      CompletionCallbackImpl<T>::RunWithParams(params);
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott private:
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  bool is_canceled_;
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace net
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#endif  // NET_BASE_COMPLETION_CALLBACK_H__
61