Skip to content

Commit

Permalink
2006-09-27 Alexander Larsson <[email protected]>
Browse files Browse the repository at this point in the history
	* Makefile:
	* gfileinputstream.[ch]:
	* gfileoutputstream.[ch]:
	Add new classes.

	* gfileinfo.[ch]:
	Add flags, symlink_target and edit_name

	* ginputstream.[ch]
	* goutputstream.[ch]:
	Export close/pending state a bit

	* gvfserror.h:
	Add NOT_SUPPORTED

Original git commit by alex <alex> at 1159368724 +0000


git-svn-id: svn+ssh://svn.gnome.org/svn/gvfs/trunk@8 0feb0166-6c39-0410-8ede-fcc449a06167
  • Loading branch information
alexl committed Sep 13, 2007
1 parent 5ed6bbd commit 5a498aa
Show file tree
Hide file tree
Showing 14 changed files with 405 additions and 15 deletions.
14 changes: 12 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,18 @@
LIBS=`pkg-config --libs glib-2.0 gobject-2.0 gthread-2.0`
CFLAGS=`pkg-config --cflags glib-2.0 gobject-2.0 gthread-2.0` -I./ -Wall -O -g -D_GNU_SOURCE

CFILES=gfileinfo.c ginputstream.c goutputstream.c gvfserror.c gfileenumerator.c gfile.c gvfs.c gvfssimple.c ginputstreamfile.c goutputstreamfile.c gioscheduler.c
HFILES=gfileinfo.h ginputstream.h goutputstream.h gvfserror.h gfileenumerator.h gfile.h gvfs.h gvfssimple.h ginputstreamfile.h goutputstreamfile.h gioscheduler.h gvfstypes.h
CFILES=gfileinfo.c ginputstream.c goutputstream.c \
gvfserror.c gfileenumerator.c gfile.c\
gvfs.c gvfssimple.c ginputstreamfile.c\
goutputstreamfile.c gioscheduler.c\
gfileinputstream.c gfileoutputstream.c

HFILES=gfileinfo.h ginputstream.h goutputstream.h\
gvfserror.h gfileenumerator.h gfile.h\
gvfs.h gvfssimple.h ginputstreamfile.h\
goutputstreamfile.h gioscheduler.h\
gfileinputstream.h gfileoutputstream.h\
gvfstypes.h

test: test.c $(CFILES) $(HFILES) Makefile
gcc $(LIBS) $(CFLAGS) -o test test.c $(CFILES)
Expand Down
16 changes: 9 additions & 7 deletions gfileinfo.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,14 @@ struct _GFileInfoPrivate {
GFileType file_type;
char *name;
char *display_name;
char *edit_name;
char *icon;
GQuark mime_type_q;
goffset size;
time_t mtime;
GFileAccessRights access_rights;
struct stat *stat_info;
char *symlink_target;
GArray *attributes;
};

Expand All @@ -47,6 +49,7 @@ g_file_info_finalize (GObject *object)
g_free (priv->display_name);
g_free (priv->icon);
g_free (priv->stat_info);
g_free (priv->symlink_target);

attrs = info->priv->attributes;
for (i = 0; i < attrs->len; i++)
Expand Down Expand Up @@ -134,9 +137,9 @@ g_file_info_get_modification_time (GFileInfo *info)
}

const char *
g_file_info_get_link_target (GFileInfo *info)
g_file_info_get_symlink_target (GFileInfo *info)
{
return g_file_info_get_attribute (info, "vfs:link_target");
return info->priv->symlink_target;
}

GFileAccessRights
Expand Down Expand Up @@ -333,12 +336,11 @@ g_file_info_set_modification_time (GFileInfo *info,
}

void
g_file_info_set_link_target (GFileInfo *info,
const char *link_target)
g_file_info_set_symlink_target (GFileInfo *info,
const char *link_target)
{
g_file_info_set_attribute (info,
"vfs:link_target",
link_target);
g_free (info->priv->symlink_target);
info->priv->symlink_target = g_strdup (link_target);
}

