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