// Copyright 2014 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 FIREWALLD_FIREWALL_SERVICE_H_
#define FIREWALLD_FIREWALL_SERVICE_H_

#if !defined(__ANDROID__)
# include <memory>
#endif  // !__ANDROID__

#include <base/callback.h>
#include <base/macros.h>
#include <base/memory/weak_ptr.h>
#include <brillo/dbus/dbus_object.h>

#include "dbus_bindings/org.chromium.Firewalld.h"
#if !defined(__ANDROID__)
# include "permission_broker/dbus-proxies.h"
#endif  // __ANDROID__

#ifdef __ANDROID__
#include "binder_interface.h"
#endif  // __ANDROID__

#include "iptables.h"

using CompletionAction =
    brillo::dbus_utils::AsyncEventSequencer::CompletionAction;

namespace firewalld {

class FirewallService : public org::chromium::FirewalldAdaptor {
 public:
  explicit FirewallService(
      brillo::dbus_utils::ExportedObjectManager* object_manager);
  virtual ~FirewallService() = default;

  // Connects to D-Bus system bus and exports methods.
  void RegisterAsync(const CompletionAction& callback);

#ifdef __ANDROID__
  // Get the binder interface for this firewall.
  android::sp<BinderInterface> GetBinderInterface();
#endif  // __ANDROID__

 private:
#if !defined(__ANDROID__)
  void OnPermissionBrokerRemoved(const dbus::ObjectPath& path);
#endif  // __ANDROID__

  brillo::dbus_utils::DBusObject dbus_object_;
#if !defined(__ANDROID__)
  std::unique_ptr<org::chromium::PermissionBroker::ObjectManagerProxy>
      permission_broker_;
#endif  // __ANDROID__
  IpTables iptables_;

#ifdef __ANDROID__
  // A binder interface for this firewall.
  android::sp<BinderInterface> binder_interface_;
#endif  // __ANDROID__

  base::WeakPtrFactory<FirewallService> weak_ptr_factory_{this};
  DISALLOW_COPY_AND_ASSIGN(FirewallService);
};

}  // namespace firewalld

#endif  // FIREWALLD_FIREWALL_SERVICE_H_