void
Expand Down
17 changes: 16 additions & 1 deletion gfileinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,21 @@ struct _GFileAttribute {
char *value;
};

typedef enum {
G_FILE_INFO_FILE_TYPE = 1 << 0,
G_FILE_INFO_NAME = 1 << 1,
G_FILE_INFO_DISPLAY_NAME = 1 << 2,
G_FILE_INFO_EDIT_NAME = 1 << 3,
G_FILE_INFO_ICON = 1 << 4,
G_FILE_INFO_MIME_TYPE = 1 << 5,
G_FILE_INFO_SIZE = 1 << 6,
G_FILE_INFO_MTIME = 1 << 7,
G_FILE_INFO_ACCESS_RIGHTS = 1 << 8,
G_FILE_INFO_STAT_INFO = 1 << 9,
G_FILE_INFO_SYMLINK_TARGET = 1 << 10,

} GFileInfoFlags;

GType g_file_info_get_type (void) G_GNUC_CONST;

GFileType g_file_info_get_file_type (GFileInfo *info);
Expand Down Expand Up @@ -92,7 +107,7 @@ void g_file_info_set_size (GFileInfo *inf
goffset size);
void g_file_info_set_modification_time (GFileInfo *info,
time_t time);
void g_file_info_set_link_target (GFileInfo *info,
void g_file_info_set_symlink_target (GFileInfo *info,
const char *link_target);
void g_file_info_set_access_rights (GFileInfo *info,
GFileAccessRights access_rights);
Expand Down
72 changes: 72 additions & 0 deletions gfileinputstream.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
#include <config.h>

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

G_DEFINE_TYPE (GFileInputStream, g_file_input_stream, G_TYPE_INPUT_STREAM);

static GInputStreamClass *parent_class = NULL;

struct _GFileInputStreamPrivate {
int dummy;
};

static void
g_file_input_stream_class_init (GFileInputStreamClass *klass)
{
parent_class = g_type_class_peek_parent (klass);

g_type_class_add_private (klass, sizeof (GFileInputStreamPrivate));
}

static void
g_file_input_stream_init (GFileInputStream *stream)
{
stream->priv = G_TYPE_INSTANCE_GET_PRIVATE (stream,
G_TYPE_FILE_INPUT_STREAM,
GFileInputStreamPrivate);
}

GFileInfo *
g_file_input_stream_get_file_info (GFileInputStream *stream,
GError **error)
{
GFileInputStreamClass *class;
GInputStream *input_stream;
GFileInfo *info;

g_return_val_if_fail (G_IS_FILE_INPUT_STREAM (stream), NULL);
g_return_val_if_fail (stream != NULL, NULL);

input_stream = G_INPUT_STREAM (stream);

if (g_input_stream_is_closed (input_stream))
{
g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_CLOSED,
_("Stream is already closed"));
return NULL;
}

if (g_input_stream_has_pending (input_stream))
{
g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_PENDING,
_("Stream has outstanding operation"));
return NULL;
}

info = NULL;

g_input_stream_set_pending (input_stream, TRUE);

class = G_FILE_INPUT_STREAM_GET_CLASS (stream);
if (class->get_file_info)
info = class->get_file_info (stream, error);
else
g_set_error (error, G_VFS_ERROR, G_VFS_ERROR_NOT_SUPPORTED,
_("Stream doesn't support get_file_info"));

g_input_stream_set_pending (input_stream, FALSE);

return info;
}
50 changes: 50 additions & 0 deletions gfileinputstream.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#ifndef __G_FILE_INPUT_STREAM_H__
#define __G_FILE_INPUT_STREAM_H__

#include <ginputstream.h>
#include <gfileinfo.h>

G_BEGIN_DECLS

