3 #include <sys/socket.h>
4 #include <netinet/in.h>
8 #include <sys/select.h>
10 #include "Session.hpp"
11 #include "Exceptions.hpp"
12 #include "DataBufferFile.hpp"
13 #include "DataBufferListing.hpp"
17 #include "DataBufferFileSymbian.hpp"
19 Data::Data( const SessionWPtr
& session
, RFile
* file
, Mode mode
)
22 , m_session( session
)
23 , m_buf( new char[BufSize
] )
25 if( mode
== M_UPLOAD
)
27 m_data
.reset( new DataBufferFileSymbian( file
, BufSize
) );
31 m_data
.reset( new DataBufferFileSymbian( file
, BufSize
) );
36 Data::Data( const SessionWPtr
& session
, FILE* file
, Mode mode
)
39 , m_session( session
)
40 , m_buf( new char[BufSize
] )
42 if( mode
== M_UPLOAD
)
44 m_data
.reset( new DataBufferFile( file
, BufSize
, DataBuffer::M_READ
) );
48 m_data
.reset( new DataBufferFile( file
, BufSize
, DataBuffer::M_WRITE
) );
52 Data::Data( const SessionWPtr
& session
, const std::list
<std::string
>& list
)
55 , m_session( session
)
56 , m_buf( new char[BufSize
] )
57 , m_data( new DataBufferListing( list
) )
71 bool Data::Connect( const std::string
& addr
, int port
)
73 if( ( m_sock
= socket( PF_INET
, SOCK_STREAM
, 0 ) ) == -1 )
75 throw SessionErrorException
;
80 sa
.sin_family
= AF_INET
;
81 sa
.sin_port
= htons( port
);
82 sa
.sin_addr
.s_addr
= inet_addr( addr
.c_str() );
83 memset( sa
.sin_zero
, 0, sizeof( sa
.sin_zero
) );
85 return connect( m_sock
, (sockaddr
*)&sa
, sizeof( sockaddr
) ) != -1;
88 bool Data::Accept( int sock
)
91 socklen_t size
= sizeof( addr
);
93 int incoming
= accept( sock
, (sockaddr
*)&addr
, &size
);
107 if( m_mode
== M_UPLOAD
)
119 int len
= m_data
->Read( m_buf
, BufSize
);
123 m_session
.lock()->DataConnectionFinished();
130 while( pos
!= len
&& CanSend() )
132 int size
= send( m_sock
, ptr
, len
- pos
, 0 );
136 throw SessionErrorException
;
140 m_session
.lock()->DataConnectionError();
150 m_data
->Store( ptr
, len
- pos
);
159 while( total
< BufSize
&& CanReceive() )
161 int size
= recv( m_sock
, m_buf
, BufSize
- total
, 0 );
164 throw SessionErrorException
;
168 m_session
.lock()->DataConnectionFinished();
173 int writeSize
= m_data
->Write( m_buf
, size
);
175 if( writeSize
!= size
)
177 m_session
.lock()->OutOfSpace();
190 FD_SET( m_sock
, &fd
);
194 select( m_sock
+ 1, NULL
, &fd
, NULL
, &tv
);
196 return FD_ISSET( m_sock
, &fd
);
199 bool Data::CanReceive()
203 FD_SET( m_sock
, &fd
);
207 select( m_sock
+ 1, &fd
, NULL
, NULL
, &tv
);
209 return FD_ISSET( m_sock
, &fd
);