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


// DVDUpdateView.cpp : implementation of the CDVDUpdateView class 
// 
 
#include "stdafx.h" 
#include "DVDUpdate.h" 
#include "malloc.h" 
#include "PackUpdate.h" 
#include "DVDUpdateDoc.h" 
#include "DVDUpdateView.h" 
#include "string.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CDVDUpdateView 
 
IMPLEMENT_DYNCREATE(CDVDUpdateView, CFormView) 
 
BEGIN_MESSAGE_MAP(CDVDUpdateView, CFormView) 
	//{{AFX_MSG_MAP(CDVDUpdateView) 
	ON_COMMAND(ID_EDIT_STRMDIV, OnEditStrmdiv) 
	ON_COMMAND(ID_FILE_OPENFL, OnFileOpenfl) 
	ON_COMMAND(ID_FILE_OPENFLD, OnFileOpenfld) 
	ON_BN_CLICKED(IDC_RADIO_MIX, OnRadioMix) 
	ON_BN_CLICKED(IDC_RADIO_PARSE, OnRadioParse) 
	ON_CBN_SELCHANGE(IDC_COMBO_ADOCODEC, OnSelchangeComboAdocodec) 
	ON_CBN_SELCHANGE(IDC_COMBO_ADOSTRMID, OnSelchangeComboAdostrmid) 
	ON_CBN_SELCHANGE(IDC_COMBO_SUBPICSTRMID, OnSelchangeComboSubpicstrmid) 
	ON_BN_CLICKED(IDC_CHECK_LINKVOBU, OnCheckLinkvobu) 
	ON_WM_VSCROLL() 
	ON_BN_CLICKED(IDC_BUTTON_UPDATE, OnButtonUpdate) 
	ON_NOTIFY(NM_CLICK, IDC_LIST_VOBU, OnClickListVobu) 
	ON_BN_CLICKED(IDC_RADIO_LOGICAL, OnRadioLogical) 
	ON_BN_CLICKED(IDC_RADIO_PHYSICAL, OnRadioPhysical) 
	ON_CBN_SELCHANGE(IDC_COMBO_RANGE, OnSelchangeComboRange) 
	ON_BN_CLICKED(IDC_CHECK_CELLID, OnCheckCellid) 
	ON_BN_CLICKED(IDC_CHECK_COUNT, OnCheckCount) 
	ON_BN_CLICKED(IDC_CHECK_START, OnCheckStart) 
	ON_BN_CLICKED(IDC_CHECK_VOBID, OnCheckVobid) 
	ON_EN_CHANGE(IDC_EDIT_VOBUCOUNT, OnChangeEditVobucount) 
	ON_EN_CHANGE(IDC_EDIT_VOBUSTART, OnChangeEditVobustart) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDVDUpdateView construction/destruction 
 
CDVDUpdateView::CDVDUpdateView() 
	: CFormView(CDVDUpdateView::IDD) 
{ 
	//{{AFX_DATA_INIT(CDVDUpdateView) 
	m_CheckCellid = FALSE; 
	m_CheckCount = FALSE; 
	m_CheckLinkvobu = FALSE; 
	m_CheckStart = FALSE; 
	m_CheckVobid = FALSE; 
	m_EditVobucount = 0; 
	m_EditVobustart = 0; 
	//}}AFX_DATA_INIT 
	// TODO: add construction code here 
 
} 
 
CDVDUpdateView::~CDVDUpdateView() 
{ 
} 
 
void CDVDUpdateView::DoDataExchange(CDataExchange* pDX) 
{ 
	CFormView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CDVDUpdateView) 
	DDX_Control(pDX, IDC_SPIN_VOBUSTART, m_SpinVobucstart); 
	DDX_Control(pDX, IDC_SPIN_VOBUCOUNT, m_SpinVobucount); 
	DDX_Control(pDX, IDC_RADIO_PHYSICAL, m_RadioPhysical); 
	DDX_Control(pDX, IDC_RADIO_PARSE, m_RadioParse); 
	DDX_Control(pDX, IDC_RADIO_MIX, m_RadioMix); 
	DDX_Control(pDX, IDC_RADIO_LOGICAL, m_RadioLogical); 
	DDX_Control(pDX, IDC_LIST_VOBU, m_ListVobu); 
	DDX_Control(pDX, IDC_LIST_VDO, m_ListVdo); 
	DDX_Control(pDX, IDC_LIST_SUBPIC, m_ListSubpic); 
	DDX_Control(pDX, IDC_LIST_PACK, m_ListPack); 
	DDX_Control(pDX, IDC_LIST_ADO, m_ListAdo); 
	DDX_Control(pDX, IDC_COMBO_SUBPICSTRMID, m_ComboSubpicstrmid); 
	DDX_Control(pDX, IDC_COMBO_RANGE, m_ComboRange); 
	DDX_Control(pDX, IDC_COMBO_ADOSTRMID, m_ComboAdostrmid); 
	DDX_Control(pDX, IDC_COMBO_ADOCODEC, m_ComboAdocodec); 
	DDX_Control(pDX, IDC_BUTTON_UPDATE, m_ButtonUpdate); 
	DDX_Check(pDX, IDC_CHECK_CELLID, m_CheckCellid); 
	DDX_Check(pDX, IDC_CHECK_COUNT, m_CheckCount); 
	DDX_Check(pDX, IDC_CHECK_LINKVOBU, m_CheckLinkvobu); 
	DDX_Check(pDX, IDC_CHECK_START, m_CheckStart); 
	DDX_Check(pDX, IDC_CHECK_VOBID, m_CheckVobid); 
	DDX_Text(pDX, IDC_EDIT_VOBUCOUNT, m_EditVobucount); 
	DDX_Text(pDX, IDC_EDIT_VOBUSTART, m_EditVobustart); 
	//}}AFX_DATA_MAP 
} 
 
BOOL CDVDUpdateView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CFormView::PreCreateWindow(cs); 
} 
 