#define G_TYPE_FILE_INPUT_STREAM (g_input_stream_get_type ())
#define G_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_INPUT_STREAM, GFileInputStream))
#define G_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_INPUT_STREAM, GFileInputStreamClass))
#define G_IS_FILE_INPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_INPUT_STREAM))
#define G_IS_FILE_INPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_INPUT_STREAM))
#define G_FILE_INPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_INPUT_STREAM, GFileInputStreamClass))

typedef struct _GFileInputStream GFileInputStream;
typedef struct _GFileInputStreamClass GFileInputStreamClass;
typedef struct _GFileInputStreamPrivate GFileInputStreamPrivate;

struct _GFileInputStream
{
GInputStream parent;

/*< private >*/
GFileInputStreamPrivate *priv;
};

struct _GFileInputStreamClass
{
GInputStreamClass parent_class;

GFileInfo *(*get_file_info) (GFileInputStream *stream,
GError **error);

/* Padding for future expansion */
void (*_g_reserved1) (void);
void (*_g_reserved2) (void);
void (*_g_reserved3) (void);
void (*_g_reserved4) (void);
void (*_g_reserved5) (void);
};

GType g_file_input_stream_get_type (void) G_GNUC_CONST;

GFileInfo *g_file_input_stream_get_file_info (GFileInputStream *stream,
GError **error);

G_END_DECLS

#endif /* __G_FILE_FILE_INPUT_STREAM_H__ */
111 changes: 111 additions & 0 deletions gfileoutputstream.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
#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);

static GOutputStreamClass *parent_class = NULL;

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

static void
g_file_output_stream_class_init (GFileOutputStreamClass *klass)
{
parent_class = g_type_class_peek_parent (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,
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, 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;
}
59 changes: 59 additions & 0 deletions gfileoutputstream.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#ifndef __G_FILE_OUTPUT_STREAM_H__
#define __G_FILE_OUTPUT_STREAM_H__

#include <goutputstream.h>
#include <gfileinfo.h>

G_BEGIN_DECLS

#define G_TYPE_FILE_OUTPUT_STREAM (g_output_stream_get_type ())
#define G_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStream))
#define G_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStreamClass))
#define G_IS_FILE_OUTPUT_STREAM(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), G_TYPE_FILE_OUTPUT_STREAM))
#define G_IS_FILE_OUTPUT_STREAM_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), G_TYPE_FILE_OUTPUT_STREAM))
#define G_FILE_OUTPUT_STREAM_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), G_TYPE_FILE_OUTPUT_STREAM, GFileOutputStreamClass))

typedef struct _GFileOutputStream GFileOutputStream;
typedef struct _GFileOutputStreamClass GFileOutputStreamClass;
typedef struct _GFileOutputStreamPrivate GFileOutputStreamPrivate;

struct _GFileOutputStream
{
GOutputStream parent;

/*< private >*/
GFileOutputStreamPrivate *priv;
};

struct _GFileOutputStreamClass
{
GOutputStreamClass parent_class;

GFileInfo *(*get_file_info) (GFileOutputStream *stream,
GError **error);

/* Padding for future expansion */
void (*_g_reserved1) (void);
void (*_g_reserved2) (void);
void (*_g_reserved3) (void);
void (*_g_reserved4) (void);
void (*_g_reserved5) (void);
};

GType g_file_output_stream_get_type (void) G_GNUC_CONST;


GFileInfo *g_file_output_stream_get_file_info (GFileOutputStream *stream,
GError **error);
void g_file_output_stream_set_should_get_final_mtime (GFileOutputStream *stream,
gboolean get_final_mtime);
time_t g_file_output_stream_get_final_mtime (GFileOutputStream *stream);

gboolean g_file_output_stream_get_should_get_final_mtime (GFileOutputStream *stream);
void g_file_output_stream_set_final_mtime (GFileOutputStream *stream,
time_t final_mtime);


G_END_DECLS

#endif /* __G_FILE_FILE_OUTPUT_STREAM_H__ */
Loading

0 comments on commit 5a498aa

Please sign in to comment.