// BonTsDemuxDlg.cpp : 実装ファイル
//

#include "stdafx.h"
#include "BonTsDemux.h"
#include "BonTsDemuxDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define WM_DOBATCH    WM_USER+100


// アプリケーションのバージョン情報に使われる CAboutDlg ダイアログ

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// ダイアログ データ
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV サポート

// 実装
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CBonTsDemuxDlg ダイアログ




CBonTsDemuxDlg::CBonTsDemuxDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBonTsDemuxDlg::IDD, pParent)
	, m_TsConverter(this)
	, m_csTsPath(_T(""))
	, m_csVideoPath(_T(""))
	, m_csAudioPath(_T(""))
	, m_bAacDecode(FALSE)
	, m_bLipSync(FALSE)
	, m_check_rf64(FALSE)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_bTestMode = FALSE;
	m_wSelectServiceID = FALSE;
}

void CBonTsDemuxDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_TSPATH, m_csTsPath);
	DDX_Text(pDX, IDC_VIDEOPATH, m_csVideoPath);
	DDX_Control(pDX, IDC_PROGRESS, m_Progress);
	DDX_Control(pDX, IDC_COMBO1, m_ComboEncode);
	DDX_Control(pDX, IDC_BATCH_LIST, m_ListBatch);
	DDX_Control(pDX, IDC_COMBO_SOUND, m_ComboSound);
	DDX_Control(pDX, IDC_COMBO_AUDIOES, m_ComboAudioEs);
	DDX_Control(pDX, IDC_SVCOMBO, m_ComboService);
	DDX_Check(pDX, IDC_CHECK_RF64, m_check_rf64);
}

