1  /* GIO - GLib Input, Output and Streaming Library
2  *
3  * Copyright (C) Carl-Anton Ingmarsson 2011 <ca.ingmarsson@gmail.com>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General
16  * Public License along with this library; if not, write to the
17  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  *
20  * Author: Carl-Anton Ingmarsson <ca.ingmarsson@gmail.com>
21  */
22 
23 #ifndef _GVFSAFPCONNECTION_H_
24 #define _GVFSAFPCONNECTION_H_
25 
26 #include <gio/gio.h>
27 
28 #include "gvfsafputils.h"
29 
30 G_BEGIN_DECLS
31 
32 enum
33 {
34   AFP_GET_USER_INFO_BITMAP_GET_UID_BIT =  0x1,
35   AFP_GET_USER_INFO_BITMAP_GET_GID_BIT =  0x2,
36   AFP_GET_USER_INFO_BITMAP_GET_UUID_BIT = 0x4
37 };
38 
39 enum
40 {
41   AFP_MAP_NAME_FUNCTION_NAME_TO_USER_ID         = 1,
42   AFP_MAP_NAME_FUNCTION_NAME_TO_GROUP_ID        = 2,
43   AFP_MAP_NAME_FUNCTION_UTF8_NAME_TO_USER_ID    = 3,
44   AFP_MAP_NAME_FUNCTION_UTF8_NAME_TO_GROUP_ID   = 4,
45   AFP_MAP_NAME_FUNCTION_UTF8_NAME_TO_USER_UUID  = 5,
46   AFP_MAP_NAME_FUNCTION_UTF8_NAME_TO_GROUP_UUID = 6
47 };
48 
49 typedef enum
50 {
51   AFP_PATH_TYPE_SHORT_NAME = 1,
52   AFP_PATH_TYPE_LONG_NAME  = 2,
53   AFP_PATH_TYPE_UTF8_NAME  = 3
54 } AfpPathType;
55 
56 enum
57 {
58   AFP_ACCESS_MODE_READ_BIT       = (1 << 0),
59   AFP_ACCESS_MODE_WRITE_BIT      = (1 << 1),
60   AFP_ACCESS_MODE_DENY_READ_BIT  = (1 << 4),
61   AFP_ACCESS_MODE_DENY_WRITE_BIT = (1 << 5)
62 };
63 
64 enum
65 {
66   AFP_FILEDIR_ATTRIBUTES_BITMAP_INVISIBLE_BIT      = 0x1,
67   AFP_FILEDIR_ATTRIBUTES_BITMAP_SYSTEM_BIT         = 0x4,
68   AFP_FILEDIR_ATTRIBUTES_BITMAP_WRITE_INHIBIT_BIT  = 0x20,
69   AFP_FILEDIR_ATTRIBUTES_BITMAP_BACKUP_NEEDED_BIT  = 0x40,
70   AFP_FILEDIR_ATTRIBUTES_BITMAP_RENAME_INHIBIT_BIT = 0x80,
71   AFP_FILEDIR_ATTRIBUTES_BITMAP_DELETE_INHIBIT_BIT = 0x100,
72   AFP_FILEDIR_ATTRIBUTES_BITMAP_COPY_PROTECT_BIT   = 0x400,
73   AFP_FILEDIR_ATTRIBUTES_BITMAP_SET_CLEAR_BIT      = 0x8000
74 };
75 
76 enum
77 {
78   AFP_FILEDIR_BITMAP_ATTRIBUTE_BIT          = 0x1,
79   AFP_FILEDIR_BITMAP_PARENT_DIR_ID_BIT      = 0x2,
80   AFP_FILEDIR_BITMAP_CREATE_DATE_BIT        = 0x4,
81   AFP_FILEDIR_BITMAP_MOD_DATE_BIT           = 0x8,
82   AFP_FILEDIR_BITMAP_BACKUP_DATE_BIT        = 0x10,
83   AFP_FILEDIR_BITMAP_FINDER_INFO_BIT        = 0x20,
84   AFP_FILEDIR_BITMAP_LONG_NAME_BIT          = 0x40,
85   AFP_FILEDIR_BITMAP_SHORT_NAME_BIT         = 0x80,
86   AFP_FILEDIR_BITMAP_NODE_ID_BIT            = 0x100,
87   AFP_FILEDIR_BITMAP_UTF8_NAME_BIT          = 0x2000,
88   AFP_FILEDIR_BITMAP_UNIX_PRIVS_BIT         = 0x8000,
89 };
90 
91 enum
92 {
93   AFP_DIR_BITMAP_ATTRIBUTE_BIT          = 0x1,
94   AFP_DIR_BITMAP_PARENT_DIR_ID_BIT      = 0x2,
95   AFP_DIR_BITMAP_CREATE_DATE_BIT        = 0x4,
96   AFP_DIR_BITMAP_MOD_DATE_BIT           = 0x8,
97   AFP_DIR_BITMAP_BACKUP_DATE_BIT        = 0x10,
98   AFP_DIR_BITMAP_FINDER_INFO_BIT        = 0x20,
99   AFP_DIR_BITMAP_LONG_NAME_BIT          = 0x40,
100   AFP_DIR_BITMAP_SHORT_NAME_BIT         = 0x80,
101   AFP_DIR_BITMAP_NODE_ID_BIT            = 0x100,
102   AFP_DIR_BITMAP_OFFSPRING_COUNT_BIT    = 0x200,
103   AFP_DIR_BITMAP_OWNER_ID_BIT           = 0x400,
104   AFP_DIR_BITMAP_GROUP_ID_BIT           = 0x800,
105   AFP_DIR_BITMAP_ACCESS_RIGHTS_BIT      = 0x1000,
106   AFP_DIR_BITMAP_UTF8_NAME_BIT          = 0x2000,
107   AFP_DIR_BITMAP_UNIX_PRIVS_BIT         = 0x8000,
108   AFP_DIR_BITMAP_UUID_BIT               = 0x10000 // AFP version 3.2 and later (with ACL support)
109 };
110 
111 enum
112 {
113   AFP_FILE_BITMAP_ATTRIBUTE_BIT          = 0x1,
114   AFP_FILE_BITMAP_PARENT_DIR_ID_BIT      = 0x2,
115   AFP_FILE_BITMAP_CREATE_DATE_BIT        = 0x4,
116   AFP_FILE_BITMAP_MOD_DATE_BIT           = 0x8,
117   AFP_FILE_BITMAP_BACKUP_DATE_BIT        = 0x10,
118   AFP_FILE_BITMAP_FINDER_INFO_BIT        = 0x20,
119   AFP_FILE_BITMAP_LONG_NAME_BIT          = 0x40,
120   AFP_FILE_BITMAP_SHORT_NAME_BIT         = 0x80,
121   AFP_FILE_BITMAP_NODE_ID_BIT            = 0x100,
122   AFP_FILE_BITMAP_DATA_FORK_LEN_BIT      = 0x200,
123   AFP_FILE_BITMAP_RSRC_FORK_LEN_BIT      = 0x400,
124   AFP_FILE_BITMAP_EXT_DATA_FORK_LEN_BIT  = 0x800,
125   AFP_FILE_BITMAP_LAUNCH_LIMIT_BIT       = 0x1000,
126   AFP_FILE_BITMAP_UTF8_NAME_BIT          = 0x2000,
127   AFP_FILE_BITMAP_EXT_RSRC_FORK_LEN_BIT  = 0x4000,
128   AFP_FILE_BITMAP_UNIX_PRIVS_BIT         = 0x8000
129 };
130 
131 enum
132 {
133   AFP_VOLUME_ATTRIBUTES_BITMAP_READ_ONLY                   = 0x1,
134   AFP_VOLUME_ATTRIBUTES_BITMAP_HAS_VOLUME_PASSWORD         = 0x2,
135   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_FILE_IDS           = 0x4,
136   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_CAT_SEARCH         = 0x8,
137   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_BLANK_ACCESS_PRIVS = 0x10,
138   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_UNIX_PRIVS         = 0x20,
139   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_UTF8_NAMES         = 0x40,
140   AFP_VOLUME_ATTRIBUTES_BITMAP_NO_NETWORK_USER_IDS         = 0x80,
141   AFP_VOLUME_ATTRIBUTES_BITMAP_DEFUALT_PRIVS_FROM_PARENT   = 0x100,
142   AFP_VOLUME_ATTRIBUTES_BITMAP_NO_EXCHANGE_FILES           = 0x200,
143   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_EXT_ATTRS          = 0x400,
144   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_ACL                = 0x800,
145   AFP_VOLUME_ATTRIBUTES_BITMAP_CASE_SENSITIVE              = 0x1000,
146   AFP_VOLUME_ATTRIBUTES_BITMAP_SUPPORTS_TM_LOCK_STEAL      = 0x2000
147 };
148 
149 enum
150 {
151   AFP_VOLUME_BITMAP_ATTRIBUTE_BIT       = 0x1,
152   AFP_VOLUME_BITMAP_SIGNATURE_BIT       = 0x2,
153   AFP_VOLUME_BITMAP_CREATE_DATE_BIT     = 0x4,
154   AFP_VOLUME_BITMAP_MOD_DATE_BIT        = 0x8,
155   AFP_VOLUME_BITMAP_BACKUP_DATE_BIT     = 0x10,
156   AFP_VOLUME_BITMAP_VOL_ID_BIT          = 0x20,
157   AFP_VOLUME_BITMAP_BYTES_FREE_BIT      = 0x40,
158   AFP_VOLUME_BITMAP_BYTES_TOTAL_BIT     = 0x80,
159   AFP_VOLUME_BITMAP_NAME_BIT            = 0x100,
160   AFP_VOLUME_BITMAP_EXT_BYTES_FREE_BIT  = 0x200,
161   AFP_VOLUME_BITMAP_EXT_BYTES_TOTAL_BIT = 0x400,
162   AFP_VOLUME_BITMAP_BLOCK_SIZE_BIT      = 0x800
163 };
164 
165 enum
166 {
167   AFP_ATTENTION_CODE_MESSAGE_AVAILABLE     = 0x2,
168   AFP_ATTENTION_CODE_SERVER_NOTIFICATION   = 0x3,
169   AFP_ATTENTION_CODE_IMMEDIATE_SHUTDOWN    = 0x4,
170   AFP_ATTENTION_CODE_SHUTDOWN_NO_MESSAGE   = 0x8,
171   AFP_ATTENTION_CODE_DISCONNECT_NO_MESSAGE = 0x9,
172   AFP_ATTENTION_CODE_SHUTDOWN_MESSAGE      = 0xA,
173   AFP_ATTENTION_CODE_DISCONNECT_MESSAGE    = 0xB
174 };
175 
176 enum
177 {
178   AFP_ATTENTION_MASK_DONT_RECONNECT_BIT = 0x1,
179   AFP_ATTENTION_MASK_SERVER_MESSAGE_BIT = 0x2,
180   AFP_ATTENTION_MASK_SERVER_CRASH_BIT   = 0x4,
181   AFP_ATTENTION_MASK_SHUTDOWN_BIT       = 0x8
182 };
183 
184 typedef enum
185 {
186   AFP_COMMAND_CLOSE_FORK         = 4,
187   AFP_COMMAND_COPY_FILE          = 5,
188   AFP_COMMAND_CREATE_DIR         = 6,
189   AFP_COMMAND_CREATE_FILE        = 7,
190   AFP_COMMAND_DELETE             = 8,
191   AFP_COMMAND_GET_FORK_PARMS     = 14,
192   AFP_COMMAND_GET_SRVR_INFO      = 15,
193   AFP_COMMAND_GET_SRVR_PARMS     = 16,
194   AFP_COMMAND_GET_VOL_PARMS      = 17,
195   AFP_COMMAND_LOGIN              = 18,
196   AFP_COMMAND_LOGIN_CONT         = 19,
197   AFP_COMMAND_LOGOUT             = 20,
198   AFP_COMMAND_MAP_ID             = 21,
199   AFP_COMMAND_MAP_NAME           = 22,
200   AFP_COMMAND_MOVE_AND_RENAME    = 23,
201   AFP_COMMAND_OPEN_VOL           = 24,
202   AFP_COMMAND_OPEN_FORK          = 26,
203   AFP_COMMAND_RENAME             = 28,
204   AFP_COMMAND_SET_FORK_PARMS     = 31,
205   AFP_COMMAND_WRITE              = 33,
206   AFP_COMMAND_GET_FILE_DIR_PARMS = 34,
207   AFP_COMMAND_SET_FILEDIR_PARMS  = 35,
208   AFP_COMMAND_GET_SRVR_MSG       = 35,
209   AFP_COMMAND_GET_USER_INFO      = 37,
210   AFP_COMMAND_EXCHANGE_FILES     = 42,
211   AFP_COMMAND_READ_EXT           = 60,
212   AFP_COMMAND_WRITE_EXT          = 61,
213   AFP_COMMAND_ENUMERATE_EXT      = 66,
214   AFP_COMMAND_ENUMERATE_EXT2     = 68
215 } AfpCommandType;
216 
217 /*
218  * GVfsAfpName
219  */
220 typedef struct _GVfsAfpName GVfsAfpName;
221 
222 GVfsAfpName* g_vfs_afp_name_new              (guint32 text_encoding,
223                                               gchar *str,
224                                               gsize len);
225 
226 void         g_vfs_afp_name_unref            (GVfsAfpName *afp_name);
227 void         g_vfs_afp_name_ref              (GVfsAfpName *afp_name);
228 
229 char*        g_vfs_afp_name_get_string       (GVfsAfpName *afp_name);
230 
231 /*
232  * GVfsAfpReply
233  */
234 #define G_VFS_TYPE_AFP_REPLY             (g_vfs_afp_reply_get_type ())
235 #define G_VFS_AFP_REPLY(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_VFS_TYPE_AFP_REPLY, GVfsAfpReply))
236 #define G_VFS_AFP_REPLY_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), G_VFS_TYPE_AFP_REPLY, GVfsAfpReplyClass))
237 #define G_VFS_IS_AFP_REPLY(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_VFS_TYPE_AFP_REPLY))
238 #define G_VFS_IS_AFP_REPLY_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), G_VFS_TYPE_AFP_REPLY))
239 #define G_VFS_AFP_REPLY_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), G_VFS_TYPE_AFP_REPLY, GVfsAfpReplyClass))
240 
241 typedef struct _GVfsAfpReplyClass GVfsAfpReplyClass;
242 typedef struct _GVfsAfpReply      GVfsAfpReply;
243 
244 gboolean        g_vfs_afp_reply_read_byte         (GVfsAfpReply *reply, guint8 *byte);
245 
246 gboolean        g_vfs_afp_reply_read_int64        (GVfsAfpReply *reply, gint64 *val);
247 gboolean        g_vfs_afp_reply_read_int32        (GVfsAfpReply *reply, gint32 *val);
248 gboolean        g_vfs_afp_reply_read_int16        (GVfsAfpReply *reply, gint16 *val);
249 
250 gboolean        g_vfs_afp_reply_read_uint64       (GVfsAfpReply *reply, guint64 *val);
251 gboolean        g_vfs_afp_reply_read_uint32       (GVfsAfpReply *reply, guint32 *val);
252 gboolean        g_vfs_afp_reply_read_uint16       (GVfsAfpReply *reply, guint16 *val);
253 
254 gboolean        g_vfs_afp_reply_get_data          (GVfsAfpReply *reply, gsize size, guint8 **data);
255 gboolean        g_vfs_afp_reply_dup_data          (GVfsAfpReply *reply, gsize size, guint8 **data);
256 
257 gboolean        g_vfs_afp_reply_read_pascal       (GVfsAfpReply *reply, gboolean is_utf8, char **str);
258 gboolean        g_vfs_afp_reply_read_afp_name     (GVfsAfpReply *reply, gboolean read_text_encoding, GVfsAfpName **afp_name);
259 
260 gboolean        g_vfs_afp_reply_seek              (GVfsAfpReply *reply, goffset offset, GSeekType type);
261 gboolean        g_vfs_afp_reply_skip_to_even      (GVfsAfpReply *reply);
262 
263 AfpResultCode   g_vfs_afp_reply_get_result_code   (GVfsAfpReply *reply);
264 goffset         g_vfs_afp_reply_get_pos           (GVfsAfpReply *reply);
265 gsize           g_vfs_afp_reply_get_size          (GVfsAfpReply *reply);
266 
267 GType           g_vfs_afp_reply_get_type         (void) G_GNUC_CONST;
268 
269 
270 /*
271  * GVfsAfpCommand
272  */
273 #define G_VFS_TYPE_AFP_COMMAND             (g_vfs_afp_command_get_type ())
274 #define G_VFS_AFP_COMMAND(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_VFS_TYPE_AFP_COMMAND, GVfsAfpCommand))
275 #define G_VFS_AFP_COMMAND_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), G_VFS_TYPE_AFP_COMMAND, GVfsAfpCommandClass))
276 #define G_VFS_IS_AFP_COMMAND(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_VFS_TYPE_AFP_COMMAND))
277 #define G_VFS_IS_AFP_COMMAND_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), G_VFS_TYPE_AFP_COMMAND))
278 #define G_VFS_AFP_COMMAND_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), G_VFS_TYPE_AFP_COMMAND, GVfsAfpCommandClass))
279 
280 typedef struct _GVfsAfpCommandClass GVfsAfpCommandClass;
281 typedef struct _GVfsAfpCommand GVfsAfpCommand;
282 
283 
284 GVfsAfpCommand* g_vfs_afp_command_new          (AfpCommandType type);
285 
286 void            g_vfs_afp_command_put_byte     (GVfsAfpCommand *comm, guint8 byte);
287 
288 void            g_vfs_afp_command_put_int16     (GVfsAfpCommand *comm, gint16 val);
289 void            g_vfs_afp_command_put_int32     (GVfsAfpCommand *comm, gint32 val);
290 void            g_vfs_afp_command_put_int64     (GVfsAfpCommand *comm, gint64 val);
291 
292 void            g_vfs_afp_command_put_uint16    (GVfsAfpCommand *comm, guint16 val);
293 void            g_vfs_afp_command_put_uint32    (GVfsAfpCommand *comm, guint32 val);
294 void            g_vfs_afp_command_put_uint64    (GVfsAfpCommand *comm, guint64 val);
295 
296 void            g_vfs_afp_command_put_pascal   (GVfsAfpCommand *comm, const char *str);
297 void            g_vfs_afp_command_put_afp_name (GVfsAfpCommand *comm, GVfsAfpName *afp_name);
298 void            g_vfs_afp_command_put_pathname (GVfsAfpCommand *comm, const char *filename);
299 
300 void            g_vfs_afp_command_pad_to_even  (GVfsAfpCommand *comm);
301 
302 gsize           g_vfs_afp_command_get_size     (GVfsAfpCommand *comm);
303 char*           g_vfs_afp_command_get_data     (GVfsAfpCommand *comm);
304 
305 void            g_vfs_afp_command_set_buffer   (GVfsAfpCommand *comm, char *buf, gsize size);
306 
307 GType           g_vfs_afp_command_get_type (void) G_GNUC_CONST;
308 
309 
310 
311 
312 /*
313  * GVfsAfpConnection
314  */
315 #define G_VFS_TYPE_AFP_CONNECTION             (g_vfs_afp_connection_get_type ())
316 #define G_VFS_AFP_CONNECTION(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnection))
317 #define G_VFS_AFP_CONNECTION_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnectionClass))
318 #define G_VFS_IS_AFP_CONNECTION(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), G_VFS_TYPE_AFP_CONNECTION))
319 #define G_VFS_IS_AFP_CONNECTION_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), G_VFS_TYPE_AFP_CONNECTION))
320 #define G_VFS_AFP_CONNECTION_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), G_VFS_TYPE_AFP_CONNECTION, GVfsAfpConnectionClass))
321 
322 typedef struct _GVfsAfpConnectionClass GVfsAfpConnectionClass;
323 typedef struct _GVfsAfpConnection GVfsAfpConnection;
324 typedef struct _GVfsAfpConnectionPrivate GVfsAfpConnectionPrivate;
325 
326 struct _GVfsAfpConnectionClass
327 {
328   GObjectClass parent_class;
329 };
330 
331 struct _GVfsAfpConnection
332 {
333   GObject parent_instance;
334 
335   GVfsAfpConnectionPrivate *priv;
336 };
337 
338 
339 GType g_vfs_afp_connection_get_type (void) G_GNUC_CONST;
340 
341 GVfsAfpReply*      g_vfs_afp_query_server_info            (GSocketConnectable *addr,
342                                                            GCancellable *cancellable,
343                                                            GError **error);
344 
345 GVfsAfpConnection* g_vfs_afp_connection_new               (GSocketConnectable *addr);
346 
347 gboolean           g_vfs_afp_connection_open_sync         (GVfsAfpConnection *afp_connection,
348                                                            GCancellable      *cancellable,
349                                                            GError            **error);
350 
351 gboolean           g_vfs_afp_connection_close_sync        (GVfsAfpConnection *afp_connection,
352                                                            GCancellable      *cancellable,
353                                                            GError            **error);
354 
355 GVfsAfpReply*      g_vfs_afp_connection_send_command_sync (GVfsAfpConnection *afp_connection,
356                                                            GVfsAfpCommand    *afp_command,
357                                                            GCancellable      *cancellable,
358                                                            GError            **error);
359 
360 GVfsAfpReply*      g_vfs_afp_connection_send_command_finish (GVfsAfpConnection *afp_connnection,
361                                                              GAsyncResult      *res,
362                                                              GError           **error);
363 
364 void               g_vfs_afp_connection_send_command     (GVfsAfpConnection   *afp_connection,
365                                                           GVfsAfpCommand      *command,
366                                                           char                *reply_buf,
367                                                           GAsyncReadyCallback  callback,
368                                                           GCancellable        *cancellable,
369                                                           gpointer             user_data);
370 
371 
372 guint32            g_vfs_afp_connection_get_max_request_size  (GVfsAfpConnection *afp_connection);
373 
374 G_END_DECLS
375 
376 #endif /* _GVFSAFPCONNECTION_H_ */
377