// 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.

#include <stdio.h>
#include <glib.h>

#include "shill/glib_io_handler.h"

namespace shill {

static gboolean DispatchIOHandler(GIOChannel *chan,
                                  GIOCondition cond,
                                  gpointer data);

GlibIOInputHandler::GlibIOInputHandler(int fd,
                                       Callback1<InputData*>::Type *callback)
    : callback_(callback) {
  channel_ = g_io_channel_unix_new(fd);
  g_io_channel_set_close_on_unref(channel_, TRUE);
  source_id_ = g_io_add_watch(channel_,
                              static_cast<GIOCondition>(
                                  G_IO_IN | G_IO_NVAL | G_IO_HUP | G_IO_ERR),
                              DispatchIOHandler, this);
}

GlibIOInputHandler::~GlibIOInputHandler() {
  g_source_remove(source_id_);
  g_io_channel_shutdown(channel_, TRUE, NULL);
  g_io_channel_unref(channel_);
}

static gboolean DispatchIOHandler(GIOChannel *chan,
                                  GIOCondition cond,
                                  gpointer data) {
  GlibIOInputHandler *handler = static_cast<GlibIOInputHandler *>(data);
  unsigned char buf[4096];
  gsize len;
  GIOError err;

  if (cond & (G_IO_NVAL | G_IO_HUP | G_IO_ERR))
    return FALSE;

  err = g_io_channel_read(chan, reinterpret_cast<gchar *>(buf), sizeof(buf),
                          &len);
  if (err) {
    if (err == G_IO_ERROR_AGAIN)
      return TRUE;
    return FALSE;
  }

  InputData input_data(buf, len);
  handler->callback_->Run(&input_data);

  return TRUE;
}

}  // namespace shill
