Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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)
}
Esempio n. 6
0
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;
}
Esempio n. 8
0
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;
}
Esempio n. 9
0
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;
}
Esempio n. 11
0
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)
}
Esempio n. 12
0
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;
}
Esempio n. 13
0
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();
}