Exemplo n.º 1
0
TCPSocket::EJobResult
SecureSocket::doWrite()
{
	static bool s_retry = false;
	static int s_retrySize = 0;
	static void* s_staticBuffer = NULL;

	// write data
	int bufferSize = 0;
	int bytesWrote = 0;
	int status = 0;
	
	if (s_retry) {
		bufferSize = s_retrySize;
	}
	else {
		bufferSize = m_outputBuffer.getSize();
		s_staticBuffer = malloc(bufferSize);
		memcpy(s_staticBuffer, m_outputBuffer.peek(bufferSize), bufferSize);
	}
	
	if (bufferSize == 0) {
		return kRetry;
	}

	if (isSecureReady()) {
		status = secureWrite(s_staticBuffer, bufferSize, bytesWrote);
		if (status > 0) {
			s_retry = false;
			bufferSize = 0;
			free(s_staticBuffer);
			s_staticBuffer = NULL;
		}
		else if (status < 0) {
			return kBreak;
		}
		else if (status == 0) {
			s_retry = true;
			s_retrySize = bufferSize;
			return kNew;
		}
	}
	else {
		return kRetry;
	}
	
	if (bytesWrote > 0) {
		discardWrittenData(bytesWrote);
		return kNew;
	}

	return kRetry;
}
Exemplo n.º 2
0
TCPSocket::EJobResult
TCPSocket::doWrite()
{
    // write data
    UInt32 bufferSize = 0;
    int bytesWrote = 0;

    bufferSize = m_outputBuffer.getSize();
    const void* buffer = m_outputBuffer.peek(bufferSize);
    bytesWrote = static_cast<UInt32>(ARCH->writeSocket(m_socket, buffer, bufferSize));

    if (bytesWrote > 0) {
        discardWrittenData(bytesWrote);
        return kNew;
    }
    
    return kRetry;
}