1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2015 The Android Open Source Project
3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License");
5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License.
6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at
7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//      http://www.apache.org/licenses/LICENSE-2.0
9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software
11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS,
12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and
14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License.
15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu//
1665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
1765a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#ifndef SHILL_DBUS_CHROMEOS_DHCPCD_LISTENER_H_
1865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#define SHILL_DBUS_CHROMEOS_DHCPCD_LISTENER_H_
1965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
2065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <string>
2165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
2265a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <dbus/dbus.h>
2365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
2465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <base/macros.h>
2565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <base/memory/ref_counted.h>
2665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <base/memory/weak_ptr.h>
2765a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <dbus/bus.h>
2865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#include <dbus/message.h>
2965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
3003e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko#include <brillo/variant_dictionary.h>
3165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
32820012496f8c171a7c5da4a4904a6ee93bfea2e9Peter Qiu#include "shill/dhcp/dhcpcd_listener_interface.h"
33820012496f8c171a7c5da4a4904a6ee93bfea2e9Peter Qiu
3465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiunamespace shill {
3565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
3665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiuclass DHCPProvider;
3765a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiuclass EventDispatcher;
3865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
3965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu// The DHCPCD listener is a singleton proxy that listens to signals from all
4065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu// DHCP clients and dispatches them through the DHCP provider to the appropriate
4165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu// client based on the PID.
42820012496f8c171a7c5da4a4904a6ee93bfea2e9Peter Qiuclass ChromeosDHCPCDListener final : public DHCPCDListenerInterface {
4365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu public:
4465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  ChromeosDHCPCDListener(const scoped_refptr<dbus::Bus>& bus,
4565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                         EventDispatcher* dispatcher,
4665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                         DHCPProvider* provider);
47820012496f8c171a7c5da4a4904a6ee93bfea2e9Peter Qiu  ~ChromeosDHCPCDListener() override;
4865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
4965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu private:
5065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  static const char kDBusInterfaceName[];
5165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  static const char kSignalEvent[];
5265a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  static const char kSignalStatusChanged[];
5365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
5465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  // Redirects the function call to HandleMessage
5565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  static DBusHandlerResult HandleMessageThunk(DBusConnection* connection,
5665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                                              DBusMessage* raw_message,
5765a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                                              void* user_data);
5865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
5965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  // Handles incoming messages.
6065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  DBusHandlerResult HandleMessage(DBusConnection* connection,
6165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                                  DBusMessage* raw_message);
6265a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
6365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  // Signal handlers.
6465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  void EventSignal(const std::string& sender,
6565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                   uint32_t pid,
6665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                   const std::string& reason,
6703e6719bae1e0903d94853b896673a033196bcf5Alex Vakulenko                   const brillo::VariantDictionary& configurations);
6865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  void StatusChangedSignal(const std::string& sender,
6965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                           uint32_t pid,
7065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu                           const std::string& status);
7165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
7265a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  scoped_refptr<dbus::Bus> bus_;
7365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  EventDispatcher* dispatcher_;
7465a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  DHCPProvider* provider_;
7565a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  const std::string match_rule_;
7665a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
7765a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  base::WeakPtrFactory<ChromeosDHCPCDListener> weak_factory_{this};
7865a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu  DISALLOW_COPY_AND_ASSIGN(ChromeosDHCPCDListener);
7965a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu};
8065a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
8165a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu}  // namespace shill
8265a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu
8365a049b4b284b5c189e0b6f901b448edd6c3d86dPeter Qiu#endif  // SHILL_DBUS_CHROMEOS_DHCPCD_LISTENER_H_
84