// 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.
//
// ::g_type_init() must be called before this class is used.
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_
