/**************************************************************
 *
 * 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 occurred */
	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 occurred? */
		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 occurred */
	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 occurred? */
		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;
}
