/* GStreamer
 *
 * Copyright (C) 2007 Rene Stadler <mail@renestadler.de>
 * Copyright (C) 2007-2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
 * 
 * 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 details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 */

/**
 * SECTION:element-giosink
 * @see_also: #GstFileSink, #GstGnomeVFSSink, #GstGioSrc
 *
 * This plugin writes incoming data to a local or remote location specified
 * by an URI. This location can be specified using any protocol supported by
 * the GIO library or it's VFS backends. Common protocols are 'file', 'ftp',
 * or 'smb'.
 *
 * If the URI or #GFile already exists giosink will post a message of
 * type %GST_MESSAGE_ELEMENT with name "file-exists" on the bus. The message
 * also contains the #GFile and the corresponding URI.
 * Applications can use the "file-exists" message to notify the user about
 * the problem and to set a different target location or to remove the
 * existing file. Note that right after the "file-exists" message a normal
 * error message is posted on the bus which should be ignored if "file-exists"
 * is handled by the application, for example by calling
 * gst_bus_set_flushing(bus, TRUE) after the "file-exists" message was
 * received and gst_bus_set_flushing(bus, FALSE) after the problem is
 * resolved.
 *
 * Similar to the "file-exist" message a "not-mounted" message is posted
 * on the bus if the target location is not mounted yet and needs to be
 * mounted. This message can be used by application to mount the location
 * and retry after the location was mounted successfully.
 * 
 * <refsect2>
 * <title>Example pipelines</title>
 * |[
 * gst-launch-1.0 -v filesrc location=input.xyz ! giosink location=file:///home/joe/out.xyz
 * ]| The above pipeline will simply copy a local file. Instead of giosink,
 * we could just as well have used the filesink element here.
 * |[
 * gst-launch-1.0 -v uridecodebin uri=file:///path/to/audio.file ! audioconvert ! flacenc ! giosink location=smb://othercomputer/foo.flac
 * ]| The above pipeline will re-encode an audio file into FLAC format and store
 * it on a remote host using the Samba protocol.
 * |[
 * gst-launch-1.0 -v audiotestsrc num-buffers=100 ! vorbisenc ! oggmux ! giosink location=file:///home/foo/bar.ogg
 * ]| The above pipeline will encode a 440Hz sine wave to Ogg Vorbis and stores
 * it in the home directory of user foo.
 * </refsect2>
 */

/* FIXME: We would like to mount the enclosing volume of an URL
 *        if it isn't mounted yet but this is possible async-only.
 *        Unfortunately this requires a running main loop from the
 *        default context and we can't guarantee this!
 *
 *        We would also like to do authentication while mounting.
 */

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include "gstgiosink.h"

GST_DEBUG_CATEGORY_STATIC (gst_gio_sink_debug);
#define GST_CAT_DEFAULT gst_gio_sink_debug

/* Filter signals and args */
enum
{
  LAST_SIGNAL
};

enum
{
  PROP_0,
  PROP_LOCATION,
  PROP_FILE
};

#define gst_gio_sink_parent_class parent_class
G_DEFINE_TYPE_WITH_CODE (GstGioSink, gst_gio_sink, GST_TYPE_GIO_BASE_SINK,
    gst_gio_uri_handler_do_init (g_define_type_id));

static void gst_gio_sink_finalize (GObject * object);
static void gst_gio_sink_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec);
static void gst_gio_sink_get_property (GObject * object, guint prop_id,
    GValue * value, GParamSpec * pspec);
static GOutputStream *gst_gio_sink_get_stream (GstGioBaseSink * base_sink);

