xref: /trunk/main/sal/inc/osl/socket.hxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 #ifndef _OSL_SOCKET_HXX_
28 #define _OSL_SOCKET_HXX_
29 
30 #include <osl/socket_decl.hxx>
31 
32 namespace osl
33 {
34     //______________________________________________________________________________
35     inline SocketAddr::SocketAddr()
36         : m_handle( osl_createEmptySocketAddr( osl_Socket_FamilyInet ) )
37     {}
38 
39     //______________________________________________________________________________
40     inline SocketAddr::SocketAddr(const SocketAddr& Addr)
41         : m_handle( osl_copySocketAddr( Addr.m_handle ) )
42     {
43     }
44 
45     //______________________________________________________________________________
46     inline SocketAddr::SocketAddr(oslSocketAddr Addr)
47         : m_handle( osl_copySocketAddr( Addr ) )
48     {
49     }
50 
51     //______________________________________________________________________________
52     inline SocketAddr::SocketAddr(oslSocketAddr Addr, __osl_socket_NoCopy )
53         : m_handle( Addr )
54     {
55     }
56 
57     //______________________________________________________________________________
58     inline SocketAddr::SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort)
59         : m_handle( osl_createInetSocketAddr( strAddrOrHostName.pData, nPort ) )
60     {
61         if(! m_handle )
62         {
63             m_handle = osl_resolveHostname(strAddrOrHostName.pData);
64 
65             // host found?
66             if(m_handle)
67             {
68                 osl_setInetPortOfSocketAddr(m_handle, nPort);
69             }
70             else
71             {
72                 osl_destroySocketAddr( m_handle );
73                 m_handle = 0;
74             }
75         }
76     }
77 
78     //______________________________________________________________________________
79     inline SocketAddr::~SocketAddr()
80     {
81         if( m_handle )
82             osl_destroySocketAddr( m_handle );
83     }
84 
85     //______________________________________________________________________________
86     inline ::rtl::OUString SocketAddr::getHostname( oslSocketResult *pResult ) const
87     {
88         ::rtl::OUString hostname;
89         oslSocketResult result = osl_getHostnameOfSocketAddr( m_handle, &(hostname.pData) );
90         if( pResult )
91             *pResult = result;
92         return hostname;
93     }
94 
95     //______________________________________________________________________________
96     inline sal_Int32 SAL_CALL SocketAddr::getPort() const
97     {
98         return osl_getInetPortOfSocketAddr(m_handle);
99     }
100 
101     //______________________________________________________________________________
102     inline sal_Bool SAL_CALL SocketAddr::setPort( sal_Int32 nPort )
103     {
104         return osl_setInetPortOfSocketAddr(m_handle, nPort );
105     }
106 
107     inline sal_Bool SAL_CALL SocketAddr::setHostname( const ::rtl::OUString &sDottedIpOrHostname )
108     {
109         *this = SocketAddr( sDottedIpOrHostname , getPort() );
110         return is();
111     }
112 
113     //______________________________________________________________________________
114     inline sal_Bool SAL_CALL SocketAddr::setAddr( const ::rtl::ByteSequence & address )
115     {
116         return osl_setAddrOfSocketAddr( m_handle, address.getHandle() )
117             == osl_Socket_Ok;
118     }
119 
120     inline ::rtl::ByteSequence SAL_CALL SocketAddr::getAddr( oslSocketResult *pResult ) const
121     {
122         ::rtl::ByteSequence sequence;
123         oslSocketResult result = osl_getAddrOfSocketAddr( m_handle,(sal_Sequence **) &sequence );
124         if( pResult )
125             *pResult = result;
126         return sequence;
127     }
128 
129     //______________________________________________________________________________
130     inline SocketAddr & SAL_CALL SocketAddr::operator= (oslSocketAddr Addr)
131     {
132         oslSocketAddr pNewAddr = osl_copySocketAddr( Addr );
133         if( m_handle )
134             osl_destroySocketAddr( m_handle );
135         m_handle = pNewAddr;
136         return *this;
137     }
138 
139     //______________________________________________________________________________
140     inline SocketAddr & SAL_CALL SocketAddr::operator= (const SocketAddr& Addr)
141     {
142         *this = (Addr.getHandle());
143         return *this;
144     }
145 
146     inline SocketAddr & SAL_CALL SocketAddr::assign( oslSocketAddr Addr, __osl_socket_NoCopy )
147     {
148         if( m_handle )
149             osl_destroySocketAddr( m_handle );
150         m_handle = Addr;
151         return *this;
152     }
153 
154     //______________________________________________________________________________
155     inline sal_Bool SAL_CALL SocketAddr::operator== (oslSocketAddr Addr) const
156     {
157         return osl_isEqualSocketAddr( m_handle, Addr );
158     }
159 
160     inline oslSocketAddr SocketAddr::getHandle() const
161     {
162         return m_handle;
163     }
164 
165     //______________________________________________________________________________
166     inline sal_Bool SocketAddr::is() const
167     {
168         return m_handle != 0;
169     }
170 
171     // (static method)______________________________________________________________
172     inline ::rtl::OUString SAL_CALL SocketAddr::getLocalHostname( oslSocketResult *pResult )
173     {
174         ::rtl::OUString hostname;
175         oslSocketResult result = osl_getLocalHostname( &(hostname.pData) );
176         if(pResult )
177             *pResult = result;
178         return hostname;
179     }
180 
181     // (static method)______________________________________________________________
182     inline void SAL_CALL SocketAddr::resolveHostname(
183         const ::rtl::OUString & strHostName, SocketAddr &Addr)
184     {
185         Addr = SocketAddr( osl_resolveHostname( strHostName.pData ) , SAL_NO_COPY );
186     }
187 
188     // (static method)______________________________________________________________
189     inline sal_Int32 SAL_CALL SocketAddr::getServicePort(
190             const ::rtl::OUString& strServiceName,
191             const ::rtl::OUString & strProtocolName )
192     {
193         return osl_getServicePort( strServiceName.pData, strProtocolName.pData );
194     }
195 
196     //______________________________________________________________________________
197     inline Socket::Socket(oslSocketType Type,
198                           oslAddrFamily Family,
199                           oslProtocol   Protocol)
200         : m_handle( osl_createSocket(Family, Type, Protocol) )
201     {}
202 
203     //______________________________________________________________________________
204     inline Socket::Socket( oslSocket socketHandle, __sal_NoAcquire )
205         : m_handle( socketHandle )
206     {}
207 
208     //______________________________________________________________________________
209     inline Socket::Socket( oslSocket socketHandle )
210         : m_handle( socketHandle )
211     {
212         osl_acquireSocket( m_handle );
213     }
214 
215     //______________________________________________________________________________
216     inline Socket::Socket( const Socket & socket )
217         : m_handle( socket.getHandle() )
218     {
219         osl_acquireSocket( m_handle );
220     }
221 
222     //______________________________________________________________________________
223     inline Socket::~Socket()
224     {
225         osl_releaseSocket( m_handle );
226     }
227 
228     //______________________________________________________________________________
229     inline Socket& Socket::operator= ( oslSocket socketHandle)
230     {
231         osl_acquireSocket( socketHandle );
232         osl_releaseSocket( m_handle );
233         m_handle = socketHandle;
234         return *this;
235     }
236 
237     //______________________________________________________________________________
238     inline Socket&  Socket::operator= (const Socket& sock)
239     {
240         return (*this) = sock.getHandle();
241     }
242 
243     //______________________________________________________________________________
244     inline sal_Bool Socket::operator==( const Socket& rSocket ) const
245     {
246         return m_handle == rSocket.getHandle();
247     }
248 
249     //______________________________________________________________________________
250     inline sal_Bool Socket::operator==( const oslSocket socketHandle ) const
251     {
252         return m_handle == socketHandle;
253     }
254 
255     //______________________________________________________________________________
256     inline void Socket::shutdown( oslSocketDirection Direction )
257     {
258         osl_shutdownSocket( m_handle , Direction );
259     }
260 
261     //______________________________________________________________________________
262     inline void Socket::close()
263     {
264         osl_closeSocket( m_handle );
265     }
266 
267     //______________________________________________________________________________
268     inline void Socket::getLocalAddr( SocketAddr & addr) const
269     {
270         addr.assign( osl_getLocalAddrOfSocket( m_handle ) , SAL_NO_COPY );
271     }
272 
273     //______________________________________________________________________________
274     inline sal_Int32 Socket::getLocalPort() const
275     {
276         SocketAddr addr( 0 );
277         getLocalAddr( addr );
278         return addr.getPort();
279     }
280 
281     //______________________________________________________________________________
282     inline ::rtl::OUString Socket::getLocalHost() const
283     {
284         SocketAddr addr( 0 );
285         getLocalAddr( addr );
286         return addr.getHostname();
287     }
288 
289     //______________________________________________________________________________
290     inline void Socket::getPeerAddr( SocketAddr &addr ) const
291     {
292         addr.assign( osl_getPeerAddrOfSocket( m_handle ), SAL_NO_COPY );
293     }
294 
295     //______________________________________________________________________________
296     inline sal_Int32 Socket::getPeerPort() const
297     {
298         SocketAddr addr( 0 );
299         getPeerAddr( addr );
300         return addr.getPort();
301     }
302 
303     //______________________________________________________________________________
304     inline ::rtl::OUString Socket::getPeerHost() const
305     {
306         SocketAddr addr( 0 );
307         getPeerAddr( addr );
308         return addr.getHostname();
309     }
310 
311     //______________________________________________________________________________
312     inline sal_Bool Socket::bind(const SocketAddr& LocalInterface)
313     {
314         return osl_bindAddrToSocket( m_handle , LocalInterface.getHandle() );
315     }
316 
317     //______________________________________________________________________________
318     inline sal_Bool Socket::isRecvReady(const TimeValue *pTimeout ) const
319     {
320         return osl_isReceiveReady( m_handle , pTimeout );
321     }
322 
323     //______________________________________________________________________________
324     inline sal_Bool Socket::isSendReady(const TimeValue *pTimeout ) const
325     {
326         return osl_isSendReady( m_handle, pTimeout );
327     }
328 
329     //______________________________________________________________________________
330     inline sal_Bool Socket::isExceptionPending(const TimeValue *pTimeout ) const
331     {
332         return osl_isExceptionPending( m_handle, pTimeout );
333     }
334 
335     //______________________________________________________________________________
336     inline oslSocketType Socket::getType() const
337     {
338         return osl_getSocketType( m_handle );
339     }
340 
341     //______________________________________________________________________________
342     inline sal_Int32  Socket::getOption(
343         oslSocketOption Option,
344         void* pBuffer,
345         sal_uInt32 BufferLen,
346         oslSocketOptionLevel Level) const
347     {
348         return osl_getSocketOption( m_handle, Level, Option, pBuffer , BufferLen );
349     }
350 
351     //______________________________________________________________________________
352     inline sal_Bool Socket::setOption(  oslSocketOption Option,
353                                         void* pBuffer,
354                                         sal_uInt32 BufferLen,
355                                         oslSocketOptionLevel Level ) const
356     {
357         return osl_setSocketOption( m_handle, Level, Option , pBuffer, BufferLen );
358     }
359 
360     //______________________________________________________________________________
361     inline sal_Bool Socket::setOption( oslSocketOption option, sal_Int32 nValue  )
362     {
363         return setOption( option, &nValue, sizeof( nValue ) );
364     }
365 
366     //______________________________________________________________________________
367     inline sal_Int32 Socket::getOption( oslSocketOption option ) const
368     {
369         sal_Int32 n;
370         getOption( option, &n, sizeof( n ) );
371         return n;
372     }
373 
374     //______________________________________________________________________________
375     inline sal_Bool Socket::enableNonBlockingMode( sal_Bool bNonBlockingMode)
376     {
377         return osl_enableNonBlockingMode( m_handle , bNonBlockingMode );
378     }
379 
380     //______________________________________________________________________________
381     inline sal_Bool Socket::isNonBlockingMode() const
382     {
383         return osl_isNonBlockingMode( m_handle );
384     }
385 
386     //______________________________________________________________________________
387     inline void SAL_CALL Socket::clearError() const
388     {
389         sal_Int32 err = 0;
390         getOption(osl_Socket_OptionError, &err, sizeof(err));
391     }
392 
393     //______________________________________________________________________________
394     inline oslSocketError Socket::getError() const
395     {
396         return osl_getLastSocketError( m_handle );
397     }
398 
399     //______________________________________________________________________________
400     inline ::rtl::OUString Socket::getErrorAsString( ) const
401     {
402         ::rtl::OUString error;
403         osl_getLastSocketErrorDescription( m_handle, &(error.pData) );
404         return error;
405     }
406 
407     //______________________________________________________________________________
408     inline oslSocket Socket::getHandle() const
409     {
410         return m_handle;
411     }
412 
413     //______________________________________________________________________________
414     inline StreamSocket::StreamSocket(oslAddrFamily Family,
415                                       oslProtocol Protocol,
416                                       oslSocketType Type )
417         : Socket( Type, Family, Protocol )
418     {}
419 
420     //______________________________________________________________________________
421     inline StreamSocket::StreamSocket( oslSocket socketHandle, __sal_NoAcquire noacquire )
422         : Socket( socketHandle, noacquire )
423     {}
424 
425     //______________________________________________________________________________
426     inline StreamSocket::StreamSocket( oslSocket socketHandle )
427         : Socket( socketHandle )
428     {}
429 
430     //______________________________________________________________________________
431     inline StreamSocket::StreamSocket( const StreamSocket & socket )
432         : Socket( socket )
433     {}
434 
435     //______________________________________________________________________________
436     inline sal_Int32 StreamSocket::read(void* pBuffer, sal_uInt32 n)
437     {
438         return osl_readSocket( m_handle, pBuffer, n );
439     }
440 
441     //______________________________________________________________________________
442     inline sal_Int32 StreamSocket::write(const void* pBuffer, sal_uInt32 n)
443     {
444         return osl_writeSocket( m_handle, pBuffer, n );
445     }
446 
447 
448     //______________________________________________________________________________
449     inline sal_Int32 StreamSocket::recv(void* pBuffer,
450                                         sal_uInt32 BytesToRead,
451                                         oslSocketMsgFlag Flag)
452     {
453         return osl_receiveSocket( m_handle, pBuffer,BytesToRead, Flag );
454     }
455 
456     //______________________________________________________________________________
457     inline sal_Int32 StreamSocket::send(const void* pBuffer,
458                                         sal_uInt32 BytesToSend,
459                                         oslSocketMsgFlag Flag)
460     {
461         return osl_sendSocket( m_handle, pBuffer, BytesToSend, Flag );
462     }
463 
464     //______________________________________________________________________________
465     inline ConnectorSocket::ConnectorSocket(oslAddrFamily Family,
466                                             oslProtocol Protocol,
467                                             oslSocketType   Type)
468         : StreamSocket( Family, Protocol ,Type )
469     {}
470 
471     //______________________________________________________________________________
472     inline oslSocketResult ConnectorSocket::connect( const SocketAddr& TargetHost,
473                                                      const TimeValue* pTimeout )
474     {
475         return osl_connectSocketTo( m_handle , TargetHost.getHandle(), pTimeout );
476     }
477 
478     //______________________________________________________________________________
479     inline AcceptorSocket::AcceptorSocket(oslAddrFamily Family ,
480                                           oslProtocol   Protocol ,
481                                           oslSocketType Type )
482         : Socket( Type, Family, Protocol )
483     {}
484 
485     //______________________________________________________________________________
486     inline sal_Bool AcceptorSocket::listen(sal_Int32 MaxPendingConnections)
487     {
488         return osl_listenOnSocket( m_handle, MaxPendingConnections );
489     }
490 
491     //______________________________________________________________________________
492     inline oslSocketResult AcceptorSocket::acceptConnection( StreamSocket& Connection)
493     {
494         oslSocket o = osl_acceptConnectionOnSocket( m_handle, 0 );
495         oslSocketResult status = osl_Socket_Ok;
496         if( o )
497         {
498             Connection = StreamSocket( o , SAL_NO_ACQUIRE );
499         }
500         else
501         {
502             Connection = StreamSocket();
503             status = osl_Socket_Error;
504         }
505         return status;
506     }
507 
508     //______________________________________________________________________________
509     inline oslSocketResult AcceptorSocket::acceptConnection(
510         StreamSocket&   Connection, SocketAddr & PeerAddr)
511     {
512         // TODO change in/OUT parameter
513         oslSocket o = osl_acceptConnectionOnSocket( m_handle, (oslSocketAddr *)&PeerAddr );
514         oslSocketResult status = osl_Socket_Ok;
515         if( o )
516         {
517             Connection = StreamSocket( o , SAL_NO_ACQUIRE );
518         }
519         else
520         {
521             Connection = StreamSocket();
522             status = osl_Socket_Error;
523         }
524         return status;
525     }
526 
527     //______________________________________________________________________________
528     inline DatagramSocket::DatagramSocket(oslAddrFamily Family,
529                                           oslProtocol   Protocol,
530                                           oslSocketType Type)
531         : Socket( Type, Family, Protocol )
532     {}
533 
534     //______________________________________________________________________________
535     inline sal_Int32 DatagramSocket::recvFrom(void*  pBuffer,
536                                               sal_uInt32 BufferSize,
537                                               SocketAddr* pSenderAddr,
538                                               oslSocketMsgFlag Flag )
539     {
540         sal_Int32 nByteRead;
541         if( pSenderAddr )
542         {
543             // TODO : correct the out-parameter pSenderAddr outparameter
544             nByteRead = osl_receiveFromSocket( m_handle, pSenderAddr->getHandle() , pBuffer,
545                                                BufferSize, Flag);
546 //              nByteRead = osl_receiveFromSocket( m_handle, *(oslSocketAddr**) &pSenderAddr , pBuffer,
547 //                                                 BufferSize, Flag);
548         }
549         else
550         {
551             nByteRead = osl_receiveFromSocket( m_handle, 0 , pBuffer , BufferSize ,  Flag );
552         }
553         return nByteRead;
554     }
555 
556     //______________________________________________________________________________
557     inline sal_Int32  DatagramSocket::sendTo( const SocketAddr& ReceiverAddr,
558                                               const void* pBuffer,
559                                               sal_uInt32 BufferSize,
560                                               oslSocketMsgFlag Flag )
561     {
562         return osl_sendToSocket( m_handle, ReceiverAddr.getHandle(), pBuffer, BufferSize, Flag );
563     }
564 }
565 #endif
566