// 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_,
                              (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
