/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * This file is part of OpenOffice.org. * * OpenOffice.org is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License version 3 * only, as published by the Free Software Foundation. * * OpenOffice.org is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License version 3 for more details * (a copy is included in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU Lesser General Public License * version 3 along with OpenOffice.org. If not, see * * for a copy of the LGPLv3 License. * ************************************************************************/ #ifndef _OSL_SOCKET_HXX_ #define _OSL_SOCKET_HXX_ #include namespace osl { //______________________________________________________________________________ inline SocketAddr::SocketAddr() : m_handle( osl_createEmptySocketAddr( osl_Socket_FamilyInet ) ) {} //______________________________________________________________________________ inline SocketAddr::SocketAddr(const SocketAddr& Addr) : m_handle( osl_copySocketAddr( Addr.m_handle ) ) { } //______________________________________________________________________________ inline SocketAddr::SocketAddr(oslSocketAddr Addr) : m_handle( osl_copySocketAddr( Addr ) ) { } //______________________________________________________________________________ inline SocketAddr::SocketAddr(oslSocketAddr Addr, __osl_socket_NoCopy ) : m_handle( Addr ) { } //______________________________________________________________________________ inline SocketAddr::SocketAddr( const ::rtl::OUString& strAddrOrHostName, sal_Int32 nPort) : m_handle( osl_createInetSocketAddr( strAddrOrHostName.pData, nPort ) ) { if(! m_handle ) { m_handle = osl_resolveHostname(strAddrOrHostName.pData); // host found? if(m_handle) { osl_setInetPortOfSocketAddr(m_handle, nPort); } else { osl_destroySocketAddr( m_handle ); m_handle = 0; } } } //______________________________________________________________________________ inline SocketAddr::~SocketAddr() { if( m_handle ) osl_destroySocketAddr( m_handle ); } //______________________________________________________________________________ inline ::rtl::OUString SocketAddr::getHostname( oslSocketResult *pResult ) const { ::rtl::OUString hostname; oslSocketResult result = osl_getHostnameOfSocketAddr( m_handle, &(hostname.pData) ); if( pResult ) *pResult = result; return hostname; } //______________________________________________________________________________ inline sal_Int32 SAL_CALL SocketAddr::getPort() const { return osl_getInetPortOfSocketAddr(m_handle); } //______________________________________________________________________________ inline sal_Bool SAL_CALL SocketAddr::setPort( sal_Int32 nPort ) { return osl_setInetPortOfSocketAddr(m_handle, nPort ); } inline sal_Bool SAL_CALL SocketAddr::setHostname( const ::rtl::OUString &sDottedIpOrHostname ) { *this = SocketAddr( sDottedIpOrHostname , getPort() ); return is(); } //______________________________________________________________________________ inline sal_Bool SAL_CALL SocketAddr::setAddr( const ::rtl::ByteSequence & address ) { return osl_setAddrOfSocketAddr( m_handle, address.getHandle() ) == osl_Socket_Ok; } inline ::rtl::ByteSequence SAL_CALL SocketAddr::getAddr( oslSocketResult *pResult ) const { ::rtl::ByteSequence sequence; oslSocketResult result = osl_getAddrOfSocketAddr( m_handle,(sal_Sequence **) &sequence ); if( pResult ) *pResult = result; return sequence; } //______________________________________________________________________________ inline SocketAddr & SAL_CALL SocketAddr::operator= (oslSocketAddr Addr) { oslSocketAddr pNewAddr = osl_copySocketAddr( Addr ); if( m_handle ) osl_destroySocketAddr( m_handle ); m_handle = pNewAddr; return *this; } //______________________________________________________________________________ inline SocketAddr & SAL_CALL SocketAddr::operator= (const SocketAddr& Addr) { *this = (Addr.getHandle()); return *this; } inline SocketAddr & SAL_CALL SocketAddr::assign( oslSocketAddr Addr, __osl_socket_NoCopy ) { if( m_handle ) osl_destroySocketAddr( m_handle ); m_handle = Addr; return *this; } //______________________________________________________________________________ inline sal_Bool SAL_CALL SocketAddr::operator== (oslSocketAddr Addr) const { return osl_isEqualSocketAddr( m_handle, Addr ); } inline oslSocketAddr SocketAddr::getHandle() const { return m_handle; } //______________________________________________________________________________ inline sal_Bool SocketAddr::is() const { return m_handle != 0; } // (static method)______________________________________________________________ inline ::rtl::OUString SAL_CALL SocketAddr::getLocalHostname( oslSocketResult *pResult ) { ::rtl::OUString hostname; oslSocketResult result = osl_getLocalHostname( &(hostname.pData) ); if(pResult ) *pResult = result; return hostname; } // (static method)______________________________________________________________ inline void SAL_CALL SocketAddr::resolveHostname( const ::rtl::OUString & strHostName, SocketAddr &Addr) { Addr = SocketAddr( osl_resolveHostname( strHostName.pData ) , SAL_NO_COPY ); } // (static method)______________________________________________________________ inline sal_Int32 SAL_CALL SocketAddr::getServicePort( const ::rtl::OUString& strServiceName, const ::rtl::OUString & strProtocolName ) { return osl_getServicePort( strServiceName.pData, strProtocolName.pData ); } //______________________________________________________________________________ inline Socket::Socket(oslSocketType Type, oslAddrFamily Family, oslProtocol Protocol) : m_handle( osl_createSocket(Family, Type, Protocol) ) {} //______________________________________________________________________________ inline Socket::Socket( oslSocket socketHandle, __sal_NoAcquire ) : m_handle( socketHandle ) {} //______________________________________________________________________________ inline Socket::Socket( oslSocket socketHandle ) : m_handle( socketHandle ) { osl_acquireSocket( m_handle ); } //______________________________________________________________________________ inline Socket::Socket( const Socket & socket ) : m_handle( socket.getHandle() ) { osl_acquireSocket( m_handle ); } //______________________________________________________________________________ inline Socket::~Socket() { osl_releaseSocket( m_handle ); } //______________________________________________________________________________ inline Socket& Socket::operator= ( oslSocket socketHandle) { osl_acquireSocket( socketHandle ); osl_releaseSocket( m_handle ); m_handle = socketHandle; return *this; } //______________________________________________________________________________ inline Socket& Socket::operator= (const Socket& sock) { return (*this) = sock.getHandle(); } //______________________________________________________________________________ inline sal_Bool Socket::operator==( const Socket& rSocket ) const { return m_handle == rSocket.getHandle(); } //______________________________________________________________________________ inline sal_Bool Socket::operator==( const oslSocket socketHandle ) const { return m_handle == socketHandle; } //______________________________________________________________________________ inline void Socket::shutdown( oslSocketDirection Direction ) { osl_shutdownSocket( m_handle , Direction ); } //______________________________________________________________________________ inline void Socket::close() { osl_closeSocket( m_handle ); } //______________________________________________________________________________ inline void Socket::getLocalAddr( SocketAddr & addr) const { addr.assign( osl_getLocalAddrOfSocket( m_handle ) , SAL_NO_COPY ); } //______________________________________________________________________________ inline sal_Int32 Socket::getLocalPort() const { SocketAddr addr( 0 ); getLocalAddr( addr ); return addr.getPort(); } //______________________________________________________________________________ inline ::rtl::OUString Socket::getLocalHost() const { SocketAddr addr( 0 ); getLocalAddr( addr ); return addr.getHostname(); } //______________________________________________________________________________ inline void Socket::getPeerAddr( SocketAddr &addr ) const { addr.assign( osl_getPeerAddrOfSocket( m_handle ), SAL_NO_COPY ); } //______________________________________________________________________________ inline sal_Int32 Socket::getPeerPort() const { SocketAddr addr( 0 ); getPeerAddr( addr ); return addr.getPort(); } //______________________________________________________________________________ inline ::rtl::OUString Socket::getPeerHost() const { SocketAddr addr( 0 ); getPeerAddr( addr ); return addr.getHostname(); } //______________________________________________________________________________ inline sal_Bool Socket::bind(const SocketAddr& LocalInterface) { return osl_bindAddrToSocket( m_handle , LocalInterface.getHandle() ); } //______________________________________________________________________________ inline sal_Bool Socket::isRecvReady(const TimeValue *pTimeout ) const { return osl_isReceiveReady( m_handle , pTimeout ); } //______________________________________________________________________________ inline sal_Bool Socket::isSendReady(const TimeValue *pTimeout ) const { return osl_isSendReady( m_handle, pTimeout ); } //______________________________________________________________________________ inline sal_Bool Socket::isExceptionPending(const TimeValue *pTimeout ) const { return osl_isExceptionPending( m_handle, pTimeout ); } //______________________________________________________________________________ inline oslSocketType Socket::getType() const { return osl_getSocketType( m_handle ); } //______________________________________________________________________________ inline sal_Int32 Socket::getOption( oslSocketOption Option, void* pBuffer, sal_uInt32 BufferLen, oslSocketOptionLevel Level) const { return osl_getSocketOption( m_handle, Level, Option, pBuffer , BufferLen ); } //______________________________________________________________________________ inline sal_Bool Socket::setOption( oslSocketOption Option, void* pBuffer, sal_uInt32 BufferLen, oslSocketOptionLevel Level ) const { return osl_setSocketOption( m_handle, Level, Option , pBuffer, BufferLen ); } //______________________________________________________________________________ inline sal_Bool Socket::setOption( oslSocketOption option, sal_Int32 nValue ) { return setOption( option, &nValue, sizeof( nValue ) ); } //______________________________________________________________________________ inline sal_Int32 Socket::getOption( oslSocketOption option ) const { sal_Int32 n; getOption( option, &n, sizeof( n ) ); return n; } //______________________________________________________________________________ inline sal_Bool Socket::enableNonBlockingMode( sal_Bool bNonBlockingMode) { return osl_enableNonBlockingMode( m_handle , bNonBlockingMode ); } //______________________________________________________________________________ inline sal_Bool Socket::isNonBlockingMode() const { return osl_isNonBlockingMode( m_handle ); } //______________________________________________________________________________ inline void SAL_CALL Socket::clearError() const { sal_Int32 err = 0; getOption(osl_Socket_OptionError, &err, sizeof(err)); } //______________________________________________________________________________ inline oslSocketError Socket::getError() const { return osl_getLastSocketError( m_handle ); } //______________________________________________________________________________ inline ::rtl::OUString Socket::getErrorAsString( ) const { ::rtl::OUString error; osl_getLastSocketErrorDescription( m_handle, &(error.pData) ); return error; } //______________________________________________________________________________ inline oslSocket Socket::getHandle() const { return m_handle; } //______________________________________________________________________________ inline StreamSocket::StreamSocket(oslAddrFamily Family, oslProtocol Protocol, oslSocketType Type ) : Socket( Type, Family, Protocol ) {} //______________________________________________________________________________ inline StreamSocket::StreamSocket( oslSocket socketHandle, __sal_NoAcquire noacquire ) : Socket( socketHandle, noacquire ) {} //______________________________________________________________________________ inline StreamSocket::StreamSocket( oslSocket socketHandle ) : Socket( socketHandle ) {} //______________________________________________________________________________ inline StreamSocket::StreamSocket( const StreamSocket & socket ) : Socket( socket ) {} //______________________________________________________________________________ inline sal_Int32 StreamSocket::read(void* pBuffer, sal_uInt32 n) { return osl_readSocket( m_handle, pBuffer, n ); } //______________________________________________________________________________ inline sal_Int32 StreamSocket::write(const void* pBuffer, sal_uInt32 n) { return osl_writeSocket( m_handle, pBuffer, n ); } //______________________________________________________________________________ inline sal_Int32 StreamSocket::recv(void* pBuffer, sal_uInt32 BytesToRead, oslSocketMsgFlag Flag) { return osl_receiveSocket( m_handle, pBuffer,BytesToRead, Flag ); } //______________________________________________________________________________ inline sal_Int32 StreamSocket::send(const void* pBuffer, sal_uInt32 BytesToSend, oslSocketMsgFlag Flag) { return osl_sendSocket( m_handle, pBuffer, BytesToSend, Flag ); } //______________________________________________________________________________ inline ConnectorSocket::ConnectorSocket(oslAddrFamily Family, oslProtocol Protocol, oslSocketType Type) : StreamSocket( Family, Protocol ,Type ) {} //______________________________________________________________________________ inline oslSocketResult ConnectorSocket::connect( const SocketAddr& TargetHost, const TimeValue* pTimeout ) { return osl_connectSocketTo( m_handle , TargetHost.getHandle(), pTimeout ); } //______________________________________________________________________________ inline AcceptorSocket::AcceptorSocket(oslAddrFamily Family , oslProtocol Protocol , oslSocketType Type ) : Socket( Type, Family, Protocol ) {} //______________________________________________________________________________ inline sal_Bool AcceptorSocket::listen(sal_Int32 MaxPendingConnections) { return osl_listenOnSocket( m_handle, MaxPendingConnections ); } //______________________________________________________________________________ inline oslSocketResult AcceptorSocket::acceptConnection( StreamSocket& Connection) { oslSocket o = osl_acceptConnectionOnSocket( m_handle, 0 ); oslSocketResult status = osl_Socket_Ok; if( o ) { Connection = StreamSocket( o , SAL_NO_ACQUIRE ); } else { Connection = StreamSocket(); status = osl_Socket_Error; } return status; } //______________________________________________________________________________ inline oslSocketResult AcceptorSocket::acceptConnection( StreamSocket& Connection, SocketAddr & PeerAddr) { // TODO change in/OUT parameter oslSocket o = osl_acceptConnectionOnSocket( m_handle, (oslSocketAddr *)&PeerAddr ); oslSocketResult status = osl_Socket_Ok; if( o ) { Connection = StreamSocket( o , SAL_NO_ACQUIRE ); } else { Connection = StreamSocket(); status = osl_Socket_Error; } return status; } //______________________________________________________________________________ inline DatagramSocket::DatagramSocket(oslAddrFamily Family, oslProtocol Protocol, oslSocketType Type) : Socket( Type, Family, Protocol ) {} //______________________________________________________________________________ inline sal_Int32 DatagramSocket::recvFrom(void* pBuffer, sal_uInt32 BufferSize, SocketAddr* pSenderAddr, oslSocketMsgFlag Flag ) { sal_Int32 nByteRead; if( pSenderAddr ) { // TODO : correct the out-parameter pSenderAddr outparameter nByteRead = osl_receiveFromSocket( m_handle, pSenderAddr->getHandle() , pBuffer, BufferSize, Flag); // nByteRead = osl_receiveFromSocket( m_handle, *(oslSocketAddr**) &pSenderAddr , pBuffer, // BufferSize, Flag); } else { nByteRead = osl_receiveFromSocket( m_handle, 0 , pBuffer , BufferSize , Flag ); } return nByteRead; } //______________________________________________________________________________ inline sal_Int32 DatagramSocket::sendTo( const SocketAddr& ReceiverAddr, const void* pBuffer, sal_uInt32 BufferSize, oslSocketMsgFlag Flag ) { return osl_sendToSocket( m_handle, ReceiverAddr.getHandle(), pBuffer, BufferSize, Flag ); } } #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */