blob: 44df28fca6c74869fbd9bee72a2c30908b451ca2 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <stdio.h>
#include <rtl/memory.h>
#include <osl/time.h>
#include <vos/socket.hxx>
#include <vos/diagnose.hxx>
//#include <osl/tools.h>
using namespace vos;
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OSocketAddr, vos),
VOS_NAMESPACE(OSocketAddr, vos),
VOS_NAMESPACE(OObject, vos), 0);
/*****************************************************************************/
// OSocketAddr()
/*****************************************************************************/
OSocketAddr::OSocketAddr()
{
m_SockAddr= 0;
}
/*****************************************************************************/
// OSocketAddr()
/*****************************************************************************/
OSocketAddr::OSocketAddr(oslSocketAddr Addr)
{
m_SockAddr= Addr;
}
/*****************************************************************************/
// OSocketAddr()
/*****************************************************************************/
OSocketAddr::OSocketAddr(const OSocketAddr& Addr) :
ISocketAddr(), OObject()
{
m_SockAddr= osl_copySocketAddr((oslSocketAddr)Addr);
}
/*****************************************************************************/
// ~OSocketAddr()
/*****************************************************************************/
OSocketAddr::~OSocketAddr()
{
osl_destroySocketAddr(m_SockAddr);
}
/*****************************************************************************/
// getFamily()
/*****************************************************************************/
OSocketAddr::TAddrFamily OSocketAddr::getFamily() const
{
return (TAddrFamily)osl_getFamilyOfSocketAddr(m_SockAddr);
}
/*****************************************************************************/
// operator oslSocketAddr ()
/*****************************************************************************/
OSocketAddr::operator oslSocketAddr() const
{
return m_SockAddr;
}
/*****************************************************************************/
// getHostname()
/*****************************************************************************/
OSocketAddr::TResult OSocketAddr::getHostname(rtl::OUString& rBuffer ) const
{
return (TResult)osl_getHostnameOfSocketAddr(m_SockAddr, &rBuffer.pData );
}
/*****************************************************************************/
// getLocalHostname()
/*****************************************************************************/
OSocketAddr::TResult OSocketAddr::getLocalHostname( rtl::OUString& pBuffer )
{
return (TResult)osl_getLocalHostname( &pBuffer.pData );
}
/*****************************************************************************/
// resolveHostname()
/*****************************************************************************/
oslSocketAddr OSocketAddr::resolveHostname(const rtl::OUString& ustrHostname)
{
return osl_resolveHostname( ustrHostname.pData );
}
/*****************************************************************************/
// operator= (oslSocketAddr Addr)
/*****************************************************************************/
void OSocketAddr::operator= (oslSocketAddr Addr)
{
if(m_SockAddr) {
osl_destroySocketAddr(m_SockAddr);
}
m_SockAddr= Addr;
}
/*****************************************************************************/
// operator== (oslSocketAddr Addr)
/*****************************************************************************/
sal_Bool OSocketAddr::operator== (oslSocketAddr Addr)
{
return (osl_isEqualSocketAddr(m_SockAddr, Addr));
}
/*****************************************************************************/
// operator=(const OSocketAddr& Addr)
/*****************************************************************************/
OSocketAddr& OSocketAddr::operator=(const OSocketAddr& Addr)
{
if(m_SockAddr) {
osl_destroySocketAddr(m_SockAddr);
}
m_SockAddr= osl_copySocketAddr((oslSocketAddr)Addr);
return *this;
}
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OInetSocketAddr, vos),
VOS_NAMESPACE(OInetSocketAddr, vos),
VOS_NAMESPACE(OSocketAddr, vos), 0);
/*****************************************************************************/
// OInetSocketAddr
// creates arbitrary inet-address (INADDR_ANY)
/*****************************************************************************/
OInetSocketAddr::OInetSocketAddr()
{
m_SockAddr= osl_createEmptySocketAddr(osl_Socket_FamilyInet);
}
/*****************************************************************************/
// OInetSocketAddr
// uses the given oslSocketAddr as its own
/*****************************************************************************/
OInetSocketAddr::OInetSocketAddr(oslSocketAddr Addr) :
OSocketAddr(Addr)
{
VOS_ASSERT(osl_getFamilyOfSocketAddr(Addr) == osl_Socket_FamilyInet);
}
/*****************************************************************************/
// OInetSocketAddr
// Create a socket address either from a dotted decimal address
//(e.g. 141.99.128.50) or a hostname (e.g. www.stardiv.de).
/*****************************************************************************/
OInetSocketAddr::OInetSocketAddr(const rtl::OUString& ustrAddrOrHostname, sal_Int32 Port)
{
// first try as dotted address.
m_SockAddr= osl_createInetSocketAddr(ustrAddrOrHostname.pData, Port);
// create failed, maybe it's an hostname
if(m_SockAddr == 0)
{
m_SockAddr= osl_resolveHostname(ustrAddrOrHostname.pData);
// host found?
if(m_SockAddr)
{
// set port will fail if addrtype is not osl_Socket_FamilyInet
VOS_VERIFY(osl_setInetPortOfSocketAddr(m_SockAddr, Port));
}
}
}
/*****************************************************************************/
// OInetSocketAddr(const OInetSocketAddr&)
/*****************************************************************************/
OInetSocketAddr::OInetSocketAddr(const OInetSocketAddr& sa) :
OSocketAddr(sa)
{
VOS_ASSERT(getFamily() == TFamily_Inet);
}
/*****************************************************************************/
// OInetSocketAddr(const OSocketAddr&)
/*****************************************************************************/
OInetSocketAddr::OInetSocketAddr(const OSocketAddr& sa) :
OSocketAddr(sa)
{
VOS_ASSERT(sa.getFamily() == TFamily_Inet);
}
/*****************************************************************************/
// ~OInetSocketAddr
/*****************************************************************************/
OInetSocketAddr::~OInetSocketAddr()
{
}
/*****************************************************************************/
// operator= (oslSocketAddr Addr)
/*****************************************************************************/
void OInetSocketAddr::operator= (oslSocketAddr Addr)
{
VOS_PRECOND(osl_getFamilyOfSocketAddr(Addr) == osl_Socket_FamilyInet,
"oslSocketAddr not of type osl_Socket_FamilyInet!");
OSocketAddr::operator=(Addr);
}
/*****************************************************************************/
// operator== (oslSocketAddr Addr)
/*****************************************************************************/
sal_Bool OInetSocketAddr::operator== (oslSocketAddr Addr)
{
return (osl_isEqualSocketAddr(m_SockAddr, Addr));
}
/*****************************************************************************/
// operator=(const OInetSocketAddr& Addr)
/*****************************************************************************/
OInetSocketAddr& OInetSocketAddr::operator=(const OInetSocketAddr& Addr)
{
VOS_ASSERT(Addr.getFamily() == TFamily_Inet);
OSocketAddr::operator=(Addr);
return *this;
}
/*****************************************************************************/
// operator=(const OSocketAddr& Addr)
/*****************************************************************************/
OInetSocketAddr& OInetSocketAddr::operator=(const OSocketAddr& Addr)
{
VOS_ASSERT(Addr.getFamily() == TFamily_Inet);
OSocketAddr::operator=(Addr);
return *this;
}
/*****************************************************************************/
// getServicePort()
/*****************************************************************************/
sal_Int32 OInetSocketAddr::getServicePort(const rtl::OUString& ustrServiceName,
const rtl::OUString& ustrProtocolName)
{
return osl_getServicePort(ustrServiceName.pData, ustrProtocolName.pData);
}
/*****************************************************************************/
// getPort()
/*****************************************************************************/
sal_Int32 OInetSocketAddr::getPort () const
{
return osl_getInetPortOfSocketAddr(m_SockAddr);
}
/*****************************************************************************/
// setPort()
/*****************************************************************************/
sal_Bool OInetSocketAddr::setPort (sal_Int32 Port)
{
return osl_setInetPortOfSocketAddr(m_SockAddr, Port);
}
/*****************************************************************************/
// getDottedAddr()
/*****************************************************************************/
OSocketAddr::TResult OInetSocketAddr::getDottedAddr( rtl::OUString& pBuffer ) const
{
return (TResult)osl_getDottedInetAddrOfSocketAddr(m_SockAddr, &pBuffer.pData );
}
/*****************************************************************************/
// setAddr()
/*****************************************************************************/
sal_Bool OInetSocketAddr::setAddr(const rtl::OUString& ustrAddrOrHostname)
{
sal_Int32 Port = 0;
if(m_SockAddr) {
// retrieve old port
Port= getPort();
// free old address
osl_destroySocketAddr(m_SockAddr);
m_SockAddr= 0;
}
// first try as dotted address.
m_SockAddr= osl_createInetSocketAddr(ustrAddrOrHostname.pData, Port);
// create failed, maybe it's an hostname
if(m_SockAddr == 0)
{
m_SockAddr= osl_resolveHostname( ustrAddrOrHostname.pData );
// host found?
if(m_SockAddr==0)
{
return sal_False;
}
// set port will fail if addrtype is not osl_Socket_FamilyInet
VOS_VERIFY(osl_setInetPortOfSocketAddr(m_SockAddr, Port));
}
return sal_True;
}
///////////////////////////////////////////////////////////////////////////////
// OIpxSocketAddr
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OIpxSocketAddr, vos),
VOS_NAMESPACE(OIpxSocketAddr, vos),
VOS_NAMESPACE(OSocketAddr, vos), 0);
/*****************************************************************************/
// OIpxSocketAddr()
/*****************************************************************************/
OIpxSocketAddr::OIpxSocketAddr()
{
m_SockAddr= osl_createEmptySocketAddr(osl_Socket_FamilyIpx);
}
/*****************************************************************************/
// OIpxSocketAddr(oslSocketAddr)
/*****************************************************************************/
OIpxSocketAddr::OIpxSocketAddr(oslSocketAddr Addr) :
OSocketAddr(Addr)
{
VOS_ASSERT(osl_getFamilyOfSocketAddr(Addr) == osl_Socket_FamilyIpx);
}
/*****************************************************************************/
// OIpxSocketAddr()
/*****************************************************************************/
OIpxSocketAddr::OIpxSocketAddr(const rtl::OUString&,
const rtl::OUString&,
sal_uInt32 )
{
// jbu : functionality removed from vos
}
/*****************************************************************************/
// OIpxSocketAddr(OIpxSocketAddr&)
/*****************************************************************************/
OIpxSocketAddr::OIpxSocketAddr(const OIpxSocketAddr& sa) :
OSocketAddr(sa)
{
VOS_ASSERT(sa.getFamily() == TFamily_Ipx);
}
/*****************************************************************************/
// OIpxSocketAddr(OSocketAddr&)
/*****************************************************************************/
OIpxSocketAddr::OIpxSocketAddr(const OSocketAddr& sa) :
OSocketAddr(sa)
{
VOS_ASSERT(sa.getFamily() == TFamily_Ipx);
}
/*****************************************************************************/
// ~OIpxSocketAddr()
/*****************************************************************************/
OIpxSocketAddr::~OIpxSocketAddr()
{
}
/*****************************************************************************/
// operator=()
/*****************************************************************************/
void OIpxSocketAddr::operator= (oslSocketAddr Addr)
{
VOS_PRECOND(osl_getFamilyOfSocketAddr(Addr) == osl_Socket_FamilyIpx,
"oslSocketAddr not of type osl_Socket_FamilyIpx!");
OSocketAddr::operator=(Addr);
}
/*****************************************************************************/
// operator== (oslSocketAddr Addr)
/*****************************************************************************/
sal_Bool OIpxSocketAddr::operator== (oslSocketAddr Addr)
{
return (osl_isEqualSocketAddr(m_SockAddr, Addr));
}
/*****************************************************************************/
// operator=(const OIpxSocketAddr& Addr)
/*****************************************************************************/
OIpxSocketAddr& OIpxSocketAddr::operator=(const OIpxSocketAddr& Addr)
{
VOS_ASSERT(Addr.getFamily() == TFamily_Ipx);
OSocketAddr::operator=(Addr);
return *this;
}
/*****************************************************************************/
// operator=(const OSocketAddr& Addr)
/*****************************************************************************/
OIpxSocketAddr& OIpxSocketAddr::operator=(const OSocketAddr& Addr)
{
VOS_ASSERT(Addr.getFamily() == TFamily_Ipx);
OSocketAddr::operator=(Addr);
return *this;
}
/*****************************************************************************/
// getNetNumber()
/*****************************************************************************/
OSocketAddr::TResult OIpxSocketAddr::getNetNumber(TIpxNetNumber&) const
{
// jbu : functionality removed from vos
return (TResult)0;
}
/*****************************************************************************/
// getNodeNumber()
/*****************************************************************************/
OSocketAddr::TResult OIpxSocketAddr::getNodeNumber(TIpxNodeNumber& ) const
{
// jbu : functionality removed from vos
return (TResult)0;
}
/*****************************************************************************/
// getSocketNumber()
/*****************************************************************************/
sal_uInt32 OIpxSocketAddr::getSocketNumber() const
{
// return osl_getIpxSocketNumber(m_SockAddr);
return (TResult)0;
}
/*****************************************************************************/
// getAddressString()
/*****************************************************************************/
//void OIpxSocketAddr::getAddressString(sal_Char* Buffer, sal_uInt32 Len) const
void OIpxSocketAddr::getAddressString( rtl::OUString& ) const
{
// jbu : functionality removed from vos
}
///////////////////////////////////////////////////////////////////////////////
// Socket
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OSocket, vos),
VOS_NAMESPACE(OSocket, vos),
VOS_NAMESPACE(OObject, vos), 0);
/*****************************************************************************/
// OSocket()
/*****************************************************************************/
OSocket::OSocket()
{
m_pRecvTimeout = 0;
m_pSendTimeout = 0;
m_pSockRef= 0;
}
/*****************************************************************************/
// OSocket()
/*****************************************************************************/
OSocket::OSocket(TSocketType Type,
TAddrFamily Family,
TProtocol Protocol)
{
m_pRecvTimeout = 0;
m_pSendTimeout = 0;
m_pSockRef=
new SockRef(osl_createSocket((oslAddrFamily)Family,
(oslSocketType)Type,
(oslProtocol)Protocol));
VOS_POSTCOND(m_pSockRef != 0, "OSocket(): new failed.\n");
VOS_POSTCOND((*m_pSockRef)(), "OSocket(): creation of socket failed!\n");
}
/*****************************************************************************/
// OSocket()
/*****************************************************************************/
OSocket::OSocket(const OSocket& sock) :
ISocketTypes(), OReference(), OObject()
{
m_pRecvTimeout = 0;
m_pSendTimeout = 0;
m_pSockRef=0;
VOS_ASSERT(sock.m_pSockRef != 0);
if ( sock.m_pSockRef !=0 )
{
m_pSockRef= sock.m_pSockRef;
setRecvTimeout(sock.m_pRecvTimeout);
setSendTimeout(sock.m_pSendTimeout);
m_pSockRef->acquire();
}
}
/*****************************************************************************/
// OSocket()
/*****************************************************************************/
OSocket::OSocket(oslSocket Socket)
{
m_pRecvTimeout = 0;
m_pSendTimeout = 0;
m_pSockRef = new SockRef(Socket);
}
/*****************************************************************************/
// ~OSocket()
/*****************************************************************************/
OSocket::~OSocket()
{
close();
delete m_pRecvTimeout;
delete m_pSendTimeout;
}
/*****************************************************************************/
// create
/*****************************************************************************/
sal_Bool OSocket::create(TSocketType Type,
TAddrFamily Family,
TProtocol Protocol)
{
// if this was a valid socket, decrease reference
if ((m_pSockRef) && (m_pSockRef->release() == 0))
{
osl_releaseSocket((*m_pSockRef)());
delete m_pSockRef;
m_pSockRef= 0;
}
m_pSockRef=
new SockRef(osl_createSocket((oslAddrFamily)Family,
(oslSocketType)Type,
(oslProtocol)Protocol));
VOS_POSTCOND(m_pSockRef != 0, "OSocket(): new failed.\n");
return (*m_pSockRef)() != 0;
}
/*****************************************************************************/
// operator=
/*****************************************************************************/
OSocket& OSocket::operator= (const OSocket& sock)
{
VOS_PRECOND(sock.m_pSockRef != 0, "OSocket::operator=: tried to assign an empty/invalid socket\n");
if (m_pSockRef == sock.m_pSockRef)
return *this;
// if this was a valid socket, decrease reference
if ((m_pSockRef) && (m_pSockRef->release() == 0))
{
osl_releaseSocket((*m_pSockRef)());
delete m_pSockRef;
m_pSockRef= 0;
}
m_pSockRef= sock.m_pSockRef;
setRecvTimeout(sock.m_pRecvTimeout);
setSendTimeout(sock.m_pSendTimeout);
m_pSockRef->acquire();
return *this;
}
/*****************************************************************************/
// operator oslSocket()
/*****************************************************************************/
OSocket::operator oslSocket() const
{
VOS_ASSERT(m_pSockRef);
return (*m_pSockRef)();
}
/*****************************************************************************/
// isValid()
/*****************************************************************************/
sal_Bool OSocket::isValid() const
{
return m_pSockRef != 0 && (*m_pSockRef)() != 0;
}
/*****************************************************************************/
// close
/*****************************************************************************/
void OSocket::close()
{
if (m_pSockRef && (*m_pSockRef)() && (m_pSockRef->release() == 0))
{
osl_releaseSocket((*m_pSockRef)());
delete m_pSockRef;
}
m_pSockRef= 0;
}
/*****************************************************************************/
// getLocalAddr
/*****************************************************************************/
void OSocket::getLocalAddr(OSocketAddr& sa) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
sa= osl_getLocalAddrOfSocket((*m_pSockRef)());
}
}
/*****************************************************************************/
// getLocalPort
/*****************************************************************************/
sal_Int32 OSocket::getLocalPort() const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
sal_Int32 Port= OSL_INVALID_PORT;
if ( m_pSockRef && (*m_pSockRef)() )
{
oslSocketAddr Addr= osl_getLocalAddrOfSocket((*m_pSockRef)());
if(Addr)
{
Port= osl_getInetPortOfSocketAddr(Addr);
osl_destroySocketAddr(Addr);
}
}
return Port;
}
/*****************************************************************************/
// getLocalHost
/*****************************************************************************/
OSocket::TResult OSocket::getLocalHost( rtl::OUString& pBuffer) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
oslSocketAddr Addr= osl_getLocalAddrOfSocket((*m_pSockRef)());
if(Addr)
{
// TResult Result= (TResult)osl_getHostnameOfSocketAddr(Addr,
// pBuffer, BufferSize);
TResult Result= (TResult)osl_getHostnameOfSocketAddr(Addr,
&pBuffer.pData );
osl_destroySocketAddr(Addr);
return Result;
}
}
return TResult_Error;
}
/*****************************************************************************/
// getPeerAddr
/*****************************************************************************/
void OSocket::getPeerAddr(OSocketAddr& sa) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
sa= osl_getPeerAddrOfSocket((*m_pSockRef)());
}
}
/*****************************************************************************/
// getPeerPort
/*****************************************************************************/
sal_Int32 OSocket::getPeerPort() const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
sal_Int32 Port= OSL_INVALID_PORT;
if ( m_pSockRef && (*m_pSockRef)() )
{
oslSocketAddr Addr= osl_getPeerAddrOfSocket((*m_pSockRef)());
if(Addr)
{
Port= osl_getInetPortOfSocketAddr(Addr);
osl_destroySocketAddr(Addr);
}
}
return Port;
}
/*****************************************************************************/
// getPeerHost
/*****************************************************************************/
OSocket::TResult OSocket::getPeerHost( rtl::OUString& pBuffer ) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
oslSocketAddr Addr= osl_getPeerAddrOfSocket((*m_pSockRef)());
if(Addr)
{
// TResult Result= (TResult)osl_getHostnameOfSocketAddr(Addr,
// pBuffer, BufferSize);
TResult Result= (TResult)osl_getHostnameOfSocketAddr(Addr,
&pBuffer.pData );
osl_destroySocketAddr(Addr);
return Result;
}
}
return TResult_Error;
}
/*****************************************************************************/
// bind
/*****************************************************************************/
sal_Bool OSocket::bind(const OSocketAddr& Addr)
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_bindAddrToSocket((*m_pSockRef)(), (oslSocketAddr)Addr);
}
return sal_False;
}
/*****************************************************************************/
// setSendTimeout
/*****************************************************************************/
void OSocket::setSendTimeout(const TimeValue* pTimeout)
{
delete m_pSendTimeout;
if (pTimeout)
m_pSendTimeout = new TimeValue(*pTimeout);
else
m_pSendTimeout = 0;
}
/*****************************************************************************/
// setRecvTimeout
/*****************************************************************************/
void OSocket::setRecvTimeout(const TimeValue* pTimeout)
{
delete m_pRecvTimeout;
if (pTimeout)
m_pRecvTimeout = new TimeValue(*pTimeout);
else
m_pRecvTimeout = 0;
}
/*****************************************************************************/
// isRecvReady
/*****************************************************************************/
sal_Bool OSocket::isRecvReady(const TimeValue* pTimeout) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_isReceiveReady((*m_pSockRef)(), pTimeout);
}
return sal_False;
}
/*****************************************************************************/
// isSendReady
/*****************************************************************************/
sal_Bool OSocket::isSendReady(const TimeValue* pTimeout) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_isSendReady((*m_pSockRef)(), pTimeout);
}
return sal_False;
}
/*****************************************************************************/
// isExceptionPending
/*****************************************************************************/
sal_Bool OSocket::isExceptionPending(const TimeValue* pTimeout) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_isExceptionPending((*m_pSockRef)(), pTimeout);
}
return sal_False;
}
/*****************************************************************************/
// getOption
/*****************************************************************************/
sal_Int32 OSocket::getOption(TSocketOption Option,
void* pBuffer,
sal_uInt32 BufferLen,
TSocketOptionLevel Level) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_getSocketOption((*m_pSockRef)(),
(oslSocketOptionLevel)Level,
(oslSocketOption)Option,
pBuffer,
BufferLen);
}
return sal_False;
}
/*****************************************************************************/
// setOption
/*****************************************************************************/
sal_Bool OSocket::setOption(TSocketOption Option,
void* pBuffer,
sal_uInt32 BufferLen,
TSocketOptionLevel Level) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_setSocketOption((*m_pSockRef)(),
(oslSocketOptionLevel)Level,
(oslSocketOption)Option,
pBuffer,
BufferLen);
}
return sal_False;
}
/*****************************************************************************/
// enableNonBlockingMode
/*****************************************************************************/
sal_Bool OSocket::enableNonBlockingMode(sal_Bool On)
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_enableNonBlockingMode((*m_pSockRef)(), On);
}
return sal_False;
}
/*****************************************************************************/
// isNonBlockingMode
/*****************************************************************************/
sal_Bool OSocket::isNonBlockingMode() const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_isNonBlockingMode((*m_pSockRef)());
}
return sal_False;
}
/*****************************************************************************/
// getType
/*****************************************************************************/
OSocket::TSocketType OSocket::getType() const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return (TSocketType)osl_getSocketType((*m_pSockRef)());
}
return TType_Invalid;
}
/*****************************************************************************/
// clearError
/*****************************************************************************/
sal_Int32 OSocket::clearError() const
{
sal_Int32 err = 0;
getOption(TOption_Error, &err, sizeof(err));
return err;
}
/*****************************************************************************/
// setDebug
/*****************************************************************************/
sal_Int32 OSocket::setDebug(sal_Int32 opt) const
{
sal_Int32 old= 0;
getOption(TOption_Debug, &old, sizeof(old));
if (opt != -1)
setOption(TOption_Debug, &opt, sizeof(opt));
return old;
}
/*****************************************************************************/
// setReuseAddr
/*****************************************************************************/
sal_Int32 OSocket::setReuseAddr(sal_Int32 opt) const
{
sal_Int32 old = 0;
getOption(TOption_ReuseAddr, &old, sizeof(old));
if (opt != -1)
setOption(TOption_ReuseAddr, &opt, sizeof(opt));
return (old);
}
/*****************************************************************************/
// setKeepAlive
/*****************************************************************************/
sal_Int32 OSocket::setKeepAlive(sal_Int32 opt) const
{
sal_Int32 old = 0;
getOption(TOption_KeepAlive, &old, sizeof(old));
if (opt != -1)
setOption(TOption_KeepAlive, &opt, sizeof(opt));
return (old);
}
/*****************************************************************************/
// setDontRoute
/*****************************************************************************/
sal_Int32 OSocket::setDontRoute(sal_Int32 opt) const
{
sal_Int32 old = 0;
getOption(TOption_DontRoute, &old, sizeof(old));
if (opt != -1)
setOption(TOption_DontRoute, &opt, sizeof(opt));
return (old);
}
/*****************************************************************************/
// setBroadcast
/*****************************************************************************/
sal_Int32 OSocket::setBroadcast(sal_Int32 opt) const
{
sal_Int32 old = 0;
getOption(TOption_Broadcast, &old, sizeof(old));
if (opt != -1)
setOption(TOption_Broadcast, &opt, sizeof(opt));
return (old);
}
/*****************************************************************************/
// setOobinline
/*****************************************************************************/
sal_Int32 OSocket::setOobinline(sal_Int32 opt) const
{
sal_Int32 old = 0;
getOption(TOption_OOBinLine, &old, sizeof(old));
if (opt != -1)
setOption(TOption_OOBinLine, &opt, sizeof(opt));
return (old);
}
/*****************************************************************************/
// setLinger
/*****************************************************************************/
sal_Int32 OSocket::setLinger(sal_Int32 time) const
{
/* local decl. of linger-struct */
struct SockLinger
{
sal_Int32 m_onoff; // option on/off
sal_Int32 m_linger; // linger time
};
SockLinger old = { 0, 0 };
getOption(TOption_Linger, &old, sizeof(old));
if (time > 0) // enable linger with wait-times > 0
{
SockLinger nw = { 1, time };
setOption(TOption_Linger, &nw, sizeof(nw));
}
else if (time == 0) // disable linger with wait-time == 0
{
SockLinger nw = { 0, old.m_linger };
setOption(TOption_Linger, &nw, sizeof(nw));
}
// returns 0 if linger was off, else the linger-time
return (old.m_onoff ? old.m_linger : 0);
}
/*****************************************************************************/
// setSendBufSize
/*****************************************************************************/
sal_Int32 OSocket::setSendBufSize(sal_Int32 sz) const
{
sal_Int32 old = 0;
getOption(TOption_SndBuf, &old, sizeof(old));
if (sz >= 0)
setOption(TOption_SndBuf, &sz, sizeof(sz));
return (old);
}
/*****************************************************************************/
// setRecvBufSize
/*****************************************************************************/
sal_Int32 OSocket::setRecvBufSize(sal_Int32 sz) const
{
sal_Int32 old = 0;
getOption(TOption_RcvBuf, &old, sizeof(old));
if (sz >= 0)
setOption(TOption_RcvBuf, &sz, sizeof(sz));
return (old);
}
/*****************************************************************************/
// setTcpNoDelay
/*****************************************************************************/
sal_Int32 OSocket::setTcpNoDelay(sal_Int32 sz) const
{
sal_Int32 old = 0;
getOption(TOption_TcpNoDelay, &old, sizeof(old), TLevel_Tcp);
if (sz >= 0)
setOption(TOption_TcpNoDelay, &sz, sizeof(sz), TLevel_Tcp);
return (old);
}
/*****************************************************************************/
// getError
/*****************************************************************************/
//void OSocket::getError(sal_Char* pBuffer, sal_uInt32 nSize) const
void OSocket::getError( rtl::OUString& pBuffer ) const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if (m_pSockRef && (*m_pSockRef)())
osl_getLastSocketErrorDescription((*m_pSockRef)(), &pBuffer.pData );
else
osl_getLastSocketErrorDescription(NULL, &pBuffer.pData );
}
/*****************************************************************************/
// getError
/*****************************************************************************/
OSocket::TSocketError OSocket::getError() const
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if (m_pSockRef && (*m_pSockRef)())
return (TSocketError)osl_getLastSocketError((*m_pSockRef)());
else
return (TSocketError)osl_getLastSocketError(NULL);
}
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OAcceptorSocket, vos),
VOS_NAMESPACE(OAcceptorSocket, vos),
VOS_NAMESPACE(OSocket, vos), 0);
/*****************************************************************************/
// OAcceptorSocket
/*****************************************************************************/
OAcceptorSocket::OAcceptorSocket(TAddrFamily Family,
TProtocol Protocol,
TSocketType Type) :
OSocket(Type, Family, Protocol)
{
}
/*****************************************************************************/
// OAcceptorSocket
/*****************************************************************************/
OAcceptorSocket::OAcceptorSocket(const OAcceptorSocket& sock) :
OSocket(sock)
{
}
/*****************************************************************************/
// ~OAcceptorSocket
/*****************************************************************************/
OAcceptorSocket::~OAcceptorSocket()
{
if (m_pSockRef && (*m_pSockRef)() && (m_pSockRef->release() == 0))
{
/* mfe: prepare for forthcoming api change */
osl_closeSocket((*m_pSockRef)());
osl_releaseSocket((*m_pSockRef)());
delete m_pSockRef;
m_pSockRef = 0;
}
}
/*****************************************************************************/
// close
/*****************************************************************************/
void OAcceptorSocket::close()
{
if (m_pSockRef && (*m_pSockRef)() && (m_pSockRef->release() == 0))
{
osl_closeSocket((*m_pSockRef)());
}
m_pSockRef= 0;
}
/*****************************************************************************/
// listen
/*****************************************************************************/
sal_Bool OAcceptorSocket::listen(sal_Int32 MaxPendingConnections)
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_listenOnSocket((*m_pSockRef)(), MaxPendingConnections);
}
return sal_False;
}
/*****************************************************************************/
// acceptConnection
/*****************************************************************************/
OSocket::TResult OAcceptorSocket::acceptConnection(OStreamSocket& connection)
{
if (m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
return TResult_TimedOut;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
OStreamSocket aSocket;
if ( m_pSockRef && (*m_pSockRef)() )
{
aSocket = osl_acceptConnectionOnSocket((*m_pSockRef)(), 0);
}
if( aSocket.isValid() )
{
connection = aSocket;
return TResult_Ok;
}
else
{
return TResult_Error;
}
}
/*****************************************************************************/
// acceptConnection
/*****************************************************************************/
OSocket::TResult OAcceptorSocket::acceptConnection(OStreamSocket& connection,
OSocketAddr& sa)
{
oslSocketAddr PeerAddr = 0;
oslSocket Socket = 0;
if (m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
return TResult_TimedOut;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
Socket= osl_acceptConnectionOnSocket((*m_pSockRef)(), &PeerAddr);
}
if (Socket)
{
sa= PeerAddr;
connection= Socket;
return TResult_Ok;
}
else
{
return TResult_Error;
}
}
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OStreamSocket, vos),
VOS_NAMESPACE(OStreamSocket, vos),
VOS_NAMESPACE(OSocket, vos), 0);
/*****************************************************************************/
// OStreamSocket
/*****************************************************************************/
OStreamSocket::OStreamSocket()
{
}
/*****************************************************************************/
// OStreamSocket
/*****************************************************************************/
OStreamSocket::OStreamSocket(TAddrFamily Family,
TProtocol Protocol,
TSocketType Type) :
OSocket(Type, Family, Protocol)
{
}
/*****************************************************************************/
// OStreamSocket
/*****************************************************************************/
OStreamSocket::OStreamSocket(oslSocket Socket) :
OSocket(Socket)
{
}
/*****************************************************************************/
// OStreamSocket
// copy constructor
/*****************************************************************************/
OStreamSocket::OStreamSocket(const OStreamSocket& sock) :
OSocket(sock), IStream()
{
}
/*****************************************************************************/
// OStreamSocket
// copy constructor
/*****************************************************************************/
OStreamSocket::OStreamSocket(const OSocket& sock) :
OSocket(sock)
{
}
/*****************************************************************************/
// ~OStreamSocket
/*****************************************************************************/
OStreamSocket::~OStreamSocket()
{
}
/*****************************************************************************/
// close
/*****************************************************************************/
void OStreamSocket::close()
{
if (m_pSockRef && (*m_pSockRef)() && (m_pSockRef->release() == 0))
{
shutdown();
osl_releaseSocket((*m_pSockRef)());
delete m_pSockRef;
}
m_pSockRef= 0;
}
/*****************************************************************************/
// operator=(oslSocket)
/*****************************************************************************/
OStreamSocket& OStreamSocket::operator=(oslSocket Socket)
{
OSocket::operator=(Socket);
return *this;
}
/*****************************************************************************/
// operator=
/*****************************************************************************/
OStreamSocket& OStreamSocket::operator= (const OSocket& sock)
{
OSocket::operator=(sock);
return *this;
}
/*****************************************************************************/
// operator=
/*****************************************************************************/
OStreamSocket& OStreamSocket::operator= (const OStreamSocket& sock)
{
OSocket::operator=(sock);
return *this;
}
/*****************************************************************************/
// read
/*****************************************************************************/
sal_Int32 OStreamSocket::read(void* pBuffer, sal_uInt32 n) const
{
sal_uInt8 *Ptr = (sal_uInt8 *)pBuffer;
if (m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ! ( m_pSockRef && (*m_pSockRef)() ) )
{
return -1;
}
/* loop until all desired bytes were read or an error occured */
sal_uInt32 BytesRead= 0;
sal_uInt32 BytesToRead= n;
while (BytesToRead > 0)
{
sal_Int32 RetVal;
RetVal= osl_receiveSocket((*m_pSockRef)(),
Ptr,
BytesToRead,
osl_Socket_MsgNormal);
/* error occured? */
if(RetVal <= 0)
{
break;
}
BytesToRead -= RetVal;
BytesRead += RetVal;
Ptr += RetVal;
/* wait for next available data or timeout */
if ( BytesToRead > 0 && m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
break;
}
return BytesRead;
}
/*****************************************************************************/
// write
/*****************************************************************************/
sal_Int32 OStreamSocket::write(const void* pBuffer, sal_uInt32 n)
{
sal_uInt8 *Ptr = (sal_uInt8 *)pBuffer;
if (m_pSendTimeout && ! isSendReady(m_pSendTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ! ( m_pSockRef && (*m_pSockRef)() ) )
{
return -1;
}
/* loop until all desired bytes were send or an error occured */
sal_uInt32 BytesSend= 0;
sal_uInt32 BytesToSend= n;
while (BytesToSend > 0)
{
sal_Int32 RetVal;
RetVal= osl_sendSocket((*m_pSockRef)(),
Ptr,
BytesToSend,
osl_Socket_MsgNormal);
/* error occured? */
if(RetVal <= 0)
{
break;
}
BytesToSend -= RetVal;
BytesSend += RetVal;
Ptr += RetVal;
/* wait till new data is available or timeout occures */
if ( BytesToSend > 0 && m_pSendTimeout && ! isSendReady(m_pSendTimeout))
break;
}
return BytesSend;
}
sal_Bool OStreamSocket::isEof() const
{
return isValid();
// BHO not enough
}
/*****************************************************************************/
// recv
/*****************************************************************************/
sal_Int32 OStreamSocket::recv(void* pBuffer,
sal_uInt32 BytesToRead,
TSocketMsgFlag Flag)
{
if (m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ! ( m_pSockRef && (*m_pSockRef)() ) )
{
return -1;
}
return osl_receiveSocket((*m_pSockRef)(),
pBuffer,
BytesToRead,
(oslSocketMsgFlag)Flag);
}
/*****************************************************************************/
// send
/*****************************************************************************/
sal_Int32 OStreamSocket::send(const void* pBuffer,
sal_uInt32 BytesToSend,
TSocketMsgFlag Flag)
{
if (m_pSendTimeout && ! isSendReady(m_pSendTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ! ( m_pSockRef && (*m_pSockRef)() ) )
{
return -1;
}
return osl_sendSocket((*m_pSockRef)(),
pBuffer,
BytesToSend,
(oslSocketMsgFlag)Flag);
}
/*****************************************************************************/
// shutdown
/*****************************************************************************/
sal_Bool OStreamSocket::shutdown(TSocketDirection Direction)
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return osl_shutdownSocket((*m_pSockRef)(), (oslSocketDirection)Direction);
}
return sal_False;
}
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(OConnectorSocket, vos),
VOS_NAMESPACE(OConnectorSocket, vos),
VOS_NAMESPACE(OStreamSocket, vos), 0);
/*****************************************************************************/
// OConnectorSocket
/*****************************************************************************/
OConnectorSocket::OConnectorSocket(TAddrFamily Family,
TProtocol Protocol,
TSocketType Type) :
OStreamSocket(Family, Protocol, Type)
{
}
/*****************************************************************************/
// OConnectorSocket
/*****************************************************************************/
OConnectorSocket::OConnectorSocket(const OConnectorSocket& sock) :
OStreamSocket(sock)
{
}
/*****************************************************************************/
// ~OConnectorSocket
/*****************************************************************************/
OConnectorSocket::~OConnectorSocket()
{
}
/*****************************************************************************/
// connect
/*****************************************************************************/
OSocket::TResult OConnectorSocket::connect(const OSocketAddr& Addr,
const TimeValue* pTimeout)
{
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( m_pSockRef && (*m_pSockRef)() )
{
return (TResult)osl_connectSocketTo((*m_pSockRef)(),
(oslSocketAddr)Addr,
pTimeout);
}
return TResult_Error;
}
VOS_IMPLEMENT_CLASSINFO(VOS_CLASSNAME(ODatagramSocket, vos),
VOS_NAMESPACE(ODatagramSocket, vos),
VOS_NAMESPACE(OSocket, vos), 0);
/*****************************************************************************/
// ODatagramSocket
/*****************************************************************************/
ODatagramSocket::ODatagramSocket(TAddrFamily Family,
TProtocol Protocol,
TSocketType Type) :
OSocket(Type, Family, Protocol)
{
}
/*****************************************************************************/
// ODatagramSocket
/*****************************************************************************/
ODatagramSocket::ODatagramSocket(const ODatagramSocket& sock) :
OSocket(sock)
{
}
/*****************************************************************************/
// ~ODatagramSocket
/*****************************************************************************/
ODatagramSocket::~ODatagramSocket()
{
}
/*****************************************************************************/
// recvFrom
/*****************************************************************************/
sal_Int32 ODatagramSocket::recvFrom(void* pBuffer,
sal_uInt32 BufferSize,
OSocketAddr* pSenderAddr,
TSocketMsgFlag Flag)
{
if (m_pRecvTimeout && ! isRecvReady(m_pRecvTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ! ( m_pSockRef && (*m_pSockRef)() ) )
{
return -1;
}
sal_Int32 BytesRead;
if(pSenderAddr)
{
// we are interested in the senders address
oslSocketAddr SenderAddr= osl_createEmptySocketAddr(osl_Socket_FamilyInet);
BytesRead=
osl_receiveFromSocket((*m_pSockRef)(),
SenderAddr,
pBuffer,
BufferSize,
(oslSocketMsgFlag)Flag);
*pSenderAddr= SenderAddr;
}
else
{
// we don't want to know the senders address
BytesRead=
osl_receiveFromSocket((*m_pSockRef)(),
0,
pBuffer,
BufferSize,
(oslSocketMsgFlag)Flag);
}
return BytesRead;
}
/*****************************************************************************/
// sendTo
/*****************************************************************************/
sal_Int32 ODatagramSocket::sendTo(const OSocketAddr& ReceiverAddr,
const void* pBuffer,
sal_uInt32 BufferSize,
TSocketMsgFlag Flag)
{
if (m_pSendTimeout && ! isSendReady(m_pSendTimeout))
return 0;
VOS_ASSERT(m_pSockRef && (*m_pSockRef)());
if ( ( m_pSockRef && (*m_pSockRef)() ) )
{
return osl_sendToSocket((*m_pSockRef)(),
(oslSocketAddr)ReceiverAddr,
pBuffer,
BufferSize,
(oslSocketMsgFlag)Flag);
}
return -1;
}