📄 hxsymbianudpsock.cpp
字号:
} /* * 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 + -