Пример #1
0
	// Note: This is for Provider's to allocate internal buffers
	// Key difference is provider supplies the IOComp function
	//
	friend SNI_Packet * SNIPacketAllocateEx( 	SNI_Conn * pConn, 
								    				SNI_Packet_IOType IOType,
								   					SOS_IOCompRoutine pfunComp)
	{
		BidTraceU3( SNI_BID_TRACE_ON, SNIAPI_TAG _T( "pConn: %p{SNI_Conn*}, IOType: %d, SOS_IOCompRoutine: %p{SOS_IOCompRoutine}\n"), 
						pConn, IOType, pfunComp);
		
		Assert(	IOType < SNI_Packet_InvalidType );

		SNI_Packet * pPacket = SNIPacketAllocate (pConn, IOType);

		if (pPacket)
			pPacket->Init(0, 0, pfunComp, pPacket, FALSE);

		BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%p{SNI_Packet*}\n"), pPacket);
		
		return pPacket;
	}
Пример #2
0
DWORD Sm_Shiloh::ReadSync(__out SNI_Packet ** ppNewPacket, int timeout)
{
	BidxScopeAutoSNI3( SNIAPI_TAG _T("%u#, ")
							  _T("ppNewPacket: %p{SNI_Packet**}, ")
							  _T("timeout: %d\n"), 
							  GetBidId(),
							  ppNewPacket, 
							  timeout );

	DWORD dwRet = ERROR_SUCCESS;

	*ppNewPacket = 0;
	
	// Check for 0 timeout - proceed only if there is data
	if( 0 == timeout)
	{
		LONG Error, cBytes;

		if( FALSE == g_rgFuncs.CheckData( m_pConnObj,
								              &cBytes,
								              &Error) )
		{
			if( Error )
			{
				SNI_SET_LAST_ERROR( SM_PROV, SNIE_1, static_cast<DWORD>(Error) );

				BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), Error);
				return Error;
			}
			else
			{
				SNI_SET_LAST_ERROR( SM_PROV, SNIE_SYSTEM, WAIT_TIMEOUT );

				BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), WAIT_TIMEOUT);
				return WAIT_TIMEOUT;
			}
		}

		// Since we already have data, call Read iwth infinite timeout
		timeout = -1;
	}
	
	// Allocate a new packet
	SNI_Packet  * pPacket = SNIPacketAllocate(m_pConn, SNI_Packet_Read);
	if( !pPacket )
	{
		dwRet = ERROR_OUTOFMEMORY;
		SNI_SET_LAST_ERROR( SM_PROV, SNIE_SYSTEM, dwRet );
		goto ErrorExit;
	}
	
	// Post the transport read
	DWORD 	dwBytesRead = 0;
	{
		LONG Error;
		#define NETE_TIMEOUT -2
		#define NET_IMMEDIATE	0xFFFF

		// Convert from Shiloh timeout format to Yukon
		// For Yukon, 
		//	-1 = INFINITE
		//	0 = ZERO
		// 	Others - MilliSecs
		// For Shiloh,
		//	NET_IMMEDIATE = ZERO
		//	0 = INFINITE
		// 	Others - Secs
		if( -1 == timeout )
			timeout = 0;
		else if( 0 == timeout )
			timeout = NET_IMMEDIATE;
		else
			timeout /= 1000;
		
		dwBytesRead = g_rgFuncs.Read( m_pConnObj,
				                   SNIPacketGetBufPtr(pPacket),
				                   (int)SNIPacketGetBufActualSize(pPacket),
				                   (int)SNIPacketGetBufActualSize(pPacket),
				                   (USHORT)timeout,
				                   &Error );
		if( Error == NETE_TIMEOUT )
		{
			dwRet = WAIT_TIMEOUT;
			SNI_SET_LAST_ERROR( SM_PROV, SNIE_SYSTEM, dwRet );
			goto ErrorExit;
		}
		
		if( 0 == dwBytesRead )
		{
			dwRet = Error;
			SNI_SET_LAST_ERROR( SM_PROV, SNIE_1, dwRet );
			goto ErrorExit;
		}
	}

	SNIPacketSetBufferSize( pPacket, dwBytesRead );

	*ppNewPacket = pPacket;

	BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), dwRet);

	return dwRet;

ErrorExit:

	if( pPacket )
		SNIPacketRelease( pPacket );

	*ppNewPacket = NULL;

	BidTraceU1( SNI_BID_TRACE_ON, RETURN_TAG _T("%d{WINERR}\n"), dwRet);
	
	return dwRet;

}