static void
gst_gio_sink_class_init (GstGioSinkClass * klass)
{
  GObjectClass *gobject_class = (GObjectClass *) klass;
  GstElementClass *gstelement_class = (GstElementClass *) klass;
  GstGioBaseSinkClass *gstgiobasesink_class = (GstGioBaseSinkClass *) klass;

  GST_DEBUG_CATEGORY_INIT (gst_gio_sink_debug, "gio_sink", 0, "GIO sink");

  gobject_class->finalize = gst_gio_sink_finalize;
  gobject_class->set_property = gst_gio_sink_set_property;
  gobject_class->get_property = gst_gio_sink_get_property;

  g_object_class_install_property (gobject_class, PROP_LOCATION,
      g_param_spec_string ("location", "Location", "URI location to write to",
          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

  /**
   * GstGioSink:file:
   *
   * %GFile to write to.
   */
  g_object_class_install_property (gobject_class, PROP_FILE,
      g_param_spec_object ("file", "File", "GFile to write to",
          G_TYPE_FILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));

  gst_element_class_set_static_metadata (gstelement_class, "GIO sink",
      "Sink/File",
      "Write to any GIO-supported location",
      "Ren\xc3\xa9 Stadler <mail@renestadler.de>, "
      "Sebastian Dröge <sebastian.droege@collabora.co.uk>");

  gstgiobasesink_class->get_stream =
      GST_DEBUG_FUNCPTR (gst_gio_sink_get_stream);
  gstgiobasesink_class->close_on_stop = TRUE;
}

static void
gst_gio_sink_init (GstGioSink * sink)
{
}

static void
gst_gio_sink_finalize (GObject * object)
{
  GstGioSink *sink = GST_GIO_SINK (object);

  if (sink->file) {
    g_object_unref (sink->file);
    sink->file = NULL;
  }

  GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
}

static void
gst_gio_sink_set_property (GObject * object, guint prop_id,
    const GValue * value, GParamSpec * pspec)
{
  GstGioSink *sink = GST_GIO_SINK (object);

  switch (prop_id) {
    case PROP_LOCATION:{
      const gchar *uri = NULL;

      if (GST_STATE (sink) == GST_STATE_PLAYING ||
          GST_STATE (sink) == GST_STATE_PAUSED) {
        GST_WARNING
            ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
        break;
      }

      GST_OBJECT_LOCK (GST_OBJECT (sink));
      if (sink->file)
        g_object_unref (sink->file);

      uri = g_value_get_string (value);

      if (uri) {
        sink->file = g_file_new_for_uri (uri);

        if (!sink->file) {
          GST_ERROR ("Could not create GFile for URI '%s'", uri);
        }
      } else {
        sink->file = NULL;
      }
      GST_OBJECT_UNLOCK (GST_OBJECT (sink));
      break;
    }
    case PROP_FILE:
      if (GST_STATE (sink) == GST_STATE_PLAYING ||
          GST_STATE (sink) == GST_STATE_PAUSED) {
        GST_WARNING
            ("Setting a new location or GFile not supported in PLAYING or PAUSED state");
        break;
      }

      GST_OBJECT_LOCK (GST_OBJECT (sink));
      if (sink->file)
        g_object_unref (sink->file);

      sink->file = g_value_dup_object (value);

      GST_OBJECT_UNLOCK (GST_OBJECT (sink));
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}

static void
gst_gio_sink_get_property (GObject * object, guint prop_id,
    GValue * value, GParamSpec * pspec)
{
  GstGioSink *sink = GST_GIO_SINK (object);

  switch (prop_id) {
    case PROP_LOCATION:{
      gchar *uri;

      GST_OBJECT_LOCK (GST_OBJECT (sink));
      if (sink->file) {
        uri = g_file_get_uri (sink->file);
        g_value_set_string (value, uri);
        g_free (uri);
      } else {
        g_value_set_string (value, NULL);
      }
      GST_OBJECT_UNLOCK (GST_OBJECT (sink));
      break;
    }
    case PROP_FILE:
      GST_OBJECT_LOCK (GST_OBJECT (sink));
      g_value_set_object (value, sink->file);
      GST_OBJECT_UNLOCK (GST_OBJECT (sink));
      break;
    default:
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
      break;
  }
}

static GOutputStream *
gst_gio_sink_get_stream (GstGioBaseSink * bsink)
{
  GstGioSink *sink = GST_GIO_SINK (bsink);
  GOutputStream *stream;
  GCancellable *cancel = GST_GIO_BASE_SINK (sink)->cancel;
  GError *err = NULL;
  gchar *uri;

  if (sink->file == NULL) {
    GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
        ("No location or GFile given"));
    return NULL;
  }

  uri = g_file_get_uri (sink->file);
  if (!uri)
    uri = g_strdup ("(null)");

  stream =
      G_OUTPUT_STREAM (g_file_create (sink->file, G_FILE_CREATE_NONE, cancel,
          &err));

  if (!stream) {
    if (!gst_gio_error (sink, "g_file_create", &err, NULL)) {
      /*if (GST_GIO_ERROR_MATCHES (err, EXISTS)) */
      /* FIXME: Retry with replace if overwrite == TRUE! */

      if (GST_GIO_ERROR_MATCHES (err, NOT_FOUND)) {
        GST_ELEMENT_ERROR (sink, RESOURCE, NOT_FOUND, (NULL),
            ("Could not open location %s for writing: %s", uri, err->message));
      } else if (GST_GIO_ERROR_MATCHES (err, EXISTS)) {
        gst_element_post_message (GST_ELEMENT_CAST (sink),
            gst_message_new_element (GST_OBJECT_CAST (sink),
                gst_structure_new ("file-exists", "file", G_TYPE_FILE,
                    sink->file, "uri", G_TYPE_STRING, uri, NULL)));

        GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
            ("Location %s already exists: %s", uri, err->message));
      } else if (GST_GIO_ERROR_MATCHES (err, NOT_MOUNTED)) {
        gst_element_post_message (GST_ELEMENT_CAST (sink),
            gst_message_new_element (GST_OBJECT_CAST (sink),
                gst_structure_new ("not-mounted", "file", G_TYPE_FILE,
                    sink->file, "uri", G_TYPE_STRING, uri, NULL)));

        GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
            ("Location %s not mounted: %s", uri, err->message));
      } else {
        GST_ELEMENT_ERROR (sink, RESOURCE, OPEN_WRITE, (NULL),
            ("Could not open location %s for writing: %s", uri, err->message));
      }

      g_clear_error (&err);
    }
    g_free (uri);
    return NULL;
  }

  GST_DEBUG_OBJECT (sink, "opened location %s", uri);

  g_free (uri);

  return stream;
}
