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

📄 hxsymbianudpsock.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}    /*     *  IUnknown methods     */STDMETHODIMP HXSymbianUDPSocket::QueryInterface(THIS_                                                REFIID riid,                                                void** ppvObj){        QInterfaceList qiList[] =        {                { GET_IIDHANDLE(IID_IUnknown), (IUnknown*)(IHXNetworkServices*)this },                { GET_IIDHANDLE(IID_IHXUDPSocket), (IHXUDPSocket*) this },                { GET_IIDHANDLE(IID_IHXSetSocketOption), (IHXSetSocketOption*) this },        };          return QIFind(qiList, QILISTSIZE(qiList), riid, ppvObj);}STDMETHODIMP_(ULONG32) HXSymbianUDPSocket::AddRef(THIS){    return InterlockedIncrement(&m_lRefCount);}STDMETHODIMP_(ULONG32) HXSymbianUDPSocket::Release(THIS){    if (InterlockedDecrement(&m_lRefCount) > 0)    {        return m_lRefCount;    }        delete this;    return 0;}    /*     *  IHXUDPSocket methods     *     *  Network addresses and ports are in native byte order     */STDMETHODIMP HXSymbianUDPSocket::Init(THIS_                                      ULONG32                   ulAddr,                                      UINT16                    nPort,                                      IHXUDPResponse*   pUDPResponse){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::Init(%08lx, %u)\n",                          ulAddr, nPort));    HX_RESULT res = HXR_FAILED;    if (m_state != udpNotOpen)    {        if (!m_pResponse && !pUDPResponse)        {            res = HXR_UNEXPECTED;        }        else if (pUDPResponse)        {            HX_RELEASE(m_pResponse);            m_pResponse = pUDPResponse;            m_pResponse->AddRef();        }        if (m_pResponse)        {            m_ulRemoteAddr = ulAddr;            m_nRemotePort = nPort;                    if (m_state == udpOpen)            {                m_state = udpInitialized;            }                        res = HXR_OK;        }    }    return res;}STDMETHODIMP HXSymbianUDPSocket::Bind(THIS_                                      UINT32  ulLocalAddr,                                      UINT16  nPort){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::Bind(%08lx, %u)\n",                          ulLocalAddr, nPort));    HX_RESULT res = HXR_FAILED;    TInetAddr addr(ulLocalAddr, nPort);    if ((m_state != udpNotOpen) &&        (m_socket.Bind(addr) == KErrNone))    {        m_state = udpBound;        res = HXR_OK;    }    return res;}STDMETHODIMP HXSymbianUDPSocket::Read(THIS_ UINT16 Size){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::Read(%d)\n", Size));    HX_RESULT res = HXR_FAILED;    if (m_state == udpBound)    {        // Note: We intentionally ignore the read        //       size and use the maximum possible        //       UDP packet size. This allows us to        //       properly receive any UDP packet.        res = DoRead(0xf000);    }    return res;}STDMETHODIMP HXSymbianUDPSocket::Write(THIS_ IHXBuffer* pBuffer){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::Write()\n"));    return WriteTo(m_ulRemoteAddr, m_nRemotePort, pBuffer);}STDMETHODIMP HXSymbianUDPSocket::WriteTo(THIS_                                          ULONG32    ulAddr,                                         UINT16     nPort,                                         IHXBuffer* pBuffer){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::WriteTo(%08lx, %d)\n",                          ulAddr, nPort));    HX_RESULT res = HXR_FAILED;    if ((m_state == udpBound) && pBuffer)    {        if (m_pWriter->IsActive())        {            // A write is in process. Cache the information            // about this write for later use.            HXSymbianUDPWriteInfo* pWriteInfo =                 new HXSymbianUDPWriteInfo(ulAddr, nPort, pBuffer);            if (pWriteInfo)            {                LISTPOSITION listRet = m_writeList.AddTail(pWriteInfo);                if( listRet == NULL )                {                    res = HXR_OUTOFMEMORY;                    HX_DELETE(pWriteInfo);                }                else                {                    res = HXR_OK;                }            }        }        else        {            // Do the write now            m_pWriter->Write(m_socket, ulAddr, nPort, pBuffer);            res = HXR_OK;        }    }    return res;}STDMETHODIMP HXSymbianUDPSocket::GetLocalPort(THIS_                                              REF(UINT16) port){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::GetLocalPort()\n"));    HX_RESULT res = HXR_FAILED;    if (m_state == udpBound )    {        port = m_socket.LocalPort();        res = HXR_OK;    }    return res;}STDMETHODIMP HXSymbianUDPSocket::JoinMulticastGroup(THIS_                                                    ULONG32 ulMulticastAddr,                                                    ULONG32 ulInterfaceAddr){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::JoinMulticastGroup(%08lx %08lx)\n",                          ulMulticastAddr, ulInterfaceAddr));    return HXR_NOTIMPL;}    STDMETHODIMP HXSymbianUDPSocket::LeaveMulticastGroup(THIS_                                                     ULONG32 ulMulticastAddr,                                                     ULONG32 ulInterfaceAddr){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::LeaveMulticastGroup(%08lx %08lx)\n",                          ulMulticastAddr, ulInterfaceAddr));    return HXR_NOTIMPL;}STDMETHODIMP HXSymbianUDPSocket::SetOption(THIS_                                            HX_SOCKET_OPTION option,                                           UINT32 ulValue){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::SetOption(%d, %ld)\n",                          option, ulValue));    HX_RESULT res = HXR_FAILED;    if (m_state == udpNotOpen)    {        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;}void HXSymbianUDPSocket::OnWriteDone(HX_RESULT status){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::WriteDone(%ld)\n", status));    if (status == HXR_OK)    {        if (m_writeList.GetCount() > 0)        {            // Write the next buffer in the list            HXSymbianUDPWriteInfo* pWriteInfo =                 (HXSymbianUDPWriteInfo*)m_writeList.RemoveHead();            IHXBuffer* pBuffer = pWriteInfo->GetBuffer();            m_pWriter->Write(m_socket,                              pWriteInfo->Address(), pWriteInfo->Port(),                             pBuffer);            HX_RELEASE(pBuffer);            delete pWriteInfo;        }    }    else    {        CloseSocket(status);    }}void HXSymbianUDPSocket::OnReadDone(HX_RESULT status,                                     ULONG32 ulAddr, UINT16 nPort,                                     IHXBuffer* pBuffer){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::OnReadDone(%ld, %08lx, %d)\n",                          status, ulAddr, nPort));    DECLARE_SMART_POINTER_UNKNOWN scopeRef((IHXUDPSocket*)this);        // We assume that the reponse object is going to be responsible for error     // handling, so the symbian network services does not try to notify    // anyone of errors returned here.    if (m_pResponse)    {        m_pResponse->ReadDone(status, pBuffer, ulAddr, nPort);    }    if (status != HXR_OK)    {        CloseSocket(status);    }}HX_RESULT HXSymbianUDPSocket::DoRead(UINT16 size){    DPRINTF(D_UDPSOCKET, ("HXSymbianUDPSocket::DoRead(%d)\n", size));    HX_RESULT res = HXR_FAILED;        if (m_pReader)    {        res = m_pReader->Read(m_socket, size);    }    return res;}void HXSymbianUDPSocket::CloseSocket(HX_RESULT status){    if (m_state != udpNotOpen)    {        // 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            HXSymbianUDPWriteInfo* pWriteInfo =                 (HXSymbianUDPWriteInfo*)m_writeList.RemoveHead();                        HX_DELETE(pWriteInfo);        }        m_state = udpNotOpen;    }}

⌨️ 快捷键说明

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