Logo
~Sockets~
~Examples~
~Contact~


MemFile Class Reference
[File handling]

Implements a memory file. More...

#include <MemFile.h>

Inheritance diagram for MemFile:
Collaboration diagram for MemFile:

List of all members.


Public Member Functions

 MemFile ()
 MemFile (const std::string &path)
 ~MemFile ()
bool fopen (const std::string &path, const std::string &mode)
void fclose () const
size_t fread (char *ptr, size_t size, size_t nmemb) const
size_t fwrite (const char *ptr, size_t size, size_t nmemb)
char * fgets (char *s, int size) const
void fprintf (const char *format,...)
off_t size () const
bool eof () const
void reset_read () const
void reset_write ()

Private Member Functions

 MemFile (const MemFile &)
MemFileoperator= (const MemFile &)

Private Attributes

std::string m_path
bool m_temporary
block_tm_base
block_tm_current_read
block_tm_current_write
int m_current_write_nr
size_t m_read_ptr
size_t m_write_ptr
bool m_b_read_caused_eof

Static Private Attributes

static std::map< std::string,
block_t * > 
m_files

Classes

struct  block_t
 File block structure. More...

Detailed Description

Implements a memory file.

Definition at line 46 of file MemFile.h.


Constructor & Destructor Documentation

MemFile::MemFile (  ) 

Definition at line 48 of file MemFile.cpp.

00049 :m_temporary(true)
00050 ,m_base(new block_t)
00051 ,m_current_read(m_base)
00052 ,m_current_write(m_base)
00053 ,m_current_write_nr(0)
00054 ,m_read_ptr(0)
00055 ,m_write_ptr(0)
00056 ,m_b_read_caused_eof(false)
00057 {
00058 }

MemFile::MemFile ( const std::string &  path  ) 

Definition at line 61 of file MemFile.cpp.

References m_base, m_current_read, m_current_write, and m_files.

00062 :m_path(path)
00063 ,m_temporary(false)
00064 ,m_base(m_files[path])
00065 ,m_current_read(NULL)
00066 ,m_current_write(NULL)
00067 ,m_current_write_nr(0)
00068 ,m_read_ptr(0)
00069 ,m_write_ptr(0)
00070 ,m_b_read_caused_eof(false)
00071 {
00072         if (!m_base)
00073         {
00074                 m_base = new block_t;
00075                 m_files[path] = m_base;
00076         }
00077         m_current_read = m_base;
00078         m_current_write = m_base;
00079 }

MemFile::~MemFile (  ) 

Definition at line 82 of file MemFile.cpp.

References m_base, and m_temporary.

00083 {
00084         while (m_base && m_temporary)
00085         {
00086                 block_t *p = m_base;
00087                 m_base = p -> next;
00088                 delete p;
00089         }
00090 }

MemFile::MemFile ( const MemFile  )  [inline, private]

Definition at line 77 of file MemFile.h.

00077 {} // copy constructor


Member Function Documentation

bool MemFile::fopen ( const std::string &  path,
const std::string &  mode 
) [virtual]

Implements IFile.

Definition at line 93 of file MemFile.cpp.

00094 {
00095         return true;
00096 }

void MemFile::fclose (  )  const [virtual]

Implements IFile.

Definition at line 99 of file MemFile.cpp.

00100 {
00101 }

size_t MemFile::fread ( char *  ptr,
size_t  size,
size_t  nmemb 
) const [virtual]

Implements IFile.

Definition at line 104 of file MemFile.cpp.

References BLOCKSIZE, m_b_read_caused_eof, m_current_read, m_read_ptr, and m_write_ptr.

Referenced by fgets().

