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 #include <wefts_coffee_base.h>
00026
00027 #include <sys/select.h>
00028 #include <sys/types.h>
00029 #include <sys/stat.h>
00030 #include <fcntl.h>
00031
00032 namespace Wefts {
00033
00050 class OSFileFuncUnix : public OSFileFuncBase
00051 {
00052 protected:
00053
00054 int m_fd;
00055
00056 bool waitForWrite()
00057 {
00058 if ( m_timeout < 0 ) return true;
00059 fd_set set;
00060 struct timespec timeout;
00061
00062 FD_SET( m_fd, &set);
00063 timeout.tv_sec = static_cast<long>(m_timeout);
00064 timeout.tv_nsec = static_cast<long>(
00065 (m_timeout - static_cast<long>(m_timeout)) *1000000000);
00066 pselect(m_fd + 1, NULL, &set, NULL, &timeout, NULL);
00067
00068 return FD_ISSET( m_fd, &set );
00069 }
00070
00071
00072 bool waitForRead()
00073 {
00074 if ( m_timeout < 0 ) return true;
00075 fd_set set;
00076 struct timespec timeout;
00077
00078 FD_SET( m_fd, &set);
00079 timeout.tv_sec = static_cast<long>(m_timeout);
00080 timeout.tv_nsec = static_cast<long>(
00081 (m_timeout - static_cast<long>(m_timeout)) *1000000000);
00082 pselect(m_fd + 1, &set, NULL, NULL, &timeout, NULL);
00083
00084 return FD_ISSET( m_fd, &set );
00085 }
00086
00087
00088 public:
00089 OSFileFuncUnix( void *descriptor = 0) :
00090 OSFileFuncBase()
00091 {
00092 if ( descriptor != 0 )
00093 setDescriptor( descriptor );
00094 }
00095
00096 virtual CffStatus open(
00097 std::string filespec,
00098 OpenMode openMode = OM_RO,
00099 LockMode lockMode = LM_SHARED
00100 );
00101
00102 virtual CffStatus create(
00103 std::string filespec,
00104 CreateMode cMode = CM_ARCHIVE,
00105 LockMode lockMode = LM_EXCLUSIVE
00106 );
00107
00108
00112 inline virtual void getDescriptor( void *data ) const
00113 {
00114 *static_cast<int *>(data) = m_fd;
00115 }
00116
00119 inline virtual void setDescriptor( void *data )
00120 {
00121 m_fd = *static_cast<int *>(data);
00122 }
00123
00124 virtual file_size_t read( void *buffer, const file_size_t len );
00125 virtual file_size_t write( void *buffer, const file_size_t len );
00126 virtual file_size_t seek(
00127 const file_size_t position,
00128 const SeekWhence swFrom= SW_FROM_BEGIN
00129 );
00130 virtual CffStatus close();
00131
00132 inline virtual void setStdIn() { m_fd = 0; }
00133 inline virtual void setStdOut(){ m_fd = 1; }
00134 inline virtual void setStdErr(){ m_fd = 2; }
00135
00136 };
00137
00139 typedef OSFileFuncUnix OSFileFunc;
00140
00142 }
00143
00144 #endif
00145
00146