BEGIN_MESSAGE_MAP(CBonTsDemuxDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	//}}AFX_MSG_MAP
	ON_WM_DESTROY()
	ON_BN_CLICKED(IDC_BROWSETS, &CBonTsDemuxDlg::OnBnClickedBrowseTs)
	ON_BN_CLICKED(IDC_BROWSEVIDEO, &CBonTsDemuxDlg::OnBnClickedBrowseVideo)
	ON_BN_CLICKED(IDC_START, &CBonTsDemuxDlg::OnBnClickedStart)
	ON_BN_CLICKED(IDC_STOP, &CBonTsDemuxDlg::OnBnClickedStop)
	ON_BN_CLICKED(IDC_BATCH_ADD, &CBonTsDemuxDlg::OnBnClickedBatchAdd)
	ON_BN_CLICKED(IDC_BATCH_DEL, &CBonTsDemuxDlg::OnBnClickedBatchDel)
	ON_LBN_SELCHANGE(IDC_BATCH_LIST, &CBonTsDemuxDlg::OnLbnSelchangeBatchList)
	ON_MESSAGE(WM_DOBATCH,&CBonTsDemuxDlg::OnDoBatch ) // 追加
	ON_BN_CLICKED(IDC_BUTTON_REPLACE, &CBonTsDemuxDlg::OnBnClickedButtonReplace)
	ON_WM_DROPFILES()
	ON_BN_CLICKED(IDC_SERVICE_REFLESH, &CBonTsDemuxDlg::OnBnClickedServiceReflesh)
END_MESSAGE_MAP()


// CBonTsDemuxDlg メッセージ ハンドラ

BOOL CBonTsDemuxDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// "バージョン情報..." メニューをシステム メニューに追加します。

	// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// TODO: 初期化をここに追加します。

	wchar_t szModulePath[256],drv[10],path[256],ext[256],appname[256],execname[256];
	wchar_t enc_param[256];
	enc_param[0] = NULL;
	GetModuleFileName(NULL,szModulePath,256);
	_wsplitpath(szModulePath,drv,path,appname,ext);
	_wmakepath(execname,drv,path,L"cap_sts_sea",L"ini");
	m_ini_path = execname;

	FILE	*fp;
	CString pg;
	wchar_t buffer[WCHAR_MAX];
	errno_t err;
	m_pCmdLine = &((CBonTsDemuxApp*)AfxGetApp())->m_CmdInfo;

	m_ComboEncode.Clear();

	m_ComboEncode.AddString(L"Demux(m2v+wav)");

	err = _wfopen_s(&fp, execname , L"rt");	//読み込み専用、テキストモード

	if(err == 0){

		for(;;){
			if(fgetws(buffer, WCHAR_MAX, fp) == NULL){	//一行読み込み(S-JIS -> Unicode自動変換)
				// 中身がない
				fclose(fp);
				break;
			}
			if(wcsstr(buffer, L"[VLC_SETTING]") == buffer){
				pg = L"";
				continue;
			} else if(wcsstr(buffer, L"[FFMPEG_SETTING]") == buffer){
				pg = L"ffmpeg:";
				continue;
			} else if(wcsstr(buffer, L"[") == buffer){
				pg = "";
			} else if(wcsstr(buffer, L";")){
				continue;
			} else if(wcsstr(buffer, L"PATH")){
				continue;
			} else if(wcsstr(buffer, L"_EXT")){
				continue;
			}

			if(pg != ""){
				wchar_t* arg;
				arg = wcsstr(buffer, L"=");
				if(arg == NULL) continue;
				*arg=NULL;
				CString buf;
				buf=buffer;
				buf.Trim();
				m_ComboEncode.AddString(buf);
			}
		}
		fclose(fp);
	}
	m_ComboEncode.AddString(L"Demux(m2v)");
	m_ComboEncode.AddString(L"Demux(wav)");
	if(m_ComboEncode.SelectString(-1,m_pCmdLine->m_ffmpeg_param) == CB_ERR){
		m_ComboEncode.SetCurSel(0);
	}

	m_ComboSound.AddString(TEXT("Stereo(主+副)"));		// SoundMethod 0
	m_ComboSound.AddString(TEXT("主音声"));				// SoundMethod 1
	m_ComboSound.AddString(TEXT("副音声"));				// SoundMethod 2
	m_ComboSound.AddString(TEXT("強制5.1ch"));			// SoundMethod 3
	m_ComboSound.AddString(TEXT("強制5.1ch(Split)"));	// SoundMethod 4
	m_ComboSound.SetCurSel(m_pCmdLine->m_sound_method);

	m_ComboAudioEs.AddString(TEXT("0"));
	m_ComboAudioEs.AddString(TEXT("1"));
	m_ComboAudioEs.AddString(TEXT("2"));
	m_ComboAudioEs.SetCurSel(m_pCmdLine->m_audio_es);

	if(m_pCmdLine->m_service){
		CComboBox *pServiceCombo = static_cast<CComboBox *>(GetDlgItem(IDC_SVCOMBO));
		CString Str;
		Str.Format(L"%d - noname",m_pCmdLine->m_service);
		pServiceCombo->AddString(Str);
		pServiceCombo->SetItemData(0,m_pCmdLine->m_service);
		pServiceCombo->SetCurSel(0);
	}

	m_csTsPath = m_pCmdLine->m_input_file;
	m_csVideoPath = m_pCmdLine->m_output_file;
	if(m_csTsPath != L"" && m_csVideoPath== L""){
		m_csVideoPath = m_csTsPath;
		m_csVideoPath.Delete(m_csVideoPath.ReverseFind('.'),m_csVideoPath.GetLength());	// 拡張子を消す
	}

	m_check_rf64 = m_pCmdLine->m_rf64;
	UpdateData(FALSE);

	if(m_pCmdLine->m_start){
		StartDemux();
	}
	return TRUE;  // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
/*
	enum CmdLineNextField {INPUT_FILE,OUTPUT_FILE,SERVICE_NUM,AUDIO_ES,FFMPEG_PARAM,SOUND_METHOD};

	void ParseParam(const TCHAR* pszParam, BOOL bFlag, BOOL bLast);
	DWORD m_next;
	DWORD m_sound_method;
	DWORD m_service;
	DWORD m_audio_es;
	CString m_input_file;
	CString m_output_file;
	CString m_ffmpeg_param;
*/
void CBonTsDemuxDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// ダイアログに最小化ボタンを追加する場合、アイコンを描画するための
//  下のコードが必要です。ドキュメント/ビュー モデルを使う MFC アプリケーションの場合、
//  これは、Framework によって自動的に設定されます。

void CBonTsDemuxDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 描画のデバイス コンテキスト

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// クライアントの四角形領域内の中央
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// アイコンの描画
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// ユーザーが最小化したウィンドウをドラッグしているときに表示するカーソルを取得するために、
//  システムがこの関数を呼び出します。
HCURSOR CBonTsDemuxDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CBonTsDemuxDlg::OnDestroy()
{
	CDialog::OnDestroy();

	// TODO: ここにメッセージ ハンドラ コードを追加します。
}

void CBonTsDemuxDlg::OnBnClickedBrowseTs()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	CFileDialog Dlg(TRUE, TEXT("ts"), NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, TEXT("TSファイル (*.ts)|*.ts||"));

	if(Dlg.DoModal() == IDOK){
		m_csTsPath = Dlg.GetPathName();

		m_bTestMode = TRUE;
		const bool bReturn = m_TsConverter.ConvertTsFile(m_csTsPath, TEST_READ_SIZE, NO_SERVICE_SELECT, NULL, NULL);

		m_csVideoPath = m_csTsPath;
		m_csVideoPath.Delete(m_csVideoPath.ReverseFind('.'),m_csVideoPath.GetLength());

//		m_csVideoPath = m_csTsPath;
//		m_csVideoPath.Replace(TEXT(".ts"), TEXT(".avi"));
		
		m_csAudioPath = m_csTsPath;
		m_csAudioPath.Replace(TEXT(".ts"), TEXT(".aac"));
				
		UpdateData(FALSE);
		}
}

