📄 proginfoedit.cpp
字号:
// ProgInfoEdit.cpp : implementation file
//
#include "stdafx.h"
#include "AliEditor.h"
#include "ProgInfoEdit.h"
#include "AliEditorView.h"
#include "MainFrm.h"
#include "StringLine.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CProgInfoEdit dialog//
CProgInfoEdit::CProgInfoEdit(CWnd* pParent /*=NULL*/)
: CDialog(CProgInfoEdit::IDD, pParent)
{
//{{AFX_DATA_INIT(CProgInfoEdit)
m_channel_name = _T("");
m_pcr_pid = 0;
m_video_pid = 0;
m_audio_pid = 0;
m_audio_pid2 = 0;
m_audio_pid3 = 0;
m_program_number = 0;
//}}AFX_DATA_INIT
m_op_type = AddNode;
m_pSatTp = NULL;
m_prog_offset = -1;
m_user_mode = CANCEL;
}
void CProgInfoEdit::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CProgInfoEdit)
DDX_Control(pDX, IDC_FAVORITE_GROUP, m_favor_grp);
DDX_Control(pDX, IDC_PROGRAM_NUMBER, m_prog_number_ctrl);
DDX_Control(pDX, IDC_PCR_PID, m_pcr_pid_ctrl);
DDX_Control(pDX, IDC_AUDIO_PID3, m_audio_pid3_ctrl);
DDX_Control(pDX, IDC_AUDIO_PID2, m_audio_pid2_ctrl);
DDX_Control(pDX, IDC_AUDIO_PID, m_audio_pid1_ctrl);
DDX_Control(pDX, IDC_VIDEO_PID, m_video_pid_ctrl);
DDX_Control(pDX, IDC_CHANNEL_FACTORY, m_channel_factory);
DDX_Control(pDX, IDC_CHANNEL_TYPE, m_prog_type);
DDX_Control(pDX, IDC_CHANNEL_SCRAMBLE, m_prog_scramble);
DDX_Text(pDX, IDC_CHANNEL_NAME, m_channel_name);
DDV_MaxChars(pDX, m_channel_name, 17);
DDX_Text(pDX, IDC_PCR_PID, m_pcr_pid);
DDX_Text(pDX, IDC_VIDEO_PID, m_video_pid);
DDX_Text(pDX, IDC_AUDIO_PID, m_audio_pid);
DDX_Text(pDX, IDC_AUDIO_PID2, m_audio_pid2);
DDX_Text(pDX, IDC_AUDIO_PID3, m_audio_pid3);
DDX_Text(pDX, IDC_PROGRAM_NUMBER, m_program_number);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CProgInfoEdit, CDialog)
//{{AFX_MSG_MAP(CProgInfoEdit)
ON_WM_CLOSE()
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CHANNEL_RESET, OnChannelReset)
ON_CBN_SELCHANGE(IDC_CHANNEL_TYPE, OnSelchangeChannelType)
ON_EN_CHANGE(IDC_PROGRAM_NUMBER, OnChangeProgramNumber)
ON_CBN_SELCHANGE(IDC_FAVORITE_GROUP, OnSelchangeFavoriteGroup)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CProgInfoEdit message handlers
BOOL CProgInfoEdit::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
switch(m_op_type)
{
case AddNode://add
m_prog_offset = 0;
for(m_prog_offset = 0; m_prog_offset < m_pSatTp->prog_count; m_prog_offset++)
{
if(m_pSatTp->pProgMapping[m_prog_offset] == -1) break;
}
AddProgInfo();
break;
case InsNode://add
m_prog_offset = m_nEditedIndex;//m_pProg->mapping_offset;
AddProgInfo();
break;
case EditNode://edit
m_prog_offset = m_nEditedIndex;//m_pProg->mapping_offset;
EditProgInfo();
break;
default:
break;
}
UpdateData(FALSE);
m_bmpslist.Create(IDB_BITMAP_MULTICHECK, 16, 0, RGB(0, 255, 0));
m_favor_grp.SetImageList(&m_bmpslist);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
combox_t type_combox[] =
{
{1, "TV" },
{0, "Radio" },
};
combox_t favor_combox[] =
{
//{0, "None" },
{1, "Sport" },
{2, "News" },
{4, "Music" },
{8, "Movie" },
{16, "Shopping" },
{32, "Education" },
{64, "Leisure" },
};
cook_node_t cook_favor[32];
combox_t favor_tag_combox[] =
{
{0, "No" },
{1, "Yes" },
};
combox_t scramble_combox[] =
{
{0, "No" },
{1, "Yes" },
};
combox_t factory_combox[] =
{
{0, "No" },
{1, "Yes" },
};
void CProgInfoEdit::InitCombox()
{
int i;
m_prog_type.ResetContent();
for(i = 0; i < sizeof(type_combox) / sizeof(combox_t); i++)
{
m_prog_type.AddString(type_combox[i].bufsz);
m_prog_type.SetItemData(i, type_combox[i].data);
}
m_favor_grp.ResetContent();
int nItemData;
COMBOBOXEXITEM comb_item;
comb_item.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;
for(i = 0; i < 32; i++)
{
//m_favor_grp.AddString(cook_favor[i].cooksz);
//nItemData = atoi(cook_favor[i].bufsz);
//m_favor_grp.SetItemData(i,nItemData);
comb_item.iItem = i;
comb_item.iImage = 0;
comb_item.iSelectedImage = 0;
comb_item.pszText = cook_favor[i].cooksz;
int nRet = m_favor_grp.InsertItem(&comb_item);
nItemData = atoi(cook_favor[i].bufsz);
m_favor_grp.SetItemData(i, nItemData);
}
m_prog_scramble.ResetContent();
for(i = 0; i < sizeof(scramble_combox) / sizeof(combox_t); i++)
{
m_prog_scramble.AddString(scramble_combox[i].bufsz);
m_prog_scramble.SetItemData(i, scramble_combox[i].data);
}
m_channel_factory.ResetContent();
for(i = 0; i < sizeof(factory_combox) / sizeof(combox_t); i++)
{
m_channel_factory.AddString(factory_combox[i].bufsz);
m_channel_factory.SetItemData(i, factory_combox[i].data);
}
}
//const char prog_template_buf[256] =
//{
// 0x00, 0x00, 0xA0, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0xA0, 0x00, 0x00, 0x00,
// 0x00, 0x00, 0xFF, 0x1F, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//};
void CProgInfoEdit::AddProgInfo()
{
if(!m_pSatTp) return;
CAliEditorView *pEditView = ((CMainFrame *)AfxGetMainWnd())->GetEditorView();
if(!pEditView) return;
InitCombox();
m_channel_name = "New Channel";
if(pEditView->m_av_type == 1)
{
m_prog_type.SetCurSel(0);
m_prog_type.EnableWindow(FALSE);
m_video_pid = 0;
}
else if(pEditView->m_av_type == 0)
{
m_prog_type.SetCurSel(1);
m_prog_type.EnableWindow(FALSE);
m_video_pid = 8191;
CWnd *pWnd = GetDlgItem(IDC_VIDEO_PID);
if(pWnd) pWnd->EnableWindow(FALSE);
}
else
{
m_prog_type.SetCurSel(0);
m_prog_type.EnableWindow(TRUE);
CWnd *pWnd = GetDlgItem(IDC_VIDEO_PID);
if(pWnd) pWnd->EnableWindow(TRUE);
m_video_pid = 0;
}
m_audio_pid = 0;
m_audio_pid2 = 0;
m_audio_pid3 = 0;
m_pcr_pid = 0;
// m_favor_grp.SetCurSel(0);
// m_favor_tag.SetCurSel(0);
m_prog_scramble.SetCurSel(0);
m_channel_factory.SetCurSel(0);
m_program_number = 0;
}
void CProgInfoEdit::EditProgInfo()
{
BOOL bRet;
char bufsz[64];
if(!m_pSatTp) return;
CAliEditorView *pEditView = ((CMainFrame *)AfxGetMainWnd())->GetEditorView();
if(!pEditView) return;
InitCombox();
bRet = GetProgNodeData(PKEYZ_SERVICE_NAME, bufsz);
if(bRet) m_channel_name = bufsz;
bRet = GetProgNodeData(PKEYZ_TV_RADIO, bufsz);
if(bRet)
{
long type_val = pEditView->GetDataValue(bufsz);
int type_sel = GetCurSel(type_combox, sizeof(type_combox) / sizeof(combox_t), type_val);
if(type_sel != -1) m_prog_type.SetCurSel(type_sel);
if(type_sel == 1)
{
CWnd *pWnd = GetDlgItem(IDC_VIDEO_PID);
if(pWnd) pWnd->EnableWindow(FALSE);
}
else if(type_sel == 0)
{
CWnd *pWnd = GetDlgItem(IDC_VIDEO_PID);
if(pWnd) pWnd->EnableWindow(TRUE);
}
}
if(pEditView->m_av_type == 1)
{
m_prog_type.EnableWindow(FALSE);
}
else if(pEditView->m_av_type == 0)
{
m_prog_type.EnableWindow(FALSE);
m_video_pid = 8191;
CWnd *pWnd = GetDlgItem(IDC_VIDEO_PID);
if(pWnd) pWnd->EnableWindow(FALSE);
}
else
{
m_prog_type.EnableWindow(TRUE);
}
bRet = GetProgNodeData(PKEYZ_VIDEO_PID, bufsz);
if(bRet) m_video_pid = pEditView->GetDataValue(bufsz);
bRet = GetProgNodeData(PKEYZ_AUDIO_PID1, bufsz);
if(bRet) m_audio_pid = pEditView->GetDataValue(bufsz);
bRet = GetProgNodeData(PKEYZ_AUDIO_PID2, bufsz);
if(bRet) m_audio_pid2 = pEditView->GetDataValue(bufsz);
bRet = GetProgNodeData(PKEYZ_AUDIO_PID3, bufsz);
if(bRet) m_audio_pid3 = pEditView->GetDataValue(bufsz);
bRet = GetProgNodeData(PKEYZ_PCR_PID, bufsz);
if(bRet) m_pcr_pid = pEditView->GetDataValue(bufsz);
long select_val = 0;
int selected = 0;
bRet = GetProgNodeData(PKEYZ_FAV_GROUP, bufsz);
if(bRet)
{
//select_val = pEditView->GetDataValue(bufsz);
select_val = atoi(bufsz);
//selected = GetCurSel(favor_combox, sizeof(favor_combox) / sizeof(combox_t), select_val);
//if(selected != -1) m_favor_grp.SetCurSel(selected);
int nCount = m_favor_grp.GetCount();
int nItemData;
for(int i = 0; i < nCount; i++)
{
nItemData = m_favor_grp.GetItemData(i);
if( select_val & nItemData )//修改选中的项的image
{
COMBOBOXEXITEM comb_item;
comb_item.mask = CBEIF_IMAGE | CBEIF_SELECTEDIMAGE;
comb_item.iItem = i;
BOOL bReturn = m_favor_grp.GetItem(&comb_item);
comb_item.iImage = 1;
comb_item.iSelectedImage = 1;
bReturn = m_favor_grp.SetItem(&comb_item);
}
}
}
// bRet = GetProgNodeData(PKEYZ_FAV_GROUP0, bufsz);
// if(bRet)
// {
// select_val = pEditView->GetDataValue(bufsz);
// selected = GetCurSel(favor_tag_combox, sizeof(favor_tag_combox) / sizeof(combox_t), select_val);
// if(selected != -1) m_favor_tag.SetCurSel(selected);
// }
bRet = GetProgNodeData(PKEYZ_SCRAMBLE, bufsz);
if(bRet)
{
select_val = pEditView->GetDataValue(bufsz);
selected = GetCurSel(scramble_combox, sizeof(scramble_combox) / sizeof(combox_t), select_val);
if(selected != -1) m_prog_scramble.SetCurSel(selected);
}
bRet = GetProgNodeData(PKEYZ_PRESET_FLAG, bufsz);
if(bRet)
{
select_val = pEditView->GetDataValue(bufsz);
selected = GetCurSel(factory_combox, sizeof(factory_combox) / sizeof(combox_t), select_val);
if(selected != -1) m_channel_factory.SetCurSel(selected);
}
bRet = GetProgNodeData(PKEYZ_PROG_NUMBER, bufsz);
if(bRet) m_program_number = pEditView->GetDataValue(bufsz);
if(m_program_number)
{
m_video_pid_ctrl.EnableWindow(FALSE);
m_audio_pid1_ctrl.EnableWindow(FALSE);
m_audio_pid2_ctrl.EnableWindow(FALSE);
m_audio_pid3_ctrl.EnableWindow(FALSE);
m_pcr_pid_ctrl.EnableWindow(FALSE);
}
}
BOOL CProgInfoEdit::AllocProgNode()
{
CDbParser *dbParser = &((CMainFrame*)AfxGetMainWnd())->m_dbParser;
CStringLines *pScripter = &((CMainFrame*)AfxGetMainWnd())->GetEditorView()->m_strlines;
int i;
CAliEditorView *pEditView = ((CMainFrame *)AfxGetMainWnd())->GetEditorView();
if(!pEditView) return FALSE;
int node_offset, map_offset;
// int nMaxOrder;
// int nAvailOrder = dbParser->FindAvailableOrder(nMaxOrder);
// int nProgCount = pEditView->GetAllServiceSatTPMod()->GetProgCount();
char *buf = dbParser->AllocNode(PROG_NODE, &node_offset);
if(!buf) return FALSE;
int node_size = pScripter->GetNodeSize(PROG_NODE);
memcpy(buf, prog_template_buf, node_size);//make template
//try to find a free position
for(i = 0; i < m_pSatTp->prog_count; i++)
{
if(m_pSatTp->pProgMapping[i] == -1) break;
}
map_offset = i;
//if full, create new 64 node mapping position
if(map_offset == m_pSatTp->prog_count)
{
int *pNewProgMapping = new int[m_pSatTp->prog_count + 64];
ASSERT(pNewProgMapping);
memset(pNewProgMapping, -1, sizeof(int) * (m_pSatTp->prog_count + 64));
if(m_pSatTp->pProgMapping)
{
memcpy(pNewProgMapping, m_pSatTp->pProgMapping, sizeof(int) * m_pSatTp->prog_count);
delete[] m_pSatTp->pProgMapping;
}
m_pSatTp->pProgMapping = pNewProgMapping;
m_pSatTp->prog_count += 64;
}
if(map_offset > m_prog_offset)//
{
for(i = map_offset; i > m_prog_offset; i--)
{
m_pSatTp->pProgMapping[i] = m_pSatTp->pProgMapping[i - 1];
}
map_offset = m_prog_offset;
}
else if(map_offset < m_prog_offset)
{
ASSERT(0);//bug
}
m_pSatTp->pProgMapping[map_offset] = node_offset;
//%todo PrivateData
// *(short *)(buf+node_size)=(nAvailOrder!= -1) ? nAvailOrder : (short)nMaxOrder+1;
// *(short *)(buf+node_size)= (short)nMaxOrder+1;
int *pProgMapping = m_pSatTp->pProgMapping;
// char *pc1 = NULL;
// char *pc2 = NULL;
// short nOrder1 = 0;
// short nOrder2 = 0;
//
// for(i = map_offset; i < m_pSatTp->prog_count - 1; i++)
// {
// if(pProgMapping[i] == -1 || pProgMapping[i + 1] == -1) break;
//
// pc1 = dbParser->GetNodePrivateData(PROG_NODE, pProgMapping[i]);
//
// ASSERT(pc1);
// if(!pc1) return FALSE;
//
// memcpy(&nOrder1, pc1, sizeof(short));
//
// pc2 = dbParser->GetNodePrivateData(PROG_NODE, pProgMapping[i + 1]);
//
// ASSERT(pc2);
// if(!pc2) return FALSE;
//
// memcpy(&nOrder2, pc2, sizeof(short));
//
// if(nOrder1 > nOrder2)
// {
// dbParser->SetNodePrivateData(PROG_NODE, pProgMapping[i], (char *)&nOrder2);
// dbParser->SetNodePrivateData(PROG_NODE, pProgMapping[i + 1], (char *)&nOrder1);
//
// }
// else if(nOrder1 == nOrder2)
// {
// ASSERT(0);
// AfxMessageBox("Order Error!");
// return FALSE;
// };
// }
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -