home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wxos2233.zip / wxOS2-2_3_3.zip / wxWindows-2.3.3 / src / common / fs_mem.cpp < prev    next >
C/C++ Source or Header  |  2002-07-30  |  5KB  |  213 lines

  1. /////////////////////////////////////////////////////////////////////////////
  2. // Name:        fs_mem.cpp
  3. // Purpose:     in-memory file system
  4. // Author:      Vaclav Slavik
  5. // Copyright:   (c) 2000 Vaclav Slavik
  6. // Licence:     wxWindows Licence
  7. /////////////////////////////////////////////////////////////////////////////
  8.  
  9.  
  10. #ifdef __GNUG__
  11. #pragma implementation "fs_mem.h"
  12. #endif
  13.  
  14. #include "wx/wxprec.h"
  15.  
  16. #ifdef __BORDLANDC__
  17. #pragma hdrstop
  18. #endif
  19.  
  20. #if wxUSE_FILESYSTEM && wxUSE_STREAMS
  21.  
  22. #ifndef WXPRECOMP
  23.     #include "wx/intl.h"
  24.     #include "wx/log.h"
  25.     #include "wx/hash.h"
  26. #endif
  27.  
  28. #include "wx/filesys.h"
  29. #include "wx/fs_mem.h"
  30. #include "wx/mstream.h"
  31.  
  32. class MemFSHashObj : public wxObject
  33. {
  34.     public:
  35.  
  36.         MemFSHashObj(const void *data, size_t len)
  37.         {
  38.             m_Data = new char[len];
  39.             memcpy(m_Data, data, len);
  40.             m_Len = len;
  41.             m_Time = wxDateTime::Now();
  42.         }
  43.  
  44.         MemFSHashObj(wxMemoryOutputStream& stream)
  45.         {
  46.             m_Len = stream.GetSize();
  47.             m_Data = new char[m_Len];
  48.             stream.CopyTo(m_Data, m_Len);
  49.             m_Time = wxDateTime::Now();
  50.         }
  51.  
  52.         ~MemFSHashObj()
  53.         {
  54.             delete[] m_Data;
  55.         }
  56.  
  57.         char *m_Data;
  58.         size_t m_Len;
  59.         wxDateTime m_Time;
  60. };
  61.  
  62.  
  63. //--------------------------------------------------------------------------------
  64. // wxMemoryFSHandler
  65. //--------------------------------------------------------------------------------
  66.  
  67.  
  68. wxHashTable *wxMemoryFSHandler::m_Hash = NULL;
  69.  
  70.  
  71. wxMemoryFSHandler::wxMemoryFSHandler() : wxFileSystemHandler()
  72. {
  73. }
  74.  
  75.  
  76.  
  77. wxMemoryFSHandler::~wxMemoryFSHandler()
  78. {
  79.     // as only one copy of FS handler is supposed to exist, we may silently
  80.     // delete static data here. (There is no way how to remove FS handler from
  81.     // wxFileSystem other than releasing _all_ handlers.)
  82.  
  83.     if (m_Hash) delete m_Hash;
  84.     m_Hash = NULL;
  85. }
  86.  
  87.  
  88.  
  89. bool wxMemoryFSHandler::CanOpen(const wxString& location)
  90. {
  91.     wxString p = GetProtocol(location);
  92.     return (p == wxT("memory"));
  93. }
  94.  
  95.  
  96.  
  97.  
  98. wxFSFile* wxMemoryFSHandler::OpenFile(wxFileSystem& WXUNUSED(fs), const wxString& location)
  99. {
  100.     if (m_Hash)
  101.     {
  102.         MemFSHashObj *obj = (MemFSHashObj*) m_Hash -> Get(GetRightLocation(location));
  103.         if (obj == NULL)  return NULL;
  104.         else return new wxFSFile(new wxMemoryInputStream(obj -> m_Data, obj -> m_Len),
  105.                             location,
  106.                             GetMimeTypeFromExt(location),
  107.                             GetAnchor(location),
  108.                             obj -> m_Time);
  109.     }
  110.     else return NULL;
  111. }
  112.  
  113.  
  114.  
  115. wxString wxMemoryFSHandler::FindFirst(const wxString& WXUNUSED(spec),
  116.                                       int WXUNUSED(flags))
  117. {
  118.     wxFAIL_MSG(wxT("wxMemoryFSHandler::FindFirst not implemented"));
  119.  
  120.     return wxEmptyString;
  121. }
  122.  
  123.  
  124.  
  125. wxString wxMemoryFSHandler::FindNext()
  126. {
  127.     wxFAIL_MSG(wxT("wxMemoryFSHandler::FindNext not implemented"));
  128.  
  129.     return wxEmptyString;
  130. }
  131.  
  132.  
  133. bool wxMemoryFSHandler::CheckHash(const wxString& filename)
  134. {
  135.     if (m_Hash == NULL)
  136.     {
  137.         m_Hash = new wxHashTable(wxKEY_STRING);
  138.         m_Hash -> DeleteContents(TRUE);
  139.     }
  140.  
  141.     if (m_Hash -> Get(filename) != NULL)
  142.     {
  143.         wxString s;
  144.         s.Printf(_("Memory VFS already contains file '%s'!"), filename.c_str());
  145.         wxLogError(s);
  146.         return FALSE;
  147.     }
  148.     else
  149.         return TRUE;
  150. }
  151.  
  152.  
  153.  
  154. #if wxUSE_GUI
  155.  
  156. /*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, wxImage& image, long type)
  157. {
  158.     if (!CheckHash(filename)) return;
  159.  
  160.  
  161.     wxMemoryOutputStream mems;
  162.     if (image.Ok() && image.SaveFile(mems, (int)type))
  163.         m_Hash -> Put(filename, new MemFSHashObj(mems));
  164.     else
  165.     {
  166.         wxString s;
  167.         s.Printf(_("Failed to store image '%s' to memory VFS!"), filename.c_str());
  168.         wxPrintf(wxT("'%s'\n"), s.c_str());
  169.         wxLogError(s);
  170.     }
  171. }
  172.  
  173.  
  174. /*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxBitmap& bitmap, long type)
  175. {
  176.     wxImage img = bitmap.ConvertToImage();
  177.     AddFile(filename, img, type);
  178. }
  179.  
  180. #endif
  181.  
  182. /*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const wxString& textdata)
  183. {
  184.     AddFile(filename, (const void*) textdata.mb_str(), textdata.Length());
  185. }
  186.  
  187.  
  188. /*static*/ void wxMemoryFSHandler::AddFile(const wxString& filename, const void *binarydata, size_t size)
  189. {
  190.     if (!CheckHash(filename)) return;
  191.     m_Hash -> Put(filename, new MemFSHashObj(binarydata, size));
  192. }
  193.  
  194.  
  195.  
  196. /*static*/ void wxMemoryFSHandler::RemoveFile(const wxString& filename)
  197. {
  198.     if (m_Hash == NULL ||
  199.         m_Hash -> Get(filename) == NULL)
  200.     {
  201.         wxString s;
  202.         s.Printf(_("Trying to remove file '%s' from memory VFS, but it is not loaded!"), filename.c_str());
  203.         wxLogError(s);
  204.     }
  205.  
  206.     else
  207.         delete m_Hash -> Delete(filename);
  208. }
  209.  
  210.  
  211.  
  212. #endif // wxUSE_FILESYSTEM && wxUSE_FS_ZIP
  213.