source: trunk/third/gnome-vfs/libgnomevfs/gnome-vfs-handle.c @ 18154

Revision 18154, 5.1 KB checked in by ghudson, 22 years ago (diff)
Work around Solaris #defines for truncate, tell, and stat.
Line 
1/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
2/* gnome-vfs-handle.c - Handle object for GNOME VFS files.
3
4   Copyright (C) 1999 Free Software Foundation
5
6   The Gnome Library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Library General Public License as
8   published by the Free Software Foundation; either version 2 of the
9   License, or (at your option) any later version.
10
11   The Gnome Library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Library General Public License for more details.
15
16   You should have received a copy of the GNU Library General Public
17   License along with the Gnome Library; see the file COPYING.LIB.  If not,
18   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19   Boston, MA 02111-1307, USA.
20
21   Author: Ettore Perazzoli <ettore@gnu.org>
22*/
23
24#include <config.h>
25#include "gnome-vfs-handle.h"
26
27#include "gnome-vfs.h"
28#include "gnome-vfs-private.h"
29
30
31struct GnomeVFSHandle {
32        /* URI of the file being accessed through the handle.  */
33        GnomeVFSURI *uri;
34
35        /* Method-specific handle.  */
36        GnomeVFSMethodHandle *method_handle;
37
38        /* Open mode.  */
39        GnomeVFSOpenMode open_mode;
40};
41
42#define CHECK_IF_OPEN(handle)                   \
43G_STMT_START{                                   \
44        if (handle->uri == NULL)                \
45                return GNOME_VFS_ERROR_NOT_OPEN;        \
46}G_STMT_END
47
48#define CHECK_IF_SUPPORTED(handle, what)                \
49G_STMT_START{                                           \
50        if (!VFS_METHOD_HAS_FUNC(handle->uri->method, what))            \
51                return GNOME_VFS_ERROR_NOT_SUPPORTED;   \
52}G_STMT_END
53
54#define INVOKE(result, handle, what, params)            \
55G_STMT_START{                                           \
56        CHECK_IF_OPEN (handle);                         \
57        CHECK_IF_SUPPORTED (handle, what);              \
58        (result) = handle->uri->method->what params;    \
59}G_STMT_END
60
61#define INVOKE_AND_RETURN(handle, what, params)         \
62G_STMT_START{                                           \
63        GnomeVFSResult __result;                        \
64                                                        \
65        INVOKE (__result, handle, what, params);        \
66        return __result;                                \
67}G_STMT_END
68
69
70GnomeVFSHandle *
71gnome_vfs_handle_new (GnomeVFSURI *uri,
72                      GnomeVFSMethodHandle *method_handle,
73                      GnomeVFSOpenMode open_mode)
74{
75        GnomeVFSHandle *new;
76
77        g_return_val_if_fail (uri != NULL, NULL);
78        g_return_val_if_fail (method_handle != NULL, NULL);
79
80        new = g_new (GnomeVFSHandle, 1);
81
82        new->uri = gnome_vfs_uri_ref (uri);
83        new->method_handle = method_handle;
84        new->open_mode = open_mode;
85
86        if ((open_mode & GNOME_VFS_OPEN_RANDOM) &&
87            !VFS_METHOD_HAS_FUNC (uri->method, seek)) {
88                GnomeVFSMethodHandle *handle;
89                handle = gnome_vfs_seek_emulate (new->uri, method_handle,
90                                                 open_mode);
91                if (handle) /* Successfully wrapped */
92                        new->method_handle = handle;
93        }
94
95        return new;
96}
97
98void
99gnome_vfs_handle_destroy (GnomeVFSHandle *handle)
100{
101        g_return_if_fail (handle != NULL);
102
103        gnome_vfs_uri_unref (handle->uri);
104
105        g_free (handle);
106}
107
108
109GnomeVFSOpenMode
110gnome_vfs_handle_get_open_mode (GnomeVFSHandle *handle)
111{
112        g_return_val_if_fail (handle != NULL, (GnomeVFSOpenMode) 0);
113
114        return handle->open_mode;
115}
116
117
118/* Actions.  */
119
120GnomeVFSResult
121gnome_vfs_handle_do_close (GnomeVFSHandle *handle,
122                           GnomeVFSContext *context)
123{
124        GnomeVFSResult result;
125
126        INVOKE (result, handle, close, (handle->uri->method, handle->method_handle, context));
127
128        /* Even if close has failed, we shut down the handle. */
129        gnome_vfs_handle_destroy (handle);
130
131        return result;
132}
133
134GnomeVFSResult
135gnome_vfs_handle_do_read (GnomeVFSHandle *handle,
136                          gpointer buffer,
137                          GnomeVFSFileSize num_bytes,
138                          GnomeVFSFileSize *bytes_read,
139                          GnomeVFSContext *context)
140{
141        INVOKE_AND_RETURN (handle, read, (handle->uri->method, handle->method_handle,
142                                          buffer, num_bytes, bytes_read,
143                                          context));
144}
145
146GnomeVFSResult
147gnome_vfs_handle_do_write (GnomeVFSHandle *handle,
148                           gconstpointer buffer,
149                           GnomeVFSFileSize num_bytes,
150                           GnomeVFSFileSize *bytes_written,
151                           GnomeVFSContext *context)
152{
153        INVOKE_AND_RETURN (handle, write, (handle->uri->method, handle->method_handle,
154                                           buffer, num_bytes, bytes_written,
155                                           context));
156}
157
158
159GnomeVFSResult
160gnome_vfs_handle_do_seek (GnomeVFSHandle *handle,
161                          GnomeVFSSeekPosition whence,
162                          GnomeVFSFileSize offset,
163                          GnomeVFSContext *context)
164{
165        INVOKE_AND_RETURN (handle, seek, (handle->uri->method, handle->method_handle,
166                                          whence, offset, context));
167}
168
169/* Athena hack to work around Solaris #define of "tell" */
170#undef tell
171
172GnomeVFSResult
173gnome_vfs_handle_do_tell (GnomeVFSHandle *handle,
174                          GnomeVFSFileSize *offset_return)
175{
176        INVOKE_AND_RETURN (handle, tell, (handle->uri->method, handle->method_handle,
177                                          offset_return));
178}
179
180
181GnomeVFSResult
182gnome_vfs_handle_do_get_file_info (GnomeVFSHandle *handle,
183                                   GnomeVFSFileInfo *info,
184                                   GnomeVFSFileInfoOptions options,
185                                   GnomeVFSContext *context)
186{
187        INVOKE_AND_RETURN (handle, get_file_info_from_handle,
188                           (handle->uri->method, handle->method_handle, info, options,
189                            context));
190}
191
192GnomeVFSResult gnome_vfs_handle_do_truncate     (GnomeVFSHandle *handle,
193                                                 GnomeVFSFileSize length,
194                                                 GnomeVFSContext *context)
195{
196        INVOKE_AND_RETURN (handle, truncate_handle, (handle->uri->method, handle->method_handle, length, context));
197}
Note: See TracBrowser for help on using the repository browser.