// 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; }
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; }