Public Member Functions | Private Member Functions | Private Attributes

ACEXML_FileCharStream Class Reference

#include <FileCharStream.h>

Inheritance diagram for ACEXML_FileCharStream:
Inheritance graph
[legend]
Collaboration diagram for ACEXML_FileCharStream:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 ACEXML_FileCharStream (void)
 Default constructor.
virtual ~ACEXML_FileCharStream (void)
 Destructor.
int open (const ACEXML_Char *name)
 Open a file.
virtual int available (void)
virtual int close (void)
virtual int get (ACEXML_Char &ch)
virtual int read (ACEXML_Char *str, size_t len)
virtual int determine_encoding (void)
virtual int peek (void)
virtual void rewind (void)
virtual const ACEXML_ChargetEncoding (void)
virtual const ACEXML_ChargetSystemId (void)

Private Member Functions

int getchar_i (char &ch)

Private Attributes

ACEXML_Charfilename_
ACEXML_Charencoding_
ACE_OFF_T size_
FILE * infile_
ACEXML_Char peek_

Detailed Description

An implementation of ACEXML_CharStream for reading input from a file.

Definition at line 31 of file FileCharStream.h.


Constructor & Destructor Documentation

ACEXML_FileCharStream::ACEXML_FileCharStream ( void   ) 

Default constructor.

Definition at line 14 of file FileCharStream.cpp.

  : filename_ (0), encoding_ (0), size_ (0), infile_ (0), peek_ (0)
{
}

ACEXML_FileCharStream::~ACEXML_FileCharStream ( void   )  [virtual]

Destructor.

Definition at line 19 of file FileCharStream.cpp.

{
  this->close();
}


Member Function Documentation

int ACEXML_FileCharStream::available ( void   )  [virtual]

Returns the available ACEXML_Char in the buffer. -1 if the object is not initialized properly.

Implements ACEXML_CharStream.

Definition at line 101 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return -1;

  long curr;
  if ((curr = ACE_OS::ftell (this->infile_)) < 0)
    return -1;
  return static_cast<int> (this->size_ - curr);
}

int ACEXML_FileCharStream::close ( void   )  [virtual]

Close this stream and release all resources used by it.

Implements ACEXML_CharStream.

Definition at line 113 of file FileCharStream.cpp.

{
  if (this->infile_ != 0)
    {
      ACE_OS::fclose (this->infile_);
      this->infile_ = 0;
    }
  delete[] this->filename_;
  this->filename_ = 0;
  delete[] this->encoding_;
  this->encoding_ = 0;
  this->size_ = 0;
  this->peek_ = 0;
  return 0;
}

int ACEXML_FileCharStream::determine_encoding ( void   )  [virtual]

Determine the encoding of the file.

Definition at line 47 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return -1;

  char input[4];
  int retval = 0;
  int i = 0;
  for (; i < 4 && retval != -1; ++i)
    retval = this->getchar_i(input[i]);
  if (i < 4)
    return -1;

  // Rewind the stream
  ACE_OS::rewind (this->infile_);

  const ACEXML_Char* temp = ACEXML_Encoding::get_encoding (input);
  if (!temp)
    return -1;
  else
    {
      delete [] this->encoding_;
      this->encoding_ = ACE::strnew (temp);
//       ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("File's encoding is %s\n"),
//                   this->encoding_));
    }
  // Move over the byte-order-mark if present.
  char ch;
  for (int j = 0; j < 3; ++j)
    {
      if (this->getchar_i (ch) < 0)
        return -1;
      if (ch == '\xFF' || ch == '\xFE' || ch == '\xEF' || ch == '\xBB' ||
          ch == '\xBF')
        continue;
      else
        {
          ACE_OS::ungetc (ch, this->infile_);
          break;
        }
    }
  return 0;
}

int ACEXML_FileCharStream::get ( ACEXML_Char ch  )  [virtual]

Read the next ACEXML_Char. Return -1 if we are not able to return an ACEXML_Char, 0 if succees.

Implements ACEXML_CharStream.

Definition at line 148 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return -1;
#if defined (ACE_USES_WCHAR)
  return this->get_i (ch);
#else
  ch = (ACEXML_Char) ACE_OS::fgetc (this->infile_);
  return (feof(this->infile_) ? -1 : 0);
#endif /* ACE_USES_WCHAR */
}

int ACEXML_FileCharStream::getchar_i ( char &  ch  )  [private]

Read the next character as a normal character. Return -1 if EOF is reached, else return 0.

Definition at line 131 of file FileCharStream.cpp.

{
  ch = static_cast<char> (ACE_OS::fgetc (this->infile_));
  return (feof(this->infile_) ? -1 : 0);
}

const ACEXML_Char * ACEXML_FileCharStream::getEncoding ( void   )  [virtual]

Implements ACEXML_CharStream.

Definition at line 246 of file FileCharStream.cpp.

{
  return this->encoding_;
}

const ACEXML_Char * ACEXML_FileCharStream::getSystemId ( void   )  [virtual]

Implements ACEXML_CharStream.

Definition at line 252 of file FileCharStream.cpp.

{
  return this->filename_;
}

int ACEXML_FileCharStream::open ( const ACEXML_Char name  ) 

Open a file.

Definition at line 25 of file FileCharStream.cpp.

{
  delete[] this->filename_;
  this->filename_ = 0;

  delete[] this->encoding_;
  this->encoding_ = 0;

  this->infile_ = ACE_OS::fopen (name, ACE_TEXT ("r"));
  if (this->infile_ == 0)
    return -1;

  ACE_stat statbuf;
  if (ACE_OS::stat (name, &statbuf) < 0)
    return -1;

  this->size_ = ACE_Utils::truncate_cast<ACE_OFF_T> (statbuf.st_size);
  this->filename_ = ACE::strnew (name);
  return this->determine_encoding();
}

int ACEXML_FileCharStream::peek ( void   )  [virtual]

Peek the next ACEXML_Char in the CharStream. Return the character if success, -1 if EOF is reached.

Implements ACEXML_CharStream.

Definition at line 161 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return -1;
#if defined (ACE_USES_WCHAR)
  return this->peek_i();
#else

  ACEXML_Char ch = static_cast<ACEXML_Char> (ACE_OS::fgetc (this->infile_));
  ACE_OS::ungetc (ch, this->infile_);
  return ch;
#endif /* ACE_USES_WCHAR */
}

int ACEXML_FileCharStream::read ( ACEXML_Char str,
size_t  len 
) [virtual]

Read the next batch of ACEXML_Char strings

Implements ACEXML_CharStream.

Definition at line 138 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return -1;

  return static_cast<int> (ACE_OS::fread (str, sizeof (ACEXML_Char), len, this->infile_));
}

void ACEXML_FileCharStream::rewind ( void   )  [virtual]

Resets the file pointer to the beginning of the stream.

Implements ACEXML_CharStream.

Definition at line 92 of file FileCharStream.cpp.

{
  if (this->infile_ == 0)
    return;
  ACE_OS::rewind (this->infile_);
  this->determine_encoding();
}


Member Data Documentation

Definition at line 117 of file FileCharStream.h.

Definition at line 116 of file FileCharStream.h.

Definition at line 119 of file FileCharStream.h.

Definition at line 124 of file FileCharStream.h.

Definition at line 118 of file FileCharStream.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines