bool CConnection::OnRead() { int result; if (m_dwMaxBufferSize-m_dwRecvBufferPosition <= 0) { SetConnectionStatus(CONNECTION_STATUS_CLOSED_FROM_LOCAL); closesocket(m_socket); return false; } result = recv(m_socket,m_pRecvBuffer+m_dwRecvBufferPosition,m_dwMaxBufferSize-m_dwRecvBufferPosition,NULL); if(result == SOCKET_ERROR) { if (WSAGetLastError() == WSAEWOULDBLOCK) { SetConnectionStatus(CONNECTION_STATUS_BLOCKED); return true; } else { SetConnectionStatus(CONNECTION_STATUS_CLOSED_FROM_LOCAL); closesocket(m_socket); return false; } } m_dwRecvBufferPosition += result; return true; }
bool CConnection::SendFromBuffer() { if (m_dwSendBufferPosition <= 0) return false; int result; while (m_dwSendBufferPosition>0) { result = send(m_socket,m_pSendBuffer,m_dwSendBufferPosition,NULL); if (result == SOCKET_ERROR) { if (WSAGetLastError() == WSAEWOULDBLOCK) { SetConnectionStatus(CONNECTION_STATUS_BLOCKED); return true; } else { SetConnectionStatus(CONNECTION_STATUS_CLOSED_FROM_LOCAL); closesocket(m_socket); return false; } } m_dwSendBufferPosition -= result; memcpy(m_pSendBuffer,m_pSendBuffer+result,m_dwSendBufferPosition); } return true; }
nsresult ListenSocket::Listen(ConnectionOrientedSocket* aCOSocket) { MOZ_ASSERT(aCOSocket); MOZ_ASSERT(mIO); // We first prepare the connection-oriented socket with a // socket connector and a socket I/O class. nsAutoPtr<UnixSocketConnector> connector; nsresult rv = mIO->GetConnector()->Duplicate(*connector.StartAssignment()); if (NS_FAILED(rv)) { return rv; } nsAutoPtr<ConnectionOrientedSocketIO> io; rv = aCOSocket->PrepareAccept(connector, mIO->GetConsumerThread(), mIO->GetIOLoop(), *io.StartAssignment()); if (NS_FAILED(rv)) { return rv; } connector.forget(); // now owned by |io| // Then we start listening for connection requests. SetConnectionStatus(SOCKET_LISTENING); mIO->GetIOLoop()->PostTask( FROM_HERE, new ListenSocketIO::ListenTask(mIO, io.forget())); return NS_OK; }
bool UnixSocketConsumer::ConnectSocket(UnixSocketConnector* aConnector, const char* aAddress, int aDelayMs) { MOZ_ASSERT(aConnector); MOZ_ASSERT(NS_IsMainThread()); nsAutoPtr<UnixSocketConnector> connector(aConnector); if (mIO) { NS_WARNING("Socket already connecting/connected!"); return false; } nsCString addr(aAddress); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); mIO = new UnixSocketConsumerIO(ioLoop, this, connector.forget(), addr); SetConnectionStatus(SOCKET_CONNECTING); if (aDelayMs > 0) { DelayedConnectTask* connectTask = new DelayedConnectTask(mIO); mIO->SetDelayedConnectTask(connectTask); MessageLoop::current()->PostDelayedTask(FROM_HERE, connectTask, aDelayMs); } else { ioLoop->PostTask(FROM_HERE, new ConnectTask(mIO)); } return true; }
BOOL CTCPSocketAsync::LocalSocketClose(int iErrorCode, BOOL bNoEvent) { try { //We are not connected SetConnectionStatus(FALSE); //Call father return CAsyncSocket::SocketClosed(iErrorCode, bNoEvent); } ERROR_HANDLER_RETURN("LocalSocketClose",FALSE) }
bool ListenSocket::Listen(ConnectionOrientedSocket* aCOSocket) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(mIO); MOZ_ASSERT(aCOSocket); SetConnectionStatus(SOCKET_LISTENING); XRE_GetIOMessageLoop()->PostTask( FROM_HERE, new ListenSocketIO::ListenTask(mIO, aCOSocket->GetIO())); return true; }
ConnectionOrientedSocketIO* BluetoothDaemonConnection::PrepareAccept(BluetoothDaemonPDUConsumer* aConsumer) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(!mIO); MOZ_ASSERT(aConsumer); SetConnectionStatus(SOCKET_CONNECTING); mIO = new BluetoothDaemonConnectionIO( XRE_GetIOMessageLoop(), -1, UnixSocketWatcher::SOCKET_IS_CONNECTING, this, aConsumer); return mIO; }
nsresult DaemonSocket::PrepareAccept(UnixSocketConnector* aConnector, MessageLoop* aConsumerLoop, MessageLoop* aIOLoop, ConnectionOrientedSocketIO*& aIO) { MOZ_ASSERT(!mIO); SetConnectionStatus(SOCKET_CONNECTING); mIO = new DaemonSocketIO( aConsumerLoop, aIOLoop, -1, UnixSocketWatcher::SOCKET_IS_CONNECTING, aConnector, this, mIOConsumer); aIO = mIO; return NS_OK; }
bool UnixSocketConsumer::ListenSocket(UnixSocketConnector* aConnector) { MOZ_ASSERT(aConnector); MOZ_ASSERT(NS_IsMainThread()); nsAutoPtr<UnixSocketConnector> connector(aConnector); if (mIO) { NS_WARNING("Socket already connecting/connected!"); return false; } mIO = new UnixSocketConsumerIO( XRE_GetIOMessageLoop(), this, connector.forget(), EmptyCString()); SetConnectionStatus(SOCKET_LISTENING); XRE_GetIOMessageLoop()->PostTask(FROM_HERE, new ListenTask(mIO)); return true; }
nsresult BluetoothDaemonConnection::ConnectSocket(BluetoothDaemonPDUConsumer* aConsumer) { MOZ_ASSERT(NS_IsMainThread()); if (mIO) { CHROMIUM_LOG("Bluetooth daemon already connecting/connected!"); return NS_ERROR_FAILURE; } SetConnectionStatus(SOCKET_CONNECTING); MessageLoop* ioLoop = XRE_GetIOMessageLoop(); mIO = new BluetoothDaemonConnectionIO( ioLoop, -1, UnixSocketWatcher::SOCKET_IS_CONNECTING, this, aConsumer); ioLoop->PostTask(FROM_HERE, new BluetoothDaemonConnectTask(mIO)); return NS_OK; }
BOOL CTCPSocketAsync::LocalSocketConnect(int iErrorCode, BOOL bNoEvent) { try { if (m_ulTimeout) //Kill the timer KillSystemTimer(); //Did we got an error if (!iErrorCode) //Set the connection status SetConnectionStatus(TRUE); //Call father return CAsyncSocket::SocketConnected(iErrorCode, bNoEvent); } ERROR_HANDLER_RETURN("LocalSocketConnect",FALSE) }
nsresult RilSocket::Connect(UnixSocketConnector* aConnector, int aDelayMs, MessageLoop* aConsumerLoop, MessageLoop* aIOLoop) { MOZ_ASSERT(!mIO); mIO = new RilSocketIO(mDispatcher, aConsumerLoop, aIOLoop, this, aConnector); SetConnectionStatus(SOCKET_CONNECTING); if (aDelayMs > 0) { RilSocketIO::DelayedConnectTask* connectTask = new RilSocketIO::DelayedConnectTask(mIO); mIO->SetDelayedConnectTask(connectTask); MessageLoop::current()->PostDelayedTask(FROM_HERE, connectTask, aDelayMs); } else { aIOLoop->PostTask(FROM_HERE, new RilSocketIO::ConnectTask(mIO)); } return NS_OK; }
bool CConnection::Send(char* msg,DWORD length) { if (length >= MAX_PACKET_SIZE) { return false; } if (m_dwRecvBufferPosition + length >= m_dwMaxBufferSize) { SetConnectionStatus(CONNECTION_STATUS_CLOSED_FROM_LOCAL); closesocket(m_socket); { // MessageBox( NULL, "서버와의 접속이 끊겼습니다","에러",MB_OK); } return false; } *(WORD*)(m_pSendBuffer+m_dwSendBufferPosition) = (WORD)length; m_dwSendBufferPosition += 2; memcpy(m_pSendBuffer+m_dwSendBufferPosition,msg,length); m_dwSendBufferPosition += length; return SendFromBuffer(); }