// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// This class is a callback object that observes all nl80211 events that come
// up from the kernel.

#ifndef SHILL_CALLBACK80211_OBJECT_H
#define SHILL_CALLBACK80211_OBJECT_H

#include <iomanip>
#include <map>
#include <string>

#include <base/basictypes.h>
#include <base/bind.h>
#include <base/lazy_instance.h>

namespace shill {

class Config80211;
class Metrics;
class UserBoundNlMessage;

// Example Config80211 callback object; the callback prints a description of
// each message with its attributes.  You want to make it a singleton so that
// its life isn't dependent on any other object (plus, since this handles
// global events from msg80211, you only want/need one).
class Callback80211Object {
 public:
  Callback80211Object();
  virtual ~Callback80211Object();

  // Get a pointer to the singleton Callback80211Object.
  static Callback80211Object *GetInstance();

  // Install ourselves as a callback.  Done automatically by constructor.
  bool InstallAsCallback();

  // Deinstall ourselves as a callback.  Done automatically by destructor.
  bool DeinstallAsCallback();

  // Simple accessor.
  void set_config80211(Config80211 *config80211) { config80211_ = config80211; }

  // Simple accessor.
  void set_metrics(Metrics *metrics) { metrics_ = metrics; }

 protected:
  friend struct base::DefaultLazyInstanceTraits<Callback80211Object>;

 private:
  // When installed, this is the method Config80211 will call when it gets a
  // message from the mac80211 drivers.
  void Config80211MessageCallback(const UserBoundNlMessage &msg);

  static const char kMetricLinkDisconnectCount[];

  Config80211 *config80211_;

  Metrics *metrics_;

  // Config80211MessageCallback method bound to this object to install as a
  // callback.
  base::WeakPtrFactory<Callback80211Object> weak_ptr_factory_;
};

}  // namespace shill

#endif  // SHILL_CALLBACK80211_OBJECT_H
