Files
ls-2019-source/extra/LS_MonitorClient/LS_MonitorClient/BlockDlg.cpp
T
2026-11-07 13:30:45 +07:00

522 lines
12 KiB
C++

// BlockDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_MonitorClient.h"
#include "ZoneDialog.h"
#include "BlockDlg.h"
#include "afxdialogex.h"
// CBlockDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CBlockDlg, CDialogEx)
CBlockDlg::CBlockDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CBlockDlg::IDD, pParent)
{
}
CBlockDlg::~CBlockDlg()
{
}
void CBlockDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control( pDX, IDC_LIST_BLOCK_PUBLICID, m_userList );
DDX_Control( pDX, IDC_LIST_BLOCK_NOTE, m_noteList );
DDX_Control( pDX, IDC_EDIT_BLOCK_PUBLICID, m_editPublicID );
DDX_Control( pDX, IDC_EDIT_BLOCK_NOTE, m_editBlockNote );
DDX_Control( pDX, IDC_COMBO_LIMITTIME, m_timeCombo );
DDX_Control( pDX, IDC_COMBO_LEVEL, m_levelCombo );
}
BEGIN_MESSAGE_MAP(CBlockDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_BLOCK_RESET, &CBlockDlg::OnBnClickedButtonBlockReset)
ON_BN_CLICKED(IDC_BUTTON_BLOCK_BLOCK, &CBlockDlg::OnBnClickedButtonBlockBlock)
ON_BN_CLICKED(IDC_BUTTON_BLOCK_UNBLOCK, &CBlockDlg::OnBnClickedButtonBlockUnblock)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_BLOCK_NOTE, &CBlockDlg::OnLvnItemchangedListBlockNote)
ON_CBN_SELCHANGE(IDC_COMBO_LIMITTIME, &CBlockDlg::OnCbnSelchangeComboTime)
ON_CBN_SELCHANGE(IDC_COMBO_LEVEL, &CBlockDlg::OnCbnSelchangeComboLevel)
END_MESSAGE_MAP()
// CBlockDlg 메시지 처리기입니다.
BOOL CBlockDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
InitList();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CBlockDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CBlockDlg::InitList()
{
m_userList.DeleteAllItems();
m_userList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_userList.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 104);
m_noteList.DeleteAllItems();
m_noteList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_noteList.InsertColumn(0, _T("Note"), LVCFMT_LEFT, 194);
// 내용
OnDropNoteFiles(_T("./blockNote.txt"));
// 기간
InsertBlockTime(_T("-- Time --"));
InsertBlockTime(_T("1 Day"));
InsertBlockTime(_T("3 Days"));
InsertBlockTime(_T("5 Days"));
InsertBlockTime(_T("10 Days"));
InsertBlockTime(_T("30 Days"));
InsertBlockTime(_T("90 Days"));
InsertBlockTime(_T("Infinite"));
ResetTimeComboBox();
// 등급
InsertBlockLevel(_T("-- Level --"));
InsertBlockLevel(_T("Caution"));
InsertBlockLevel(_T("Limitation"));
InsertBlockLevel(_T("Block"));
InsertBlockLevel(_T("Unblock"));
ResetLevelComboBox();
}
void CBlockDlg::InsertPublicID(CString PublicID)
{
if( PublicID.GetLength() == 0 ) return ;
m_userList.InsertItem( m_userList.GetItemCount(), PublicID );
}
void CBlockDlg::InsertBlockNote(CString note)
{
if( note.GetLength() == 0 ) return ;
m_noteList.InsertItem( m_noteList.GetItemCount(), note );
}
void CBlockDlg::InsertBlockTime(CString limitTime)
{
if( limitTime.GetLength() == 0 ) return ;
m_timeCombo.InsertString( m_timeCombo.GetCount(), limitTime );
}
void CBlockDlg::InsertBlockLevel(CString level)
{
if( level.GetLength() == 0 ) return ;
m_levelCombo.InsertString( m_levelCombo.GetCount(), level );
}
void CBlockDlg::OnDropUserFiles(CString file)
{
m_userList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertPublicID(line);
}
}
}
}
void CBlockDlg::OnDropNoteFiles(CString file)
{
m_noteList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertBlockNote(line);
}
}
}
}
BlockInfo* CBlockDlg::GetSelectUserInfo(uint index)
{
// 사용 안함
//if( m_userList.GetSelectedCount() <= 0 )
// return NULL;
//POSITION pos = m_userList.GetFirstSelectedItemPosition();
//while( (pos) && (index > 0) )
//{
// m_userList.GetNextSelectedItem( pos );
// index--;
//}
//if( pos )
//{
// int userListindex = m_userList.GetNextSelectedItem(pos);
// if( userListindex != -1 )
// {
// CString userId = m_userList.GetItemText( userListindex, 0 );
// POSITION find = m_blockUserInfo.Find( BlockInfo(userId) );
//
// if( !find )
// return NULL;
// return &m_blockUserInfo.GetAt(find);
// }
//}
return NULL;
}
void CBlockDlg::SelectListItem(CListCtrl& list, CString item)
{
// 사용안함
//LVFINDINFOA find;
//find.flags = LVFI_STRING;
//find.psz = item;
//int index = list.FindItem( &find );
//if( index != -1 )
//{
// list.SetItemState( index,
// LVIS_SELECTED,
// LVIS_SELECTED);
//}
//else
//{
// for(int i = 0 ; i < list.GetItemCount() ; i++)
// {
// list.SetItemState( i, 0, LVIS_SELECTED );
// }
//}
//list.Invalidate(true);
}
void CBlockDlg::SetUserInfoNote(CString note)
{
if( note.GetLength() == 0 ) return ;
m_blockUserInfo.blockNote = note;
}
void CBlockDlg::SetUserInfoTime(CString limitTime)
{
m_blockUserInfo.limitTime = limitTime;
}
void CBlockDlg::SetUserInfoLevel(int level)
{
m_blockUserInfo.level = level;
}
void CBlockDlg::ResetUserInfoNote(CString note)
{
m_blockUserInfo.blockNote == note;
m_blockUserInfo.blockNote.Empty();
}
void CBlockDlg::ResetNoteListCtrl()
{
for( int i = 0 ; i < m_noteList.GetItemCount() ; i++ )
{
if( m_noteList.GetItemState( i, LVIS_SELECTED ) == LVIS_SELECTED )
{
m_noteList.SetItemState( i, 0, LVIS_SELECTED );
m_noteList.SetItemState( i, 0, LVIS_FOCUSED );
break;
}
}
}
BOOL CBlockDlg::PreTranslateMessage(MSG* pMsg)
{
switch( pMsg->message )
{
case WM_DROPFILES:
{
if( m_userList.GetSafeHwnd() == pMsg->hwnd )
{
uint dragCount = DragQueryFile((HDROP)pMsg->wParam, 0xFFFFFFFF, NULL, 0);
char file[MAX_PATH];
if( dragCount > 0 )
{
DragQueryFile( (HDROP)pMsg->wParam, 0, file, MAX_PATH );
OnDropUserFiles( file );
}
}
else if( m_noteList.GetSafeHwnd() == pMsg->hwnd )
{
uint dragCount = DragQueryFile((HDROP)pMsg->wParam, 0xFFFFFFFF, NULL, 0);
char file[MAX_PATH];
if( dragCount > 0 )
{
DragQueryFile( (HDROP)pMsg->wParam, 0, file, MAX_PATH );
OnDropNoteFiles( file );
}
}
}
break;
case WM_KEYDOWN:
{
if( VK_RETURN == pMsg->wParam )
{
if( m_editPublicID.GetSafeHwnd() == pMsg->hwnd )
{
CString publicID;
m_editPublicID.GetWindowText( publicID );
m_editPublicID.SetWindowText( _T("") );
InsertPublicID(publicID);
m_userList.EnsureVisible( m_userList.GetItemCount()-1, FALSE );
}
else if( m_editBlockNote.GetSafeHwnd() == pMsg->hwnd )
{
CString blockNote;
m_editBlockNote.GetWindowText( blockNote );
m_editBlockNote.SetWindowText( _T("") );
InsertBlockNote( blockNote );
m_noteList.EnsureVisible( m_noteList.GetItemCount()-1, FALSE );
}
return TRUE;
}
else if (VK_DELETE == pMsg->wParam )
{
if( m_userList.GetSafeHwnd() == pMsg->hwnd )
{
int index = -1;
POSITION pos = m_userList.GetFirstSelectedItemPosition();
while(pos)
{
index = m_userList.GetNextSelectedItem( pos );
m_userList.DeleteItem( index );
pos = m_userList.GetFirstSelectedItemPosition();
}
m_timeCombo.SelectString( 0, m_blockUserInfo.limitTime );
m_levelCombo.SetCurSel( m_blockUserInfo.level );
}
else if( m_noteList.GetSafeHwnd() == pMsg->hwnd )
{
int index = -1;
POSITION pos = m_noteList.GetFirstSelectedItemPosition();
while(pos)
{
index = m_noteList.GetNextSelectedItem( pos );
CString delstr = m_noteList.GetItemText(index, 0);
ResetUserInfoNote(delstr);
m_noteList.DeleteItem( index );
pos = m_noteList.GetFirstSelectedItemPosition();
}
}
return TRUE;
}
}
break;
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
void CBlockDlg::OnBnClickedButtonBlockReset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_userList.DeleteAllItems();
SelectListItem( m_noteList, _T("") );
m_blockUserInfo.Clear();
ResetNoteListCtrl();
ResetTimeComboBox();
ResetLevelComboBox();
}
void CBlockDlg::OnBnClickedButtonBlockBlock()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if( !m_parent ) return;
if( m_userList.GetItemCount() == 0 )
{
MessageBox(_T("UserList is Empty!!"), _T("BLOCK"), MB_OK);
return ;
}
if( m_blockUserInfo.level == BLOCKTYPE_UNBLOCK )
return OnBnClickedButtonBlockUnblock();
if( !CheckBlockUserInfoList() )
return ;
CString publicID;
int64 limitTime = GetTime( m_blockUserInfo.limitTime ) * 3600;
for(int i = 0 ; i < m_userList.GetItemCount() ; i++)
{
publicID = m_userList.GetItemText( i, 0 );
m_parent->RequestUserBlock( publicID,
m_blockUserInfo.blockNote,
limitTime,
m_blockUserInfo.level );
}
m_parent->WriteLogDlg( _T("[Block] Request UserBlock") );
MessageBox(_T("Completed"), _T("BLOCK"), MB_OK);
}
void CBlockDlg::OnBnClickedButtonBlockUnblock()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if( !m_parent ) return ;
if( m_userList.GetItemCount() == 0 )
{
MessageBox(_T("UserList is Empty!!"), _T("BLOCK"), MB_OK);
return ;
}
CString publicID;
for(int i = 0 ; i < m_userList.GetItemCount() ; i++)
{
publicID = m_userList.GetItemText( i, 0 );
m_parent->RequestUserUnblock( publicID );
}
m_parent->WriteLogDlg( _T("[Block] Request UserUnblock") );
MessageBox(_T("Completed"), _T("UNBLOCK"), MB_OK);
}
void CBlockDlg::OnLvnItemchangedListBlockNote(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
if( !( ( pNMLV->uChanged == LVIF_STATE ) && ( pNMLV->uNewState == (LVIS_SELECTED | LVIS_FOCUSED) ) ) )
return ;
CString note = m_noteList.GetItemText( pNMLV->iItem, 0 );
SetUserInfoNote( note );
}
BOOL CBlockDlg::CheckBlockUserInfoList()
{
if( m_blockUserInfo.blockNote.IsEmpty() )
{
MessageBox(_T("Note is Unselected!!"), _T("BLOCK"), MB_OK);
return FALSE;
}
if( m_blockUserInfo.limitTime.IsEmpty() ||
m_blockUserInfo.limitTime == _T("-- Time --"))
{
MessageBox(_T("Time is Unselected!!"), _T("BLOCK"), MB_OK);
return FALSE;
}
if( m_blockUserInfo.level <= 0 )
{
MessageBox(_T("Level is Unselected!!"), _T("BLOCK"), MB_OK);
return FALSE;
}
return TRUE;
}
int CBlockDlg::GetTime(CString limitTime)
{
CString timeToken;
int findIndex = 0, tokenIndex = 0;
findIndex = limitTime.Find( _T("Hour") );
if( findIndex != -1 )
{
timeToken = limitTime.Tokenize(_T("Hour"), tokenIndex);
return _ttoi(timeToken.GetBuffer( timeToken.GetLength() ));
}
findIndex = 0, tokenIndex = 0;
findIndex = limitTime.Find( _T("Day") );
if( findIndex != -1 )
{
timeToken = limitTime.Tokenize(_T("Day"), tokenIndex);
return _ttoi(timeToken.GetBuffer( timeToken.GetLength() )) * 24;
}
findIndex = 0, tokenIndex = 0;
findIndex = limitTime.Find( _T("Week") );
if( findIndex != -1 )
{
timeToken = limitTime.Tokenize(_T("Week"), tokenIndex);
return _ttoi(timeToken.GetBuffer( timeToken.GetLength() )) * 24 * 7;
}
findIndex = 0, tokenIndex = 0;
findIndex = limitTime.Find( _T("Month") );
if( findIndex != -1 )
{
timeToken = limitTime.Tokenize(_T("Month"), tokenIndex);
return _ttoi(timeToken.GetBuffer( timeToken.GetLength() )) * 24 * 30;
}
findIndex = 0, tokenIndex = 0;
findIndex = limitTime.Find( _T("Year") );
if( findIndex != -1 )
{
timeToken = limitTime.Tokenize(_T("Year"), tokenIndex);
return _ttoi(timeToken.GetBuffer( timeToken.GetLength() )) * 24 * 365;
}
return 50 * 24 * 365;
}
void CBlockDlg::OnCbnSelchangeComboTime()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int select = m_timeCombo.GetCurSel();
CString limitTime;
m_timeCombo.GetLBText(select, limitTime);
SetUserInfoTime( limitTime );
}
void CBlockDlg::OnCbnSelchangeComboLevel()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int select = m_levelCombo.GetCurSel();
SetUserInfoLevel( select );
}