void CBonTsDemuxDlg::OnBnClickedBrowseVideo()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	m_csVideoPath = m_csTsPath;
	m_csVideoPath.Delete(m_csVideoPath.ReverseFind('.'),m_csVideoPath.GetLength());

	CFileDialog Dlg(FALSE, TEXT("*"), m_csVideoPath, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, TEXT("ファイル (*.*)|*.*||"));
	if(Dlg.DoModal() != IDOK)return;

	m_csVideoPath = Dlg.GetPathName();
	if(m_csVideoPath.ReverseFind('.') && m_csVideoPath.ReverseFind('.') > m_csVideoPath.ReverseFind('\\')){
		m_csVideoPath.Delete(m_csVideoPath.ReverseFind('.'),m_csVideoPath.GetLength());
	}

	UpdateData(FALSE);
}

void CBonTsDemuxDlg::OnBnClickedBrowseAudio()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	CFileDialog Dlg(FALSE, TEXT("aac"), NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, TEXT("aacファイル (*.aac)|*.aac|wavファイル (*.wav)|*.wav||"));
	if(Dlg.DoModal() != IDOK)return;
	
	m_csAudioPath = Dlg.GetPathName();
	m_bAacDecode = (Dlg.GetFileExt() == TEXT("aac"))? false : true;
		
	UpdateData(FALSE);
}

void CBonTsDemuxDlg::OnBnClickedVideoOut()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	UpdateData(TRUE);
	
	GetDlgItem(IDC_VIDEOPATH)->EnableWindow(m_bVideoOut);
	GetDlgItem(IDC_BROWSEVIDEO)->EnableWindow(m_bVideoOut);
}

void CBonTsDemuxDlg::OnBnClickedAudioOut()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	UpdateData(TRUE);
	
}

void CBonTsDemuxDlg::OnBnClickedAacDecode()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	UpdateData(TRUE);
	
	if(m_bAacDecode){
		m_csAudioPath.Replace(TEXT(".aac"), TEXT(".wav"));
		}
	else{
		m_csAudioPath.Replace(TEXT(".wav"), TEXT(".aac"));
		}
		
	UpdateData(FALSE);
}

