6 #include <sys/socket.h>
7 #include <netinet/in.h>
9 #include <sys/select.h>
16 #include "Session.hpp"
17 #include "Exceptions.hpp"
18 #include "DataBufferFile.hpp"
19 #include "DataBufferListing.hpp"
23 #include "DataBufferFileSymbian.hpp"
25 Data::Data( const SessionWPtr
& session
, RFile
* file
, Mode mode
)
28 , m_session( session
)
29 , m_buf( new char[BufSize
] )
31 if( mode
== M_UPLOAD
)
33 m_data
.reset( new DataBufferFileSymbian( file
, BufSize
) );
37 m_data
.reset( new DataBufferFileSymbian( file
, BufSize
) );
42 Data::Data( const SessionWPtr
& session
, FILE* file
, Mode mode
)
45 , m_session( session
)
46 , m_buf( new char[BufSize
] )
48 if( mode
== M_UPLOAD
)
50 m_data
.reset( new DataBufferFile( file
, BufSize
) );
54 m_data
.reset( new DataBufferFile( file
, BufSize
) );
58 Data::Data( const SessionWPtr
& session
, const std::list
<std::string
>& list
)
61 , m_session( session
)
62 , m_buf( new char[BufSize
] )
63 , m_data( new DataBufferListing( list
) )
77 bool Data::Connect( const std::string
& addr
, int port
)
79 if( ( m_sock
= socket( PF_INET
, SOCK_STREAM
, 0 ) ) == -1 )
81 throw SessionErrorException
;
86 sa
.sin_family
= AF_INET
;
87 sa
.sin_port
= htons( port
);
88 sa
.sin_addr
.s_addr
= inet_addr( addr
.c_str() );
89 memset( sa
.sin_zero
, 0, sizeof( sa
.sin_zero
) );
91 return connect( m_sock
, (sockaddr
*)&sa
, sizeof( sockaddr
) ) != -1;
94 bool Data::Accept( int sock
)
97 socklen_t size
= sizeof( addr
);
99 int incoming
= accept( sock
, (sockaddr
*)&addr
, &size
);
113 if( m_mode
== M_UPLOAD
)
125 int len
= m_data
->Read( m_buf
, BufSize
);
129 m_session
.lock()->DataConnectionFinished();
136 while( pos
!= len
&& CanSend() )
138 int size
= send( m_sock
, ptr
, len
- pos
, 0 );
142 throw SessionErrorException
;
146 m_session
.lock()->DataConnectionError();
156 m_data
->Store( ptr
, len
- pos
);
165 while( total
< BufSize
&& CanReceive() )
167 int size
= recv( m_sock
, m_buf
, BufSize
- total
, 0 );
170 throw SessionErrorException
;
174 m_session
.lock()->DataConnectionFinished();
179 int writeSize
= m_data
->Write( m_buf
, size
);
181 if( writeSize
!= size
)
183 m_session
.lock()->OutOfSpace();
196 FD_SET( m_sock
, &fd
);
200 select( m_sock
+ 1, NULL
, &fd
, NULL
, &tv
);
202 return FD_ISSET( m_sock
, &fd
);
205 bool Data::CanReceive()
209 FD_SET( m_sock
, &fd
);
213 select( m_sock
+ 1, &fd
, NULL
, NULL
, &tv
);
215 return FD_ISSET( m_sock
, &fd
);