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