/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
/* gnome-vfs-uri.h - URI handling for the GNOME Virtual File System.

   Copyright (C) 1999 Free Software Foundation

   The Gnome 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.

   The Gnome 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 the Gnome Library; see the file COPYING.LIB.  If not,
   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   Boston, MA 02111-1307, USA.

   Author: Ettore Perazzoli <ettore@comm2000.it>
*/

#ifndef GNOME_VFS_URI_H
#define GNOME_VFS_URI_H

#include <glib/glist.h>
#include <glib-object.h> /* For GType */

G_BEGIN_DECLS

/* This describes a URI element.  */
typedef struct GnomeVFSURI {
	/* Reference count.  */
	guint ref_count;

	/* Text for the element: eg. some/path/name.  */
	gchar *text;

	/* Text for uri fragment: eg, #anchor  */
	gchar *fragment_id;
	
	/* Method string: eg. `gzip', `tar', `http'.  This is necessary as
	   one GnomeVFSMethod can be used for different method strings
	   (e.g. extfs handles zip, rar, zoo and several other ones).  */
	gchar *method_string;

	/* VFS method to access the element.  */
	struct GnomeVFSMethod *method;

	/* Pointer to the parent element, or NULL for toplevel elements.  */
	struct GnomeVFSURI *parent;

	/* Reserved to avoid future breaks in ABI compatibility */
	void *reserved1;
	void *reserved2;
} GnomeVFSURI;

/* This is the toplevel URI element.  A toplevel method implementations should
   cast the `GnomeVFSURI' argument to this type to get the additional host/auth
   information.  If any of the elements is 0, it is unspecified.  */
typedef struct {
	/* Base object.  */
	GnomeVFSURI uri;

	/* Server location information.  */
	gchar *host_name;
	guint host_port;

	/* Authorization information. (unescaped) */
	gchar *user_name;
	gchar *password;

	/* The parent URN, if it exists */
	gchar *urn;

	/* Reserved to avoid future breaks in ABI compatibility */
	void *reserved1;
	void *reserved2;

} GnomeVFSToplevelURI;


/**
 * GnomeVFSURIHideOptions:
 * @GNOME_VFS_URI_HIDE_NONE: don't hide anything
 * @GNOME_VFS_URI_HIDE_USER_NAME: hide the user name
 * @GNOME_VFS_URI_HIDE_PASSWORD: hide the password
 * @GNOME_VFS_URI_HIDE_HOST_NAME: hide the host name
 * @GNOME_VFS_URI_HIDE_HOST_PORT: hide the port
 * @GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD: hide the method (e.g. http, file)
 * @GNOME_VFS_URI_HIDE_FRAGMENT_IDENTIFIER: hide the fragment identifier
 *
 * Packed boolean bitfield controlling hiding of various elements
 * of a GnomeVFSURI when it is converted to a string.
 **/
typedef enum
{
	GNOME_VFS_URI_HIDE_NONE = 0,
	GNOME_VFS_URI_HIDE_USER_NAME = 1 << 0,
	GNOME_VFS_URI_HIDE_PASSWORD = 1 << 1,
	GNOME_VFS_URI_HIDE_HOST_NAME = 1 << 2,
	GNOME_VFS_URI_HIDE_HOST_PORT = 1 << 3,
	GNOME_VFS_URI_HIDE_TOPLEVEL_METHOD = 1 << 4,
	GNOME_VFS_URI_HIDE_FRAGMENT_IDENTIFIER = 1 << 8
} GnomeVFSURIHideOptions; 

GType gnome_vfs_uri_hide_options_get_type (void);
#define GNOME_VFS_TYPE_VFS_URI_HIDE_OPTIONS (gnome_vfs_uri_hide_options_get_type())


/**
 * GNOME_VFS_URI_MAGIC_CHR:
 *
 * The character used to divide location from
 * extra "arguments" passed to the method.
 **/
/**
 * GNOME_VFS_URI_MAGIC_STR:
 *
 * The character used to divide location from
 * extra "arguments" passed to the method.
 **/
#define GNOME_VFS_URI_MAGIC_CHR	'#'
#define GNOME_VFS_URI_MAGIC_STR "#"

/**
 * GNOME_VFS_URI_PATH_CHR:
 *
 * Defines the path seperator character.
 **/
