converter.C

Go to the documentation of this file.
00001 /* Gnome gxsm - Gnome X Scanning Microscopy
00002  * universal STM/AFM/SARLS/SPALEED/... controlling and
00003  * data analysis software
00004  * 
00005  * Gxsm Plugin Name: converter.C
00006  * ========================================
00007  * 
00008  * Copyright (C) 2003 The Free Software Foundation
00009  *
00010  * Authors: Kristan Temme <etptt@users.sf.net>
00011  * 
00012  * This program is free software; you can redistribute it and/or modify
00013  * it under the terms of the GNU General Public License as published by
00014  * the Free Software Foundation; either version 2 of the License, or
00015  * (at your option) any later version.
00016  *
00017  * This program is distributed in the hope that it will be useful,
00018  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00019  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020  * GNU General Public License for more details.
00021  *
00022  * You should have received a copy of the GNU General Public License
00023  * along with this program; if not, write to the Free Software
00024  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
00025  */
00026 
00027 /* Please do not change the Begin/End lines of this comment section!
00028  * this is a LaTeX style section used for auto generation of the PlugIn Manual 
00029  * Chapter. Add a complete PlugIn documentation inbetween the Begin/End marks!
00030  * --------------------------------------------------------------------------------
00031 % BeginPlugInDocuSection
00032 % PlugInDocuCaption: Converter 
00033 % PlugInName: Converter
00034 % PlugInAuthor: Kristan Temme and Thorsten Wagner
00035 % PlugInAuthorEmail: stm@users.sf.net
00036 % PlugInMenuPath: Tools/Converter 
00037 % PlugInDescription
00038 Simple file conversion utility, which converts files all kinds of data files supported by GXSM-2
00039 % PlugInUsage
00040 Registers itself for converting files. Just choose the right file extensions for the conversion (e.g. .nc to .top). You can also select the source and destination folder by the browse buttons.
00041 % EndPlugInDocuSection
00042  * -------------------------------------------------------------------------------- 
00043  */
00044 
00045 
00046 #include <gtk/gtk.h>
00047 #include <sys/types.h>
00048 #include <sys/stat.h>
00049 #include <dirent.h>
00050 #include <fnmatch.h>
00051 #include <string.h>
00052 #include <unistd.h>
00053 
00054 #include "config.h"
00055 #include "gxsm/plugin.h"
00056 #include "gxsm/dataio.h"
00057 #include "gxsm/action_id.h"
00058 #include "gxsm/util.h"
00059 #include "batch.h"
00060 #include "fileio.c"
00061 
00062 #include "converter.h"
00063 #include "gxsm_app.h"
00064 #include "surface.h"
00065 
00066 #include "unit.h"
00067 #include "pcs.h"
00068 #include "xsmtypes.h"
00069 
00070 #define IMGMAXCOLORS 64
00071 #define WSXM_MAXCHARS 1000
00072 #define UMASK (S_IRUSR | S_IWUSR | S_IXUSR )
00073 
00074 // Plugin Prototypes
00075 static void converter_init (void);
00076 static void converter_query (void);
00077 static void converter_about (void);
00078 static void converter_configure (void);
00079 static void converter_cleanup (void);
00080 
00081 static void converter_convert(GtkWidget *w, void *data);
00082 
00083 
00084 //
00085 // Gxsm plugin discription
00086 //
00087 GxsmPlugin converter_pi = {
00088   NULL,                   // filled in and used by Gxsm, don't touch !
00089   NULL,                   // filled in and used by Gxsm, don't touch !
00090   0,                      // filled in and used by Gxsm, don't touch !
00091   NULL,                   // filled in just after init() is called !!!
00092   "Converter",
00093   NULL,                      
00094   "Converts supported file types faster",
00095   "Kristan Temme and Thorsten Wagner",
00096   N_("_Tools/"),
00097   N_("Converter"),
00098   NULL,
00099   "No further info",
00100   NULL,          
00101   NULL,          
00102   converter_init,  
00103   converter_query,  
00104   converter_about,
00105   converter_configure,
00106   NULL,
00107   converter_cleanup
00108 };
00109 
00110 //
00111 //Text used in the About Box
00112 //
00113 static const char *about_text = N_("Gxsm Converter for supported files.");
00114                                    
00115         
00116 //
00117 // Symbol "get_gxsm_plugin_info" is resolved by dlsym from Gxsm, used to get Plugin's info!! 
00118 // Essential Plugin Function!!
00119 //
00120 GxsmPlugin *get_gxsm_plugin_info ( void ){ 
00121   converter_pi.description = g_strdup_printf(N_("Gxsm converter file converter %s"), VERSION);
00122   return &converter_pi; 
00123 }
00124 
00125 //
00126 // Query Function, installs Plugin's in the apropriate menupath
00127 // !!!! make sure the "converter_cleanup()" function (see below) !!!!
00128 // !!!! removes the correct menuentries !!!!
00129 //
00130 static void converter_query(void)
00131 {
00132   static GnomeUIInfo menuinfo_Convert[] = { 
00133     { GNOME_APP_UI_ITEM, 
00134       N_("Converter"), N_("Converts supported file formats quickly"), 
00135       (gpointer) converter_convert, NULL,
00136       NULL, GNOME_APP_PIXMAP_STOCK, GNOME_STOCK_MENU_OPEN,
00137       0, GDK_CONTROL_MASK, NULL },
00138     GNOMEUIINFO_END
00139   };
00140 
00141   gnome_app_insert_menus (
00142           GNOME_APP(converter_pi.app->getApp()), 
00143           N_("Tools/"), 
00144           menuinfo_Convert
00145           );
00146  
00147   if(converter_pi.status) g_free(converter_pi.status); 
00148   converter_pi.status = g_strconcat (
00149           N_("Plugin query has attached "),
00150           converter_pi.name, 
00151           N_(": File converter is ready to use"),
00152           NULL);
00153 }
00154 
00155 //
00156 // init-Function
00157 //
00158 
00159 static void converter_init(void)
00160 {
00161   PI_DEBUG(DBG_L2,"converter Plugin Init");
00162 }
00163 
00164 //
00165 // about-Function
00166 //
00167 static void converter_about(void)
00168 {
00169   const gchar *authors[] = { converter_pi.authors, NULL};
00170   gtk_widget_show(gnome_about_new ( converter_pi.name,
00171                                     VERSION,
00172                                     N_("(C) 2003 the Free Software Foundation"),
00173                                     about_text,
00174                                     authors,
00175                                     NULL,NULL,NULL
00176                                     ));
00177 }
00178 
00179 //
00180 // configure-Function
00181 //
00182 static void converter_configure(void)
00183 {
00184   if(converter_pi.app)
00185     converter_pi.app->message("converter Plugin Configuration");
00186 }
00187 
00188 //
00189 // cleanup-Function, make sure the Menustrings are matching those above!!!
00190 //
00191 static void converter_cleanup(void)
00192 {
00193   PI_DEBUG(DBG_L2,"converter Plugin Cleanup");
00194   gnome_app_remove_menus (GNOME_APP (converter_pi.app->getApp()),
00195                           N_("Tools/Converter"), 1);
00196 }
00197 
00198 
00199 //Gtk+ Signal Funktion
00200 static void converter_convert(GtkWidget *w, void *data)
00201 {
00202   converterControl *Popup = new converterControl();
00203   Popup->run();
00204   PI_DEBUG(DBG_L2,"converter dialog opened");
00205 }
00206 
00207 
00209 // ANFANG converter
00211 
00212 gchar *select_mask;
00213 
00214 converter::converter() : m_converted(0)
00215 {
00216         PI_DEBUG(DBG_L2,"Generating converter object!");
00217 }
00218 
00219 
00220 void converter::concatenate_dirs(gchar* target, const gchar* add)
00221 {
00223         int len = strlen(target);
00224         if (len > 0 && target[len-1] != '/')
00225                 strcat(target, "/");
00226         strcat(target, add);
00227 }
00228 
00229 
00230 void converter::create_full_path(gchar* target, const gchar* source_directory,
00231         const gchar* current_dir, const gchar* file)
00232 {
00233         if (source_directory)
00234                 strcpy(target, source_directory);
00235         else
00236                 *target = '\0';
00237 
00238         if (current_dir)
00239                 concatenate_dirs(target, current_dir);
00240 
00241         if (file)
00242                 concatenate_dirs(target, file);
00243 }
00244 
00245 
00246 void converter::replace_suffix(gchar* target, gchar* new_suffix)
00247 {
00248         int len = strlen(target);
00249 
00250         for (int i = len-1; i > -1; --i) {
00251                 if (target[i] == EXT_SEP) {
00252                         strcpy(target+i+1, new_suffix);
00253                         return;
00254                 }
00255         }
00256 }
00257 
00258 
00260 void converter::ConvertDir(converterData* work_it, const gchar* current_dir)
00261 {
00262         gchar source_dir[MAX_PATH];
00263 
00264         create_full_path(source_dir, work_it->sourceDir, current_dir, 0);
00265 
00266         DIR* dir = opendir(source_dir);
00267 
00268         if (dir) {
00269                 struct stat file_stat;
00270                 dirent* current_file;
00271                 gchar source_name[MAX_PATH];
00272                 gchar target_name[MAX_PATH];
00273 
00274                 while ((current_file = readdir(dir))) {
00275                         create_full_path(source_name, work_it->sourceDir, current_dir, 
00276                                 current_file->d_name);
00277                         if (lstat(source_name, &file_stat) != -1) {
00278                                 // go recursively in case of directories
00279                                 if (S_ISDIR(file_stat.st_mode) && *current_file->d_name != '.')
00280                                 {
00281                                         if (work_it->m_recursive) {
00282                                                 if (work_it->m_create_subdirs) {
00283                                                         create_full_path(target_name, work_it->destDir,
00284                                                                 current_dir, current_file->d_name);
00285                                                 //      if (lstat(target_name, &file_stat) != -1
00286                                                 //              && mkdir(target_name, S_IRUSR | S_IWUSR
00287                                                 //                       | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP)
00288                                                 //                       == -1)
00289                                                         if (mkdir(target_name, S_IRUSR | S_IWUSR
00290                                                                          | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP)
00291                                                                          == -1)
00292                                                         {
00293                                                                 std::cout << "Could not create directory "
00294                                                                         << target_name << std::endl; 
00295                                                         } else
00296                                                                 std::cout << "Create directory "
00297                                                                          << target_name << std::endl;
00298                                                 }
00299                                                 create_full_path(source_name, 0, current_dir,
00300                                                          current_file->d_name);
00301                                                 ConvertDir(work_it, source_name);
00302                                         }
00303                                 // otherwise check whether the file matches the mask
00304                                 // Note: S_ISREG didn't seem to work correctly on my
00305                                 // system - otherwise I would use it as well
00306                                 } else if (!fnmatch(work_it->convFilter, current_file->d_name,
00307                                         0))
00308                                 {
00309                                         create_full_path(source_name, work_it->sourceDir,
00310                                                 current_dir, current_file->d_name);
00311                                         create_full_path(target_name, work_it->destDir,
00312                                                 work_it->m_create_subdirs ? current_dir : 0, current_file->d_name);
00313                                         replace_suffix(target_name, work_it->writeFormat);
00314 
00315                                         if (!work_it->m_overwrite_target
00316                                                  && lstat(target_name, &file_stat) != -1)
00317                                         {
00318                                                 std::cout << target_name << " already exists!"
00319                                                          << std::endl;
00320                                                 continue;
00321                                         }
00322 
00323                                         ++m_converted;
00324                                         std::cout << "Converting file " << m_converted << ": "
00325                                                 << source_name << std::endl;
00326                                         DoConvert(source_name, target_name);
00327                                 }
00328                         }
00329                 }       
00330         }
00331 
00332         closedir(dir);
00333 }
00334 
00335 
00336 void converter::DoConvert(gchar *pathname,gchar *outputname)
00337 {
00338         if (gapp->xsm->ActivateFreeChannel()) {
00339                 PI_DEBUG(DBG_L2,"Nc2top Error: finding Free Channel" );
00340                 return;
00341         }
00342 
00343         gint Ch = gapp->xsm->FindChan(ID_CH_M_ACTIVE);          
00344  
00345         if ((Ch = readToAct(pathname)) < 0)
00346                 PI_DEBUG(DBG_L2,"readToAct: Conversion of " << pathname << "failed");
00347                   
00348         else {
00349                 if (!writeFromCh(Ch, outputname))
00350                         PI_DEBUG(DBG_L2,"Converted: " << pathname << " to " << outputname);
00351                 else 
00352                         PI_DEBUG(DBG_L2,"writeFromCh: Conversion of " << pathname << "failed");                        
00353         }
00354 
00355         gapp->xsm->SetMode(Ch, ID_CH_M_OFF, TRUE);      
00356 }
00357 
00358 
00359 gint  converter::readToAct( gchar *fname){
00360         
00361   Scan   *ActiveScan = NULL;
00362   Dataio *Dio = NULL;
00363   gint ret = -1;
00364   
00365   ActiveScan = gapp->xsm->GetActiveScan();              
00366   ret = gapp->xsm->FindChan(ID_CH_M_ACTIVE);
00367   
00368 // check if something else (no NetCDF)
00369  if (!(strstr(fname, ".nc") || strstr(fname, ".NC"))){
00370                      gapp->xsm->gnuimport (fname);
00371                      return ret;
00372                 }
00373  else {
00374         if (!strncasecmp(fname+strlen(fname)-3,".nc",3))
00375           Dio = new NetCDF(ActiveScan, fname);          // NetCDF File
00376         else ret =-1; //Error: no import filter found!
00377           
00378         Dio->Read();
00379         if(Dio->ioStatus()){
00380           //Some error occured 
00381           ret = -1;
00382           }  
00383         delete Dio;
00384 
00385   ActiveScan->GetDataSet(gapp->xsm->data);
00386   // refresh all Parameter and draw Scan
00387   gapp->spm_update_all();
00388   ActiveScan->draw();   
00389         
00390   return  ret ;
00391  }              
00392 }
00393 
00394 gint converter::writeFromCh(gint Ch, gchar *fname)
00395 {
00396         gint ret;
00397         
00398         if (!(strstr(fname, ".nc") || strstr(fname, ".NC")))
00399         {
00400                 //Make sure We are using the right channel
00401                 if (gapp->xsm->FindChan(ID_CH_M_ACTIVE) != Ch)
00402                         gapp->xsm->ActivateChannel(Ch);
00403                                                         
00404                 ret = gapp->xsm->gnuexport (fname);
00405                 return ret;
00406         } else  {
00407                 ret = gapp->xsm->save(TRUE, fname, Ch, true);
00408                 return ret;
00409         }       
00410 
00411         return -1; 
00412  }
00413 
00414 
00416 gchar* converter::strParse(gchar* name, converterData* check)
00417 {
00419         int len = strlen(name);
00420         gchar* fname = strdup(name);
00421   
00422         if (len > 0) {
00424                 int index = len;
00425                 for (; index > 0; --index) {
00426                         if (fname[index] == EXT_SEP)
00427                                 break;
00428                 }
00429                 fname[index] = '\0';
00430 
00431                 len = strlen(check->destDir);
00432 
00434                 if (len > 0) {
00435                         if(check->destDir[len-1] != '/')
00436                                 strcat(check->destDir, "/");
00437                 }
00438                 
00439                 snprintf(retStr, MAX_PATH, "%s%s.%s", check->destDir, fname,
00440                         check->writeFormat);
00441                 return retStr;
00442         } else
00443                 return NULL;
00444 }
00445                         
00447 // ENDE converter
00449 
00451 // ANFANG converterControl
00453 
00454 gint file_error(const gchar *err_msg, const gchar *dir);
00455 
00456 converterControl::converterControl ()
00457 { 
00458   topdata = new converterData(getenv("PWD"),getenv("PWD"),"*.nc", "top");
00459   XsmRescourceManager xrm("FilePathSelectionHistory","Converter");
00460   xrm.Get ("SourcePath",&topdata->sourceDir, getenv("PWD"));
00461   xrm.Get ("DestPath", &topdata->destDir, getenv("PWD"));
00462   xrm.Get ("InputFilter", &topdata->convFilter, "*.nc");
00463   xrm.Get ("OutputFilter",&topdata->writeFormat, "top");        
00464 }
00465 
00466 
00467 converterControl::~converterControl ()
00468 {
00469   delete topdata;
00470 }
00471 
00472 
00473 void converterControl::run()
00474 {
00475         GtkWidget *dialog;
00476         GtkWidget *vbox;
00477         GtkWidget *hbox;
00478         GtkWidget *VarName;
00479         GtkWidget *variable;
00480         GtkWidget *help;
00481   
00482   DlgStart();
00483   dialog = gnome_dialog_new(_("converter Convert"),
00484                                              _("Convert"),  
00485                                 GNOME_STOCK_BUTTON_CANCEL, 
00486                              NULL); 
00487   
00488    gnome_dialog_set_close(GNOME_DIALOG(dialog), FALSE);
00489    gnome_dialog_close_hides(GNOME_DIALOG(dialog), FALSE);
00490    gnome_dialog_set_default(GNOME_DIALOG(dialog), 3);      
00491   
00492         vbox = gtk_vbox_new (FALSE, 0);
00493     gtk_widget_show (vbox);
00494 
00495         gtk_box_pack_start(GTK_BOX(GNOME_DIALOG(dialog)->vbox),
00496                      vbox, TRUE, TRUE, GNOME_PAD);
00497 
00498 
00499          hbox = gtk_hbox_new (FALSE, 0);
00500   gtk_widget_show (hbox);
00501   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00502                         
00503   VarName = gtk_label_new (_("Source Path"));
00504   gtk_widget_set_usize (VarName, 100, -1);
00505   gtk_widget_show (VarName);
00506   gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00507   gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00508   gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00509   gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00510         
00511    SrcDir = variable = gnome_file_entry_new( NULL, "Choose the source directory");
00512    gnome_file_entry_set_default_path( GNOME_FILE_ENTRY ( variable ), topdata->sourceDir);
00513    gnome_file_entry_set_directory_entry(GNOME_FILE_ENTRY (variable), TRUE);
00514    gnome_file_entry_set_filename (GNOME_FILE_ENTRY (variable), topdata->sourceDir);
00515    gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00516    gtk_widget_show(variable);
00517 
00518   hbox = gtk_hbox_new (FALSE, 0);
00519   gtk_widget_show (hbox);
00520   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00521 
00522   VarName = gtk_label_new (_("Selection Mask"));
00523   gtk_widget_set_usize (VarName, 100, -1);
00524   gtk_widget_show (VarName);
00525   gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00526   gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00527   gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00528   gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00529   
00530   SrcMask = variable = gtk_entry_new ();
00531   gtk_widget_show (variable);
00532   gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00533   gtk_entry_set_text (GTK_ENTRY (variable), topdata->convFilter);
00534 
00535   help = gtk_button_new_with_label (_("Help"));
00536   gtk_widget_show (help);
00537   gtk_box_pack_start (GTK_BOX (hbox), help, TRUE, TRUE, 0);
00538   gtk_signal_connect (GTK_OBJECT (help), "clicked",
00539                       GTK_SIGNAL_FUNC (show_info_callback),
00540                       (void*)(_("Select subset of files via wildcard.")));
00541 
00542   hbox = gtk_hbox_new (FALSE, 0);
00543   gtk_widget_show (hbox);
00544   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00545 
00546   VarName = gtk_label_new (_("Destination Path"));
00547   gtk_widget_set_usize (VarName, 100, -1);
00548   gtk_widget_show (VarName);
00549   gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00550   gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00551   gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00552   gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00553 
00554   DestDir = variable = gnome_file_entry_new( NULL, "Choose the destination directory");
00555   gnome_file_entry_set_default_path( GNOME_FILE_ENTRY ( variable ), topdata->destDir);
00556   gnome_file_entry_set_directory_entry(GNOME_FILE_ENTRY (variable), TRUE);
00557   gnome_file_entry_set_filename (GNOME_FILE_ENTRY (variable), topdata->destDir);
00558   gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE,0 );
00559   gtk_widget_show(variable);
00560 
00561   hbox = gtk_hbox_new (FALSE, 0);
00562   gtk_widget_show (hbox);
00563   gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
00564 
00565   VarName = gtk_label_new (_("Format"));
00566   gtk_widget_set_usize (VarName, 100, -1);
00567   gtk_widget_show (VarName);
00568   gtk_label_set_justify(GTK_LABEL(VarName), GTK_JUSTIFY_LEFT);
00569   gtk_misc_set_alignment (GTK_MISC (VarName), 0.0, 0.5);
00570   gtk_misc_set_padding (GTK_MISC (VarName), 5, 0);
00571   gtk_box_pack_start (GTK_BOX (hbox), VarName, TRUE, TRUE, 0);
00572   
00573   DestMask = variable = gtk_entry_new ();
00574   gtk_widget_show (variable);
00575   gtk_box_pack_start (GTK_BOX (hbox), variable, TRUE, TRUE, 0);
00576   gtk_entry_set_text (GTK_ENTRY (variable), topdata->writeFormat);
00577 
00578   help = gtk_button_new_with_label (_("Help"));
00579   gtk_widget_show (help);
00580   gtk_box_pack_start (GTK_BOX (hbox), help, TRUE, TRUE, 0);
00581   gtk_signal_connect (GTK_OBJECT (help), "clicked",
00582                       GTK_SIGNAL_FUNC (show_info_callback),
00583   (void*)(_("Enter the file format suffix without any special characters")));
00584   
00585         gtk_signal_connect(GTK_OBJECT(dialog), "clicked",
00586                 GTK_SIGNAL_FUNC(converterControl::dlg_clicked),
00587                 this);
00588   
00589         hbox = gtk_hbox_new(FALSE, 0);
00590         gtk_widget_show(hbox);
00591         gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
00592         GtkWidget* toggle_recursive = gtk_check_button_new_with_label("Recursive");
00593         
00594         gtk_box_pack_start(GTK_BOX (hbox), toggle_recursive, TRUE, TRUE, 0);
00595         gtk_widget_show(toggle_recursive);
00596         GtkWidget* toggle_overwrite_target = gtk_check_button_new_with_label("Overwrite Target File");
00597         gtk_signal_connect(GTK_OBJECT(toggle_recursive), "clicked",
00598                 GTK_SIGNAL_FUNC(converterControl::recursive_click),
00599                 this);
00600   
00601         gtk_box_pack_start(GTK_BOX (hbox), toggle_overwrite_target, TRUE, TRUE, 0);
00602         gtk_widget_show(toggle_overwrite_target);
00603         gtk_signal_connect(GTK_OBJECT(toggle_overwrite_target), "clicked",
00604                 GTK_SIGNAL_FUNC(converterControl::overwrite_target_click),
00605                 this);
00606   
00607         GtkWidget* toggle_create_subdirs = gtk_check_button_new_with_label("Create sub-directories");
00608         gtk_box_pack_start(GTK_BOX (hbox), toggle_create_subdirs, TRUE, TRUE, 0);
00609         gtk_widget_show(toggle_create_subdirs);
00610         gtk_signal_connect(GTK_OBJECT(toggle_create_subdirs), "clicked",
00611                 GTK_SIGNAL_FUNC(converterControl::create_subdirs_click),
00612                 this);
00613   
00614 
00615   gtk_widget_show(dialog);  
00616 }
00617 
00618 
00619 void converterControl::recursive_click(GtkWidget* widget, gpointer userdata)
00620 {
00621         ((converterControl*) userdata)->topdata->m_recursive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
00622 }
00623 
00624 
00625 void converterControl::overwrite_target_click(GtkWidget* widget, gpointer userdata)
00626 {
00627         ((converterControl*) userdata)->topdata->m_overwrite_target = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
00628 }
00629 
00630 
00631 void converterControl::create_subdirs_click(GtkWidget* widget, gpointer userdata)
00632 {
00633         ((converterControl*) userdata)->topdata->m_create_subdirs = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget));
00634 }
00635 
00636 
00637 void converterControl::dlg_clicked(GnomeDialog * dialog, gint button_number, converterControl *mic){
00638 
00639         converter *converter_obj;
00640         converter_obj = new converter();
00641   
00642         
00643   g_free(mic->topdata->sourceDir); 
00644   mic->topdata->sourceDir = g_strdup(gnome_file_entry_get_full_path(GNOME_FILE_ENTRY (mic->SrcDir),TRUE));
00645   if(mic->topdata->sourceDir == NULL && !button_number)
00646                 if(file_error("Source directory does not exist",NULL)){
00647                             gnome_dialog_close(dialog); 
00648                                 goto finish;
00649                 }
00650                 
00651   g_free(mic->topdata->convFilter); 
00652   mic->topdata->convFilter = g_strdup(gtk_entry_get_text (GTK_ENTRY (mic->SrcMask)));
00653  
00654   
00655   g_free(mic->topdata->destDir); 
00656   mic->topdata->destDir = g_strdup(gnome_file_entry_get_full_path(GNOME_FILE_ENTRY (mic->DestDir),FALSE));
00657   if(access(mic->topdata->destDir,F_OK) && !button_number)
00658                 if(file_error("Destination directory does not exist",mic->topdata->destDir)){
00659                                         gnome_dialog_close(dialog); 
00660                                         goto finish;
00661             }
00662             
00663    g_free(mic->topdata->writeFormat); 
00664   mic->topdata->writeFormat = g_strdup(gtk_entry_get_text (GTK_ENTRY (mic->DestMask)));   
00665   
00666   
00667   switch(button_number){
00668    
00669     case 0: 
00670        gnome_dialog_close(dialog);                                                                                                                                                              
00671        show_info_callback(NULL, _("Converting ..."));
00672        converter_obj->ConvertDir(mic->topdata, 0);
00673         break;
00674    
00675     case 1: 
00676         gnome_dialog_close(dialog); 
00677         break;
00678   
00679   }
00680 finish:
00681   XsmRescourceManager xrm("FilePathSelectionHistory","Converter");
00682   xrm.Put ("SourcePath", mic->topdata->sourceDir);
00683   xrm.Put ("DestPath", mic->topdata->destDir);
00684   xrm.Put ("InputFilter", mic->topdata->convFilter);
00685   xrm.Put ("OutputFilter", mic->topdata->writeFormat);
00686   mic->DlgDone();
00687 
00688 }
00689 
00690 gint file_error(const gchar *err_msg, const gchar *dir)
00691 {
00692         GtkWidget *dialog;
00693  
00694  if(dir != NULL){       
00695         
00696         dialog = gnome_message_box_new(err_msg, GNOME_MESSAGE_BOX_QUESTION,
00697                                                 GNOME_STOCK_BUTTON_YES,
00698                                                 GNOME_STOCK_BUTTON_NO,
00699                                                 NULL);
00700         
00701         if(gnome_dialog_run_and_close( GNOME_DIALOG (dialog)) == 0){
00702                                           if(mkdir(dir, UMASK)){
00703                                             PI_DEBUG(DBG_L2,"Error: creating the directory");
00704                                                         return 1;
00705                                                 }
00706                                         return 0;       
00707                 }
00708          else {
00709                         PI_DEBUG(DBG_L2,"Aborting ..."<< err_msg);
00710                         return 1;                       
00711               }
00712   }
00713  
00714  else{
00715                 dialog = gnome_error_dialog(err_msg);
00716             gnome_dialog_run_and_close( GNOME_DIALOG (dialog) );
00717             PI_DEBUG(DBG_L2, "Aborting ... " << err_msg);
00718             return 1;
00719         }       
00720 }
00722 // ENDE converterControl
00724 
00726 //ANFANG converterData
00728 
00729 converterData :: converterData(gchar *src, gchar *dst, gchar *conv, gchar *write) : m_recursive(false), m_overwrite_target(false), m_create_subdirs(false)
00730 {
00731                 sourceDir   =  g_strdup(src);
00732                 destDir     =  g_strdup(dst); 
00733         convFilter  =  g_strdup(conv);
00734         writeFormat =  g_strdup(write);
00735 }
00736         
00737 converterData :: ~converterData() 
00738 {
00739                 g_free(sourceDir);
00740                 g_free(destDir);
00741                 g_free(convFilter);
00742                 g_free(writeFormat);
00743 }
00744 
00746 // ENDE converterData
00748 

Generated on Sat Apr 1 09:04:24 2006 for GXSM by  doxygen 1.4.6