void CBonTsDemuxDlg::StartDemux(void)
{
	wchar_t buff[1024],ext[256];
	CString param;
	buff[0] = NULL;
	ext[0] = NULL;
	if(m_ComboEncode.GetCurSel()>=0){
		m_ComboEncode.GetLBText( m_ComboEncode.GetCurSel(),param );
		GetPrivateProfileString(L"FFMPEG_SETTING",param,L"",buff,sizeof(buff),m_ini_path);
		param = param + L"_EXT";
		GetPrivateProfileString(L"FFMPEG_SETTING",param,L"",ext,sizeof(ext),m_ini_path);
	}

	m_bTestMode = FALSE;

	if(buff[0] == NULL){
//		m_csVideoPath.Replace(TEXT(".avi"), TEXT(""));

		m_csAudioPath = m_csVideoPath + L".wav";
		m_csVideoPath += L".m2v";
	} else if (m_pCmdLine->m_disable_rename == FALSE){
		if(ext[0] == NULL){
			if(wcsstr(buff, L"-vcodec copy") || wcsstr(buff, L"-vcodec mpeg") || wcsstr(buff, L"-target ntsc-dvd") ){
				m_csVideoPath += L".mpg";
			} else if(wcsstr(buff, L"-f mp4") || wcsstr(buff, L"-f psp") || wcsstr(buff, L"-f ipod")){
				m_csVideoPath += L".mp4";
			} else {
				m_csVideoPath += L".avi";
			}
		} else {
			m_csVideoPath += L".";
			m_csVideoPath += ext;
		}
	}
	if(wcsstr(param, L"Demux(wav)")){
		m_csVideoPath = L"";
	} else if(wcsstr(param, L"Demux(m2v)")){
		m_csAudioPath = L"";
	}
/*
	switch(m_ComboSound.GetCurSel()){
		case 0:		// Normal Stereo
			break;
		case 1:		// Right Only
			break;
		case 2:		// Left Only
			break;
		case 3:		// Force 5.1ch
			break;
		default:
			break;
	}
*/
	// コンバート開始
	CComboBox *pServiceCombo = static_cast<CComboBox *>(GetDlgItem(IDC_SVCOMBO));
	m_wSelectServiceID = NO_SERVICE_SELECT;
	int iSelPos = pServiceCombo->GetCurSel();
	if(iSelPos!=-1)
	{
		m_wSelectServiceID = static_cast<WORD>(pServiceCombo->GetItemData(iSelPos));
	}

	const bool bReturn = m_TsConverter.ConvertTsFile(m_csTsPath,READ_TO_FILEEND,m_wSelectServiceID,
													(LPCTSTR)m_csVideoPath,
													(LPCTSTR)m_csAudioPath,
													true,//(m_bAacDecode)? true : false,
													true,//(m_bLipSync)? true : false,
													buff,
													m_ComboSound.GetCurSel(),
													m_ComboAudioEs.GetCurSel(),
													m_check_rf64
													);

	if(!bReturn){
		::AfxMessageBox(TEXT("ファイルのオープンに失敗しました。"));
		}
}

LRESULT CBonTsDemuxDlg::OnDoBatch(WPARAM wParam, LPARAM lParam )
{
    // ここにメッセージを受け取ったときの処理を記述
	OnLbnSelchangeBatchList();

	StartDemux();
	return 0;
}


void CBonTsDemuxDlg::OnBnClickedStart()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	m_Abort = FALSE;
	OnBnClickedAacDecode();
	
//	if(!m_bVideoOut && !m_bAudioOut){
//		::AfxMessageBox(TEXT("ビデオまたはオーディオを出力設定にしてください。"));
//		return;
//		}

	if(m_csVideoPath != _TEXT("")){
		OnBnClickedBatchAdd();
	}
	m_ListBatch.SetCurSel(0);
	UpdateData(TRUE);
	OnLbnSelchangeBatchList();

	StartDemux();
}

void CBonTsDemuxDlg::OnBnClickedStop()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	m_Abort = TRUE;
	m_TsConverter.CancelConvert();
}

void CBonTsDemuxDlg::LockControl(const BOOL bLock)
{
	// コントロールをロックする
	const BOOL bEnable = (bLock)? FALSE : TRUE;

	GetDlgItem(IDC_START)->EnableWindow(bEnable);
	GetDlgItem(IDC_BROWSETS)->EnableWindow(bEnable);
	GetDlgItem(IDC_BROWSEVIDEO)->EnableWindow(bEnable);
	GetDlgItem(IDC_TSPATH)->EnableWindow(bEnable);
	GetDlgItem(IDC_VIDEOPATH)->EnableWindow(bEnable);
	GetDlgItem(IDC_COMBO1)->EnableWindow(bEnable);
	GetDlgItem(IDC_BATCH_LIST)->EnableWindow(bEnable);
	GetDlgItem(IDC_BATCH_ADD)->EnableWindow(bEnable);
	GetDlgItem(IDC_BATCH_DEL)->EnableWindow(bEnable);
	GetDlgItem(IDC_COMBO_SOUND)->EnableWindow(bEnable);
	GetDlgItem(IDC_COMBO_AUDIOES)->EnableWindow(bEnable);
	GetDlgItem(IDC_BUTTON_REPLACE)->EnableWindow(bEnable);
	GetDlgItem(IDC_SVCOMBO)->EnableWindow(bEnable);
	GetDlgItem(IDC_SERVICE_REFLESH)->EnableWindow(bEnable);
}

void  CBonTsDemuxDlg::OnTsConverterStart(const ULONGLONG llFileSize)
{
	// 変換開始イベント
	LockControl(TRUE);
	m_Progress.SetRange(0, 1000);

	m_Progress.SetPos(0);
}

