/* GStreamer
 *
 * Copyright (C) 2014 Samsung Electronics. All rights reserved.
 *     @Author: Reynaldo H. Verdejo Pinochet <r.verdejo@sisa.samsung.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more
 */


#include <glib.h>
#include <gst/gst.h>
#include <libsoup/soup.h>
#include "gstsouputils.h"

/**
 * Soup logger funcs
 */

GST_DEBUG_CATEGORY_EXTERN (soup_utils_debug);
#define GST_CAT_DEFAULT soup_utils_debug

static inline gchar
gst_soup_util_log_make_level_tag (SoupLoggerLogLevel level)
{
  gchar c;

  if (G_UNLIKELY ((gint) level > 9))
    return '?';

  switch (level) {
    case SOUP_LOGGER_LOG_MINIMAL:
      c = 'M';
      break;
    case SOUP_LOGGER_LOG_HEADERS:
      c = 'H';
      break;
    case SOUP_LOGGER_LOG_BODY:
      c = 'B';
      break;
    default:
      /* Unknown level. If this is hit libsoup likely added a new
       * log level to SoupLoggerLogLevel and it should be added
       * as a case */
      c = level + '0';
      break;
  }
  return c;
}

static void
gst_soup_util_log_printer_cb (SoupLogger G_GNUC_UNUSED * logger,
    SoupLoggerLogLevel level, char direction, const char *data,
    gpointer user_data)
{
  gchar c;
  c = gst_soup_util_log_make_level_tag (level);
  GST_TRACE_OBJECT (GST_ELEMENT (user_data), "HTTP_SESSION(%c): %c %s", c,
      direction, data);
}

void
gst_soup_util_log_setup (SoupSession * session, SoupLoggerLogLevel level,
    GstElement * element)
{
  SoupLogger *logger;

  if (!level) {
    GST_INFO_OBJECT (element, "Not attaching a logger with level 0");
    return;
  }

  g_assert (session && element);

  if (gst_debug_category_get_threshold (GST_CAT_DEFAULT)
      < GST_LEVEL_TRACE) {
    GST_INFO_OBJECT (element, "Not setting up HTTP session logger. "
        "Need at least GST_LEVEL_TRACE");
    return;
  }

  /* Create a new logger and set body_size_limit to -1 (no limit) */
  logger = soup_logger_new (level, -1);
  soup_logger_set_printer (logger, gst_soup_util_log_printer_cb,
      gst_object_ref (element), (GDestroyNotify) gst_object_unref);

  /* Attach logger to session */
  soup_session_add_feature (session, SOUP_SESSION_FEATURE (logger));
  g_object_unref (logger);
}
