00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 #ifndef WT_COFFEE_UNIX_H
00023 #define WT_COFFEE_UNIX_H
00024 
00025 
00026 #define _WIN32_WINNT 0x0400 
00027 #include <windows.h>
00028 
00029 #include <wefts_coffee_base.h>
00030 #include <wefts_os_windows.h>
00031 
00032 namespace Wefts {
00033 
00067 class OSFileFuncWin : public OSFileFuncBase
00068 {
00069 protected:
00070    
00071    HANDLE m_handle;
00072    HANDLE m_evtComplete;
00073    
00074    LARGE_INTEGER m_liSize;
00075    LARGE_INTEGER m_liPos;
00076    
00077    file_size_t internal_rw( void *buffer, const file_size_t len, bool rw, bool bFile );
00078    bool m_bOvlFiles;
00079 
00080 public:
00081    OSFileFuncWin( void *descriptor = 0 );
00082 
00083    ~OSFileFuncWin() { CloseHandle( m_evtComplete ); }
00084    
00085    virtual CffStatus open(
00086       std::string filespec,             
00087       OpenMode openMode = OM_RO,        
00088       LockMode lockMode = LM_SHARED   
00089       );
00090 
00091    virtual CffStatus create(
00092       std::string filespec,               
00093       CreateMode cMode = CM_ARCHIVE,            
00094       LockMode lockMode = LM_EXCLUSIVE  
00095       );
00096 
00097 
00101    inline virtual void getDescriptor( void *data ) const
00102    {
00103       *static_cast<HANDLE *>(data) = m_handle;
00104    }
00105 
00108    inline virtual void setDescriptor( void *data )
00109    {
00110       m_handle = *static_cast<HANDLE *>(data);
00111    }
00112 
00113    virtual file_size_t read( void *buffer, const file_size_t len ) {
00114       return OSFileFuncWin::internal_rw( buffer, len, true, true );
00115    }
00116 
00117    virtual file_size_t write( void *buffer, const file_size_t len )
00118    {
00119       return OSFileFuncWin::internal_rw( buffer, len, false, true );
00120    }
00121    
00122    virtual file_size_t seek(
00123       const file_size_t position,
00124       const SeekWhence swFrom= SW_FROM_BEGIN
00125       );
00126    
00127    virtual CffStatus close();
00128 
00130    inline virtual void setStdIn() { 
00131       m_handle = GetStdHandle( STD_INPUT_HANDLE ); 
00132       
00133       if ( GetFileType( m_handle ) == FILE_TYPE_CHAR )
00134          m_bOvlFiles = false;
00135    }
00136       
00138    inline virtual void setStdOut(){ 
00139       m_handle = GetStdHandle( STD_OUTPUT_HANDLE ); 
00140      
00141       if ( GetFileType( m_handle ) == FILE_TYPE_CHAR )
00142          m_bOvlFiles = false;
00143    }
00144 
00146    inline virtual void setStdErr(){ 
00147       m_handle = GetStdHandle( STD_ERROR_HANDLE );
00148       
00149       if ( GetFileType( m_handle ) == FILE_TYPE_CHAR )
00150          m_bOvlFiles = false;
00151    }
00152 };
00153 
00155 typedef OSFileFuncWin OSFileFunc;
00156 
00158 } 
00159 
00160 #endif
00161 
00162