// Copyright (c) 2011 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.

#ifndef IMAGE_BURNER_IMAGE_BURN_SERVICE_H_
#define IMAGE_BURNER_IMAGE_BURN_SERVICE_H_

#include <stdint.h>

#include <string>

#include <brillo/glib/abstract_dbus_service.h>
#include <brillo/glib/dbus.h>
#include <chromeos/dbus/service_constants.h>

#include "image-burner/image_burner_impl.h"

namespace imageburn {

// Defined in image_burner.h.
struct ImageBurner;

const int kNumSignals = 2;

enum BurnSignals {
  kSignalBurnFinished,
  kSignalBurnUpdate
};

// Provides a wrapper for exporting ImageBurnerInterface to
// D-Bus and entering the glib run loop.
class ImageBurnService : public brillo::dbus::AbstractDbusService,
                         public SignalSender {
 public:
  explicit ImageBurnService(BurnerImpl* burner_impl);
  virtual ~ImageBurnService();

  // brillo::dbus::AbstractDbusService implementation.
  const char *service_name() const override;
  const char *service_path() const override;
  const char *service_interface() const override;
  GObject *service_object() const override;
  bool Initialize() override;
  bool Reset() override;
  bool Shutdown() override;

  // SignalSender interface.
  void SendFinishedSignal(const char* target_path, bool success,
                          const char* error_message) override;
  void SendProgressSignal(int64_t amount_burnt, int64_t total_size,
                          const char* target_path) override;

  gboolean BurnImageAsync(gchar* from_path, gchar* to_path,
      DBusGMethodInvocation* context);

 protected:
  GMainLoop *main_loop() override {
    return main_loop_;
  }

 private:
  void Cleanup();
  void SetError(const std::string& message, GError** error);

  ImageBurner* image_burner_;
  GMainLoop* main_loop_;
  guint signals_[kNumSignals];
  int64_t amount_burnt_for_next_signal_;
  bool burning_;
  BurnerImpl* burner_impl_;
};

}  // namespace imageburn

#endif  // IMAGE_BURNER_IMAGE_BURN_SERVICE_H_
