// BonTsDemuxDlg.h : ヘッダー ファイル
//

#pragma once
#include "afxcmn.h"
#include "TsConverter.h"
#include "afxwin.h"

#define TEST_READ_SIZE 5*1024*1024

// CBonTsDemuxDlg ダイアログ
class CBonTsDemuxDlg : public CDialog, protected CTsConverter::IEventHandler
{
// コンストラクション
public:
	CBonTsDemuxDlg(CWnd* pParent = NULL);	// 標準コンストラクタ

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

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

// 実装
protected:

	// 生成された、メッセージ割り当て関数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
	
	afx_msg void OnBnClickedAacDecode();
	afx_msg void OnBnClickedBrowseTs();
	afx_msg void OnBnClickedBrowseVideo();
	afx_msg void OnBnClickedBrowseAudio();
	afx_msg void OnBnClickedVideoOut();
	afx_msg void OnBnClickedAudioOut();
	afx_msg void OnBnClickedStart();
	afx_msg void OnBnClickedStop();
	afx_msg void OnDestroy();
	afx_msg LRESULT OnDoBatch(UINT wParam,LONG lParam);


	void LockControl(const BOOL bLock = TRUE);

// CTsConverter::IEventHandler
	virtual void OnTsConverterStart(const ULONGLONG llFileSize);
	virtual void OnTsConverterEnd(const ULONGLONG llFileSize);
	virtual void OnTsConverterProgress(const ULONGLONG llCurPos, const ULONGLONG llFileSize);
	virtual void OnTsConverterServiceName(LPCTSTR lpszServiceName);
	virtual void OnTsConverterServiceInfo(CProgManager *pProgManager);

	HICON m_hIcon;
	CString m_csTsPath;
	CString m_csVideoPath;
	CString m_csAudioPath;
	BOOL m_bVideoOut;
	BOOL m_bAudioOut;
	BOOL m_bAacDecode;
	BOOL m_bLipSync;
	CProgressCtrl m_Progress;
	
	CTsConverter m_TsConverter;
	CComboBox m_ComboEncode;
	CString m_ini_path;
private:
	BOOL m_Abort;
	CListBox m_ListBatch;
	void StartDemux(void);
	afx_msg void OnBnClickedBatchAdd();
	afx_msg void OnBnClickedBatchDel();
	afx_msg void OnLbnSelchangeBatchList();
	CComboBox m_ComboSound;
	CComboBox m_ComboAudioEs;
	afx_msg void OnBnClickedButtonReplace();
	afx_msg void OnDropFiles(HDROP hDropInfo);
	BOOL m_bTestMode;
	BOOL m_wSelectServiceID;
private:
	CComboBox m_ComboService;
	afx_msg void OnBnClickedServiceReflesh();
};


// strtok のクラス実装
class RtlToken
{
protected:
// Members
    CString m_strText;
    CString m_strSep;

public:
// Ctor/Dtor
    RtlToken(LPCTSTR lpszText = _T(""), LPCTSTR lpszSeparator = _T
(" ")) : \
        m_strText(lpszText), m_strSep(lpszSeparator)
    {
    }
    ~RtlToken()
    {
        m_strText.Empty();
        m_strSep.Empty();
    }

    void operator()(LPCTSTR lpszText = _T(""), LPCTSTR lpszSeparator = _T
(" "))
    {
        m_strText = lpszText;
        m_strSep = lpszSeparator;
    }
    void operator=(LPCTSTR lpszText)
    {
        m_strText = lpszText;
    }
    void SetSeparator(LPCTSTR lpszSeparator = _T(" "))
    {
        m_strSep = lpszSeparator;
    }

// Operations
    // 参照されていない残り部分を返し、バッファをクリアする
    CString GetRestString()
    {
        CString strRet = m_strText;
        m_strText.Empty();
        return strRet;
    }

    // 一度使用した文字列と直後の区切り文字列は削除する
    CString GetNextToken()
    {
        ATLASSERT( !m_strSep.IsEmpty() );

        CString strRet = m_strText;

        if (m_strSep.IsEmpty()) {
            m_strText.Empty();
            return strRet;
        }

        const int nPos = strRet.Find(m_strSep);
        if (nPos >= 0)
            strRet = strRet.Left(nPos);

        // standby for next call
        const int nLen = strRet.GetLength();
        if (nLen >= 0)
            m_strText.Delete(0, m_strSep.GetLength() + nLen);

        return strRet;
    }
};