void  CBonTsDemuxDlg::OnTsConverterEnd(const ULONGLONG llFileSize)
{
	// 変換終了イベント
	int sel = m_ListBatch.GetCurSel() + 1;

	LockControl(FALSE);
	if(m_bTestMode){
		SetDlgItemText(IDC_INFOVIEW, TEXT("サーチ完了"));
		return;
	}

	if(m_ListBatch.GetCount() <= sel || m_Abort){
		SetDlgItemText(IDC_INFOVIEW, TEXT("変換が完了しました"));

		m_csVideoPath = "";
		m_csTsPath = "";

		GetDlgItem(IDC_TSPATH)->SetWindowTextW(TEXT(""));
		GetDlgItem(IDC_VIDEOPATH)->SetWindowTextW(TEXT(""));
		if(m_pCmdLine->m_quit){
			EndDialog(0);
		}
	} else {
		m_ListBatch.SetCurSel(sel);
		::PostMessage(m_hWnd,WM_DOBATCH,0,0);
	}
}

void CBonTsDemuxDlg::OnTsConverterProgress(const ULONGLONG llCurPos, const ULONGLONG llFileSize)
{
	// 進捗更新イベント
	if(m_bTestMode) return;

	m_Progress.SetPos((int)((llCurPos * 1000ULL) / llFileSize));
}

void CBonTsDemuxDlg::OnTsConverterServiceName(LPCTSTR lpszServiceName)
{
	// サービス名更新イベント
	CString csText;
	csText.Format(TEXT("サービス名： %s"), lpszServiceName);
	SetDlgItemText(IDC_INFOVIEW, csText);
}

void CBonTsDemuxDlg::OnTsConverterServiceInfo(CProgManager *pProgManager)
{
	// サービスリスト更新イベント
	CComboBox *pServiceCombo = static_cast<CComboBox *>(GetDlgItem(IDC_SVCOMBO));

	int iCurSel = pServiceCombo->GetCurSel();
	if(pServiceCombo->GetCount()==0) iCurSel = -1;
	WORD wCurServiceSel = static_cast<WORD>(pServiceCombo->GetItemData(iCurSel));
	if(!m_bTestMode){
		wCurServiceSel = m_wSelectServiceID;
		}
	pServiceCombo->ResetContent();
	TCHAR szServiceName[1024];
	WORD wServiceID;
	bool bSelected = false;
	
	// サービス名更新
	for(WORD wIndex = 0U ; wIndex < pProgManager->GetServiceNum() ; wIndex++){
		if(pProgManager->GetServiceID(&wServiceID, wIndex)){
			CString Str;
			if(pProgManager->GetServiceName(szServiceName, wIndex)){				
				Str.Format(TEXT("%5d : %s"),wServiceID,szServiceName);
				}
			else{				
				Str.Format(TEXT("%5d : サービス名取得中..."),wServiceID);
				}
			// サービス更新
			int iPos = pServiceCombo->AddString(Str);
			pServiceCombo->SetItemData(iPos,wServiceID);
			// リスト変更前に選択しているアイテムなら再選択する
			if(iCurSel != -1){
				if(wCurServiceSel==wServiceID){
					pServiceCombo->SetCurSel(iPos);
					bSelected = true;
					}
				}
			}			
		}
	// 選択がまったくない場合、一番上のアイテムを選択する
	if(!bSelected || m_bTestMode){
		pServiceCombo->SetCurSel(0);
		}
}
void CBonTsDemuxDlg::OnBnClickedBatchAdd()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	CString buff,buff2,num;
	if(m_csTsPath == L"" || m_csVideoPath == L""){
		AfxMessageBox(L"ファイル名がありません。");
		return;
	}
	buff = m_csTsPath+L","+m_csVideoPath+L","+m_csAudioPath;

	num.Format(L"%d",m_ComboEncode.GetCurSel());
	buff += L",";
	buff += num;

	num.Format(L"%d",m_ComboSound.GetCurSel());	
	buff += L",";
	buff += num;

	num.Format(L"%d",m_ComboAudioEs.GetCurSel());	
	buff += L",";
	buff += num;
	
	num.Format(L"%d",m_ComboService.GetCurSel());	
	buff += L",";
	buff += num;

	for(int i = 0 ; i < m_ComboService.GetCount() ; i ++){
		wchar_t param[256];
		m_ComboService.GetLBText( i,param );
		buff += L",";
		buff += param;
		buff2.Format(L"%d",(DWORD)m_ComboService.GetItemData(i));
		buff += L",";
		buff += buff2;
	}
	
	//重複チェック
	int i,cnt;
	cnt = m_ListBatch.GetCount();
	for(i = 0 ; i < cnt ; i ++){
		CString item;
		m_ListBatch.GetText(i,item);
		if(item == buff) return;
	}
	
	int sel = m_ListBatch.GetCurSel();
	if(sel <= 0){
		m_ListBatch.InsertString(m_ListBatch.GetCount(),buff);
	} else {
		m_ListBatch.InsertString(sel,buff);
	}


	m_csVideoPath = "";
	m_csTsPath = "";

	m_ComboService.ResetContent();

	UpdateData(FALSE);
}

