Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

AbstractFile.C

Go to the documentation of this file.
00001 /*---------------------------------------------------------------------+
00002  | Library QgarLib, graphics analysis and recognition                  |
00003  | Copyright (C) 2002  Qgar Project, LORIA                             |
00004  |                                                                     |
00005  | This library is free software; you can redistribute it and/or       |
00006  | modify it under the terms of the GNU Lesser General Public          |
00007  | License version 2.1, as published by the Free Software Foundation.  |
00008  |                                                                     |
00009  | This library is distributed in the hope that it will be useful,     |
00010  | but WITHOUT ANY WARRANTY; without even the implied warranty of      |
00011  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                |
00012  | See the GNU Lesser General Public License for more details.         |
00013  |                                                                     |
00014  | The GNU Lesser General Public License is included in the file       |
00015  | LICENSE.LGPL, in the root directory of the Qgar packaging. See      |
00016  | http://www.gnu.org/licenses/lgpl.html for the terms of the licence. |
00017  | To receive a paper copy, write to the Free Software Foundation,     |
00018  | Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.       |
00019  |                                                                     |
00020  | Contact Project Qgar for any information:                           |
00021  |   LORIA - équipe Qgar                                               |
00022  |   B.P. 239, 54506 Vandoeuvre-lès-Nancy Cedex, France                |
00023  |   email: qgar-contact@loria.fr                                      |
00024  |   http://www.qgar.org/                                              |
00025  *---------------------------------------------------------------------*/
00026 
00027 
00028 /**
00029  * @file   AbstractFile.C
00030  * @brief  Implementation of class qgar::AbstractFile.
00031  *
00032  *         See file AbstractFile.H for the interface.
00033  *
00034  * @author <a href="mailto:qgar-develop@loria.fr?subject=Qgar fwd Gérald Masini">Gérald Masini</a>
00035  * @date   July 2, 2001  17:13
00036  * @since  Qgar 1.0
00037  */
00038 
00039 
00040 // STL
00041 #include <fstream>
00042 #include <string>
00043 #include <sstream>
00044 // QGAR
00045 #include <qgarlib/AbstractFile.H>
00046 #include <qgarlib/QgarErrorIO.H>
00047 #include <qgarlib/QgarErrorInvalidArg.H>
00048 #include <qgarlib/QgarErrorUser.H>
00049 
00050 
00051 namespace qgar
00052 {
00053 
00054 
00055 // ---------------------------------------------------------------------
00056 // C O N S T R U C T O R S
00057 // ---------------------------------------------------------------------
00058 
00059 
00060 AbstractFile::AbstractFile(const char* aFileName)
00061 
00062   throw(QgarErrorInvalidArg)
00063 
00064   : _fileStatus(QGE_FILE_STATUS_CLOSED)
00065 
00066 {
00067   _fileStream.close();
00068 
00069   if (aFileName == 0)
00070     {
00071       throw QgarErrorInvalidArg(__FILE__, __LINE__,
00072                                 "qgar::AbstractFile::AbstractFile(const char*)",
00073                                 "File name not instantiated");
00074     }
00075 
00076   if (*aFileName == '\0')
00077     {
00078       throw QgarErrorInvalidArg(__FILE__, __LINE__,
00079                                 "qgar::AbstractFile::AbstractFile(const char*)",
00080                                 "Empty file name");
00081     }
00082 
00083   _fileName = new char[strlen(aFileName) + 1];
00084   strcpy(_fileName, aFileName);
00085 }
00086 
00087 
00088 // -------------------------------------------------------------------
00089 // D E S T R U C T O R 
00090 // -------------------------------------------------------------------
00091 
00092 
00093 AbstractFile::~AbstractFile()
00094 {
00095   delete [] _fileName;
00096 }
00097 
00098 
00099 // ---------------------------------------------------------------------
00100 // O P E N I N G    A N D    C L O S I N G
00101 // ---------------------------------------------------------------------
00102 
00103 
00104 // OPEN IN READ-ONLY MODE
00105 
00106 void
00107 AbstractFile::openRONLY()
00108 
00109   throw(QgarErrorIO)
00110 
00111 {
00112   close();
00113 
00114   _fileStream.clear();
00115   _fileStream.open(_fileName, std::ios::in | std::ios::binary);
00116 
00117   if (!_fileStream)
00118     {
00119       std::ostringstream os;
00120       os << "Cannot open input file: "
00121          << _fileName;
00122       throw QgarErrorIO(__FILE__, __LINE__,
00123                         "void qgar::AbstractFile::openRONLY()",
00124                         os.str());
00125     }
00126 
00127   _fileStatus = QGE_FILE_STATUS_READ_ONLY;
00128   _fileStream.seekg(0);
00129   readHeader();
00130 }
00131 
00132 
00133 // OPEN FOR WRITE-ONLY MODE
00134 
00135 void
00136 AbstractFile::openWONLY()
00137 
00138   throw(QgarErrorIO)
00139 
00140 {
00141   close();
00142   // Courtesies of Microsoft Corp.:
00143   // 1. the failbits MUST be cleared before calling open()
00144   // 2. ios::trunc MUST be specified within MSVC++
00145   _fileStream.clear();
00146   _fileStream.open(_fileName, std::ios::out | std::ios::trunc | std::ios::binary);
00147 
00148   if (!_fileStream)
00149     {
00150       std::ostringstream os;
00151       os << "Cannot open output file: "
00152          << _fileName;
00153       throw QgarErrorIO(__FILE__, __LINE__,
00154                         "void qgar::AbstractFile::openWONLY()",
00155                         os.str());
00156     }
00157 
00158   _fileStatus = QGE_FILE_STATUS_WRITE_ONLY;
00159   writeHeader();
00160 }
00161 
00162 
00163 // OPEN IN APPEND MODE
00164 
00165 void
00166 AbstractFile::openAPPEND()
00167 
00168   throw(QgarErrorIO)
00169 
00170 {
00171   close();
00172   // Courtesy of Microsoft Corp.:
00173   // the failbits MUST be cleared before calling open()
00174   _fileStream.clear();
00175 
00176   _fileStream.open(_fileName, std::ios::app | std::ios::binary);
00177   if (!_fileStream)
00178     {
00179       std::ostringstream os;
00180       os << "Cannot open append file: "
00181          << _fileName;
00182       throw QgarErrorIO(__FILE__, __LINE__,
00183                         "void qgar::AbstractFile::openAPPEND()",
00184                         os.str());
00185     }
00186 
00187   _fileStatus = QGE_FILE_STATUS_APPEND;
00188   _fileStream.seekg(0);
00189   readHeader();
00190   _fileStream.seekg(0, std::ios::end);
00191 }
00192 
00193 
00194 // OPEN IN READ-WRITE MODE
00195 
00196 void
00197 AbstractFile::openRW()
00198 
00199   throw(QgarErrorIO)
00200 
00201 {
00202   close();
00203   _fileStream.open(_fileName, std::ios::in | std::ios::out | std::ios::binary);
00204   if (!_fileStream) 
00205     {
00206       std::ostringstream os;
00207       os << "Cannot open read/write file: "
00208          << _fileName;
00209       throw QgarErrorIO(__FILE__, __LINE__,
00210                         "void qgar::AbstractFile::openRW()",
00211                         os.str());
00212     }
00213 
00214   _fileStatus = QGE_FILE_STATUS_READ_WRITE;
00215   _fileStream.seekg(0);
00216   writeHeader();
00217 }
00218 
00219 
00220 // OPEN IN READ-APPEND MODE
00221 
00222 void
00223 AbstractFile::openRA()
00224 
00225   throw(QgarErrorIO)
00226 
00227 {
00228   close();
00229   _fileStream.open(_fileName, std::ios::in | std::ios::app | std::ios::binary);
00230 
00231   if (!_fileStream)
00232     {
00233       std::ostringstream os;
00234       os << "Cannot open read/append file: "
00235          << _fileName;
00236       throw QgarErrorIO(__FILE__, __LINE__,
00237                         "void qgar::AbstractFile::openRA()",
00238                         os.str());
00239     }
00240 
00241   _fileStatus = QGE_FILE_STATUS_READ_APPEND;
00242   _fileStream.seekg(0);
00243   readHeader();
00244   _fileStream.seekg(0, std::ios::end);
00245 }
00246 
00247 
00248 // CLOSE FILE
00249 
00250 void
00251 AbstractFile::close()
00252 {
00253   if (_fileStatus != QGE_FILE_STATUS_CLOSED)
00254  {
00255    if (   (_fileStatus == QGE_FILE_STATUS_WRITE_ONLY)
00256        || (_fileStatus == QGE_FILE_STATUS_READ_WRITE))
00257      {
00258        writeFooter();
00259      }
00260 
00261    _fileStream.close();
00262    _fileStatus = QGE_FILE_STATUS_CLOSED;
00263   }
00264 }
00265 
00266 
00267 // ---------------------------------------------------------------------
00268 // T E S T I N G    S T A T U S
00269 // ----------------------------------------------------------------------
00270 
00271 
00272 void
00273 AbstractFile::isOpenR()
00274 
00275   throw(QgarErrorUser)
00276 
00277 {
00278   if (   (_fileStatus == QGE_FILE_STATUS_WRITE_ONLY)
00279       || (_fileStatus == QGE_FILE_STATUS_APPEND))
00280     {
00281       std::ostringstream os;
00282       os << "File not open in read mode: "
00283          << _fileName;
00284       throw QgarErrorUser(__FILE__, __LINE__,
00285                           "void qgar::AbstractFile::isOpenR()",
00286                           os.str());
00287     }
00288 }
00289 
00290 
00291 void
00292 AbstractFile::isOpenW()
00293 
00294   throw(QgarErrorUser)
00295 
00296 {
00297   if (_fileStatus == QGE_FILE_STATUS_READ_ONLY)
00298     {
00299       std::ostringstream os;
00300       os << "File not open in write mode: "
00301          << _fileName;
00302       throw QgarErrorUser(__FILE__, __LINE__,
00303                           "void qgar::AbstractFile::isOpenW()",
00304                           os.str());
00305     }
00306 }
00307 
00308 
00309 void
00310 AbstractFile::isOpenA()
00311 
00312   throw(QgarErrorUser)
00313 
00314 {
00315   if (   (_fileStatus != QGE_FILE_STATUS_APPEND)
00316       && (_fileStatus != QGE_FILE_STATUS_READ_APPEND))
00317     {
00318       std::ostringstream os;
00319       os << "File not open in append mode: "
00320          << _fileName;
00321       throw QgarErrorUser(__FILE__, __LINE__,
00322                           "void qgar::AbstractFile::isOpenA()",
00323                           os.str());
00324     }
00325 }
00326 
00327 
00328 void
00329 AbstractFile::isOpenRW()
00330 
00331   throw(QgarErrorUser)
00332 
00333 {
00334   if (_fileStatus != QGE_FILE_STATUS_READ_WRITE)
00335     {
00336       std::ostringstream os;
00337       os << "File not open in read/write mode: "
00338          << _fileName;
00339       throw QgarErrorUser(__FILE__, __LINE__,
00340                           "void qgar::AbstractFile::isOpenRW()",
00341                           os.str());
00342     }
00343 }
00344 
00345 
00346 void
00347 AbstractFile::isOpenRA()
00348 
00349   throw(QgarErrorUser)
00350 
00351 {
00352   if (_fileStatus != QGE_FILE_STATUS_READ_APPEND)
00353     {
00354       std::ostringstream os;
00355       os << "File not open in read/append mode: "
00356          << _fileName;
00357       throw QgarErrorUser(__FILE__, __LINE__,
00358                           "void qgar::AbstractFile::isOpenRA()",
00359                           os.str());
00360     }
00361 }
00362 
00363 // ----------------------------------------------------------------------
00364 
00365 } // namespace qgar