MayaChemTools

   1 package FileIO::FileIO;
   2 #
   3 # $RCSfile: FileIO.pm,v $
   4 # $Date: 2015/02/28 20:48:43 $
   5 # $Revision: 1.27 $
   6 #
   7 # Author: Manish Sud <msud@san.rr.com>
   8 #
   9 # Copyright (C) 2015 Manish Sud. All rights reserved.
  10 #
  11 # This file is part of MayaChemTools.
  12 #
  13 # MayaChemTools is free software; you can redistribute it and/or modify it under
  14 # the terms of the GNU Lesser General Public License as published by the Free
  15 # Software Foundation; either version 3 of the License, or (at your option) any
  16 # later version.
  17 #
  18 # MayaChemTools is distributed in the hope that it will be useful, but without
  19 # any warranty; without even the implied warranty of merchantability of fitness
  20 # for a particular purpose.  See the GNU Lesser General Public License for more
  21 # details.
  22 #
  23 # You should have received a copy of the GNU Lesser General Public License
  24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
  25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
  26 # Boston, MA, 02111-1307, USA.
  27 #
  28 
  29 use strict;
  30 use Carp;
  31 use Exporter;
  32 use FileHandle;
  33 use ObjectProperty;
  34 
  35 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  36 
  37 @ISA = qw(ObjectProperty Exporter);
  38 @EXPORT = qw();
  39 @EXPORT_OK = qw();
  40 
  41 %EXPORT_TAGS = (all  => [@EXPORT, @EXPORT_OK]);
  42 
  43 # Setup class variables...
  44 my($ClassName);
  45 _InitializeClass();
  46 
  47 # Class constructor...
  48 sub new {
  49   my($Class, %NamesAndValues) = @_;
  50 
  51   # Initialize object...
  52   my $This = {};
  53   bless $This, ref($Class) || $Class;
  54   $This->_InitializeFileIO();
  55 
  56   $This->_InitializeFileIOProperties(%NamesAndValues);
  57 
  58   return $This;
  59 }
  60 
  61 # Initialize object data...
  62 #
  63 sub _InitializeFileIO {
  64   my($This) = @_;
  65 
  66   # File name...
  67   $This->{Name} = '';
  68 
  69   # Read, write or append...
  70   $This->{Mode} = 'Read';
  71 
  72   # Open/close status...
  73   $This->{Status} = 0;
  74 
  75   # File handle returned by file open...
  76   $This->{FileHandle} = '';
  77 }
  78 
  79 # Initialize class ...
  80 sub _InitializeClass {
  81   #Class name...
  82   $ClassName = __PACKAGE__;
  83 
  84 }
  85 
  86 # Initialize object properties....
  87 sub _InitializeFileIOProperties {
  88   my($This, %NamesAndValues) = @_;
  89 
  90   my($Name, $Value, $MethodName);
  91   while (($Name, $Value) = each  %NamesAndValues) {
  92     $MethodName = "Set${Name}";
  93     $This->$MethodName($Value);
  94   }
  95 
  96   return $This;
  97 }
  98 
  99 # Close any open file...
 100 sub DESTROY {
 101   my($This) = @_;
 102 
 103   $This->Close();
 104 
 105   return $This;
 106 }
 107 
 108 # Set file name and make sure it's not already set...
 109 #
 110 sub SetName {
 111   my($This, $Name) = @_;
 112 
 113   if ($This->{Name}) {
 114     croak "Error: ${ClassName}->SetName: Can't set file name to $Name:  $This->{Name}...";
 115   }
 116 
 117   $This->{Name} = $Name;
 118 
 119   return $This;
 120 }
 121 
 122 # Open file using specified mode...
 123 #
 124 sub Open {
 125   my($This, $Mode) = @_;
 126 
 127   if ($This->{Status}) {
 128     croak "Error: ${ClassName}->Open: Can't open file $This->{Name}: It's already open...";
 129   }
 130 
 131   if (defined $Mode) {
 132     # Set mode...
 133     $This->SetMode($Mode);
 134   }
 135 
 136   # Get name and mode...
 137   my($Name);
 138   $Name = $This->{Name};
 139   $Mode = $This->_GetOpenMode();
 140 
 141   # Open the file using specified mode and store FileHandle...
 142   my($FileHandle);
 143   $FileHandle = new FileHandle("${Mode}${Name}");
 144   if (!defined $FileHandle) {
 145     croak "Error: ${ClassName}->Open: Can't open $Name:  $! ...";
 146   }
 147   $This->{FileHandle} = $FileHandle;
 148   $This->{Status} = 1;
 149 
 150   return $This;
 151 }
 152 
 153 # Close an open file...
 154 sub Close {
 155   my($This) = @_;
 156 
 157   if ($This->{Status}) {
 158     $This->{FileHandle}->close();
 159   }
 160   $This->{Status} = 0;
 161 
 162   return $This;
 163 }
 164 
 165 # Supported Mode values are: Read, Write, Append, <, >, >>, r, w, a
 166 #
 167 sub SetMode {
 168   my($This, $SpecifiedMode) = @_;
 169   my($Mode);
 170 
 171   if (!defined $SpecifiedMode) {
 172     $SpecifiedMode = 'Read';
 173   }
 174 
 175   MODE: {
 176     if ($SpecifiedMode =~ /^(Read|<|r)$/i) { $Mode = 'Read'; last MODE; }
 177     if ($SpecifiedMode =~ /^(Write|>|w)$/i) { $Mode = 'Write'; last MODE; }
 178     if ($SpecifiedMode =~ /^(Append|>>|a)$/i) { $Mode = 'Append'; last MODE; }
 179     croak "Error: ${ClassName}->SetMode: Specified mode value, $SpecifiedMode, is not valid: Supported values: Read, Write, Append, <, >, >>, r, w, a...";
 180   }
 181   $This->{Mode} = $Mode;
 182 
 183   return $This;
 184 }
 185 
 186 # Get mode values to be used for file open function: <, >, >>
 187 #
 188 sub _GetOpenMode {
 189   my($This) = @_;
 190   my($Mode);
 191 
 192   MODE: {
 193     if ($This->{Mode} =~ /^(Read|<|r)$/i) { $Mode = '<'; last MODE; }
 194     if ($This->{Mode} =~ /^(Write|>|w)$/i) { $Mode = '>'; last MODE; }
 195     if ($This->{Mode} =~ /^(Append|>>|a)$/i) { $Mode = '>>'; last MODE; }
 196     $Mode = '';
 197   }
 198   return $Mode;
 199 }
 200