1 #ifndef MC__VFS_PATH_H
2 #define MC__VFS_PATH_H
3 
4 /*** typedefs(not structures) and defined constants **********************************************/
5 
6 #define VFS_PATH_URL_DELIMITER "://"
7 
8 /*** enums ***************************************************************************************/
9 
10 typedef enum
11 {
12     VPF_NONE = 0,
13     VPF_NO_CANON = 1 << 0,
14     VPF_USE_DEPRECATED_PARSER = 1 << 1,
15     VPF_RECODE = 1 << 2,
16     VPF_STRIP_HOME = 1 << 3,
17     VPF_STRIP_PASSWORD = 1 << 4,
18     VPF_HIDE_CHARSET = 1 << 5
19 } vfs_path_flag_t;
20 
21 /*** structures declarations (and typedefs of structures)*****************************************/
22 
23 struct vfs_class;
24 struct vfs_url_struct;
25 
26 typedef struct
27 {
28     gboolean relative;
29     GArray *path;
30     char *str;
31 } vfs_path_t;
32 
33 typedef struct
34 {
35     char *user;
36     char *password;
37     char *host;
38     gboolean ipv6;
39     int port;
40     char *path;
41     struct vfs_class *class;
42 #ifdef HAVE_CHARSET
43     char *encoding;
44 #endif
45     char *vfs_prefix;
46 
47     struct
48     {
49 #ifdef HAVE_CHARSET
50         GIConv converter;
51 #endif
52         DIR *info;
53     } dir;
54 } vfs_path_element_t;
55 
56 /*** global variables defined in .c file *********************************************************/
57 
58 /*** declarations of public functions ************************************************************/
59 
60 vfs_path_t *vfs_path_new (void);
61 vfs_path_t *vfs_path_clone (const vfs_path_t * vpath);
62 void vfs_path_remove_element_by_index (vfs_path_t * vpath, int element_index);
63 char *vfs_path_free (vfs_path_t * path, gboolean free_str);
64 int vfs_path_elements_count (const vfs_path_t * path);
65 
66 char *vfs_path_to_str_elements_count (const vfs_path_t * path, int elements_count);
67 char *vfs_path_to_str_flags (const vfs_path_t * vpath, int elements_count, vfs_path_flag_t flags);
68 vfs_path_t *vfs_path_from_str (const char *path_str);
69 vfs_path_t *vfs_path_from_str_flags (const char *path_str, vfs_path_flag_t flags);
70 vfs_path_t *vfs_path_build_filename (const char *first_element, ...);
71 vfs_path_t *vfs_path_append_new (const vfs_path_t * vpath, const char *first_element, ...);
72 vfs_path_t *vfs_path_append_vpath_new (const vfs_path_t * first_vpath, ...);
73 size_t vfs_path_tokens_count (const vfs_path_t * vpath);
74 char *vfs_path_tokens_get (const vfs_path_t * vpath, ssize_t start_position, ssize_t length);
75 vfs_path_t *vfs_path_vtokens_get (const vfs_path_t * vpath, ssize_t start_position, ssize_t length);
76 
77 void vfs_path_add_element (vfs_path_t * vpath, const vfs_path_element_t * path_element);
78 const vfs_path_element_t *vfs_path_get_by_index (const vfs_path_t * path, int element_index);
79 vfs_path_element_t *vfs_path_element_clone (const vfs_path_element_t * element);
80 void vfs_path_element_free (vfs_path_element_t * element);
81 
82 struct vfs_class *vfs_prefix_to_class (const char *prefix);
83 
84 #ifdef HAVE_CHARSET
85 gboolean vfs_path_element_need_cleanup_converter (const vfs_path_element_t * element);
86 vfs_path_t *vfs_path_change_encoding (vfs_path_t * vpath, const char *encoding);
87 #endif
88 
89 char *vfs_path_serialize (const vfs_path_t * vpath, GError ** error);
90 vfs_path_t *vfs_path_deserialize (const char *data, GError ** error);
91 
92 char *vfs_path_build_url_params_str (const vfs_path_element_t * element, gboolean keep_password);
93 char *vfs_path_element_build_pretty_path_str (const vfs_path_element_t * element);
94 
95 size_t vfs_path_len (const vfs_path_t * vpath);
96 gboolean vfs_path_equal (const vfs_path_t * vpath1, const vfs_path_t * vpath2);
97 gboolean vfs_path_equal_len (const vfs_path_t * vpath1, const vfs_path_t * vpath2, size_t len);
98 vfs_path_t *vfs_path_to_absolute (const vfs_path_t * vpath);
99 
100 /*** inline functions ****************************************************************************/
101 
102 static inline gboolean
vfs_path_element_valid(const vfs_path_element_t * element)103 vfs_path_element_valid (const vfs_path_element_t * element)
104 {
105     return (element != NULL && element->class != NULL);
106 }
107 
108 /* --------------------------------------------------------------------------------------------- */
109 
110 static inline const char *
vfs_path_get_last_path_str(const vfs_path_t * vpath)111 vfs_path_get_last_path_str (const vfs_path_t * vpath)
112 {
113     const vfs_path_element_t *element;
114     if (vpath == NULL)
115         return NULL;
116     element = vfs_path_get_by_index (vpath, -1);
117     return (element != NULL) ? element->path : NULL;
118 }
119 
120 /* --------------------------------------------------------------------------------------------- */
121 
122 static inline const struct vfs_class *
vfs_path_get_last_path_vfs(const vfs_path_t * vpath)123 vfs_path_get_last_path_vfs (const vfs_path_t * vpath)
124 {
125     const vfs_path_element_t *element;
126     if (vpath == NULL)
127         return NULL;
128     element = vfs_path_get_by_index (vpath, -1);
129     return (element != NULL) ? element->class : NULL;
130 }
131 
132 /* --------------------------------------------------------------------------------------------- */
133 /**
134  * Convert vfs_path_t to string representation.
135  *
136  * @param vpath pointer to vfs_path_t object
137  *
138  * @return pointer to constant string
139  */
140 
141 static inline const char *
vfs_path_as_str(const vfs_path_t * vpath)142 vfs_path_as_str (const vfs_path_t * vpath)
143 {
144     return (vpath == NULL ? NULL : vpath->str);
145 }
146 
147 /* --------------------------------------------------------------------------------------------- */
148 
149 #endif
150