void CDVDUpdateView::OnInitialUpdate() 
{ 
	CFormView::OnInitialUpdate(); 
	GetParentFrame()->RecalcLayout(); 
	ResizeParentToFit(); 
 
	this->GetDlgItem(IDC_EDIT_START)->EnableWindow(FALSE); 
	this->GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(FALSE); 
 
	m_RadioParse.SetCheck(1); 
	m_CheckLinkvobu=FALSE; 
	 
	m_ComboAdostrmid.SetCurSel(0); 
	m_ComboAdocodec.SetCurSel(0); 
	m_ComboSubpicstrmid.SetCurSel(0); 
	 
	m_ListVobu.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	m_ListVobu.SetBkColor(RGB(247,247,255)); 
	m_ListVobu.SetTextColor(RGB(0,0,255)); 
	m_ListVobu.SetTextBkColor(RGB(247,247,255)); 
	m_ListVobu.InsertColumn(0, "Pack", LVCFMT_LEFT,36); 
	 
	m_ListVdo.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	m_ListVdo.SetBkColor(RGB(247,247,255)); 
	m_ListVdo.SetTextColor(RGB(0,0,255)); 
	m_ListVdo.SetTextBkColor(RGB(247,247,255)); 
	m_ListVdo.InsertColumn(0, "Pack", LVCFMT_LEFT,36); 
	 
	m_ListAdo.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	m_ListAdo.SetBkColor(RGB(247,247,255)); 
	m_ListAdo.SetTextColor(RGB(0,0,255)); 
	m_ListAdo.SetTextBkColor(RGB(247,247,255)); 
	m_ListAdo.InsertColumn(0, "Pack", LVCFMT_LEFT,36); 
	 
	m_ListSubpic.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	m_ListSubpic.SetBkColor(RGB(247,247,255)); 
	m_ListSubpic.SetTextColor(RGB(0,0,255)); 
	m_ListSubpic.SetTextBkColor(RGB(247,247,255)); 
	m_ListSubpic.InsertColumn(0, "Pack", LVCFMT_LEFT,36); 
	 
	m_ListPack.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); 
	m_ListPack.SetBkColor(RGB(247,247,255)); 
	m_ListPack.SetTextColor(RGB(0,0,255)); 
	m_ListPack.SetTextBkColor(RGB(247,247,255)); 
	m_ListPack.InsertColumn(0, "Pack", LVCFMT_LEFT,36); 
	 
	m_ListVobu.InsertColumn(1, "VOB_ID", LVCFMT_LEFT, 50); 
	m_ListVobu.InsertColumn(2, "CELL_ID", LVCFMT_LEFT, 55); 
	m_ListVobu.InsertColumn(3, "SCR", LVCFMT_LEFT, 36); 
	 
	m_ListVdo.InsertColumn(1, "PTS", LVCFMT_LEFT, 36); 
	m_ListVdo.InsertColumn(2, "DTS", LVCFMT_LEFT, 36); 
	m_ListVdo.InsertColumn(3, "SCR", LVCFMT_LEFT, 36); 
	 
	m_ListAdo.InsertColumn(1, "StreamID", LVCFMT_LEFT, 60); 
	m_ListAdo.InsertColumn(2, "Codec", LVCFMT_LEFT, 45); 
	m_ListAdo.InsertColumn(3, "PTS", LVCFMT_LEFT, 36); 
	m_ListAdo.InsertColumn(4, "SCR", LVCFMT_LEFT, 36); 
	 
	m_ListSubpic.InsertColumn(1, "StreamID", LVCFMT_LEFT, 60); 
	m_ListSubpic.InsertColumn(2, "PTS", LVCFMT_LEFT, 36); 
	m_ListSubpic.InsertColumn(3, "SCR", LVCFMT_LEFT, 36); 
	 
	m_ListPack.InsertColumn(1, "VOB_ID", LVCFMT_LEFT, 50); 
	m_ListPack.InsertColumn(2, "CELL_ID", LVCFMT_LEFT, 55); 
	m_ListPack.InsertColumn(3, "SCR", LVCFMT_LEFT, 36); 
	m_ListPack.InsertColumn(4, "PTS", LVCFMT_LEFT, 36); 
	m_ListPack.InsertColumn(5, "DTS", LVCFMT_LEFT, 36); 
	m_ListPack.InsertColumn(6, "StreamID", LVCFMT_LEFT, 60); 
    m_ListPack.InsertColumn(7, "Codec", LVCFMT_LEFT, 50); 
	 
	 
	 
    //以下是对旋转框的初始化 
	CSpinButtonCtrl *pSpin1=(CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_VOBUSTART/*旋转框的ID号*/); 
	pSpin1->SetRange(0,10000); 
    pSpin1->SetPos((int)(m_EditVobustart*10.0)); 
    pSpin1->SetBuddy(GetDlgItem(IDC_EDIT_VOBUSTART/*相关联的编辑框的ID号*/)); 
	 
	CSpinButtonCtrl *pSpin2=(CSpinButtonCtrl *)GetDlgItem(IDC_SPIN_VOBUCOUNT); 
	pSpin2->SetRange(0,10000); 
    pSpin2->SetPos((int)(m_EditVobucount*10.0)); 
    pSpin2->SetBuddy(GetDlgItem(IDC_EDIT_VOBUCOUNT));  
 
	head = (Linklist) malloc (sizeof (Cpack)); 
	head->next = NULL; 
	head->m_VOBU_ID = 0; 
	 
	UpdateData(FALSE); 
 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDVDUpdateView diagnostics 
 
#ifdef _DEBUG 
void CDVDUpdateView::AssertValid() const 
{ 
	CFormView::AssertValid(); 
} 
 
void CDVDUpdateView::Dump(CDumpContext& dc) const 
{ 
	CFormView::Dump(dc); 
} 
 
