00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "mlview-file-descriptor.h"
00020
00021 #include <stdio.h>
00022 #include <sys/types.h>
00023 #include <sys/stat.h>
00024 #include <sys/unistd.h>
00025 #include <fcntl.h>
00026 #include <libxml/uri.h>
00027 #include <libxml/nanohttp.h>
00028 #include <libxml/nanoftp.h>
00029
00030
00039 struct _MlViewFileDescriptorPrivate
00040 {
00041 gchar *uri_str ;
00042 xmlURI * uri;
00043 time_t last_modif_date ;
00044 gboolean is_local ;
00045 };
00046 enum MLVIEW_FILE_DESCRIPTOR_STATUS {
00047 MLVIEW_FILE_DESCRIPTOR_BAD_PARAM = -2,
00048 MLVIEW_FILE_DESCRIPTOR_FETCH_FAILED = -1,
00049 MLVIEW_FILE_DESCRIPTOR_OK = 0,
00050 MLVIEW_FILE_DESCRIPTOR_IS_LOCAL = 1
00051 } ;
00052
00053 #define PRIVATE(file_desc) (file_desc->private)
00054
00063 MlViewFileDescriptor *
00064 mlview_file_descriptor_new (const gchar * a_file_uri)
00065 {
00066 MlViewFileDescriptor * fd = NULL ;
00067 struct stat file_stats ;
00068 int status ;
00069
00070 g_return_val_if_fail (a_file_uri != NULL , NULL) ;
00071 fd = g_malloc0 (sizeof(MlViewFileDescriptor)) ;
00072 PRIVATE (fd) = g_malloc (sizeof(MlViewFileDescriptorPrivate)) ;
00073
00074 if( !(PRIVATE (fd)->uri = xmlParseURI (a_file_uri)) ){
00075 g_free (PRIVATE (fd)) ;
00076 g_free (fd) ;
00077 return NULL ;
00078 }
00079
00080 PRIVATE (fd)->uri_str = g_strdup (a_file_uri) ;
00081
00082 PRIVATE (fd)->is_local = (!PRIVATE (fd)->uri->scheme || !strcmp(PRIVATE(fd)->uri->scheme, "file")) ? TRUE : FALSE ;
00083
00084 if (PRIVATE(fd)->is_local == TRUE && PRIVATE(fd)->uri && PRIVATE(fd)->uri->path) {
00085 if ( (status = stat (PRIVATE (fd)->uri->path, &file_stats)) == 0) {
00086 PRIVATE (fd)->last_modif_date = file_stats.st_mtime ;
00087 } else {
00088 PRIVATE(fd)->last_modif_date = 0 ;
00089 }
00090 }
00091
00092 return fd ;
00093 }
00094
00095
00102 void
00103 mlview_file_descriptor_destroy (MlViewFileDescriptor *a_file_desc)
00104 {
00105
00106 g_return_if_fail (a_file_desc != NULL) ;
00107
00108 if (!PRIVATE (a_file_desc))
00109 return ;
00110
00111 if (PRIVATE (a_file_desc)->uri && PRIVATE (a_file_desc)->uri->path != NULL) {
00112 xmlFreeURI (PRIVATE (a_file_desc)->uri) ;
00113 PRIVATE (a_file_desc)->uri = NULL ;
00114 }
00115 if (PRIVATE (a_file_desc)->uri_str) {
00116 g_free (PRIVATE (a_file_desc)->uri_str) ;
00117 PRIVATE (a_file_desc)->uri_str = NULL ;
00118 }
00119
00120 g_free (PRIVATE (a_file_desc)) ;
00121 PRIVATE (a_file_desc) = NULL ;
00122 g_free (a_file_desc) ;
00123 a_file_desc = NULL ;
00124 }
00125
00126
00134 void
00135 mlview_file_descriptor_update_modified_time (MlViewFileDescriptor *a_file_desc)
00136 {
00137 g_return_if_fail (a_file_desc != NULL) ;
00138 g_return_if_fail (PRIVATE (a_file_desc) != NULL) ;
00139
00140 if (PRIVATE (a_file_desc)->is_local)
00141 PRIVATE (a_file_desc)->last_modif_date = time (NULL) ;
00142 }
00143
00144
00152 gint
00153 mlview_file_descriptor_is_modified (const MlViewFileDescriptor *a_file_desc, gboolean * a_is_modified)
00154 {
00155 struct stat file_stats ;
00156 int status ;
00157
00158 *a_is_modified = FALSE ;
00159 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00160 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, -1) ;
00161 g_return_val_if_fail (PRIVATE (a_file_desc)->uri, -1) ;
00162
00163 if (PRIVATE (a_file_desc)->uri->path == NULL || !PRIVATE (a_file_desc)->is_local)
00164 return -1 ;
00165 status = stat (PRIVATE (a_file_desc)->uri->path, & file_stats) ;
00166
00167 if (status != 0)
00168 return -1 ;
00169
00170
00171 *a_is_modified = (file_stats.st_mtime < PRIVATE (a_file_desc)->last_modif_date) ? TRUE : FALSE ;
00172
00173 return 0 ;
00174 }
00175
00176
00183 gint
00184 mlview_file_descriptor_is_readable (const MlViewFileDescriptor *a_file_desc, gboolean *a_is_readable)
00185 {
00186 struct stat file_stats ;
00187 int status ;
00188 mode_t mode ;
00189
00190 *a_is_readable = FALSE ;
00191
00192 g_return_val_if_fail ( a_file_desc != NULL, -1) ;
00193 g_return_val_if_fail ( PRIVATE (a_file_desc) != NULL, -1) ;
00194 g_return_val_if_fail ( PRIVATE (a_file_desc)->uri != NULL, -1) ;
00195
00196 if (PRIVATE (a_file_desc)->uri->path == NULL)
00197 return -1 ;
00198
00199 if (PRIVATE (a_file_desc)->is_local){
00200 status = stat (PRIVATE (a_file_desc)->uri->path, &file_stats) ;
00201 if (status != 0)
00202 return -1 ;
00203 mode = file_stats.st_mode ;
00204
00205
00206 *a_is_readable = (((file_stats.st_mode & S_IRUSR) == S_IRUSR))?TRUE:FALSE ;
00207 }
00208 return 0 ;
00209 }
00210
00211
00218 gint
00219 mlview_file_descriptor_is_writeable (const MlViewFileDescriptor *a_file_desc, gboolean *a_is_writeable)
00220 {
00221 struct stat file_stats ;
00222 int status ;
00223 mode_t mode ;
00224
00225 *a_is_writeable = FALSE ;
00226
00227 g_return_val_if_fail( a_file_desc != NULL, -1) ;
00228 g_return_val_if_fail( PRIVATE (a_file_desc) != NULL, -1) ;
00229 g_return_val_if_fail( PRIVATE (a_file_desc)->uri != NULL, -1) ;
00230
00231 if (PRIVATE (a_file_desc)->uri->path == NULL)
00232 return -1 ;
00233
00234 if (PRIVATE (a_file_desc)->is_local) {
00235 status = stat (PRIVATE (a_file_desc)->uri->path, &file_stats) ;
00236
00237 if (status != 0)
00238 return -1 ;
00239
00240 mode = file_stats.st_mode ;
00241
00242
00243 *a_is_writeable = (((file_stats.st_mode & S_IWUSR) == S_IWUSR))?TRUE :FALSE ;
00244 }
00245 return 0 ;
00246
00247 }
00248
00256 gchar *
00257 mlview_file_descriptor_get_file_path(const MlViewFileDescriptor *a_file_desc)
00258 {
00259 g_return_val_if_fail (a_file_desc != NULL, NULL) ;
00260 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, NULL) ;
00261 g_return_val_if_fail (PRIVATE (a_file_desc)->uri != NULL, NULL) ;
00262
00263 return PRIVATE (a_file_desc)->uri->path ;
00264 }
00265
00273 void
00274 mlview_file_descriptor_set_file_path (MlViewFileDescriptor *a_file_desc, gchar *a_file_path)
00275 {
00276 struct stat file_stats ;
00277 int status ;
00278
00279 g_return_if_fail (a_file_desc != NULL) ;
00280 g_return_if_fail (PRIVATE (a_file_desc) != NULL) ;
00281 g_return_if_fail (PRIVATE (a_file_desc)->uri) ;
00282
00283 PRIVATE (a_file_desc)->uri->path = a_file_path ;
00284 if (PRIVATE (a_file_desc)->is_local) {
00285 status = stat (a_file_path, &file_stats) ;
00286
00287 if (status == 0)
00288 PRIVATE (a_file_desc)->last_modif_date = file_stats.st_mtime ;
00289 PRIVATE (a_file_desc)->last_modif_date = 0 ;
00290 }
00291 }
00292
00293
00301 guint
00302 mlview_file_descriptor_get_lmd (const MlViewFileDescriptor *a_file_desc)
00303 {
00304 g_return_val_if_fail (a_file_desc != NULL, 0) ;
00305 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, 0) ;
00306
00307 return PRIVATE (a_file_desc)->last_modif_date ;
00308 }
00309
00310
00319 void
00320 mlview_file_descriptor_set_lmd (MlViewFileDescriptor *a_file_desc, guint a_last_modif_time)
00321 {
00322 g_return_if_fail (a_file_desc != NULL) ;
00323 g_return_if_fail (PRIVATE (a_file_desc) != NULL) ;
00324
00325 PRIVATE (a_file_desc)->last_modif_date = a_last_modif_time ;
00326 }
00327
00328
00336 gint
00337 mlview_file_descriptor_is_dir (const MlViewFileDescriptor *a_file_desc, gboolean * a_is_dir)
00338 {
00339 struct stat file_stats ;
00340 gint status ;
00341
00342 *a_is_dir=FALSE ;
00343 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00344 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, -1) ;
00345 g_return_val_if_fail (PRIVATE (a_file_desc)->uri != NULL, -1) ;
00346
00347 if (PRIVATE (a_file_desc)->uri->path == NULL || !PRIVATE(a_file_desc)->is_local)
00348 return FALSE ;
00349 status = stat (PRIVATE (a_file_desc)->uri->path, &file_stats) ;
00350
00351 if (status != 0)
00352 return -1 ;
00353 *a_is_dir = (S_ISDIR(file_stats.st_mode))?TRUE:FALSE ;
00354 return 0 ;
00355 }
00356
00360 gint
00361 mlview_file_descriptor_is_regular_file (const MlViewFileDescriptor *a_file_desc, gboolean * a_is_reg)
00362 {
00363 gint status ;
00364 struct stat file_stats ;
00365
00366 *a_is_reg=FALSE ;
00367 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00368 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, -1) ;
00369 g_return_val_if_fail (PRIVATE (a_file_desc)->uri != NULL, -1) ;
00370
00371 if (PRIVATE (a_file_desc)->uri->path == NULL || !PRIVATE (a_file_desc)->is_local)
00372 return FALSE ;
00373 status = stat (PRIVATE (a_file_desc)->uri->path, &file_stats) ;
00374
00375 if (status != 0)
00376 return -1 ;
00377 *a_is_reg = (S_ISREG(file_stats.st_mode))?TRUE:FALSE ;
00378 return 0 ;
00379 }
00380
00381
00385 gint
00386 mlview_file_descriptor_create_directory (MlViewFileDescriptor *a_file_desc, guint a_mode)
00387 {
00388 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00389 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, -1) ;
00390 g_return_val_if_fail (PRIVATE (a_file_desc)->is_local == TRUE, -1) ;
00391 g_return_val_if_fail (PRIVATE (a_file_desc)->uri != NULL, -1) ;
00392 g_return_val_if_fail (PRIVATE (a_file_desc)->uri->path != NULL, -1) ;
00393
00394 return mkdir (PRIVATE (a_file_desc)->uri->path, a_mode) ;
00395 }
00396
00404 gint
00405 mlview_file_descriptor_create_file (MlViewFileDescriptor *a_file_desc, guint a_mode)
00406 {
00407 gint fd=0 ;
00408
00409 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00410 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, -1) ;
00411 g_return_val_if_fail (PRIVATE (a_file_desc)->is_local == TRUE, -1) ;
00412 g_return_val_if_fail (PRIVATE (a_file_desc)->uri != NULL, -1) ;
00413 g_return_val_if_fail (PRIVATE (a_file_desc)->uri->path != NULL, -1) ;
00414
00415 fd = open (PRIVATE (a_file_desc)->uri->path, O_CREAT , a_mode) ;
00416
00417 if (fd != -1) {
00418 close (fd) ;
00419 return 0 ;
00420 }
00421 return -1 ;
00422
00423
00424
00425 }
00426
00427
00428 gint
00429 mlview_file_descriptor_is_local (MlViewFileDescriptor * a_file_desc, gboolean * a_is_local)
00430 {
00431 *a_is_local = FALSE ;
00432 g_return_val_if_fail (a_file_desc != NULL, -1) ;
00433 g_return_val_if_fail (PRIVATE(a_file_desc) != NULL, -1) ;
00434
00435 *a_is_local = PRIVATE (a_file_desc)->is_local ;
00436 return 0 ;
00437 }
00438
00439
00451 enum MLVIEW_FILE_DESCRIPTOR_STATUS
00452 mlview_file_descriptor_fetch_file (MlViewFileDescriptor * a_file_desc,
00453 const gchar * a_file_path) {
00454 gboolean is_local = TRUE ;
00455 gint status = 0 ;
00456
00457 g_return_val_if_fail (a_file_desc != NULL, MLVIEW_FILE_DESCRIPTOR_BAD_PARAM) ;
00458 g_return_val_if_fail (PRIVATE (a_file_desc) != NULL, MLVIEW_FILE_DESCRIPTOR_BAD_PARAM) ;
00459
00460 if (mlview_file_descriptor_is_local (a_file_desc, &is_local))
00461 return MLVIEW_FILE_DESCRIPTOR_BAD_PARAM ;
00462
00463 if (is_local == TRUE)
00464 return MLVIEW_FILE_DESCRIPTOR_IS_LOCAL ;
00465
00466 if (!PRIVATE (a_file_desc)->uri_str)
00467 return MLVIEW_FILE_DESCRIPTOR_BAD_PARAM ;
00468
00469 status = xmlNanoHTTPFetch (PRIVATE (a_file_desc)->uri_str, a_file_path, NULL) ;
00470
00471 if (status == -1)
00472 return MLVIEW_FILE_DESCRIPTOR_FETCH_FAILED ;
00473
00474 return MLVIEW_FILE_DESCRIPTOR_OK ;
00475 }