00105 {
00106         size_t p = m_read_ptr % BLOCKSIZE;
00107         size_t sz = size * nmemb;
00108         size_t available = m_write_ptr - m_read_ptr;
00109         if (sz > available) // read beyond eof
00110         {
00111                 sz = available;
00112                 m_b_read_caused_eof = true;
00113         }
00114         if (!sz)
00115         {
00116                 return 0;
00117         }
00118         if (p + sz < BLOCKSIZE)
00119         {
00120                 memcpy(ptr, m_current_read -> data + p, sz);
00121                 m_read_ptr += sz;
00122         }
00123         else
00124         {
00125                 size_t sz1 = BLOCKSIZE - p;
00126                 size_t sz2 = sz - sz1;
00127                 memcpy(ptr, m_current_read -> data + p, sz1);
00128                 m_read_ptr += sz1;
00129                 while (sz2 > BLOCKSIZE)
00130                 {
00131                         if (m_current_read -> next)
00132                         {
00133                                 m_current_read = m_current_read -> next;
00134                                 memcpy(ptr + sz1, m_current_read -> data, BLOCKSIZE);
00135                                 m_read_ptr += BLOCKSIZE;
00136                                 sz1 += BLOCKSIZE;
00137                                 sz2 -= BLOCKSIZE;
00138                         }
00139                         else
00140                         {
00141                                 return sz1;
00142                         }
00143                 }
00144                 if (m_current_read -> next)
00145                 {
00146                         m_current_read = m_current_read -> next;
00147                         memcpy(ptr + sz1, m_current_read -> data, sz2);
00148                         m_read_ptr += sz2;
00149                 }
00150                 else
00151                 {
00152                         return sz1;
00153                 }
00154         }
00155         return sz;
00156 }

size_t MemFile::fwrite ( const char *  ptr,
size_t  size,
size_t  nmemb 
) [virtual]

Implements IFile.

Definition at line 159 of file MemFile.cpp.

References BLOCKSIZE, m_current_write, m_current_write_nr, and m_write_ptr.

Referenced by fprintf().

00160 {
00161         size_t p = m_write_ptr % BLOCKSIZE;
00162         int nr = (int)m_write_ptr / BLOCKSIZE;
00163         size_t sz = size * nmemb;
00164         if (m_current_write_nr < nr)
00165         {
00166                 block_t *next = new block_t;
00167                 m_current_write -> next = next;
00168                 m_current_write = next;
00169                 m_current_write_nr++;
00170         }
00171         if (p + sz <= BLOCKSIZE)
00172         {
00173                 memcpy(m_current_write -> data + p, ptr, sz);
00174                 m_write_ptr += sz;
00175         }
00176         else
00177         {
00178                 size_t sz1 = BLOCKSIZE - p; // size left
00179                 size_t sz2 = sz - sz1;
00180                 memcpy(m_current_write -> data + p, ptr, sz1);
00181                 m_write_ptr += sz1;
00182                 while (sz2 > BLOCKSIZE)
00183                 {
00184                         if (m_current_write -> next)
00185                         {
00186                                 m_current_write = m_current_write -> next;
00187                                 m_current_write_nr++;
00188                         }
00189                         else
00190                         {
00191                                 block_t *next = new block_t;
00192                                 m_current_write -> next = next;
00193                                 m_current_write = next;
00194                                 m_current_write_nr++;
00195                         }
00196                         memcpy(m_current_write -> data, ptr + sz1, BLOCKSIZE);
00197                         m_write_ptr += BLOCKSIZE;
00198                         sz1 += BLOCKSIZE;
00199                         sz2 -= BLOCKSIZE;
00200                 }
00201                 if (m_current_write -> next)
00202                 {
00203                         m_current_write = m_current_write -> next;
00204                         m_current_write_nr++;
00205                 }
00206                 else
00207                 {
00208                         block_t *next = new block_t;
00209                         m_current_write -> next = next;
00210                         m_current_write = next;
00211                         m_current_write_nr++;
00212                 }
00213                 memcpy(m_current_write -> data, ptr + sz1, sz2);
00214                 m_write_ptr += sz2;
00215         }
00216         return sz;
00217 }

char * MemFile::fgets ( char *  s,
int  size 
) const [virtual]