/**
 * GNOME_VFS_URI_PATH_STR:
 *
 * Defines the path seperator string.
 **/
#define GNOME_VFS_URI_PATH_CHR '/'
#define GNOME_VFS_URI_PATH_STR "/"

/* FUNCTIONS */
GnomeVFSURI 	     *gnome_vfs_uri_new                   (const gchar *text_uri);
GnomeVFSURI 	     *gnome_vfs_uri_resolve_relative      (const GnomeVFSURI *base,
							   const gchar *relative_reference);
GnomeVFSURI 	     *gnome_vfs_uri_ref                   (GnomeVFSURI *uri);
void        	      gnome_vfs_uri_unref                 (GnomeVFSURI *uri);

GnomeVFSURI          *gnome_vfs_uri_append_string         (const GnomeVFSURI *uri,
						           const char *uri_fragment);
GnomeVFSURI          *gnome_vfs_uri_append_path           (const GnomeVFSURI *uri,
						           const char *path);
GnomeVFSURI          *gnome_vfs_uri_append_file_name      (const GnomeVFSURI *uri,
						           const gchar *filename);
gchar       	     *gnome_vfs_uri_to_string             (const GnomeVFSURI *uri,
						           GnomeVFSURIHideOptions hide_options);
GnomeVFSURI 	     *gnome_vfs_uri_dup                   (const GnomeVFSURI *uri);
gboolean    	      gnome_vfs_uri_is_local              (const GnomeVFSURI *uri);
gboolean	      gnome_vfs_uri_has_parent	          (const GnomeVFSURI *uri);
GnomeVFSURI	     *gnome_vfs_uri_get_parent            (const GnomeVFSURI *uri);

GnomeVFSToplevelURI *gnome_vfs_uri_get_toplevel           (const GnomeVFSURI *uri);

const gchar 	    *gnome_vfs_uri_get_host_name          (const GnomeVFSURI *uri);
const gchar         *gnome_vfs_uri_get_scheme             (const GnomeVFSURI *uri);
guint 	    	     gnome_vfs_uri_get_host_port          (const GnomeVFSURI *uri);
const gchar 	    *gnome_vfs_uri_get_user_name          (const GnomeVFSURI *uri);
const gchar	    *gnome_vfs_uri_get_password           (const GnomeVFSURI *uri);

void		     gnome_vfs_uri_set_host_name          (GnomeVFSURI *uri,
						           const gchar *host_name);
void 	    	     gnome_vfs_uri_set_host_port          (GnomeVFSURI *uri,
						           guint host_port);
void		     gnome_vfs_uri_set_user_name          (GnomeVFSURI *uri,
						           const gchar *user_name);
void		     gnome_vfs_uri_set_password           (GnomeVFSURI *uri,
						           const gchar *password);

gboolean	     gnome_vfs_uri_equal	          (const GnomeVFSURI *a,
						           const GnomeVFSURI *b);

gboolean	     gnome_vfs_uri_is_parent	          (const GnomeVFSURI *possible_parent,
						           const GnomeVFSURI *possible_child,
						           gboolean recursive);
				  
const gchar 	    *gnome_vfs_uri_get_path                (const GnomeVFSURI *uri);
const gchar 	    *gnome_vfs_uri_get_fragment_identifier (const GnomeVFSURI *uri);
gchar 		    *gnome_vfs_uri_extract_dirname         (const GnomeVFSURI *uri);
gchar		    *gnome_vfs_uri_extract_short_name      (const GnomeVFSURI *uri);
gchar		    *gnome_vfs_uri_extract_short_path_name (const GnomeVFSURI *uri);

gint		     gnome_vfs_uri_hequal 	           (gconstpointer a,
						            gconstpointer b);
guint		     gnome_vfs_uri_hash		           (gconstpointer p);

GList               *gnome_vfs_uri_list_parse              (const gchar* uri_list);
GList               *gnome_vfs_uri_list_ref                (GList *list);
GList               *gnome_vfs_uri_list_unref              (GList *list);
GList               *gnome_vfs_uri_list_copy               (GList *list);
void                 gnome_vfs_uri_list_free               (GList *list);

char                *gnome_vfs_uri_make_full_from_relative (const char *base_uri,
							    const char *relative_uri);


G_END_DECLS

#endif /* GNOME_VFS_URI_H */