CDVDUpdateDoc* CDVDUpdateView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDVDUpdateDoc))); 
	return (CDVDUpdateDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDVDUpdateView message handlers 
 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnEditStrmdiv()  
{ 
	char	buf[MAX_PATH];    
	ZeroMemory(buf,	sizeof(buf));    
	BROWSEINFO	bi;    
	bi.hwndOwner	=	m_hWnd;    
	bi.pidlRoot	=	NULL;    
	bi.pszDisplayName	=	buf;    
	bi.lpszTitle	=	"Please select directory:";    
	bi.ulFlags	=	0;    
	bi.lpfn	=	NULL;    
	bi.lParam	=	0;    
	bi.iImage	=	0;    
	LPITEMIDLIST	lp	=	SHBrowseForFolder(&bi);    
 
	if(lp	&&	SHGetPathFromIDList(lp,	buf))    
	{ 
		m_SaveFile	=	buf;    
	}	// TODO: Add your command handler code here 
 
 
	StreamDivide(); 
	CreatLog(); 
 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnFileOpenfl()  
{ 
	for (int i=0; i<=9; i++)	m_UpdateFiles[i] = "";//清空待处理文件数组 
	 
	CFileDialog dlg(TRUE,NULL,NULL,NULL,"DVD Data Files (*.vob;*.vro)|*.vob; *.vro||"); 
	if(dlg.DoModal( )	==	IDOK) 
	{	 
		m_OpenFile	=  dlg.GetPathName(); 
		m_OutputName = dlg.GetFileName(); 
		m_OpenFile.MakeUpper();//转大写 
		 
		this->m_ComboRange.ResetContent(); 
		this->m_ComboRange.AddString("As Open File"); 
		this->m_ComboRange.SetCurSel(0);//更新组合框 
		 
		m_UpdateFiles[0] = m_OpenFile;//放入待处理文件数组 
		LONG flength = 0; 
		i=0; 
		while (m_UpdateFiles[i] != "") 
		{ 
			CFile myfile; 
			myfile.Open(m_UpdateFiles[i++],CFile::modeRead); 
			flength += myfile.GetLength(); 
		}	 
		m_MaxPack = flength/2048; 
		 
		CString tstr; 
		tstr.Format("/%d",m_MaxPack); 
		this->GetDlgItem(IDC_STATIC_MAXPACK)->SetWindowText(tstr); 
		 
		if ( (m_OpenFile.Right(3)) == "VRO" ) 
		{ 
			GetDlgItem(IDC_RADIO_LOGICAL)->EnableWindow(FALSE); 
			GetDlgItem(IDC_CHECK_VOBID)->EnableWindow(FALSE); 
			GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(FALSE); 
			GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(FALSE); 
			GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(FALSE); 
			m_RadioLogical.SetCheck(0); 
			m_RadioPhysical.SetCheck(1);//若为vro文件,logical range失效 
		} 
		else 
			GetDlgItem(IDC_RADIO_LOGICAL)->EnableWindow(TRUE); 
	} 
	// TODO: Add your command handler code here	 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnFileOpenfld()  
{ 
	for (int i=0; i<=9; i++)	m_UpdateFiles[i] = "";//清空待处理文件数组 
	char	buf[MAX_PATH];    
	ZeroMemory(&buf,	sizeof(buf));    
	BROWSEINFO	bi;    
	bi.hwndOwner	=	m_hWnd;    
	bi.pidlRoot	=	NULL;    
	bi.pszDisplayName	=	buf;    
	bi.lpszTitle	=	"Please select directory:";    
	bi.ulFlags	=	0;    
	bi.lpfn	=	NULL;    
	bi.lParam	=	0;    
	bi.iImage	=	0; 
	 
	LPITEMIDLIST	lp	=	SHBrowseForFolder(&bi);    
	 
	if(lp	&&	SHGetPathFromIDList(lp,	buf))    
	{ 
		m_OpenFolder	=	buf; 
		m_OpenFolder.MakeUpper();//转大写 
		 
		if (	  ( m_OpenFolder.Right(8)  != "VIDEO_TS" ) 
			&&( m_OpenFolder.Right(8)  != "DVD_RTAV" ) )	 
			MessageBox("请重新指定文件夹"); 
		else	 
			 
			if (m_OpenFolder.Right(8)  == "DVD_RTAV")//若为record 
			{ 
				GetDlgItem(IDC_RADIO_LOGICAL)->EnableWindow(FALSE); 
				GetDlgItem(IDC_CHECK_VOBID)->EnableWindow(FALSE); 
				GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(FALSE); 
				GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(FALSE); 
				GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(FALSE);//Logical失效 
				 
				ShowFolderVro(m_OpenFolder); 
			} 
			else//为DVD-VIDEO 
			{ 
				GetDlgItem(IDC_RADIO_LOGICAL)->EnableWindow(TRUE); 
				GetDlgItem(IDC_CHECK_VOBID)->EnableWindow(TRUE); 
				GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(TRUE); 
				GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(TRUE); 
				GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(TRUE); 
				 
				ShowFolderVob(m_OpenFolder); 
			} 
			 
	} 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnRadioMix()  
{ 
	// TODO: Add your control notification handler code here 
	GetDlgItem(IDC_LIST_VOBU)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_LIST_VDO)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_LIST_ADO)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_LIST_SUBPIC)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_STATIC_VOBU)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_STATIC_VDO)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_STATIC_ADO)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_STATIC_SUBPIC)->ShowWindow(SW_HIDE); 
	GetDlgItem(IDC_CHECK_LINKVOBU)->ShowWindow(SW_HIDE); 
     
    GetDlgItem(IDC_LIST_PACK)->ShowWindow(SW_SHOW);		 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnRadioParse()  
{ 
	// TODO: Add your control notification handler code here 
	GetDlgItem(IDC_LIST_VOBU)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_LIST_VDO)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_LIST_ADO)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_LIST_SUBPIC)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_STATIC_VOBU)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_STATIC_VDO)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_STATIC_ADO)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_STATIC_SUBPIC)->ShowWindow(SW_SHOW); 
	GetDlgItem(IDC_CHECK_LINKVOBU)->ShowWindow(SW_SHOW); 
	 
    GetDlgItem(IDC_LIST_PACK)->ShowWindow(SW_HIDE);	 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnSelchangeComboAdocodec()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData();//将控件显示的数据传给成员变量 
	 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
	 
	if(m_CheckLinkvobu==FALSE){ 
        m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
	    m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart,m_EditVobucount, T1, T2, T3); 
	} 
	else { 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		CString PackNum=m_ListVobu.GetItemText(0,0); 
		int i; 
		int j; 
		i=atoi(PackNum); 
		j=GetVOBUNum(head, i); 
		char buffer[20]; 
		_itoa(j, buffer, 10 ); 
		 
		ConLinkView(head, j, T1, T2, T3); 
		 
		}		 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnSelchangeComboAdostrmid()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData();//将控件显示的数据传给成员变量 
	 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
	 
	if(m_CheckLinkvobu==FALSE){ 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
	    m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart,m_EditVobucount, T1, T2, T3); 
	} 
	else { 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		CString PackNum=m_ListVobu.GetItemText(0,0); 
		int i; 
		int j; 
		i=atoi(PackNum); 
		j=GetVOBUNum(head, i); 
		char buffer[20]; 
		_itoa(j, buffer, 10 ); 
		 
		ConLinkView(head, j, T1, T2, T3); 
		 
		} 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnSelchangeComboSubpicstrmid()  
{ 
	// TODO: Add your control notification handler code here 
	UpdateData();//将控件显示的数据传给成员变量 
	 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
	 
	if(m_CheckLinkvobu==FALSE){ 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
	    m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart,m_EditVobucount, T1, T2, T3); 
	} 
	else { 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		CString PackNum=m_ListVobu.GetItemText(0,0); 
		int i; 
		int j; 
		i=atoi(PackNum); 
		j=GetVOBUNum(head, i); 
		char buffer[20]; 
		_itoa(j, buffer, 10 ); 
		 
		ConLinkView(head, j, T1, T2, T3); 
		 
		} 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnCheckLinkvobu()  
{ 
	// TODO: Add your control notification handler code here 
	m_ListVobu.SetFocus();    
    m_ListVobu.SetItemState(0,   LVIS_SELECTED|LVIS_FOCUSED,   LVIS_SELECTED|LVIS_FOCUSED); 
	 
    m_CheckLinkvobu=!m_CheckLinkvobu; 
	if(m_CheckLinkvobu==FALSE) 
	{ 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
	    m_ListPack.DeleteAllItems(); 
		UpdateData();//将控件显示的数据传给成员变量 
		 
		CString T1; 
		CString T2; 
		CString T3; 
		int index1; 
		int index2; 
		int index3; 
		 
		index1=m_ComboAdostrmid.GetCurSel(); 
		m_ComboAdostrmid.GetLBText(index1,T1); 
		index2=m_ComboAdocodec.GetCurSel(); 
		m_ComboAdocodec.GetLBText(index2,T2); 
		index3=m_ComboSubpicstrmid.GetCurSel(); 
	    m_ComboSubpicstrmid.GetLBText(index3,T3); 
		 
		ConditionalView(head, m_EditVobustart,m_EditVobucount, T1, T2, T3);//调用	 
	} 
	else if(m_CheckLinkvobu==TRUE) 
	{ 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		 
		CString PackNum=m_ListVobu.GetItemText(0,0); 
		int i; 
		int j; 
		i=atoi(PackNum); 
		j=GetVOBUNum(head, i); 
		char buffer[20]; 
		_itoa(j, buffer, 10 ); 
		 
		CString T1; 
		CString T2; 
		CString T3; 
		int index1; 
		int index2; 
		int index3; 
		 
		index1=m_ComboAdostrmid.GetCurSel(); 
		m_ComboAdostrmid.GetLBText(index1,T1); 
		index2=m_ComboAdocodec.GetCurSel(); 
		m_ComboAdocodec.GetLBText(index2,T2); 
		index3=m_ComboSubpicstrmid.GetCurSel(); 
		m_ComboSubpicstrmid.GetLBText(index3,T3); 
		 
		ConLinkView(head, j, T1, T2, T3);				                                                                      
		}	 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnVScroll(UINT nSBCode,  
							   UINT nPos,  
							   CScrollBar* pScrollBar)  
{ 
	// TODO: Add your message handler code here and/or call default 
 
	 
	if(nSBCode==SB_ENDSCROLL) 
	{ 
		return ; 
	} 
	if(pScrollBar->GetDlgCtrlID()==IDC_SPIN_VOBUSTART/*此处是VOBU Start的旋转控件的ID*/ 
		||pScrollBar->GetDlgCtrlID()==IDC_SPIN_VOBUCOUNT/*此处是VOBU Count的旋转控件的ID*/) 
	{ 
		CString  strValue; 
		strValue.Format("%d",(int)nPos); 
		((CSpinButtonCtrl *)pScrollBar)->GetBuddy()->SetWindowText(strValue);  
	 
	CFormView::OnVScroll(nSBCode, nPos, pScrollBar); 
	} 
	 
	UpdateData();//将控件显示的数据传给成员变量 
	 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
 
	if(m_CheckLinkvobu==FALSE){ 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
	    m_ListVdo.DeleteAllItems(); 
	    m_ListAdo.DeleteAllItems(); 
	    m_ListSubpic.DeleteAllItems(); 
	    m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart,m_EditVobucount, T1, T2, T3); 
	} 
	else { 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
	    m_ListSubpic.DeleteAllItems(); 
        SpinView(head, m_EditVobustart,m_EditVobucount); 
 
		CString PackNum=m_ListVobu.GetItemText(0,0); 
		int i; 
		int j; 
		i=atoi(PackNum); 
		j=GetVOBUNum(head, i); 
 
		ConLinkView(head, j, T1, T2, T3);		                                                                      
		} 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnButtonUpdate()  
{ 
	 
	// TODO: Add your control notification handler code here 
	m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
	m_ListVdo.DeleteAllItems(); 
	m_ListAdo.DeleteAllItems(); 
	m_ListSubpic.DeleteAllItems(); 
	m_ListPack.DeleteAllItems(); 
	 
	m_CheckLinkvobu=FALSE; 
	 
	 
	m_ComboAdostrmid.SetCurSel(0); 
	m_ComboAdocodec.SetCurSel(0); 
	m_ComboSubpicstrmid.SetCurSel(0); 
	m_EditVobucount=0; 
	 
	CString message; 
	 
	if (this->m_RadioPhysical.GetCheck() == BST_CHECKED) 
	{ 
		if (m_CheckStart) m_StartPack = GetDlgItemInt(IDC_EDIT_START); 
		if (m_CheckCount) m_Count = GetDlgItemInt(IDC_EDIT_COUNT); 
	} 
	else  
		if(this->m_RadioLogical.GetCheck() == BST_CHECKED) 
		{ 
			if (m_CheckVobid) m_Vobid = GetDlgItemInt(IDC_EDIT_VOBID); 
			if (m_CheckCellid) m_Cellid = GetDlgItemInt(IDC_EDIT_CELLID); 
		} 
		else 
			MessageBox("请指定解析方式!"); 
		// TODO: Add your control notification handler code here 
		 
		 
		if ( (this->m_RadioPhysical.GetCheck() == BST_CHECKED) 
			|| (this->m_RadioLogical.GetCheck() == BST_CHECKED)) 
		{	 
			DWORD dwBegin = GetTickCount(); 
			if (m_Vobid == -2 || m_Cellid == -2) 
			{ 
				if (m_StartPack == -1 && m_Count == -1) 
				{ 
					PhyUpdate(0, m_MaxPack, m_UpdateFiles); 
				} 
				else if (m_StartPack == -1 && m_Count != -1) 
				{ 
					PhyUpdate(0, m_Count, m_UpdateFiles); 
				} 
				else if (m_StartPack != -1 && m_Count == -1) 
				{ 
					PhyUpdate(m_StartPack, m_MaxPack, m_UpdateFiles); 
				} 
				else 
					PhyUpdate(m_StartPack, m_Count, m_UpdateFiles); 
			} 
			 
			if (m_StartPack == -2 || m_Count == -2) 
			{ 
				LogUpdate(m_Vobid, m_Cellid, m_UpdateFiles); 
			} 
			m_EditVobucount=LastPack->m_VOBU_ID; 
			message.Format("Cost Time : %.3f s",((float)GetTickCount()-dwBegin)/1000); 
			MessageBox(message); 
			UpdateData(FALSE); 
	} 
 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
void CDVDUpdateView::OnClickListVobu(NMHDR* pNMHDR,  
									 LRESULT* pResult)  
{ 
	// TODO: Add your control notification handler code here 
	 
	POSITION pos = m_ListVobu.GetFirstSelectedItemPosition(); 
	m_nIndex = m_ListVobu.GetNextSelectedItem(pos);  // 得到项目索引 
	 
	*pResult = 0; 
 
 
	if(m_CheckLinkvobu==TRUE){ 
		CString PackNum=m_ListVobu.GetItemText(m_nIndex,0); 
	    int i; 
	    int j; 
	    i=atoi(PackNum); 
 	    j=GetVOBUNum(head, i); 
	    char buffer[20]; 
     	_itoa(j, buffer, 10 ); 
	 
	    CString T1; 
	    CString T2; 
	    CString T3; 
	    int index1; 
	    int index2; 
	    int index3; 
	 
		index1=m_ComboAdostrmid.GetCurSel(); 
		m_ComboAdostrmid.GetLBText(index1,T1); 
 
		index2=m_ComboAdocodec.GetCurSel(); 
		m_ComboAdocodec.GetLBText(index2,T2); 
 
		index3=m_ComboSubpicstrmid.GetCurSel(); 
	    m_ComboSubpicstrmid.GetLBText(index3,T3); 
 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
	    m_ListSubpic.DeleteAllItems(); 
 
	    ConLinkView(head, j, T1, T2, T3); 
	}	 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::OnePackView(Linklist L,  
								 int VOBUStart,  
								 int VOBUCount,  
								 CString AStreamID,  
								 CString ACodec,  
								 CString SPStreamID) 
{	 
	if(L==NULL) 
		return(FALSE); 
	else { 
		switch(L->m_Pack_Type) 
		{ 
		case 0:{UpdateData(); 
			VOBUView(L, VOBUStart, VOBUCount); 
			   }break;  
		case 1:{UpdateData(); 
			VOBUView(L, VOBUStart, VOBUCount); 
			   }break;                                               
		case 2:{UpdateData(); 
			VideoView(L, VOBUStart, VOBUCount); 
			   }break;  
		case 3:{UpdateData(); 
			AudioView(L, AStreamID, ACodec, VOBUStart, VOBUCount); 
			   }break;  
		case 4:{UpdateData(); 
			SubPView(L, SPStreamID, VOBUStart, VOBUCount);				   
			   }break;  
		case 5:return(TRUE);break;  
		} 
	} 
	 
return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::VOBUView(Linklist L,  
							  int VOBUStart,  
							  int VOBUCount) 
{ 
	char buffer0[20]; 
	_itoa(L->m_Pack_ID, buffer0, 10); 
	 
	char buffer1[20]; 
	_itoa(L->m_Pack_para1, buffer1, 2); 
	 
	char buffer2[20]; 
	_itoa(L->m_Pack_para2, buffer2, 2); 
	 
	char buffer3[20]; 
	_itoa(L->m_Pack_para3, buffer3, 2); 
 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1){ 
         
		m_ListVobu.InsertItem(0, buffer0); 
		m_ListVobu.SetItemText(0, 1 ,buffer1);  
		m_ListVobu.SetItemText(0, 2 ,buffer2); 
		m_ListVobu.SetItemText(0, 3 ,buffer3); 
		 
		m_ListPack.InsertItem(0, buffer0); 
		m_ListPack.SetItemText(0, 1 ,buffer1);  
		m_ListPack.SetItemText(0, 2 ,buffer2); 
		m_ListPack.SetItemText(0, 3 ,buffer3); 
		m_ListPack.SetItemText(0, 4, "/");  
		m_ListPack.SetItemText(0, 5, "/"); 
		m_ListPack.SetItemText(0, 6, "/"); 
		m_ListPack.SetItemText(0, 7, "/"); 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::ConditionalView(Linklist L,  
									 int VOBUStart,  
									 int VOBUCount,  
									 CString AStreamID,  
									 CString ACodec,  
									 CString SPStreamID) 
{ 
	if(L==NULL) 
		return(FALSE); 
	else { 
		switch(L->m_Pack_Type) 
		{ 
		case 0:{UpdateData(); 
			VOBUView(L, VOBUStart, VOBUCount); 
			   }break; 
		case 1:{UpdateData(); 
			VOBUView(L, VOBUStart, VOBUCount); 
			   }break;                                              
		case 2:{UpdateData(); 
			VideoView(L, VOBUStart, VOBUCount); 
			   }break; 
		case 3:{UpdateData(); 
			AudioView(L, AStreamID, ACodec, VOBUStart, VOBUCount); 
			   }break; 
		case 4:{UpdateData(); 
			SubPView(L, SPStreamID, VOBUStart, VOBUCount);				   
			   }break; 
		case 5:return(TRUE);break; 
		} 
        L=L->next; 
		ConditionalView(L, VOBUStart, VOBUCount, AStreamID, ACodec, SPStreamID); 
	} 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::SubPView(Linklist L,  
							  CString SPStreamID,  
							  int VOBUStart,  
							  int VOBUCount) 
{    
	char buffer0[20]; 
	_itoa(L->m_Pack_para1,buffer0,10); 
 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(((strcmp("ALL",SPStreamID) == 0) &&  
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1))  
		|| ((strcmp(SPStreamID, buffer0) == 0) &&   
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1))) 
	{ 
		char buffer1[20]; 
        _itoa(L->m_Pack_ID, buffer1, 10); 
 
		char buffer2[20]; 
        _itoa(L->m_Pack_para1, buffer2, 10); 
 
		char buffer3[20]; 
        _itoa(L->m_Pack_para2, buffer3, 2); 
 
		char buffer4[20]; 
        _itoa(L->m_Pack_para3, buffer4, 2); 
 
 
 
		m_ListSubpic.InsertItem(0, buffer1); 
		m_ListSubpic.SetItemText(0, 1 ,buffer2); 
		m_ListSubpic.SetItemText(0, 2 ,buffer3); 
		m_ListSubpic.SetItemText(0, 3 ,buffer4); 
		 
		m_ListPack.InsertItem(0, buffer1); 
		m_ListPack.SetItemText(0, 1, "/");  
		m_ListPack.SetItemText(0, 2, "/"); 
		m_ListPack.SetItemText(0, 3, buffer4); 
		m_ListPack.SetItemText(0, 4, buffer3);  
		m_ListPack.SetItemText(0, 5, "/"); 
		m_ListPack.SetItemText(0, 6, buffer2); 
		m_ListPack.SetItemText(0, 7, "/"); 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::AudioView(Linklist L,  
							   CString AStreamID, 
							   CString ACodec,  
							   int VOBUStart,  
							   int VOBUCount) 
{ 
	char buffer0[20]; 
	_itoa(L->m_Pack_para1, buffer0, 10); 
 
	CString t; 
	 
	switch(L->m_Pack_para2) 
	{ 
	case 1: t="MPEG";break; 
	case 2: t="AC3"; break; 
	case 3: t="DTS"; break; 
	case 4: t="SDDS"; break; 
	case 5: t="LinearPCM";break; 
	} 
 
 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(((strcmp("ALL", AStreamID) == 0) && (strcmp("ALL", ACodec) == 0) && 
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1))  
		|| ((strcmp(AStreamID, buffer0) == 0) &&  
		(strcmp(ACodec,t) == 0) &&  
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1)) || 
		((strcmp(AStreamID, buffer0) == 0) &&  
		(strcmp("ALL", ACodec) == 0) &&  
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1)) || 
		((strcmp(ACodec, t) == 0) &&  
		(strcmp("ALL", AStreamID) == 0) &&  
		(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1))) 
	{ 
		char buffer3[20]; 
        _itoa(L->m_Pack_ID, buffer3, 10 ); 
 
		char buffer4[20]; 
        _itoa(L->m_Pack_para1, buffer4, 10); 
 
		char buffer6[20]; 
        _itoa(L->m_Pack_para3, buffer6, 2 ); 
 
		char buffer7[20]; 
        _itoa(L->m_Pack_para4, buffer7, 2 ); 
 
 
 
		m_ListAdo.InsertItem(0, buffer3); 
		m_ListAdo.SetItemText(0, 1 ,buffer4); 
		m_ListAdo.SetItemText(0, 2 ,t); 
		m_ListAdo.SetItemText(0, 3 ,buffer6); 
		m_ListAdo.SetItemText(0, 4 ,buffer7); 
		 
		m_ListPack.InsertItem(0, buffer3); 
	    m_ListPack.SetItemText(0, 1, "/");  
		m_ListPack.SetItemText(0, 2, "/"); 
		m_ListPack.SetItemText(0, 3, buffer7); 
		m_ListPack.SetItemText(0, 4, buffer6);  
		m_ListPack.SetItemText(0, 5, "/"); 
		m_ListPack.SetItemText(0, 6, buffer4); 
		m_ListPack.SetItemText(0, 7, t); 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::VideoView(Linklist L,  
							   int VOBUStart,  
							   int VOBUCount) 
{ 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1){ 
        char buffer0[20]; 
        _itoa(L->m_Pack_ID, buffer0, 10 ); 
 
		char buffer1[20]; 
        _itoa(L->m_Pack_para1, buffer1, 2); 
 
		char buffer2[20]; 
        _itoa(L->m_Pack_para2, buffer2, 2); 
 
		char buffer3[20]; 
        _itoa(L->m_Pack_para3, buffer3, 2); 
 
 
 
		m_ListVdo.InsertItem(0, buffer0); 
		m_ListVdo.SetItemText(0, 1 ,buffer1); 
		m_ListVdo.SetItemText(0, 2 ,buffer2); 
		m_ListVdo.SetItemText(0, 3 ,buffer3); 
		 
		m_ListPack.InsertItem(0, buffer0); 
		m_ListPack.SetItemText(0, 1, "/");  
		m_ListPack.SetItemText(0, 2, "/"); 
		m_ListPack.SetItemText(0, 3, buffer3); 
		m_ListPack.SetItemText(0, 4, buffer1);  
		m_ListPack.SetItemText(0, 5, buffer2); 
		m_ListPack.SetItemText(0, 6, "/"); 
		m_ListPack.SetItemText(0, 7, "/"); 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::ConLinkView(Linklist L,  
								 int VOBUID,  
								 CString AStreamID,  
								 CString ACodec,  
								 CString SPStreamID) 
{ 
	if(L==NULL) 
		return(FALSE); 
	else { 
		switch(L->m_Pack_Type) 
		{  	 
		case 2:{UpdateData(); 
			LinkVideoView(L,VOBUID); 
			   }break; 
		case 3:{UpdateData(); 
			LinkAudioView(L,VOBUID, AStreamID, ACodec); 
			   }break; 
		case 4:{UpdateData(); 
			LinkSubPView(L,VOBUID, SPStreamID);				   
			   }break; 
		case 5:return(TRUE);break; 
		} 
        L=L->next; 
		ConLinkView(L, VOBUID, AStreamID, ACodec, SPStreamID); 
	} 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::LinkSubPView(Linklist L,  
								  int VOBUID,  
								  CString SPStreamID) 
{ 
	char buffer0[20]; 
	_itoa(L->m_Pack_para1,buffer0,10); 
	if(L==NULL) 
		return(FALSE); 
	else if((L->m_VOBU_ID==VOBUID && (strcmp(SPStreamID,buffer0)==0)) || 
		(L->m_VOBU_ID==VOBUID && (strcmp(SPStreamID,"ALL")==0))) 
	{ 
		char buffer1[20]; 
        _itoa(L->m_Pack_ID, buffer1, 10 ); 
 
		char buffer2[20]; 
        _itoa(L->m_Pack_para1, buffer2, 10); 
 
		char buffer3[20]; 
        _itoa(L->m_Pack_para2, buffer3, 2); 
 
		char buffer4[20]; 
        _itoa(L->m_Pack_para3, buffer4, 2); 
 
 
		m_ListSubpic.InsertItem(0, buffer1); 
		m_ListSubpic.SetItemText(0, 1 ,buffer2); 
		m_ListSubpic.SetItemText(0, 2 ,buffer3); 
		m_ListSubpic.SetItemText(0, 3 ,buffer4);	 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::LinkAudioView(Linklist L,  
								   int VOBUID,  
								   CString AStreamID,  
								   CString ACodec) 
{ 
	char buffer0[20]; 
	_itoa(L->m_Pack_para1,buffer0,10); 
 
	CString t; 
 
	switch(L->m_Pack_para2) 
	{ 
	case 1: t="MPEG";break; 
	case 2: t="AC3"; break; 
	case 3: t="DTS"; break; 
	case 4: t="SDDS"; break; 
	case 5: t="Linear PCM";break; 
	} 
 
	if(L==NULL) 
		return(FALSE); 
	else if((L->m_VOBU_ID==VOBUID && (strcmp(AStreamID,buffer0)==0) && (strcmp(ACodec,t)==0)) || 
		(L->m_VOBU_ID==VOBUID && (strcmp(AStreamID,"ALL")==0) && (strcmp(ACodec,t)==0)) || 
		(L->m_VOBU_ID==VOBUID && (strcmp(AStreamID,buffer0)==0) && (strcmp(ACodec,"ALL")==0)) || 
		(L->m_VOBU_ID==VOBUID && (strcmp(AStreamID,"ALL")==0) && (strcmp(ACodec,"ALL")==0))) 
	{ 
		char buffer2[20]; 
        _itoa(L->m_Pack_ID, buffer2, 10 ); 
 
		char buffer3[20]; 
        _itoa(L->m_Pack_para1, buffer3, 10); 
 
		char buffer5[20]; 
        _itoa(L->m_Pack_para3, buffer5, 2); 
 
		char buffer6[20]; 
        _itoa(L->m_Pack_para4, buffer6, 2); 
 
 		m_ListAdo.InsertItem(0, buffer2); 
		m_ListAdo.SetItemText(0, 1 ,buffer3); 
		m_ListAdo.SetItemText(0, 2 ,t); 
		m_ListAdo.SetItemText(0, 3 ,buffer5); 
		m_ListAdo.SetItemText(0, 4 ,buffer6);		 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::LinkVideoView(Linklist L,  
								   int VOBUID) 
{ 
	if(L==NULL) 
		return(FALSE); 
	else if(L->m_VOBU_ID==VOBUID) 
	{ 
		char buffer0[20]; 
        _itoa(L->m_Pack_ID, buffer0, 10 ); 
 
		char buffer1[20]; 
        _itoa(L->m_Pack_para1, buffer1, 2); 
 
		char buffer2[20]; 
        _itoa(L->m_Pack_para2, buffer2, 2); 
 
		char buffer3[20]; 
        _itoa(L->m_Pack_para3, buffer3, 2); 
 
		m_ListVdo.InsertItem(0, buffer0); 
		m_ListVdo.SetItemText(0, 1 ,buffer1); 
		m_ListVdo.SetItemText(0, 2 ,buffer2); 
		m_ListVdo.SetItemText(0, 3 ,buffer3);		 
	} 
	else return(TRUE); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::SpinView(Linklist L,  
							  int VOBUStart,  
							  int VOBUCount) 
{ 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(((L->m_Pack_Type==(enum CDVDUpdateView::Cpack::type)0) && (L->m_VOBU_ID >= VOBUStart) && (L->m_VOBU_ID <= VOBUStart + VOBUCount - 1)) || 
		    ((L->m_Pack_Type==(enum CDVDUpdateView::Cpack::type)1) && (L->m_VOBU_ID >= VOBUStart) && (L->m_VOBU_ID <= VOBUStart + VOBUCount - 1))){ 
        char buffer0[20]; 
        _itoa(L->m_Pack_ID, buffer0, 10 ); 
 
		char buffer1[20]; 
        _itoa(L->m_Pack_para1, buffer1, 2); 
		 
		char buffer2[20]; 
        _itoa(L->m_Pack_para2, buffer2, 2); 
		 
		char buffer3[20]; 
        _itoa(L->m_Pack_para3, buffer3, 2); 
 
		m_ListVobu.InsertItem(0, buffer0); 
	    m_ListVobu.SetItemText(0, 1 ,buffer1);  
     	m_ListVobu.SetItemText(0, 2 ,buffer2); 
		m_ListVobu.SetItemText(0, 3 ,buffer3); 
	} 
	L=L->next; 
	SpinView(L, VOBUStart, VOBUCount); 
	return(TRUE); 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
int CDVDUpdateView::GetVOBUNum(Linklist L,  
							   int PackNum) 
{ 
	Linklist p; 
	p=L; 
	while(p!=NULL){ 
		if(p->m_Pack_ID==PackNum) 
				return p->m_VOBU_ID; 
		else p=p->next;} 
} 
/********************************************************************************************/ 
/* 
/* 
/* 
/********************************************************************************************/ 
bool CDVDUpdateView::LinkVOBUView(Linklist L,  
								  int VOBUStart,  
								  int VOBUCount) 
{ 
	if(L==NULL){ 
		return(FALSE); 
	} 
	else if(L->m_VOBU_ID >= VOBUStart && L->m_VOBU_ID <= VOBUStart + VOBUCount - 1){ 
        char buffer0[20]; 
        _itoa(L->m_Pack_ID, buffer0, 10 ); 
 
		char buffer1[20]; 
        _itoa(L->m_Pack_para1, buffer1, 2); 
		 
		char buffer2[20]; 
        _itoa(L->m_Pack_para2, buffer2, 2); 
		 
		char buffer3[20]; 
        _itoa(L->m_Pack_para3, buffer3, 2); 
 
		m_ListVobu.InsertItem(0, buffer0); 
	    m_ListVobu.SetItemText(0, 1 ,buffer1);  
     	m_ListVobu.SetItemText(0, 2 ,buffer2); 
		m_ListVobu.SetItemText(0, 3 ,buffer3); 
	} 
	return(TRUE); 
} 
 
 
void CDVDUpdateView::OnRadioLogical()  
{ 
//	m_CheckStart = FALSE;  m_CheckCount = FALSE; 
//	UpdateData(FALSE); 
	this->m_RadioPhysical.SetCheck(FALSE); 
	GetDlgItem(IDC_CHECK_VOBID)->EnableWindow(TRUE); 
	GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(FALSE); 
	if (m_CheckVobid)   
	{ 
		GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(TRUE); 
		GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(TRUE); 
		if (m_CheckCellid) 
			GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(TRUE); 
 
	} 
 
	 
	GetDlgItem(IDC_CHECK_START)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CHECK_COUNT)->EnableWindow(FALSE); 
	GetDlgItem(IDC_EDIT_START)->EnableWindow(FALSE); 
	GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(FALSE); 
	 
	m_StartPack = -2; m_Count = -2; 
	m_Vobid = -1; m_Cellid = -1; 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnRadioPhysical()  
{ 
//	m_CheckVobid = FALSE;  m_CheckCellid = FALSE; 
//	UpdateData(FALSE); 
	this->m_RadioLogical.SetCheck(FALSE); 
	GetDlgItem(IDC_CHECK_START)->EnableWindow(TRUE); 
	GetDlgItem(IDC_CHECK_COUNT)->EnableWindow(TRUE); 
	if (m_CheckStart) GetDlgItem(IDC_EDIT_START)->EnableWindow(TRUE); 
	if (m_CheckCount) GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(TRUE); 
	 
	GetDlgItem(IDC_CHECK_VOBID)->EnableWindow(FALSE); 
	GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(FALSE); 
	GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(FALSE); 
	GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(FALSE); 
	 
	m_StartPack = -1; m_Count = -1; 
	m_Vobid = -2; m_Cellid = -2; 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnSelchangeComboRange()  
{ 
	int sel,i; 
	for (i=0;i<=8;i++) 
		m_UpdateFiles[i] = ""; 
	sel = this->m_ComboRange.GetCurSel(); 
	m_OutputName = m_ComboShowFiles[sel]; 
	i = 0; 
	while (m_ComboShowLinkFiles[sel][i] != "") 
	{ 
		m_UpdateFiles[i] = m_ComboShowLinkFiles[sel][i]; 
		i++; 
	}//将用户在组合框中选定的文件放入m_UpdateFiles数组 
	LONG flength = 0; 
	i=0; 
	while ((m_UpdateFiles[i] != "") && (i<=8)) 
	{ 
		CFile myfile; 
		myfile.Open(m_UpdateFiles[i++],CFile::modeRead); 
		flength += myfile.GetLength(); 
	} 
	m_MaxPack = flength/2048; 
	CString tstr; 
	tstr.Format("/%d",m_MaxPack); 
		this->GetDlgItem(IDC_STATIC_MAXPACK)->SetWindowText(tstr); 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnCheckCellid()  
{ 
	m_CheckCellid = !m_CheckCellid; 
	if (m_CheckCellid == FALSE) 
	{ 
		this->GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(FALSE); 
		m_Cellid = -1; 
	} 
	else 
		this->GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(TRUE); 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnCheckCount()  
{ 
	m_CheckCount = !m_CheckCount; 
	if (m_CheckCount == FALSE) 
	{ 
		this->GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(FALSE); 
		m_Count = -1; 
	} 
	else 
		this->GetDlgItem(IDC_EDIT_COUNT)->EnableWindow(TRUE); 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnCheckStart()  
{ 
	m_CheckStart = !m_CheckStart; 
	if (m_CheckStart == FALSE) 
	{ 
		this->GetDlgItem(IDC_EDIT_START)->EnableWindow(FALSE); 
		m_StartPack = -1; 
	} 
	else 
		this->GetDlgItem(IDC_EDIT_START)->EnableWindow(TRUE); 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::OnCheckVobid()  
{ 
	m_CheckVobid = !m_CheckVobid; 
	if (m_CheckVobid == FALSE) 
	{ 
		this->GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(FALSE); 
		this->GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(FALSE); 
		this->GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(FALSE); 
		m_Vobid = -1; m_Cellid = -1; 
	} 
	else 
	{ 
		this->GetDlgItem(IDC_EDIT_VOBID)->EnableWindow(TRUE); 
		this->GetDlgItem(IDC_CHECK_CELLID)->EnableWindow(TRUE); 
		if (m_CheckCellid) 
			this->GetDlgItem(IDC_EDIT_CELLID)->EnableWindow(TRUE); 
	} 
	// TODO: Add your control notification handler code here 
	 
} 
 
void CDVDUpdateView::ShowFolderVro(CString foldername) 
{ 
	CString tfilename;	//temp 
	CFileFind finder; 
	BOOL bWorking = finder.FindFile(foldername + "\\*.vro");//遍历vro文件 
	int i = 0; 
	 
	this->m_ComboRange.ResetContent(); 
	 
	while (bWorking) 
	{ 
		bWorking = finder.FindNextFile(); 
		 
		tfilename = finder.GetFileName(); 
		tfilename.MakeUpper();	 
		 
		if ( (tfilename == "VR_MOVIE.VRO") ||  
			(tfilename == "VR_STILL.VRO") ||  
			(tfilename == "VR_AUDIO.VRO")) 
		{ 
			 
			m_ComboShowFiles[i] = (LPCTSTR)finder.GetFileName(); 
			//vro文件没有合并显示情况,文件名直接放入m_ComboShowFiles数组 
			m_ComboShowLinkFiles[i][0] = (LPCTSTR)finder.GetFilePath(); 
			this->m_ComboRange.AddString(m_ComboShowFiles[i++]); 
			this->m_ComboRange.SetCurSel(-1); 
		} 
		 
	}	 
} 
 
void CDVDUpdateView::ShowFolderVob(CString foldername) 
{ 
	CString	files[MAX_PATH],filesname[MAX_PATH];//temp,含路径,不含路径 
	CFileFind finder; 
	CString tfilename;	//temp 
	BOOL bWorking = finder.FindFile(foldername + "\\*.vob"); 
	int i = 0; int j,k; 
	CString tstr,tstr1; char tch; 
	 
	this->m_ComboRange.ResetContent(); 
	 
	while (bWorking) 
	{ 
		bWorking = finder.FindNextFile(); 
		tfilename = finder.GetFileName(); 
		tfilename.MakeUpper(); 
		 
		if ((tfilename == "VIDEO_TS.VOB") ||  
			((tfilename.Left(4) == "VTS_") && (tfilename.Right(6).Left(1) == "_")) ) 
		{ 
			files[i] = finder.GetFilePath();//完整文件名放入临时数组 
			filesname[i++] = finder.GetFileName(); 
		}	 
	} 
	 
	i = 0; j = 0; k = 0; //i为filename数组下标,j,k为m_ComboShowLinkFiles数组下标 
	 
	int m=-1;//合并显示时的统计组别变量 
	int flag=0; 
	 
	while (filesname[i] != "") 
	{ 
		tfilename = filesname[i]; 
		tfilename.MakeUpper(); 
		if ( ( !((48 < filesname[i].Right(5).Left(1)) && (filesname[i].Right(5).Left(1)< 58))) || 
			(tfilename == "VIDEO_TS.VOB")) 
		{ 
			m_ComboShowFiles[j] = filesname[i]; 
			m_ComboShowLinkFiles[j++][0] = files[i++]; 
		} 
		else//需要合并显示 
		{ 
			if (flag == 0) 
			{ 
				tstr = filesname[i].Right(8); 
				tstr = tstr.Left(2); 
				m = atoi(tstr); 
				flag = 1;	 
			} 
			tstr = filesname[i+1].Right(8); 
			tstr = tstr.Left(2);//查看下一个文件情况 
			 
			if (m == atoi(tstr))//与下一个文件是一个系列 
			{	 
				m_ComboShowLinkFiles[j][k++] = files[i++]; 
			} 
			else//与下一个文件不是一个系列,m_ComboShowFiles需要更新 
			{ 
				m_ComboShowLinkFiles[j][k] = files[i]; 
				tstr = filesname[i].Right(8); 
				tstr = tstr.Left(2); 
				_itoa(k+1,&tch,10); 
				tstr1 = ("VTS_"+tstr+"_1-"+tch+".VOB"); 
				m_ComboShowFiles[j++] = (k>0) ? tstr1 : filesname[i]; 
				k = 0; 
				m = atoi(tstr); 
				i++; 
				flag = 0; 
			} 
		} 
	} 
	 
	i = 0; 
	while (m_ComboShowFiles[i] != "") 
	{ 
		this->m_ComboRange.AddString(m_ComboShowFiles[i++]); 
		this->m_ComboRange.SetCurSel(-1); 
	}	 
} 
 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CDVDUpdateView::StructInitial(Linklist &head, Linklist &lastaddr) 
{	 
	Linklist p1; 
 
	while(head->next != NULL) 
	{ 
		p1 = head->next; 
		head->next = p1->next; 
		free(p1); 
	} 
	 
	lastaddr = head; 
    return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CDVDUpdateView::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 CDVDUpdateView::NewData(Linklist &lastaddr) 
{ 
	Linklist p1; 
 
	p1 = (Linklist) malloc (sizeof (Cpack)); 
	lastaddr->next = p1; 
	lastaddr = p1; 
	lastaddr->next = NULL; 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CDVDUpdateView::PhyUpdate(int Start, int Count, CString filename[9]) 
{ 
	int i = 0; 
    int onesize = 0; 
	int k, packID = -1, VOBUID = -1; 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
 
	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; 
						OnePackView(LastPack, VOBUID, m_MaxPack, T1, T2, T3); 
					} 
					 
				} 
				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; 
					OnePackView(LastPack, VOBUID, m_MaxPack, T1, T2, T3); 
				} 
				 
			} 
			CloseHandle(hEvent); 
			CloseHandle(hFile); 
			delete pbRead; 
			delete pbBuf; 
		} 
	} 
 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CDVDUpdateView::LogUpdate(int VOBID, int CELLID, CString filename[9]) 
{ 
	int i = 0; 
	int onesize = 0; 
	int k, packID = -1, VOBUID = -1; 
	bool flag = 0;	 
	CString T1; 
	CString T2; 
	CString T3; 
	int index1; 
	int index2; 
	int index3; 
	 
	index1=m_ComboAdostrmid.GetCurSel(); 
	m_ComboAdostrmid.GetLBText(index1,T1); 
	 
	index2=m_ComboAdocodec.GetCurSel(); 
	m_ComboAdocodec.GetLBText(index2,T2); 
	 
	index3=m_ComboSubpicstrmid.GetCurSel(); 
	m_ComboSubpicstrmid.GetLBText(index3,T3); 
 
 
	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; 
						OnePackView(LastPack, VOBUID, m_MaxPack, T1, T2, T3); 
					} 
						 
				} 
				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; 
					OnePackView(LastPack, VOBUID, m_MaxPack, T1, T2, T3); 
				} 
				 
			} 
			CloseHandle(hEvent); 
			CloseHandle(hFile); 
			delete pbRead; 
			delete pbBuf; 
		} 
 
	} 
	 
	return TRUE; 
} 
 
/****************************************************************************** 
/* 
/* 
/* 
/* 
/* 
/*****************************************************************************/ 
bool CDVDUpdateView::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;	 
} 
 
 
/****************************************************************************************/ 
/* Name     : char* CDVDUpdateView::CreatName(int n) 
/* Function : create the filename including the file path to save 
/* Input    : int n , n is Pack ID 
/* Return   : char *FileName , the name and the path to save 
/****************************************************************************************/ 
char* CDVDUpdateView::CreatName(int n,char* files,CString file) 
{ 
	CString filename; 
	CString name; 
	CString replace;       //declare 3 CString variables to creat the filename 
	FILE *fp;              //file operation pointer 
	char *h;			    
	char hd[20];           //save the pack head 
	char *FileName;		   //filename to save at last 
	h=hd; 
	int seek; 
	int i,length;  
 
	 
	if((fp=fopen(files,"rb"))==NULL){		//open the source file 
		printf("Can't open file!\n"); 
		exit(0); 
	} 
	 
	seek=2048*n; 
	fseek(fp,seek,0); 
	fread(hd,20,1,fp);      //put the first 20 bytes of the source file into hd[20] 
 
	switch(*(h+3)){ 
		case -69 : name = ".nv"; break; 
		case -65 : name = ".rdi"; break; 
		case -32 : name = ".vid"; break; 
		case -68 : { 
			replace = GetReplace(hd);          //replace X by the stream ID  
			if (*(h+7) == 1) { name = ".X.mpg" ; name.Replace("X",replace); } 
			if (*(h+7) == 2) { name = ".X.ac5" ; name.Replace("X",replace); } 
			if (*(h+7) == 3) { name = ".X.dts" ; name.Replace("X",replace); } 
			if (*(h+7) == 4) { name = ".X.sdds" ; name.Replace("X",replace); } 
			if (*(h+7) == 5) { name = ".X.pcm" ; name.Replace("X",replace); } 
				}; break ; 
		case -48 : { name = ".YY.sp" ; replace=GetReplace(hd); 
			name.Replace("YY",replace); break; }  //replace YY by the stream ID 
		default  : name = ".err"; break; 
	} 
 
	filename = m_SaveFile+ "\\" + file + name;    //creat the filename(CString) 
 
	length=filename.GetLength(); 
	FileName=new char[length];  
    for(i=0;im_Pack_Type){ 
					case L->NV_PCK:fprintf(fplog,"Pack %d NV_PCK *** VOB_ID:%d   CELL_ID:%d   SCR:%d   \n", 
							k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
					case L->RDI_PCK:fprintf(fplog,"Pack %d RDI_PCK *** SCR:%d   \n",k,L->m_Pack_para1);break; 
					case L->V_Pack:fprintf(fplog,"Pack %d Video Pack *** PTS:%d   DTS:%d   SCR:%d   \n", 
							k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
					case L->A_Pack:fprintf(fplog, 
							"Pack %d Audio Pack *** StreamID:%d   Codec:%d   PTS:%d   SCR:%d   \n", 
							k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3,L->m_Pack_para4); 
			            break; 
					case L->SP_Pack:fprintf(fplog,"Pack %d Sub-Picture Pack *** StreamID:%d   PTS:%d   SCR:%d   \n", 
							k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
					default : fprintf(fplog,"Pack %d    This pack is a wrong pack!\n",k);break; 
				} 
				if(fclose(fplog)){ 
					printf("Can not close file!\n"); 
					exit(0); 
				}									//close the log file 
			} 
			WaitForSingleObject(hEvent, INFINITE); 
			memcpy(pbBuf, pbRead, 2048); 
 
			if((fplog=fopen(LogFileName,"a+"))==NULL){ 
				printf("can not open file!\n"); 
				exit(0); 
			} 
 
			 
			OnePackUpdate(pbBuf,L); 
 
			switch(L->m_Pack_Type){ 
				case L->NV_PCK:fprintf(fplog,"Pack %d NV_PCK *** VOB_ID:%d   CELL_ID:%d   SCR:%d   \n", 
						k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
				case L->RDI_PCK:fprintf(fplog,"Pack %d RDI_PCK *** SCR:%d   \n",k,L->m_Pack_para1);break; 
				case L->V_Pack:fprintf(fplog,"Pack %d Video Pack *** PTS:%d   DTS:%d   SCR:%d   \n", 
						k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
				case L->A_Pack:fprintf(fplog, 
						"Pack %d Audio Pack *** StreamID:%d   Codec:%d   PTS:%d   SCR:%d   \n", 
						k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3,L->m_Pack_para4); 
			            break; 
				case L->SP_Pack:fprintf(fplog,"Pack %d Sub-Picture Pack *** StreamID:%d   PTS:%d   SCR:%d   \n", 
						k,L->m_Pack_para1,L->m_Pack_para2,L->m_Pack_para3);break; 
				default : fprintf(fplog,"Pack %d    This pack is a wrong pack!\n",k);break; 
			} 
			if(fclose(fplog)){ 
				printf("Can not close file!\n"); 
				exit(0); 
			}									//close the log file 
 
			CloseHandle(hEvent); 
			CloseHandle(hFile); 
			delete pbRead; 
			delete pbBuf; 
		} 
		i++; 
	} 
	free(L); 
	MessageBox("Output Finished!"); 
} 
 
void CDVDUpdateView::OnChangeEditVobucount()  
{ 
	// TODO: If this is a RICHEDIT control, the control will not 
	// send this notification unless you override the CFormView::OnInitDialog() 
	// function and call CRichEditCtrl().SetEventMask() 
	// with the ENM_CHANGE flag ORed into the mask. 
	 
	// TODO: Add your control notification handler code here 
	CString tstr; 
	GetDlgItemText(IDC_EDIT_VOBUCOUNT,tstr); 
	if (tstr != "") 
	{ 
		 
		UpdateData(TRUE); 
		CString T1; 
		CString T2; 
		CString T3; 
		int index1; 
		int index2; 
		int index3; 
		 
		index1=m_ComboAdostrmid.GetCurSel(); 
		m_ComboAdostrmid.GetLBText(index1,T1); 
		index2=m_ComboAdocodec.GetCurSel(); 
		m_ComboAdocodec.GetLBText(index2,T2); 
		index3=m_ComboSubpicstrmid.GetCurSel(); 
		m_ComboSubpicstrmid.GetLBText(index3,T3); 
		 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart, m_EditVobucount, T1, T2, T3); 
	} 
	 
} 
 
void CDVDUpdateView::OnChangeEditVobustart()  
{ 
	// TODO: If this is a RICHEDIT control, the control will not 
	// send this notification unless you override the CFormView::OnInitDialog() 
	// function and call CRichEditCtrl().SetEventMask() 
	// with the ENM_CHANGE flag ORed into the mask. 
	 
	// TODO: Add your control notification handler code here 
	CString tstr; 
	GetDlgItemText(IDC_EDIT_VOBUSTART,tstr); 
	if (tstr != "") 
	{ 
		 
		UpdateData(TRUE); 
		CString T1; 
		CString T2; 
		CString T3; 
		int index1; 
		int index2; 
		int index3; 
		 
		index1=m_ComboAdostrmid.GetCurSel(); 
		m_ComboAdostrmid.GetLBText(index1,T1); 
		index2=m_ComboAdocodec.GetCurSel(); 
		m_ComboAdocodec.GetLBText(index2,T2); 
		index3=m_ComboSubpicstrmid.GetCurSel(); 
		m_ComboSubpicstrmid.GetLBText(index3,T3); 
		 
		m_ListVobu.DeleteAllItems();//清空VOBU List中的所有内容 
		m_ListVdo.DeleteAllItems(); 
		m_ListAdo.DeleteAllItems(); 
		m_ListSubpic.DeleteAllItems(); 
		m_ListPack.DeleteAllItems(); 
		ConditionalView(head, m_EditVobustart, m_EditVobucount, T1, T2, T3); 
	} 
	 
}