void CBonTsDemuxDlg::OnBnClickedBatchDel()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	m_ListBatch.DeleteString(m_ListBatch.GetCurSel());
	m_ListBatch.SetCurSel(0);

	m_csVideoPath = "";
	m_csTsPath = "";

	m_ComboService.ResetContent();

	UpdateData(FALSE);
}

void CBonTsDemuxDlg::OnLbnSelchangeBatchList()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	CString item,num;
	int sel = m_ListBatch.GetCurSel();
	if(sel <0) return;

	m_ListBatch.GetText(m_ListBatch.GetCurSel(),item);
	RtlToken tok((LPCTSTR)item, L",");
	m_csTsPath = tok.GetNextToken();
	m_csVideoPath = tok.GetNextToken();
	m_csAudioPath = tok.GetNextToken();

	num = tok.GetNextToken();
	m_ComboEncode.SetCurSel(_wtoi((LPCTSTR)num));
	num = tok.GetNextToken();
	m_ComboSound.SetCurSel(_wtoi((LPCTSTR)num));
	num = tok.GetNextToken();
	m_ComboAudioEs.SetCurSel(_wtoi((LPCTSTR)num));

	num = tok.GetNextToken();
	m_ComboService.ResetContent();
	for(int i = 0;; i ++){
		item = tok.GetNextToken();
		if(item == L"") break;
		m_ComboService.AddString(item);
		item = tok.GetNextToken();
		m_ComboService.SetItemData(i,_wtoi((LPCTSTR)item));
	}
	m_ComboService.SetCurSel(_wtoi((LPCTSTR)num));


	UpdateData(FALSE);
}

void CBonTsDemuxDlg::OnBnClickedButtonReplace()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	if(m_csTsPath == L"" || m_csVideoPath == L""){
		AfxMessageBox(L"ファイル名がありません。");
		return;
	}

//	OnBnClickedBatchDel();
	m_ListBatch.DeleteString(m_ListBatch.GetCurSel());
	OnBnClickedBatchAdd();
}

void CBonTsDemuxDlg::OnDropFiles(HDROP hDropInfo)
{
	// TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。
    wchar_t FileName[_MAX_PATH];
    int NameSize = sizeof(FileName);
    int FileNumber;
    CString str;
    int i;

    FileNumber = DragQueryFile(hDropInfo, 0xffffffff, FileName, NameSize);

    for(i=0; i<FileNumber; i++){
        DragQueryFile(hDropInfo, i, FileName, NameSize);
		if(wcsstr(FileName, L".ts")){
			m_csTsPath = FileName;
			
//			m_csVideoPath = m_csTsPath;
//			m_csVideoPath.Replace(TEXT(".ts"), TEXT(".avi"));
			m_csVideoPath = m_csTsPath;
			if(m_csVideoPath.ReverseFind('.') && m_csVideoPath.ReverseFind('.') > m_csVideoPath.ReverseFind('\\')){
				m_csVideoPath.Delete(m_csVideoPath.ReverseFind('.'),m_csVideoPath.GetLength());
			}
			
			m_csAudioPath = m_csTsPath;
			m_csAudioPath.Replace(TEXT(".ts"), TEXT(".aac"));

			m_ComboService.ResetContent();

			UpdateData(FALSE);
			OnBnClickedBatchAdd();
		}
    }

//	__super::OnDropFiles(hDropInfo);
}

void CBonTsDemuxDlg::OnBnClickedServiceReflesh()
{
	// TODO: ここにコントロール通知ハンドラ コードを追加します。
	m_bTestMode = TRUE;
	const bool bReturn = m_TsConverter.ConvertTsFile(m_csTsPath, TEST_READ_SIZE, NO_SERVICE_SELECT, NULL, NULL);
}

