Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals  

mlview-file-descriptor.c

Go to the documentation of this file.
00001 /*
00002  *This file is part of MlView
00003  *
00004  *MlView is free software; you can redistribute it and/or modify it under the terms of 
00005  *the GNU General Public License as published by the Free Software Foundation; either version 2, 
00006  *or (at your option) any later version.
00007  *
00008  *MlView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; 
00009  *without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00010  *See the GNU General Public License for more details.
00011  *
00012  *You should have received a copy of the GNU General Public License along with MlView; 
00013  *see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00014 *
00015 *
00016 *Copyright 2001 dodji seketeli.
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 ;/*the string representation of the uri*/
00042         xmlURI * uri; /*The URI of this file descriptor*/
00043         time_t last_modif_date ;/*is valid only in the case of a local file*/
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         /*if the last modif date  of the on memory file is newer than the last modif date of the on disk file, return TRUE*/
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                 /*If this file offers the read access to the current user, return TRUE*/
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                 /*If this file offers the write access to the current user, return TRUE*/
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) {/*open succeed*/
00418                 close (fd) ;
00419                 return 0 ;
00420         }
00421         return -1 ;
00422 
00423         /*return open (PRIVATE (a_file_desc)->uri->path, O_CREAT , a_mode) ;*/
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 }

Generated on Sat Jul 6 09:57:32 2002 for Gnome-MlView by doxygen1.2.16