summaryrefslogtreecommitdiff
path: root/gvfs/gfileoutputstream.c
blob: 861e50f02ba3546543034da1084b63ab399e7925 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <config.h>

#include <glib.h>
#include <glib/gi18n-lib.h>
#include <gfileoutputstream.h>

G_DEFINE_TYPE (GFileOutputStream, g_file_output_stream, G_TYPE_OUTPUT_STREAM);

struct _GFileOutputStreamPrivate {
  guint get_final_mtime : 1;
  time_t final_mtime;
};

static void
g_file_output_stream_class_init (GFileOutputStreamClass *klass)
{
  g_type_class_add_private (klass, sizeof (GFileOutputStreamPrivate));
}

static void
g_file_output_stream_init (GFileOutputStream *stream)
{
  stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream,
					      G_TYPE_FILE_OUTPUT_STREAM,
					      GFileOutputStreamPrivate);
}

GFileInfo *
g_file_output_stream_get_file_info (GFileOutputStream      *stream,
				    GFileInfoRequestFlags   requested,
				    char                   *attributes,
				    GError                **error)
{
  GFileOutputStreamClass *class;
  GOutputStream *output_stream;
  GFileInfo *info;
  
  g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), NULL);
  g_return_val_if_fail (stream != NULL, NULL);
  
  output_stream = G_OUTPUT_STREAM (stream);
  
  if (g_output_stream_is_closed (output_stream))
    {
      g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_CLOSED,
		   _("Stream is already closed"));
      return NULL;
    }
  
  if (g_output_stream_has_pending (output_stream))
    {
      g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_PENDING,
		   _("Stream has outstanding operation"));
      return NULL;
    }
      
  info = NULL;
  
  g_output_stream_set_pending (output_stream, TRUE);
  
  class = G_FILE_OUTPUT_STREAM_GET_CLASS (stream);
  if (class->get_file_info)
    info = class->get_file_info (stream, requested, attributes, error);
  else
    g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_NOT_SUPPORTED,
		 _("Stream doesn't support get_file_info"));
  
  g_output_stream_set_pending (output_stream, FALSE);
  
  return info;
}

void
g_file_output_stream_set_should_get_final_mtime (GFileOutputStream  *stream,
						 gboolean           get_final_mtime)
{
  g_return_if_fail (G_IS_FILE_OUTPUT_STREAM (stream));
  g_return_if_fail (stream != NULL);

  stream->priv->get_final_mtime = get_final_mtime;
}

gboolean
g_file_output_stream_get_should_get_final_mtime (GFileOutputStream  *stream)
{
  g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE);
  g_return_val_if_fail (stream != NULL, FALSE);

  return stream->priv->get_final_mtime;
}

time_t
g_file_output_stream_get_final_mtime (GFileOutputStream  *stream)
{
  g_return_val_if_fail (G_IS_FILE_OUTPUT_STREAM (stream), FALSE);
  g_return_val_if_fail (stream != NULL, FALSE);

  return stream->priv->final_mtime;
}

void
g_file_output_stream_set_final_mtime (GFileOutputStream  *stream,
				      time_t             final_mtime)
{
  g_return_if_fail (G_IS_FILE_OUTPUT_STREAM (stream));
  g_return_if_fail (stream != NULL);

  stream->priv->final_mtime = final_mtime;
}