Implements IFile.

Definition at line 221 of file MemFile.cpp.

References eof(), and fread().

00222 {
00223         int n = 0;
00224         while (n < size - 1 && !eof())
00225         {
00226                 char c;
00227                 size_t sz = fread(&c, 1, 1);
00228                 if (sz)
00229                 {
00230                         if (c == 10)
00231                         {
00232                                 s[n] = 0;
00233                                 return s;
00234                         }
00235                         s[n++] = c;
00236                 }
00237         }
00238         s[n] = 0;
00239         return s;
00240 }

void MemFile::fprintf ( const char *  format,
  ... 
) [virtual]

Implements IFile.

Definition at line 243 of file MemFile.cpp.

References BLOCKSIZE, and fwrite().

00244 {
00245         va_list ap;
00246         char tmp[BLOCKSIZE];
00247         va_start(ap, format);
00248 #ifdef _WIN32
00249         vsprintf(tmp, format, ap);
00250 #else
00251         vsnprintf(tmp, BLOCKSIZE - 1, format, ap);
00252 #endif
00253         va_end(ap);
00254         fwrite(tmp, 1, strlen(tmp));
00255 }

off_t MemFile::size (  )  const [virtual]

Implements IFile.

Definition at line 258 of file MemFile.cpp.

References m_write_ptr.

00259 {
00260         return (off_t)m_write_ptr;
00261 }

bool MemFile::eof (  )  const [virtual]

Implements IFile.

Definition at line 264 of file MemFile.cpp.

References m_b_read_caused_eof.

Referenced by fgets().

00265 {
00266         return m_b_read_caused_eof; //(m_read_ptr < m_write_ptr) ? false : true;
00267 }

void MemFile::reset_read (  )  const [virtual]

Implements IFile.

Definition at line 270 of file MemFile.cpp.

References m_base, m_current_read, and m_read_ptr.

00271 {
00272         m_read_ptr = 0;
00273         m_current_read = m_base;
00274 }

void MemFile::reset_write (  )  [virtual]

Implements IFile.

Definition at line 277 of file MemFile.cpp.

References m_base, m_current_write, m_current_write_nr, and m_write_ptr.

00278 {
00279         m_write_ptr = 0;
00280         m_current_write = m_base;
00281         m_current_write_nr = 0;
00282 }

MemFile& MemFile::operator= ( const MemFile  )  [inline, private]

Definition at line 78 of file MemFile.h.

00078 { return *this; } // assignment operator


Member Data Documentation

std::map< std::string, MemFile::block_t * > MemFile::m_files [static, private]

Definition at line 80 of file MemFile.h.

Referenced by MemFile().

std::string MemFile::m_path [private]

Definition at line 81 of file MemFile.h.

bool MemFile::m_temporary [private]

Definition at line 82 of file MemFile.h.

Referenced by ~MemFile().

Definition at line 83 of file MemFile.h.

Referenced by MemFile(), reset_read(), reset_write(), and ~MemFile().

block_t* MemFile::m_current_read [mutable, private]

Definition at line 84 of file MemFile.h.

Referenced by fread(), MemFile(), and reset_read().

Definition at line 85 of file MemFile.h.

Referenced by fwrite(), MemFile(), and reset_write().

Definition at line 86 of file MemFile.h.

Referenced by fwrite(), and reset_write().

size_t MemFile::m_read_ptr [mutable, private]

Definition at line 87 of file MemFile.h.

Referenced by fread(), and reset_read().

size_t MemFile::m_write_ptr [private]

Definition at line 88 of file MemFile.h.

Referenced by fread(), fwrite(), reset_write(), and size().

bool MemFile::m_b_read_caused_eof [mutable, private]

Definition at line 89 of file MemFile.h.

Referenced by eof(), and fread().


The documentation for this class was generated from the following files:
Page, code, and content Copyright (C) 2007 by Anders Hedström
Generated for C++ Sockets by  doxygen 1.4.4