//
// Copyright (C) 2016 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef TRUNKS_TRUNKS_DBUS_SERVICE_H_
#define TRUNKS_TRUNKS_DBUS_SERVICE_H_

#include <memory>
#include <string>

#include <base/memory/weak_ptr.h>
#include <brillo/daemons/dbus_daemon.h>
#include <brillo/dbus/dbus_method_response.h>
#include <brillo/dbus/dbus_object.h>

#include "trunks/command_transceiver.h"
#include "trunks/interface.pb.h"
#include "trunks/power_manager.h"

namespace trunks {

// TrunksDBusService registers for and handles all incoming D-Bus messages for
// the trunksd system daemon.
//
// Example Usage:
//
// TrunksDBusService service;
// service.set_transceiver(&my_transceiver);
// service.Run();
class TrunksDBusService : public brillo::DBusServiceDaemon {
 public:
  TrunksDBusService();
  ~TrunksDBusService() override = default;

  // The |transceiver| will be the target of all incoming TPM commands. This
  // class does not take ownership of |transceiver|.
  void set_transceiver(CommandTransceiver* transceiver) {
    transceiver_ = transceiver;
  }

  // The |power_manager| will be initialized with D-Bus object.
  // This class does not take ownership of |power_manager|.
  void set_power_manager(PowerManager* power_manager) {
    power_manager_ = power_manager;
  }

 protected:
  // Exports D-Bus methods.
  void RegisterDBusObjectsAsync(
      brillo::dbus_utils::AsyncEventSequencer* sequencer) override;

  // Tears down dependant objects.
  void OnShutdown(int* exit_code) override;

 private:
  // Handles calls to the 'SendCommand' method.
  void HandleSendCommand(std::unique_ptr<brillo::dbus_utils::DBusMethodResponse<
                             const SendCommandResponse&>> response_sender,
                         const SendCommandRequest& request);

  base::WeakPtr<TrunksDBusService> GetWeakPtr() {
    return weak_factory_.GetWeakPtr();
  }

  std::unique_ptr<brillo::dbus_utils::DBusObject> trunks_dbus_object_;
  CommandTransceiver* transceiver_ = nullptr;
  PowerManager* power_manager_ = nullptr;

  // Declared last so weak pointers are invalidated first on destruction.
  base::WeakPtrFactory<TrunksDBusService> weak_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(TrunksDBusService);
};

}  // namespace trunks

#endif  // TRUNKS_TRUNKS_DBUS_SERVICE_H_
