#ifndef __COMMON_H__
#define __COMMON_H__
//
// Headerfile for support classes
//
// This file is part of sfftobmp, a program to convert
// structured fax files (sff) to windows bitmap files (bmp),
// portable bitmap graphics (pbm), tagged image file format (tiff)
// or JPEG (jpg).
//
// Copyright (C) 1998-2008 Peter Schaefer-Hutter and contributors ("THE AUTHORS")
//
// Permission to use, copy, modify, distribute, and sell this software and
// its documentation for any purpose is hereby granted without fee.
//
// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//
// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL,
// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY
// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY
// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
// OR PERFORMANCE OF THIS SOFTWARE.
//
// Contributor(s):
//    Ulf Zibis <ulf.zibis@gmx.de> (Prepared for inheritance,
//       destructor handling, preserving filetime, CWildcardTranslator)
//
// You can contact the original author by email at peter.schaefer@gmx.de.
//
// I'm always pleased to hear that somebody is actually using my software.
// If you can manage it, e-mail me a quick notice. Thanks!
//
/*-RCS-Info----------------------------------------------------

 $Id: common.h,v 1.3 2008/09/13 13:06:26 pschaefer Exp $

---RCS-Info--------------------------------------------------*/

#include <boost/filesystem/path.hpp>

class CSimpleException
{
public:
  enum {
    err_invalidfile = 0,
    err_corruptfile,
    err_lastpageread,
    err_notsupported,
    err_openfile,
    err_closedfile,
    err_findPath,
    err_nowhitestart,
    err_noblackcode,
    err_noblackterm,
    err_nowhiteterm,
    err_invalidversion,
    err_unknowncoding,
    err_toomuchformats,
    err_cmdline,
    err_noformat,
    err_outfileexists,
    err_outfileisdir,
    err_outdir,
    err_stdoutnotallowed,
    err_stdoutonlyonefile,
    // insert here
    err_count
  };

  unsigned m_nError;

  CSimpleException(const int nError) :
    m_nError(nError) { };

  const std::string& what();

protected:
    static const std::string m_aReasons[err_count+1];
};

//-----------------------------------------------------------------

class CFile
{
protected:
  FILE                   *m_hFile;
  int                     m_nFileNo;
  boost::filesystem::path m_strPath;

public:
  enum seek_offset {
    sk_from_start,
    sk_current
  };

  CFile() : m_hFile(NULL), m_nFileNo(0) { /* sonst nix */ };
  CFile(const std::string& strPath);
    // throw CSimpleException

  virtual ~CFile();

  FILE       *GetFP() { return m_hFile; };
  int         GetFN() { return m_nFileNo; };
  const char *GetFileName() { return m_strPath.string().c_str(); };
  sff_byte    GetC();
  sff_dword   Tell();
  bool        Eof();
  void        Seek(int pos, CFile::seek_offset dir);
  void        Read(void *pTarget, int nLen);
  void        Write(void *pSource, int nLen);

  void        DumpToStdOut();  // throw CSimpleException

  virtual void Open(const std::string& strPath, const char *pszMode);
    // throw CSimpleException
  virtual void OpenTemp();
    // throw CSimpleException
  virtual void Close();
    // throw CSimpleException

  time_t GetModificationTime();
  virtual void SetModificationTime(const time_t &modtime);
};

#endif // __COMMON_H__
