⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hxsymbiantcpsock.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        return m_lRefCount;    }    delete this;    return 0;}    /*     *	IHXTCPSocket methods     *     *  Network addresses and ports are in native byte order     *     */STDMETHODIMP HXSymbianTCPSocket::Init(THIS_				      IHXTCPResponse* /*IN*/ pTCPResponse){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::Init()\n"));    HX_RELEASE(m_pResponse);    m_pResponse = pTCPResponse;    if (m_pResponse)	m_pResponse->AddRef();    return (m_pResponse) ? HXR_OK : HXR_FAILED;}STDMETHODIMP HXSymbianTCPSocket::SetResponse(THIS_					     IHXTCPResponse* pTCPResponse){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::SetResponse()\n"));    HX_RELEASE(m_pResponse);    m_pResponse = pTCPResponse;    if (m_pResponse)	m_pResponse->AddRef();    return (m_pResponse) ? HXR_OK : HXR_FAILED;}STDMETHODIMP HXSymbianTCPSocket::Bind(THIS_				      UINT32 ulLocalAddr,				      UINT16 nPort){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::Bind(%08lx, %u)\n",			  ulLocalAddr, nPort));    HX_RESULT res = HXR_FAILED;    TInetAddr addr(ulLocalAddr, nPort);    if ((m_state == tcpInitialized) &&	(m_socket.Bind(addr) == KErrNone))    {	m_state = tcpBound;	res = HXR_OK;    }    return res;}    /*     * pDestination is a string containing host name or dotted-ip notation     */STDMETHODIMP HXSymbianTCPSocket::Connect(THIS_					 const char* pDestination,					 UINT16 nPort){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::Connect('%s', %u)\n",			  pDestination, nPort));    HX_RESULT res = HXR_FAILED;    if (m_state == tcpInitialized)	Bind(0, 0);    if (m_state == tcpBound)    {	m_state = tcpResolving;	m_nConnectPort = nPort;	res = m_pResolver->GetHostByName(pDestination);	if (HXR_OK != res)	{	    m_state = tcpBound;	}    }    return res;}STDMETHODIMP HXSymbianTCPSocket::Read(THIS_ UINT16 Size){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::Read(%u)\n", Size));    HX_RESULT res = HXR_FAILED;    HX_ASSERT(m_state == tcpConnected);    if ((m_state == tcpConnected) && (!m_pReader->IsActive()))    {	res = DoRead(Size);    }    return res;}STDMETHODIMP HXSymbianTCPSocket::Write(THIS_ IHXBuffer*	pBuffer){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::Write()\n"));    HX_RESULT res = HXR_FAILED;    HX_ASSERT(m_state == tcpConnected);    if ((m_state == tcpConnected) && pBuffer)    {	if (m_pWriter->IsActive())	{	    // A write is in progress. Add the buffer	    // to the write list	    pBuffer->AddRef();	    LISTPOSITION listRet = m_writeList.AddTail(pBuffer);            if( listRet == NULL )            {                res = HXR_OUTOFMEMORY;                HX_RELEASE(pBuffer);            }	}	else	{	    // Do the write now	    m_pWriter->Write(m_socket, pBuffer);	}	res = HXR_OK;    }    return res;}    /************************************************************************     *	Method:     *	    IHXTCPSocket::WantWrite     *	Purpose:     *	    This method is called when you wish to write a large amount of     *	    data.  If you are only writing small amounts of data, you can     *	    just call Write (all data not ready to be transmitted will be     *	    buffered on your behalf).  When the TCP channel is ready to be     *	    written to, the response interfaces WriteReady method will be     *	    called.     */STDMETHODIMP HXSymbianTCPSocket::WantWrite(THIS){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::WantWrite()\n"));    m_bWantWrite = TRUE;    return HXR_OK;}    /************************************************************************     *	Method:     *	    IHXTCPSocket::GetForeignAddress     *	Purpose:     *	    Returns the address of the other end of the TCP socket as a     *	    ULONG32 in local host order     */STDMETHODIMP HXSymbianTCPSocket::GetForeignAddress(THIS_ REF(ULONG32) lAddress){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::GetForeignAddress()\n"));    HX_RESULT res = HXR_FAILED;    if (m_state == tcpConnected)    {	TInetAddr addr;	m_socket.RemoteName(addr);	lAddress = (ULONG32)addr.Address();	res = HXR_OK;    }    return res;}STDMETHODIMP HXSymbianTCPSocket::GetLocalAddress(THIS_ REF(ULONG32) lAddress){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::GetLocalAddress()\n"));    HX_RESULT res = HXR_FAILED;    if ((m_state != tcpNotInitialized) &&	(m_state != tcpInitialized))    {	TInetAddr addr;	m_socket.LocalName(addr);	lAddress = (ULONG32)addr.Address();	res = HXR_OK;    }    return res;}    /************************************************************************     *	Method:     *	    IHXTCPSocket::GetForeignPort     *	Purpose:     *	    Returns the port of the other end of the TCP socket in local     *      host order.     */STDMETHODIMP HXSymbianTCPSocket::GetForeignPort(THIS_ REF(UINT16) port){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::GetForeignPort()\n"));    HX_RESULT res = HXR_FAILED;    if (m_state == tcpConnected)    {	TInetAddr addr;	m_socket.RemoteName(addr);	port = addr.Port();	res = HXR_OK;    }    return res;}STDMETHODIMP HXSymbianTCPSocket::GetLocalPort(THIS_ REF(UINT16) port){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::GetLocalPort()\n"));    HX_RESULT res = HXR_FAILED;    if ((m_state != tcpNotInitialized) &&	(m_state != tcpInitialized))    {	port = m_socket.LocalPort();	res = HXR_OK;    }    return res;}STDMETHODIMP HXSymbianTCPSocket::SetOption(THIS_					   HX_SOCKET_OPTION option,					   UINT32 ulValue){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::SetOption(%d, %lu)\n",			  option, ulValue));    HX_RESULT res = HXR_FAILED;    if (m_state == tcpNotInitialized)    {	switch(option)	{	case  HX_SOCKOPT_REUSE_ADDR:	case HX_SOCKOPT_REUSE_PORT:	    if (m_socket.SetOpt(KSoReuseAddr, KSOLSocket, ulValue) == KErrNone)	    {		res = HXR_OK;	    }	    break;	case HX_SOCKOPT_BROADCAST:	case HX_SOCKOPT_SET_RECVBUF_SIZE:	case HX_SOCKOPT_SET_SENDBUF_SIZE:	case HX_SOCKOPT_MULTICAST_IF:	    res = HXR_UNEXPECTED;	    break;	default:	    res = HXR_FAILED;	    break;	};    }    return res;}HX_RESULT HXSymbianTCPSocket::GetHostByNameDone(HX_RESULT status,						ULONG32 ulAddr){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::ResolveDone(%ld, %08lx)\n",			  status, ulAddr));    HX_ASSERT(m_state == tcpResolving);    DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXTCPSocket*)this);    if (m_state == tcpResolving)    {	if (status == HXR_OK)	{	    m_pConnector->Connect(m_socket, ulAddr, m_nConnectPort);	    m_state = tcpConnecting;	}	else if (m_pResponse)	{	    m_pResponse->ConnectDone(status);	    m_state = tcpBound;	}    }    return HXR_OK;}void HXSymbianTCPSocket::OnConnect(HX_RESULT status){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::OnConnect(%ld)\n",			  status));    HX_ASSERT(m_state == tcpConnecting);    DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXTCPSocket*)this);    if (status == HXR_OK)    {	m_state = tcpConnected;    }    else    {	m_state = tcpBound;    }    if (m_pResponse)    {	m_pResponse->ConnectDone(status);    }}void HXSymbianTCPSocket::OnWriteDone(HX_RESULT status){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::OnWriteDone(%ld)\n", status));    DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXTCPSocket*)this);    if (status == HXR_OK)    {	if (m_writeList.GetCount() > 0)	{	    // Write the next buffer in the list	    IHXBuffer* pBuffer = (IHXBuffer*)m_writeList.RemoveHead();	    m_pWriter->Write(m_socket, pBuffer);	    HX_RELEASE(pBuffer);	}	// Signal WriteReady() if we don't have any	// writes pending and the response object	// wants these calls	if (!m_pWriter->IsActive() && m_bWantWrite && m_pResponse)	{	    m_pResponse->WriteReady(HXR_OK);	}    }    else    {	CloseConnection(status);    }}void HXSymbianTCPSocket::OnReadDone(HX_RESULT status, IHXBuffer* pBuffer){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::OnReadDone(%ld)\n", status));    DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXTCPSocket*)this);    if (m_pResponse)    {        // We assume error reporting/handling is done in the response object        // via the value of status passed here.	m_pResponse->ReadDone(status, pBuffer);    }    if (status != HXR_OK)    {	CloseConnection(status);    }}HX_RESULT HXSymbianTCPSocket::DoRead(UINT16 size){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::DoRead(%u)\n", size));    HX_RESULT res = HXR_FAILED;    if (m_pReader)    {        res = m_pReader->Read(m_socket, size);    }    return res;}void HXSymbianTCPSocket::CloseConnection(HX_RESULT status){    DPRINTF(D_TCPSOCKET, ("HXSymbianTCPSocket::CloseConnection(%ld)\n",			  status));    if (m_state != tcpNotInitialized)    {	// Cancel any connector	if (m_pConnector->IsActive())	{	    m_socket.CancelConnect();	    m_pConnector->Cancel();	}	// Cancel writer	if (m_pWriter->IsActive())	{	    m_socket.CancelWrite();	    m_pWriter->Cancel();	}	if (m_pReader->IsActive())	{	    m_socket.CancelRecv();	    m_pReader->Cancel();	}	// Clear the writer list	while (m_writeList.GetCount() > 0)	{	    // Write the next buffer in the list	    IHXBuffer* pBuffer = (IHXBuffer*)m_writeList.RemoveHead();	    HX_RELEASE(pBuffer);	}	if ((m_state != tcpInitialized) && m_pResponse)	{	    m_pResponse->Closed(HXR_OK);	}	m_state = tcpInitialized;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -