www.pudn.com > rtptest.rar > MemStream.cpp


// MemStream.cpp: implementation of the CMemStream class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "Client.h" 
#include "MemStream.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CMemStream::CMemStream() 
{ 
	m_llPosition = 0; 
	m_pMutex = CreateMutex(NULL,FALSE,NULL); 
	m_pbBuffer = NULL; 
	m_pbBuffer = NULL; 
	m_dwBytesToRead = 0; 
	m_dwBytesHaveRead = 0; 
	//m_EventSink = NULL; 
} 
 
CMemStream::~CMemStream() 
{ 
 
} 
 
HRESULT CMemStream::Block() 
{ 
	WaitForSingleObject(m_pMutex,INFINITE); 
	return S_OK; 
} 
 
HRESULT CMemStream::ReleaseBlock() 
{ 
	ReleaseMutex(m_pMutex); 
	return S_OK; 
} 
 
void CMemStream::SetRTPSession(RTPSession *rtpSession) { 
	m_rtpSession = rtpSession; 
} 
HRESULT CMemStream::SetPointer(LONGLONG llPos) 
{ 
	if (llPos < 0 || llPos > m_llLength) { 
        return S_FALSE; 
    } else { 
        m_llPosition = llPos; 
        return S_OK; 
    } 
} 
 
HRESULT CMemStream::Read(PBYTE pbBuffer, DWORD dwBytesToRead,  
						 BOOL bAlign, LPDWORD pdwBytesRead) 
{ 
	/*if(m_EventSink) 
	{ 
		HRESULT hr = m_EventSink->OnPlayerNeedData(m_llPosition,dwBytesToRead,pdwBytesRead,pbBuffer); 
		if(SUCCEEDED(hr)) 
			m_llPosition+=dwBytesToRead; 
		return hr; 
	}*/ 
	//_MSGTYPE msgType(QUEST_DATA); 
	//_MSGSUBTYPE msgSubType(OTHER); 
 
	CTRLMSG msg; 
	 
	m_dwBytesHaveRead = 0; 
	m_dwBytesToRead = dwBytesToRead; 
	m_pbBuffer = NULL; 
 
	msg.msgType = QUEST_DATA; 
	msg.msgSubType = OTHER; 
	msg.lPos = m_llPosition; 
	msg.dwBytesToRead = dwBytesToRead; 
	msg.dwLength = 0; 
	m_bWaiting = TRUE; 
	m_rtpSession->SendPacket(&msg,sizeof(CTRLMSG)); 
	//ASSERT(m_llPosition + (LONGLONG)dwBytesToRead <= m_llLength); 
	while(m_bWaiting) 
	{ 
		Sleep(1); 
	} 
 
	ZeroMemory(pbBuffer,dwBytesToRead); 
	memcpy(pbBuffer,m_pbBuffer,dwBytesToRead); 
	m_llPosition += dwBytesToRead; 
	*pdwBytesRead = dwBytesToRead; 
	delete m_pbBuffer; 
	m_pbBuffer = NULL; 
	return S_OK; 
	//return E_POINTER; 
} 
 
LONGLONG CMemStream::Size(LONGLONG *pSizeAvailable) 
{	 
   *pSizeAvailable =  m_llLength; 
    return m_llLength; 
} 
 
DWORD CMemStream::Alignment() 
{ 
	return 1; 
} 
 
void CMemStream::Lock() 
{ 
	m_csLock.Lock(); 
} 
 
void CMemStream::Unlock() 
{ 
	m_csLock.Unlock(); 
} 
 
void CMemStream::SetMediaLength(LONGLONG lMediaLength) 
{ 
	m_llLength = lMediaLength; 
	//m_llLength = -1; 
} 
 
void CMemStream::FillBuffer(char* pbData,int nLength) 
{ 
	//CTRLMSG msg; 
	memcpy(&m_msg,pbData,sizeof(CTRLMSG)); 
	switch(m_msg.msgType) { 
	case REPLY_DATA: 
		if(NULL == m_pbBuffer) { 
			m_pbBuffer = new char[m_dwBytesToRead]; 
			m_dwBytesHaveRead = 0; 
			//m_dwBytesToRead = 0; 
		} 
		//TRACE("Receive %d Bytes\n",m_msg.dwLength); 
		if(m_dwBytesHaveRead + m_msg.dwLength  < m_dwBytesToRead) { 
			memcpy(m_pbBuffer + m_dwBytesHaveRead,pbData + sizeof(CTRLMSG),m_msg.dwLength); 
			m_dwBytesHaveRead += m_msg.dwLength; 
			return; 
		} 
		else { 
			memcpy(m_pbBuffer + m_dwBytesHaveRead,pbData + sizeof(CTRLMSG),m_msg.dwLength); 
			m_dwBytesHaveRead = m_dwBytesToRead;			 
		} 
		break; 
	case REPLY_LENGTH: 
		SetMediaLength(m_msg.lPos); 
		break; 
	} 
 
	m_bWaiting = FALSE; 
}