www.pudn.com > DVDUpdate.rar > PackUpdate.cpp


//  
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "DVDUpdate.h" 
#include "PackUpdate.h" 
#include "malloc.h" 
#include "stdafx.h" 
#include "string.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CPackUpdate::CPackUpdate() 
{ 
 
} 
 
CPackUpdate::~CPackUpdate() 
{ 
 
} 
 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::StructInitial(Linklist &head, Linklist &lastaddr) 
{	 
	Linklist p1; 
 
	if(head -> m_VOBU_ID != 0) 
	{ 
		head = (Linklist) malloc (sizeof (Cpack)); 
		head->next = NULL; 
		head->m_VOBU_ID = 0; 
	} 
	else 
	{ 
		while(head->next != NULL) 
		{ 
			p1 = head->next; 
			head->next = p1->next; 
			free(p1); 
		} 
	} 
	 
	lastaddr = head; 
    return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::OnePackUpdate(BYTE *pbdata, Linklist &k) 
{   	 
	if ( *(pbdata + 2) == 0x01 ) 
	{ 
		switch( *(pbdata + 3) ) 
		{ 
			case 0xBB :  
			{ 
				k->m_Pack_Type = k->NV_PCK; 
				k->m_Pack_para1 = *(pbdata + 4)*16*16 + *(pbdata + 5); 
				k->m_Pack_para2 = *(pbdata + 6)*16*16 + *(pbdata + 7); 
				k->m_Pack_para3 = *(pbdata + 8)*16*16 + *(pbdata + 9); 
				break; 
			} 
			case 0xBF :  
			{ 
				k->m_Pack_Type = k->RDI_PCK; 
				k->m_Pack_para1 = *(pbdata + 4)*16*16 + *(pbdata + 5); 
				break; 
			} 
			case 0xE0 :  
			{ 
				k->m_Pack_Type = k->V_Pack; 
				k->m_Pack_para1 = *(pbdata + 4)*16*16 + *(pbdata + 5); 
				k->m_Pack_para2 = *(pbdata + 6)*16*16 + *(pbdata + 7); 
				k->m_Pack_para3 = *(pbdata + 8)*16*16 + *(pbdata + 9); 
				break; 
			}  
			case 0xBC :  
			{ 
				k->m_Pack_Type = k->A_Pack; 
				k->m_Pack_para1 = *(pbdata + 4)*16*16 + *(pbdata + 5); 
				k->m_Pack_para2 = *(pbdata + 6)*16*16 + *(pbdata + 7); 
				k->m_Pack_para3 = *(pbdata + 8)*16*16 + *(pbdata + 9); 
				k->m_Pack_para4 = *(pbdata + 10)*16*16 + *(pbdata + 11); 
				break; 
			} 
			case 0xD0 : 
			{ 
				k->m_Pack_Type = k->SP_Pack; 
				k->m_Pack_para1 = *(pbdata + 4)*16*16 + *(pbdata + 5); 
				k->m_Pack_para2 = *(pbdata + 6)*16*16 + *(pbdata + 7); 
				k->m_Pack_para3 = *(pbdata + 8)*16*16 + *(pbdata + 9); 
				break; 
			} 
			default : k->m_Pack_Type = k->Error_Pack;break; 
		} 
	} 
	else k->m_Pack_Type = k->Error_Pack; 
 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::NewData(Linklist &lastaddr) 
{ 
	Linklist p1; 
 
	p1 = (Linklist) malloc (sizeof (Cpack)); 
	lastaddr->next = p1; 
	lastaddr = p1; 
	lastaddr->next = NULL; 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::PhyUpdate(int Start, int Count, CString filename[9]) 
{ 
	int i = 0; 
    int onesize = 0; 
	int k, packID = -1, VOBUID = -1; 
 
	StructInitial(head, LastPack); 
 
	while (filename[i] != "") 
	{ 
		HANDLE hFile = CreateFile(filename[i], GENERIC_READ, 0, NULL, OPEN_EXISTING, 
			FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL); 
		onesize = (SetFilePointer(hFile, 0, NULL, FILE_END))/2048; 
		i++; 
 
 
		if (INVALID_HANDLE_VALUE != hFile) 
		{ 
			HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, "read_event"); 
			BYTE *pbRead = new BYTE[2048]; 
			BYTE *pbBuf = new BYTE[2048]; 
			DWORD dwRead, dwCount = 0; 
			OVERLAPPED overlap; 
			overlap.Offset = 0; 
			overlap.OffsetHigh = 0; 
			overlap.hEvent = hEvent; 
 
 
			ReadFile(hFile, pbRead, 2048, &dwRead, &overlap); 
			{ 
				for (k=1; k= Start && packID <= Start + Count) 
					{ 
						NewData(LastPack); 
						OnePackUpdate(pbBuf, LastPack); 
						LastPack->m_Pack_ID = packID; 
						LastPack->m_VOBU_ID = VOBUID; 
					} 
					 
				} 
				WaitForSingleObject(hEvent, INFINITE); 
				memcpy(pbBuf, pbRead, 2048); 
				if (*(pbBuf+3) == 0xBB || *(pbBuf+3) == 0xBF) 
				{ 
					VOBUID = VOBUID + 1; 
				} 
				packID = packID + 1; 
				if (packID >= Start && packID <= Start + Count) 
				{ 
					NewData(LastPack); 
					OnePackUpdate(pbBuf, LastPack); 
					LastPack->m_Pack_ID = packID; 
					LastPack->m_VOBU_ID = VOBUID; 
				} 
				 
			} 
			CloseHandle(hEvent); 
			CloseHandle(hFile); 
			delete pbRead; 
			delete pbBuf; 
		} 
	} 
 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::LogUpdate(int VOBID, int CELLID, CString filename[9]) 
{ 
	int i = 0; 
	int onesize = 0; 
	int k, packID = -1, VOBUID = -1; 
	bool flag = 0;	 
 
	StructInitial(head, LastPack); 
 
	while (filename[i] != "") 
	{ 
		HANDLE hFile = CreateFile(filename[i], GENERIC_READ, 0, NULL, OPEN_EXISTING, 
			FILE_FLAG_OVERLAPPED | FILE_ATTRIBUTE_NORMAL, NULL); 
		onesize = (SetFilePointer(hFile, 0, NULL, FILE_END))/2048; 
		i++; 
 
		if (INVALID_HANDLE_VALUE != hFile) 
		{ 
			HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, "read_event"); 
			BYTE *pbRead = new BYTE[2048]; 
			BYTE *pbBuf = new BYTE[2048]; 
			DWORD dwRead, dwCount = 0; 
			OVERLAPPED overlap; 
			overlap.Offset = 0; 
			overlap.OffsetHigh = 0; 
			overlap.hEvent = hEvent; 
 
 
			ReadFile(hFile, pbRead, 2048, &dwRead, &overlap); 
			{ 
				for (k=1; km_Pack_ID = packID; 
						LastPack->m_VOBU_ID = VOBUID; 
					} 
						 
				} 
				WaitForSingleObject(hEvent, INFINITE); 
				memcpy(pbBuf, pbRead, 2048); 
				if (*(pbBuf+3) == 0xBB || *(pbBuf+3) == 0xBF) 
				{ 
					VOBUID = VOBUID + 1; 
				} 
				packID = packID + 1; 
				if (OnePackVOBJug(VOBID, CELLID, pbBuf, flag)) 
				{ 
					NewData(LastPack); 
					OnePackUpdate(pbBuf, LastPack); 
					LastPack->m_Pack_ID = packID; 
					LastPack->m_VOBU_ID = VOBUID; 
				} 
				 
			} 
			CloseHandle(hEvent); 
			CloseHandle(hFile); 
			delete pbRead; 
			delete pbBuf; 
		} 
 
	} 
	 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CPackUpdate::OnePackVOBJug(int VOBID, int CELLID, BYTE *pbdata, bool &flag) 
{ 
	if (VOBID == -1 && CELLID == -1) 
	{ 
		return TRUE; 
	} 
	else if (CELLID == -1 && VOBID != -1) 
	{ 
		if (*(pbdata + 3) == 0xBB) 
		{ 
			if ( *(pbdata + 4)*16*16+*(pbdata + 5) == VOBID ) 
			{ 
				flag = 1; 
			} 
			else flag = 0; 
		} 
		 
		if (flag) 
		{ 
			return TRUE; 
		} 
		else return FALSE; 
	} 
	else if (CELLID != -1 && VOBID != -1) 
	{ 
		if (*(pbdata + 3) == 0xBB) 
		{ 
			if ( *(pbdata + 4)*16*16+*(pbdata + 5) == VOBID &&  
				 *(pbdata + 6)*16*16+*(pbdata + 7) == CELLID ) 
			{ 
				flag = 1; 
			} 
			else flag = 0; 
		} 
		 
		if (flag) 
		{ 
			return TRUE; 
		} 
		else return FALSE; 
	} 
 
	else return FALSE;	 
}