LosaDev source snapshot 2019

This commit is contained in:
LosaDev committed 2026-11-07 13:30:45 +07:00
commit c198676e97
20588 files changed
+8812878

No files matched your search

Binary file not shown.
+17
View File
@@ -0,0 +1,17 @@
[monitor]
server=172.30.84.26:35434
[zone1]
name=EU_ALPHA
main=172.20.20.247:40001
login=172.20.20.247:40005
countrycode=1
[zone2]
name=EU_LIVE
main=172.20.20.247:40001
login=172.20.20.247:40005
countrycode=1
///////////위에 BETA 임시명칭 작업 경로 알파
+33
View File
@@ -0,0 +1,33 @@
[event_3]
active = 1
type = 3
start_year = 2012
start_month = 11
start_date = 3
start_hour = 0
end_year = 2012
end_month = 11
end_date = 3
end_hour = 24
max_value = 7
; bonus로 지급되는 경험치 % , 20이면 20%의 경험치를 더준다.
value_1 = 300
; 요일 (일 월 화 수 목 금 토 : 1 - 이벤트 없음, 2 - 이벤트 있음)
value_2 = 1111112
; 시작 & 종료 시간
value_3 = 12
value_4 = 13
value_5 = 1111111
value_6 = 18
value_7 = 20
;// 이벤트를 사용하는 채널링 타입 ( -1 : 모두 이용 / 0 : 일반 유저만 이용 / 300 : mgame 유저만 이용 )
max_use_channeling_type = 1
use_channeling_type1 = -1
+3
View File
@@ -0,0 +1,3 @@
5.111045.250000
5.211043.250000
5.311038.250000
+2
View File
@@ -0,0 +1,2 @@
youngdieb
youngdiex
+20
View File
@@ -0,0 +1,20 @@
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual Studio 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LS_Monitor", "LS_Monitor\LS_Monitor.vcxproj", "{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}.Debug|Win32.ActiveCfg = Debug|Win32
{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}.Debug|Win32.Build.0 = Debug|Win32
{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}.Release|Win32.ActiveCfg = Release|Win32
{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
+347
View File
@@ -0,0 +1,347 @@
// AnnounceDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "AnnounceDlg.h"
#include "afxdialogex.h"
#include "Network/Protocol.h"
// CAnnounceDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CAnnounceDlg, CDialogEx)
CAnnounceDlg::CAnnounceDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CAnnounceDlg::IDD, pParent)
, m_parent(NULL)
, m_count(0)
{
}
CAnnounceDlg::~CAnnounceDlg()
{
}
void CAnnounceDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_ANNOUNCE, m_editAnnounce);
DDX_Control(pDX, IDC_EDIT_USERID, m_editUserID);
DDX_Control(pDX, IDC_EDIT_INTERVAL, m_interval);
DDX_Control(pDX, IDC_LIST_KICKUSERID, m_userList);
DDX_Control(pDX, IDC_LIST_ANNOUNCE, m_announceList);
}
BEGIN_MESSAGE_MAP(CAnnounceDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_ANNOUNCE, &CAnnounceDlg::OnBnClickedButtonAnnounce)
ON_BN_CLICKED(IDC_BUTTON_KICK, &CAnnounceDlg::OnBnClickedButtonKickout)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON_COMMONRESET, &CAnnounceDlg::OnBnClickedButtonReset)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_KICKUSERID, &CAnnounceDlg::OnLvnItemchangedListKickuserid)
ON_BN_CLICKED(IDC_BUTTON_PRACTICE, &CAnnounceDlg::OnBnClickedButtonPractice)
END_MESSAGE_MAP()
// CAnnounceDlg 메시지 처리기입니다.
void CAnnounceDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CAnnounceDlg::OnBnClickedButtonAnnounce()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
KillTimer(1);
CString count;
m_interval.GetWindowText(count);
m_count = atoi(count);
if(m_count <= 0)
{
m_count = 1;
}
if(m_count > 1)
{
int delay = m_announceList.GetItemCount() * 20000;
SetTimer(1, delay, NULL);
}
else
{
DoAnnounce();
}
MessageBox(_T("Completed"), _T("ANNOUNCE"), MB_OK);
}
void CAnnounceDlg::OnBnClickedButtonKickout()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString userId;
int count = m_userList.GetItemCount();
for(int i = 0 ; i < count ; i++)
{
userId = m_userList.GetItemText(i, 0);
if(!userId.IsEmpty())
{
m_parent->RequestKickUser(userId);
}
}
MessageBox(_T("Completed"), _T("KICK OUT"), MB_OK);
}
void CAnnounceDlg::OnBnClickedButtonPractice()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString userId;
int count = m_userList.GetItemCount();
for(int i = 0 ; i < count ; i++)
{
userId = m_userList.GetItemText(i, 0);
if(!userId.IsEmpty())
{
m_parent->RequestPractice(userId);
}
}
MessageBox(_T("Completed"), _T("PRACTICE OUT"), MB_OK);
}
BOOL CAnnounceDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
InitList();
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CAnnounceDlg::InitList()
{
m_userList.DeleteAllItems();
m_userList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_userList.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 120);
m_announceList.DeleteAllItems();
m_announceList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_announceList.InsertColumn(0, _T("Announcement"), LVCFMT_LEFT, 275);
}
void CAnnounceDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(1 == nIDEvent)
{
DoAnnounce();
--m_count;
if(m_count <= 0)
{
KillTimer(1);
TRACE("Announce End\n");
}
}
CDialogEx::OnTimer(nIDEvent);
}
void CAnnounceDlg::OnDropUserFiles(CString file)
{
m_userList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertUserID(line);
}
}
}
}
void CAnnounceDlg::OnDropAnnounceFiles(CString file)
{
m_announceList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertAnnounce(line);
}
}
}
}
void CAnnounceDlg::InsertUserID(CString userId)
{
if(userId.GetLength() == 0) return;
m_userList.InsertItem(m_userList.GetItemCount(), userId);
}
void CAnnounceDlg::InsertAnnounce(CString announce)
{
if(announce.GetLength() == 0) return;
m_announceList.InsertItem(m_announceList.GetItemCount(), announce);
}
void CAnnounceDlg::DoAnnounce()
{
CString userId;
CString announce;
m_editUserID.GetWindowText(userId);
int count = m_announceList.GetItemCount();
for(int i = 0 ; i < count ; i++)
{
announce = m_announceList.GetItemText(i, 0);
if(!announce.IsEmpty())
{
int msgType = userId.IsEmpty() ? ANNOUNCE_TYPE_ALL : ANNOUNCE_TYPE_ONE;
m_parent->RequestAnnounce(msgType, userId, announce);
TRACE("[%d]Announce : %s\n", m_count, announce);
}
}
}
BOOL CAnnounceDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_DROPFILES == pMsg->message)
{
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_announceList.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 );
OnDropAnnounceFiles( file );
}
}
}
else if(WM_KEYDOWN == pMsg->message )
{
if(VK_RETURN == pMsg->wParam)
{
if(m_editUserID.GetSafeHwnd() == pMsg->hwnd)
{
CString userId;
m_editUserID.GetWindowText(userId);
m_editUserID.SetWindowText(_T(""));
InsertUserID(userId);
}
else if(m_editAnnounce.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCode;
m_editAnnounce.GetWindowText(itemCode);
m_editAnnounce.SetWindowText(_T(""));
InsertAnnounce(itemCode);
}
return TRUE;
}
else if(VK_DELETE == pMsg->wParam)
{
if(m_userList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_userList.GetSelectedCount();
if(count > 0) //kyg 여기에 루프 추가
{
DeleteListItem(m_userList);
}
}
else if(m_announceList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_announceList.GetSelectedCount();
if(count > 0)
{
DeleteListItem(m_announceList);
}
}
return TRUE;
}
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
void CAnnounceDlg::OnBnClickedButtonReset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
KillTimer(1);
m_userList.DeleteAllItems();
m_announceList.DeleteAllItems();
}
void CAnnounceDlg::OnLvnItemchangedListKickuserid(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
//m_userList.GetItemState()
*pResult = 0;
}
void CAnnounceDlg::DeleteListItem(CListCtrl& m_List)
{
int index = -1;
POSITION pos = m_List.GetFirstSelectedItemPosition();
while(pos)
{
int index = m_List.GetNextSelectedItem(pos);
m_List.DeleteItem(index);
pos = m_List.GetFirstSelectedItemPosition();
}
}
+58
View File
@@ -0,0 +1,58 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
class CZoneDialog;
// CAnnounceDlg 대화 상자입니다.
class CAnnounceDlg : public CDialogEx
{
DECLARE_DYNAMIC(CAnnounceDlg)
public:
CAnnounceDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CAnnounceDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_ANNOUNCE_DIALOG };
public:
void Startup(CZoneDialog* parent);
void InitList();
protected:
void OnDropUserFiles(CString file);
void OnDropAnnounceFiles(CString file);
void InsertUserID(CString userId);
void InsertAnnounce(CString announce);
void DoAnnounce();
protected:
CZoneDialog* m_parent;
int m_count;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonAnnounce();
afx_msg void OnBnClickedButtonKickout();
CEdit m_editAnnounce;
CEdit m_editUserID;
virtual BOOL OnInitDialog();
CEdit m_interval;
afx_msg void OnTimer(UINT_PTR nIDEvent);
CListCtrl m_userList;
CListCtrl m_announceList;
virtual BOOL PreTranslateMessage(MSG* pMsg);
void DeleteListItem(CListCtrl& m_List);
afx_msg void OnBnClickedButtonReset();
afx_msg void OnLvnItemchangedListKickuserid(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnClickedButtonPractice();
};
+75
View File
@@ -0,0 +1,75 @@
// AuthDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "AuthDlg.h"
#include "afxdialogex.h"
// CAuthDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CAuthDlg, CDialogEx)
CAuthDlg::CAuthDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CAuthDlg::IDD, pParent)
{
}
CAuthDlg::~CAuthDlg()
{
}
void CAuthDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_ID, m_editID);
DDX_Control(pDX, IDC_EDIT_PWD, m_editPWD);
}
BEGIN_MESSAGE_MAP(CAuthDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_AUTH, &CAuthDlg::OnBnClickedButtonAuth)
END_MESSAGE_MAP()
// CAuthDlg 메시지 처리기입니다.
void CAuthDlg::OnBnClickedButtonAuth()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_editID.GetWindowText(m_ID);
m_editPWD.GetWindowText(m_PWD);
if(m_ID.IsEmpty() || m_PWD.IsEmpty())
{
EndDialog(IDCANCEL);
}
else
EndDialog(IDOK);
}
void CAuthDlg::GetText(CString& ID, CString& PWD)
{
ID = m_ID;
PWD = m_PWD;
}
BOOL CAuthDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_KEYDOWN == pMsg->message )
{
if(VK_RETURN == pMsg->wParam)
{
OnBnClickedButtonAuth();
return TRUE;
}
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
+33
View File
@@ -0,0 +1,33 @@
#pragma once
#include "afxwin.h"
// CAuthDlg 대화 상자입니다.
class CAuthDlg : public CDialogEx
{
DECLARE_DYNAMIC(CAuthDlg)
public:
CAuthDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CAuthDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_AUTH_DIALOG };
public:
void GetText(CString& ID, CString& PWD);
protected:
CString m_ID, m_PWD;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CEdit m_editID;
CEdit m_editPWD;
afx_msg void OnBnClickedButtonAuth();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
+521
View File
@@ -0,0 +1,521 @@
// BlockDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.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 );
}
+99
View File
@@ -0,0 +1,99 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
class CZoneDialog;
struct BlockInfo
{
CString blockNote;
CString limitTime;
int level;
BlockInfo()
{
Clear();
}
void Clear()
{
blockNote.Empty();
limitTime.Empty();
level = 0;
}
};
// CBlockDlg 대화 상자입니다.
class CBlockDlg : public CDialogEx
{
DECLARE_DYNAMIC(CBlockDlg)
public:
CBlockDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CBlockDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_BLOCK_DIALOG };
public:
void Startup(CZoneDialog* parent);
protected:
void InitList();
void InsertPublicID(CString publicID);
void InsertBlockNote(CString note);
void InsertBlockTime(CString limitTime);
void InsertBlockLevel(CString level);
void OnDropUserFiles(CString file);
void OnDropNoteFiles(CString file);
BlockInfo* GetSelectUserInfo(uint nIndex = 0);
void SelectListItem(CListCtrl& list, CString item);
void SetUserInfoNote(CString note);
void SetUserInfoTime(CString limitTime);
void SetUserInfoLevel(int level);
void ResetUserInfoNote(CString note);
void ResetNoteListCtrl();
void ResetTimeComboBox() { m_timeCombo.SetCurSel( 0 ); }
void ResetLevelComboBox() { m_levelCombo.SetCurSel( 0 ); }
BOOL CheckBlockUserInfoList();
int GetTime(CString limitTime);
protected:
CZoneDialog* m_parent;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_userList;
CListCtrl m_noteList;
CComboBox m_timeCombo;
CComboBox m_levelCombo;
CEdit m_editPublicID;
CEdit m_editBlockNote;
BlockInfo m_blockUserInfo;
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedButtonBlockReset();
afx_msg void OnBnClickedButtonBlockBlock();
afx_msg void OnBnClickedButtonBlockUnblock();
afx_msg void OnLvnItemchangedListBlockNote(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnCbnSelchangeCombo1();
afx_msg void OnCbnSelchangeComboTime();
afx_msg void OnCbnSelchangeComboLevel();
};
+24
View File
@@ -0,0 +1,24 @@
비매너 - 욕설, 비방
비매너 - 도배
비매너 - 마스터/회사 비방
비매너 - 가족 모독/욕설
비매너 - 성적인 욕설/표현
비매너 - 불량 닉네임/길드명
비매너 - 불량 미니홈피소개
비매너 - 상업광고/사기
비매너 - 불량 길드마크
비매너 - 불량 길드소개
게임진행방해 - 삭제빵
게임진행방해 - 어뷰징
허위신고 - 게임 내
허위신고 - 문의 접수
개인정보/계정도용 - 개인정보유출
개인정보/계정도용 - 문의 접수
현금거래 - 현금거래시도
사칭/허위유포 - 사칭
사칭/허위유포 - 불량 닉네임
사칭/허위유포 - 허위사실유포
버그/핵사용 - 사이트광고
버그/핵사용 - 버그/핵 사용
버그/핵사용 - 버그/핵 유포
저작권 - 저작권 침해
+104
View File
@@ -0,0 +1,104 @@
// CSDialog.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "CSDialog.h"
#include "WinMessage.h"
#include "afxdialogex.h"
// CCSDialog 대화 상자입니다.
IMPLEMENT_DYNAMIC(CCSDialog, CDialogEx)
CCSDialog::CCSDialog(CWnd* pParent /*=NULL*/)
: CDialogEx(CCSDialog::IDD, pParent), m_parent(NULL)
{
}
CCSDialog::~CCSDialog()
{
}
void CCSDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_CSLOG, m_csLog);
DDX_Control(pDX, IDC_EDIT_CHANGEVERSION, m_changeVersion);
DDX_Control(pDX, IDC_EDIT_VERSION, m_version);
}
BEGIN_MESSAGE_MAP(CCSDialog, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_LOADCS, &CCSDialog::OnBnClickedButtonLoadCS)
ON_BN_CLICKED(IDC_BUTTON_SHOWCS, &CCSDialog::OnBnClickedButtonShowCS)
END_MESSAGE_MAP()
// CCSDialog 메시지 처리기입니다.
void CCSDialog::Startup(CZoneDialog* dlg)
{
m_parent = dlg;
ShowWindow(SW_HIDE);
}
void CCSDialog::OnBnClickedButtonLoadCS()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOADCS, NULL);
}
void CCSDialog::OnBnClickedButtonShowCS()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_SHOWCS, NULL);
}
BOOL CCSDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
m_csLog.ResetContent();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CCSDialog::Log(const char *format, ...)
{
TCHAR buffer[2048];
va_list marker;
va_start( marker, format );
_vstprintf_s( buffer, _countof(buffer), format, marker );
va_end( marker );
if(m_csLog.GetCount() > 100)
{
m_csLog.DeleteString(0);
}
m_csLog.AddString( buffer );
m_csLog.SetTopIndex( m_csLog.GetCount() - 1 );
}
void CCSDialog::GetVersion(CString& version, CString& change)
{
m_version.GetWindowText(version);
m_changeVersion.GetWindowText(change);
}
BOOL CCSDialog::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
+41
View File
@@ -0,0 +1,41 @@
#pragma once
#include "afxwin.h"
class CZoneDialog;
// CCSDialog 대화 상자입니다.
class CCSDialog : public CDialogEx
{
DECLARE_DYNAMIC(CCSDialog)
public:
CCSDialog(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CCSDialog();
// 대화 상자 데이터입니다.
enum { IDD = IDD_CS_DIALOG };
public:
void Startup(CZoneDialog* dlg);
void Log(const char *format, ...);
void GetVersion(CString& version, CString& change);
protected:
CZoneDialog* m_parent;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListBox m_csLog;
CEdit m_changeVersion;
CEdit m_version;
afx_msg void OnBnClickedButtonLoadCS();
afx_msg void OnBnClickedButtonShowCS();
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
@@ -0,0 +1,339 @@
// CompensationDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "CompensationDlg.h"
#include "afxdialogex.h"
#include <atltime.h>
#include "ZoneDialog.h"
// CCompensationDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CCompensationDlg, CDialogEx)
CCompensationDlg::CCompensationDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CCompensationDlg::IDD, pParent)
{
}
CCompensationDlg::~CCompensationDlg()
{
}
void CCompensationDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_ITEM_COMPENSATION, m_compensationList);
DDX_Control(pDX, IDC_LIST_ENDDATE, m_endDate);
DDX_Control(pDX, IDC_EDIT_COMPENSATION, m_editCompensationCode);
DDX_Control(pDX, IDC_EDIT_ENDDATE, m_editEndDate);
}
BEGIN_MESSAGE_MAP(CCompensationDlg, CDialogEx)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_ITEM_COMPENSATION, &CCompensationDlg::OnLvnItemchangedItemCompensation)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ENDDATE, &CCompensationDlg::OnLvnItemchangedListEnddate)
ON_BN_CLICKED(IDC_BUTTON_RESET, &CCompensationDlg::OnBnClickedButtonReset)
ON_BN_CLICKED(IDC_INSERT, &CCompensationDlg::OnBnClickedInsert)
END_MESSAGE_MAP()
// CCompensationDlg 메시지 처리기입니다.
void CCompensationDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CCompensationDlg::OnLvnItemchangedItemCompensation(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
void CCompensationDlg::OnLvnItemchangedListEnddate(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
void CCompensationDlg::OnBnClickedButtonReset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_compensationList.DeleteAllItems();
m_endDate.DeleteAllItems();
}
BOOL CCompensationDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
m_compensationList.DeleteAllItems();
m_compensationList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_compensationList.InsertColumn(0, _T("PresentType"), LVCFMT_LEFT, 60);
m_compensationList.InsertColumn(1, _T("Value1"), LVCFMT_LEFT, 75);
m_compensationList.InsertColumn(2, _T("Value2"), LVCFMT_LEFT, 75);
m_endDate.DeleteAllItems();
m_endDate.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_endDate.InsertColumn(0, _T("EndDate"), LVCFMT_LEFT, 180);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
BOOL CCompensationDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_DROPFILES == pMsg->message)
{
if(m_compensationList.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 );
OnDropItemFiles( file );
}
}
else if(m_endDate.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 );
OnDropEndDateFiles( file );
}
}
}
else if(WM_KEYDOWN == pMsg->message )
{
if(VK_RETURN == pMsg->wParam)
{
if(m_editCompensationCode.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCode;
m_editCompensationCode.GetWindowText(itemCode);
m_editCompensationCode.SetWindowText(_T(""));
InsertItemCode(itemCode);
}
else if(m_editEndDate.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCount;
m_editEndDate.GetWindowText(itemCount);
m_editEndDate.SetWindowText(_T(""));
InsertEndDate(itemCount);
}
return TRUE;
}
else if(VK_DELETE == pMsg->wParam)
{
if(m_compensationList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_compensationList.GetSelectedCount();
if(count > 0) //kyg 여기에 루프 추가
{
DeleteListItem(m_compensationList);
}
}
else if(m_endDate.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_endDate.GetSelectedCount();
if(count > 0)
{
DeleteListItem(m_endDate);
}
}
return TRUE;
}
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
void CCompensationDlg::InsertItemCode(CString itemCode)
{
if( itemCode.GetLength() == 0 || m_compensationList.GetItemCount() > 0 )
return;
if(itemCode.GetLength() == 0) return;
int index = 0;
CString presentType, value1, value2;
presentType = itemCode.Tokenize(_T("."), index);
if(presentType.IsEmpty()) return;
if( atoi(presentType) != 3 && atoi(presentType) != 6 )
return;
value1 = itemCode.Tokenize(_T("."), index);
if(value1.IsEmpty()) return;
value2 = itemCode.Tokenize(_T("."), index);
if(value2.IsEmpty()) return;
int itemCount = m_compensationList.GetItemCount();
m_compensationList.InsertItem(itemCount, presentType);
m_compensationList.SetItemText(itemCount, 1, value1);
m_compensationList.SetItemText(itemCount, 2, value2);
}
BOOL CCompensationDlg::CheckDateType(CString endDate)
{
if( endDate.GetLength() != 10 )
return FALSE;
DWORD dwEndDate = atoi(endDate);
int iYear = dwEndDate / 1000000;
int iMonth = (dwEndDate % 1000000) / 10000;
int iDay = (dwEndDate % 10000) / 100;
int iHour = (dwEndDate % 10000) % 100;
if( iYear < 2015 )
return FALSE;
if( iMonth < 1 || iMonth > 12 )
return FALSE;
if( iHour < 0 || 24 < iHour )
return FALSE;
int checkDay = 0;
if( 2 == iMonth )
{
checkDay = 28;
if ((iYear % 4 == 0 && iYear % 100 != 0) || (iYear % 100 == 0 && iYear % 400 == 0))
checkDay = 29;
}
else if( (iMonth == 4 || iMonth == 6 || iMonth == 9 || iMonth == 11) )
{
checkDay = 30;
}
else
{
checkDay = 31;
}
if( checkDay < iDay )
return FALSE;
//현재보다 이전인지 체크
CTime cCurTime = CTime::GetCurrentTime();
CTime cEndDate( iYear, iMonth, iDay, iHour, 0, 0 );
if( cCurTime > cEndDate )
return FALSE;
return TRUE;
}
void CCompensationDlg::InsertEndDate(CString endDate)
{
if( endDate.GetLength() == 0 || m_endDate.GetItemCount() > 0 )
return;
//check
if( !CheckDateType(endDate) )
return;
m_endDate.InsertItem(m_endDate.GetItemCount(), endDate);
}
void CCompensationDlg::OnDropItemFiles(CString file)
{
m_compensationList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertItemCode(line);
}
}
}
}
void CCompensationDlg::OnDropEndDateFiles(CString file)
{
m_endDate.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertEndDate(line);
}
}
}
}
void CCompensationDlg::DeleteListItem(CListCtrl& m_List)
{
int index = -1;
POSITION pos = m_List.GetFirstSelectedItemPosition();
while(pos)
{
int index = m_List.GetNextSelectedItem(pos);
m_List.DeleteItem(index);
pos = m_List.GetFirstSelectedItemPosition();
}
}
void CCompensationDlg::OnBnClickedInsert()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString presentType, value1, value2, endDate;
presentType = m_compensationList.GetItemText(0, 0);
value1 = m_compensationList.GetItemText(0, 1);
value2 = m_compensationList.GetItemText(0, 2);
endDate = m_endDate.GetItemText(0, 0);
if( m_compensationList.GetItemCount() <= 0 || m_endDate.GetItemCount() <= 0 )
return;
ReqeustGiveCompensation(atoi(presentType), atoi(value1), atoi(value2), atoi(endDate));
}
void CCompensationDlg::ReqeustGiveCompensation(int type, int code, int value, int endDate)
{
//CTime 값으로 변환
int iYear = endDate / 1000000;
int iMonth = (endDate % 1000000) / 10000;
int iDay = (endDate % 10000) / 100;
int iHour = (endDate % 10000) % 100;
CTime cEndDate( iYear, iMonth, iDay, iHour, 0, 0 );
m_parent->RequestCompensation(type, code, value, cEndDate.GetTime());
}
@@ -0,0 +1,55 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
class CZoneDialog;
// CCompensationDlg 대화 상자입니다.
class CCompensationDlg : public CDialogEx
{
DECLARE_DYNAMIC(CCompensationDlg)
public:
CCompensationDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CCompensationDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_COMPENSATION_DIALOG };
public:
void Startup(CZoneDialog* parent);
protected:
CZoneDialog* m_parent;
protected:
void InsertItemCode(CString itemCode);
void InsertEndDate(CString endDate);
void OnDropItemFiles(CString file);
void OnDropEndDateFiles(CString file);
void DeleteListItem(CListCtrl& m_List);
void ReqeustGiveCompensation(int type, int code, int value, int endDate);
BOOL CheckDateType(CString endDate);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_compensationList;
CListCtrl m_endDate;
CEdit m_editCompensationCode;
CEdit m_editEndDate;
afx_msg void OnLvnItemchangedItemCompensation(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnItemchangedListEnddate(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnBnClickedButtonReset();
afx_msg void OnBnClickedInsert();
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
+344
View File
@@ -0,0 +1,344 @@
#pragma once
#include <Mmsystem.h>
#include <vector>
#include <map>
#include "IOSocket.h"
// define
#define COMPARE(x,min,max) (((x)>=(min))&&((x)<(max)))
#define SAFEDELETE(x) if(x != NULL) { delete x; x = NULL; }
#define SAFEDELETEARRAY(x) if(x != NULL) { delete [] x; x = NULL; }
enum ServerStates
{
SERVERSTATE_OFF=0,
SERVERSTATE_ON,
SERVERSTATE_BUSY,
SERVERSTATE_END,
SERVERSTATE_EMPTY
};
struct BILLINGSERVERINFO
{
BILLINGSERVERINFO()
{
serviceName = "";
serviceIP = "";
servicePort = 0;
billingServerState = 0;
serverType = 0;
serverListIndex = -1;
serverKeyIndex = -1;
connect = 0;
userInfoCount = 0;
reloadStatus = "";
}
CString serviceName;
CString serviceIP;
int servicePort;
int billingServerState;
int serverType;
int serverListIndex;
int serverKeyIndex;
int connect;
WORD userInfoCount;
CIOSocket billingSocket;
CString reloadStatus;
};
typedef std::map<int, BILLINGSERVERINFO*> BILLINGSERVERTABLE;
struct SERVERINFO
{
SERVERINFO()
{
serverIndex = 0;
serverType = 0;
serverState = 0;
serviceName = "";
serviceIP = "";
servicePort = 0;
connect = 0;
// GB_Connect = 0;
// DE_Connect = 0;
// FR_Connect = 0;
// IT_Connect = 0;
// PL_Connect = 0;
// TR_Connect = 0;
// ETC_Connect = 0;
roomCount = 0;
plazaCount = 0;
battleRoomCount = 0;
pingMS = 0;
DBMS = 0;
delay = 0;
relayFlag = 0;
}
int serverIndex;
int serverType;
int serverState;
CString serviceName;
CString serviceIP;
int servicePort;
WORD connect;
// WORD GB_Connect; //영국
// WORD DE_Connect; //독일
// WORD FR_Connect; //프랑스
// WORD IT_Connect; //이탈리아
// WORD PL_Connect; //폴란드
// WORD TR_Connect; //터키
// WORD ETC_Connect; //터키
WORD roomCount;
WORD plazaCount;
WORD battleRoomCount;
WORD pingMS;
WORD DBMS;
WORD delay;
BOOL relayFlag;
};
struct MAINSERVERINFO
{
DWORD dwGlobalTime; //GLOBAL TIME
char szPublicIP[ 32 ]; //Network Info
char szPrivateIP[ 32 ];
int iPort;
int ThreadCount; //Thread Info
int JoinServerCount; //Connect Client Info
int RemainderMemPoolCount; //Remainder MemPool Info
int RecvQueuePacketCount[4];//RECV QUEUE
int RecvQueueRemainderCount[4];//Remainder MemPool Info
char szDBAgentIP[ 32 ]; //DB AGENT SERVER INFO
char szLogDBAgentIP[ 32 ]; //DB AGENT SERVER INFO
int DBAgentPort;
bool bDBAConnected;
int LogDBAgentPort;
bool bLogDBAConnected;
int MaxGuildCount; //GUILD INFO
int MaxUpdateGuild;
char szCampStringHelp[ 128 ];//CAMP INFO
int MaxTradeItemCount; //Trade Info
char szEventShopState[ 32 ]; //Event Shop Info
int EventGoodsSaveDataCount;
int MaxToolConnectCount; //MANAGER TOOL
bool bUseClientVersion; // Client Version
int iClientVersion;
char szMainServerVersion[ 8 ];// Main Server Version
char szMainServerName[ 32 ];
// Log
int usingLogCount; // 현재
int maxUsingLogCount; // 가장 많이 쓸때
int remainLogCount; // remain
int dropLogCount; // 드랍된 갯수.
MAINSERVERINFO() : dwGlobalTime(0), iPort(0), ThreadCount(0), JoinServerCount(0), RemainderMemPoolCount(0)
, DBAgentPort(0), bDBAConnected(false), LogDBAgentPort(0), bLogDBAConnected(false), MaxGuildCount(0)
, MaxUpdateGuild(0), MaxTradeItemCount(0), EventGoodsSaveDataCount(0), MaxToolConnectCount(0)
, bUseClientVersion(false), iClientVersion(0), usingLogCount(0), maxUsingLogCount(0), remainLogCount(0), dropLogCount(0)
{
ZeroMemory( szPublicIP, sizeof( szPublicIP ) );
ZeroMemory( szPrivateIP, sizeof( szPrivateIP ) );
ZeroMemory( RecvQueuePacketCount, sizeof( RecvQueuePacketCount ) );
ZeroMemory( RecvQueueRemainderCount, sizeof( RecvQueueRemainderCount ) );
ZeroMemory( szDBAgentIP, sizeof( szDBAgentIP ) );
ZeroMemory( szLogDBAgentIP, sizeof( szLogDBAgentIP ) );
ZeroMemory( szCampStringHelp, sizeof( szCampStringHelp ) );
ZeroMemory( szEventShopState, sizeof( szEventShopState ) );
ZeroMemory( szMainServerVersion, sizeof( szMainServerVersion ) );
ZeroMemory( szMainServerName, sizeof( szMainServerName ) );
}
};
struct GAMESERVERINFO
{
DWORD dwGlobalTime; //GLOBAL TIME
char szPublicIP[ 32 ]; //Network Info
int csPort;
int SSPort;
int MSPort;
int ThreadCount; //Thread Info
int NodeSize; //Connect Client Info
int CopyNodeSize;
int RemainderNode; //Remainder MemPool Info
int RoomNodeSize; //CREATE ROOM
int PlazaNodeSize;
int HeapQuartersNodeSize;
int CopyRoomNodeSize;
int CopyPlazaNodeSize;
int CopyHeapQuartersNodeSize;
int RommRemainderNode; //Remainder MemPool Info
int BattleRoomNodeSize; //CREATE BATTLEROOM
int BattleRoomCopyNodeSize;
int PartyLevelCheckMinRoom;
int BattleRoomRemainderNode; //Remainder MemPool Info
int LadderTeamNodeSize; //CREATE LADDERTEAM
int LadderTeamCopyNodeSize;
int LadderTeamCampBattlePlay;
int LadderTeamRemainderNode; //Remainder MemPool Info
int RecvQueueNodeSize[ 4 ]; //RECV QUEUE
int BroadCastUDPnRelayNodeSize;
int RecvQueueRemainderNodeSize[4]; //Remainder MemPool Info
int BroadCastUDPnRelayRemainderNodeSize;
int DBClientNodeSize; //DB AGENT SERVER INFO
int DBClientTotalNodeSize; //DB AGENT SERVER INFO
char szSTRFILEVER[ 8 ]; // Game Server Version
char szSTRINTERNALNAME[ 32 ];
char szGameServerID[ 32 ]; // Game Server ID
char szGameServerName[ 32 ]; // Game Server Name
char szLogDBIP[ 32 ]; // LogDB Agent IP / port
int LogDBPort;
bool IsLogDBAActive;
DWORD HackCheckMin; // HackCheck
DWORD HackCheckMax;
int HackCheckLess;
int HackCheckOver;
int HackCheckLessOver;
int HackCheckTotal;
int IsClientVersion; // Client Version
int GetClientVersion;
int ChannelNodeSize; //CREATE Channel
int ChannelRemainderSize;
int ChannelCopyNodeSize;
int MemoNodeSize; //MEMO
DWORD GetServerIndex; //GAME SERVER INFO
int ServerNodeSize;
int ServerRemainderNodeSize;
bool IsMainServerActive; // Main Server Info
char MainServerIP[ 32 ];
int MainServerPort;
__int64 UDPTransferCount; //UDP Transfer Count
__int64 UDPTransferTCPCount;
__int64 UDPTransferTCPSendCount;
bool IsBillingRelayServerActive; //BILLING RELAY SERVER INFO
char BillingIP[ 32 ];
int BillingPort;
char XtrapVersion[ 32 ];
int LicenseDate; // Expiration dates
bool m_bReserveLogout; // Exit
int remainSecond;
int sendBufferUsingCnt; // SendBuffer
int sendBufferRemainCnt;
int sendBufferMaxCnt;
// Log
int usingLogCount; // 현재
int maxUsingLogCount; // 가장 많이 쓸때
int remainLogCount; // remain
int dropLogCount; // 드랍된 갯수.
GAMESERVERINFO() : dwGlobalTime(0), csPort(0), SSPort(0), MSPort(0), ThreadCount(0), NodeSize(0), CopyNodeSize(0)
, RemainderNode(0), RoomNodeSize(0), PlazaNodeSize(0), HeapQuartersNodeSize(0), CopyRoomNodeSize(0), CopyPlazaNodeSize(0)
, CopyHeapQuartersNodeSize(0), RommRemainderNode(0), BattleRoomNodeSize(0), BattleRoomCopyNodeSize(0), PartyLevelCheckMinRoom(0)
, BattleRoomRemainderNode(0), LadderTeamNodeSize(0), LadderTeamCopyNodeSize(0), LadderTeamCampBattlePlay(0), LadderTeamRemainderNode(0)
, BroadCastUDPnRelayNodeSize(0), BroadCastUDPnRelayRemainderNodeSize(0), DBClientNodeSize(0), DBClientTotalNodeSize(0)
, LogDBPort(0), IsLogDBAActive(false), HackCheckMin(0), HackCheckMax(0), HackCheckLess(0), HackCheckOver(0), HackCheckLessOver(0), HackCheckTotal(0), IsClientVersion(0)
, GetClientVersion(0), ChannelNodeSize(0), ChannelRemainderSize(0), ChannelCopyNodeSize(0), MemoNodeSize(0)
, GetServerIndex(0), ServerNodeSize(0), ServerRemainderNodeSize(0), IsMainServerActive(false), MainServerPort(0)
, UDPTransferCount(0), UDPTransferTCPCount(0), UDPTransferTCPSendCount(0), IsBillingRelayServerActive(false), BillingPort(0)
, LicenseDate(0), m_bReserveLogout(false), remainSecond(0), sendBufferUsingCnt(0), sendBufferRemainCnt(0), sendBufferMaxCnt(0)
, usingLogCount(0), maxUsingLogCount(0), remainLogCount(0), dropLogCount(0)
{
ZeroMemory( szPublicIP, sizeof( szPublicIP ) );
ZeroMemory( RecvQueueNodeSize, sizeof( RecvQueueNodeSize ) );
ZeroMemory( RecvQueueRemainderNodeSize, sizeof( RecvQueueRemainderNodeSize ) );
ZeroMemory( szSTRFILEVER, sizeof( szSTRFILEVER ) );
ZeroMemory( szSTRINTERNALNAME, sizeof( szSTRINTERNALNAME ) );
ZeroMemory( szGameServerID, sizeof( szGameServerID ) );
ZeroMemory( szGameServerName, sizeof( szGameServerName ) );
ZeroMemory( szLogDBIP, sizeof( szLogDBIP ) );
ZeroMemory( MainServerIP, sizeof( MainServerIP ) );
ZeroMemory( BillingIP, sizeof( BillingIP ) );
ZeroMemory( XtrapVersion, sizeof( XtrapVersion ) );
}
};
struct LoginServerInfo
{
TCHAR serverIP[64];
int serverPort;
int acceptCountPerSec;
int acceptCount;
int closeCount;
int opPoolCount;
int clientPoolCount;
int userInfoCount;
int serverConnectorPoolCount;
int packetQueueCount;
int serverConnectCount;
};
struct ServerInfo
{
TCHAR serverIP[64];
TCHAR serverName[64];
int serverPort;
int userCount;
int sendCount;
int fullCount;
int blockState;
int serverId;
int serverState;
};
#pragma pack(push,1)
struct SendRelayInfo_
{
TCHAR m_ipAddr[64];
int m_port;
int m_userCount;
int m_roomCount;
int m_serverCount;
int m_64DropCount;
int m_256DropCount;
int m_1024DropCount;
int m_64UsingCount;
int m_256UsingCount;
int m_1024UsingCount;
SendRelayInfo_()
{
ZeroMemory(m_ipAddr,64);
m_port = 0;
m_userCount = 0;
m_roomCount= 0;
m_64DropCount= 0;
m_256DropCount= 0;
m_1024DropCount= 0;
m_64UsingCount= 0;
m_256UsingCount= 0;
m_1024UsingCount= 0;
}
};
#pragma pack(pop)
namespace ESOCKET
{
enum Socket
{
LS_CONNECTED = 0,
LS_DISCONNECTED,
LS_REQSERVERSTATE,
LS_RESPSERVERSTATE,
LS_ZOMBIESERVERSTATE,
LS_BLOCKED,
};
}
namespace EMCONTROLTYPE
{
enum ECONTYPE
{
LS_GETSERVERINFO,
LS_SETALLSERVERBLOCK,
LS_SETSERVERBLOCK,
LS_FILLSERVERINFO,
LS_SETMAXUSER,
LS_FILLINFODRAW,
LS_QUICKEXIT,
};
}
+102
View File
@@ -0,0 +1,102 @@
// DisplayDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "DisplayDlg.h"
#include "afxdialogex.h"
// CDisplayDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CDisplayDlg, CDialogEx)
CDisplayDlg::CDisplayDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CDisplayDlg::IDD, pParent), m_serverType(0), m_index(0), m_parent(NULL)
{
}
CDisplayDlg::~CDisplayDlg()
{
}
void CDisplayDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_SHOWINFO, m_editCtrl);
}
BEGIN_MESSAGE_MAP(CDisplayDlg, CDialogEx)
END_MESSAGE_MAP()
void CDisplayDlg::Startup(CZoneDialog* dlg)
{
m_parent = dlg;
ShowWindow(SW_HIDE);
}
// CDisplayDlg 메시지 처리기입니다.
void CDisplayDlg::Show(int serverType, int index, CString& title, CString& text)
{
SetWindowText(title);
m_serverType = serverType;
m_index = index;
m_editCtrl.SetWindowText(text);
m_editCtrl.SetSel(0, 0);
m_editCtrl.SetFocus();
ShowWindow(SW_SHOW);
}
void CDisplayDlg::Refresh()
{
if(!m_parent->m_billingFlag)
m_parent->RequestInfo(m_serverType, m_index);
else
{
int billingKeyIndex = m_serverType;
m_parent->RequestInfo(SERVER_TYPE_BILLING, billingKeyIndex);
}
}
BOOL CDisplayDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
switch(pMsg->message)
{
case WM_KEYDOWN :
{
if(VK_F5 == pMsg->wParam)
{
Refresh();
return FALSE;
}
}
break;
case WM_SYSKEYDOWN:
{
}
break;
}
return CDialogEx::PreTranslateMessage(pMsg);
}
BOOL CDisplayDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
+40
View File
@@ -0,0 +1,40 @@
#pragma once
#include "afxwin.h"
class CZoneDialog;
// CDisplayDlg 대화 상자입니다.
class CDisplayDlg : public CDialogEx
{
DECLARE_DYNAMIC(CDisplayDlg)
public:
CDisplayDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CDisplayDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_DISPLAY_DIALOG };
public:
void Startup(CZoneDialog* dlg);
void Show(int serverType, int index, CString& title, CString& text);
protected:
void Refresh();
protected:
int m_serverType;
int m_index;
CZoneDialog* m_parent;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CEdit m_editCtrl;
virtual BOOL PreTranslateMessage(MSG* pMsg);
virtual BOOL OnInitDialog();
};
+96
View File
@@ -0,0 +1,96 @@
/*===================================================*\
| |
| EASY-SIZE Macros |
| |
| Copyright (c) 2001 - Marc Richarme |
| [email protected] |
| http://devix.cjb.net |
| |
| License: |
| |
| You may use this code in any commersial or non- |
| commersial application, and you may redistribute |
| this file (and even modify it if you wish) as |
| long as you keep this notice untouched in any |
| version you redistribute. |
| |
| Usage: |
| |
| - Insert 'DECLARE_EASYSIZE' somewhere in your |
| class declaration |
| - Insert an easysize map in the beginning of your |
| class implementation (see documentation) and |
| outside of any function. |
| - Insert 'INIT_EASYSIZE;' in your |
| OnInitDialog handler. |
| - Insert 'UPDATE_EASYSIZE' in your OnSize handler |
| - Optional: Insert 'EASYSIZE_MINSIZE(mx,my);' in |
| your OnSizing handler if you want to specify |
| a minimum size for your dialog |
| |
| Check http://devix.cjb.net for the |
| docs and new versions |
| |
\*===================================================*/
#ifndef __EASYSIZE_H_
#define __EASYSIZE_H_
#define ES_BORDER 0xffffffff
#define ES_KEEPSIZE 0xfffffffe
#define ES_HCENTER 0x00000001
#define ES_VCENTER 0x00000002
#define DECLARE_EASYSIZE \
void __ES__RepositionControls(BOOL bInit);\
void __ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright);
#define INIT_EASYSIZE __ES__RepositionControls(TRUE); __ES__RepositionControls(FALSE)
#define UPDATE_EASYSIZE if(GetWindow(GW_CHILD)!=NULL) __ES__RepositionControls(FALSE)
#define EASYSIZE_MINSIZE(mx,my,s,r) if(r->right-r->left < mx) { if((s == WMSZ_BOTTOMLEFT)||(s == WMSZ_LEFT)||(s == WMSZ_TOPLEFT)) r->left = r->right-mx; else r->right = r->left+mx; } if(r->bottom-r->top < my) { if((s == WMSZ_TOP)||(s == WMSZ_TOPLEFT)||(s == WMSZ_TOPRIGHT)) r->top = r->bottom-my; else r->bottom = r->top+my; }
#define BEGIN_EASYSIZE_MAP(class) \
void class::__ES__CalcBottomRight(CWnd *pThis, BOOL bBottom, int &bottomright, int &topleft, UINT id, UINT br, int es_br, CRect &rect, int clientbottomright) {\
if(br==ES_BORDER) bottomright = clientbottomright-es_br;\
else if(br==ES_KEEPSIZE) bottomright = topleft+es_br;\
else { CRect rect2;\
pThis->GetDlgItem(br)->GetWindowRect(rect2); pThis->ScreenToClient(rect2);\
bottomright = (bBottom?rect2.top:rect2.left) - es_br;}}\
void class::__ES__RepositionControls(BOOL bInit) { CRect rect,rect2,client; GetClientRect(client);
#define END_EASYSIZE_MAP Invalidate(); UpdateWindow(); }
#define EASYSIZE(id,l,t,r,b,o) \
static int id##_es_l, id##_es_t, id##_es_r, id##_es_b;\
if(bInit) {\
GetDlgItem(id)->GetWindowRect(rect); ScreenToClient(rect);\
if(o & ES_HCENTER) id##_es_l = rect.Width()/2; else {\
if(l==ES_BORDER) id##_es_l = rect.left; else if(l==ES_KEEPSIZE) id##_es_l = rect.Width(); else {\
GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2);\
id##_es_l = rect.left-rect2.right;}}\
if(o & ES_VCENTER) id##_es_t = rect.Height()/2; else {\
if(t==ES_BORDER) id##_es_t = rect.top; else if(t==ES_KEEPSIZE) id##_es_t = rect.Height(); else {\
GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2);\
id##_es_t = rect.top-rect2.bottom;}}\
if(o & ES_HCENTER) id##_es_r = rect.Width(); else { if(r==ES_BORDER) id##_es_r = client.right-rect.right; else if(r==ES_KEEPSIZE) id##_es_r = rect.Width(); else {\
GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2);\
id##_es_r = rect2.left-rect.right;}}\
if(o & ES_VCENTER) id##_es_b = rect.Height(); else { if(b==ES_BORDER) id##_es_b = client.bottom-rect.bottom; else if(b==ES_KEEPSIZE) id##_es_b = rect.Height(); else {\
GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2);\
id##_es_b = rect2.top-rect.bottom;}}\
} else {\
int left,top,right,bottom; BOOL bR = FALSE,bB = FALSE;\
if(o & ES_HCENTER) { int _a,_b;\
if(l==ES_BORDER) _a = client.left; else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.right; }\
if(r==ES_BORDER) _b = client.right; else { GetDlgItem(r)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.left; }\
left = _a+((_b-_a)/2-id##_es_l); right = left + id##_es_r;} else {\
if(l==ES_BORDER) left = id##_es_l;\
else if(l==ES_KEEPSIZE) { __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right); left = right-id##_es_l;\
} else { GetDlgItem(l)->GetWindowRect(rect2); ScreenToClient(rect2); left = rect2.right + id##_es_l; }\
if(l != ES_KEEPSIZE) __ES__CalcBottomRight(this,FALSE,right,left,id,r,id##_es_r,rect,client.right);}\
if(o & ES_VCENTER) { int _a,_b;\
if(t==ES_BORDER) _a = client.top; else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); _a = rect2.bottom; }\
if(b==ES_BORDER) _b = client.bottom; else { GetDlgItem(b)->GetWindowRect(rect2); ScreenToClient(rect2); _b = rect2.top; }\
top = _a+((_b-_a)/2-id##_es_t); bottom = top + id##_es_b;} else {\
if(t==ES_BORDER) top = id##_es_t;\
else if(t==ES_KEEPSIZE) { __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom); top = bottom-id##_es_t;\
} else { GetDlgItem(t)->GetWindowRect(rect2); ScreenToClient(rect2); top = rect2.bottom + id##_es_t; }\
if(t != ES_KEEPSIZE) __ES__CalcBottomRight(this,TRUE,bottom,top,id,b,id##_es_b,rect,client.bottom);}\
GetDlgItem(id)->MoveWindow(left,top,right-left,bottom-top,FALSE);\
}
#endif //__EASYSIZE_H_
+121
View File
@@ -0,0 +1,121 @@
// EventDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "EventDlg.h"
#include "afxdialogex.h"
// CEventDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CEventDlg, CDialogEx)
CEventDlg::CEventDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CEventDlg::IDD, pParent), m_parent(NULL)
{
}
CEventDlg::~CEventDlg()
{
}
void CEventDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_EDIT_EVENT, m_eventEdit);
}
BEGIN_MESSAGE_MAP(CEventDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_EVENTINSERT, &CEventDlg::OnBnClickedButtonEventApply)
END_MESSAGE_MAP()
// CEventDlg 메시지 처리기입니다.
void CEventDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CEventDlg::OnDropEventFiles(CString file)
{
m_eventEdit.SetWindowText(_T(""));
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line, output = "";
while(ff.ReadString(line))
{
output += line;
output += _T("\r\n");
}
ff.Close();
m_eventEdit.SetWindowText(output);
}
}
void CEventDlg::Parse(CString text)
{
ZeroMemory(m_values, sizeof(m_values));
m_valueCount = 0;
int curPos = 0;
CString token= text.Tokenize(_T("\r\n"),curPos);
while (token != _T(""))
{
token.MakeLower();
if(!token.IsEmpty() &&
(token.Find(_T(";"), 0) == -1) &&
(token.Find(_T("["), 0) == -1) &&
(token.Find(_T(";"), 0) == -1) )
{
int index = 0;
CString key = token.Tokenize(_T("="), index);
CString value = token.Tokenize(_T("="), index);
m_values[m_valueCount++] = atoi(value);
}
token = text.Tokenize(_T("\r\n"), curPos);
};
}
void CEventDlg::OnBnClickedButtonEventApply()
{
CString text;
m_eventEdit.GetWindowText(text);
// 텍스트 파싱
Parse(text);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_parent->RequestEventInsert(m_values, m_valueCount);
MessageBox(_T("Completed"), _T("EVENT"), MB_OK);
}
BOOL CEventDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_DROPFILES == pMsg->message)
{
if(m_eventEdit.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 );
OnDropEventFiles( file );
}
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
+39
View File
@@ -0,0 +1,39 @@
#pragma once
#include "afxwin.h"
class CZoneDialog;
// CEventDlg 대화 상자입니다.
class CEventDlg : public CDialogEx
{
DECLARE_DYNAMIC(CEventDlg)
public:
CEventDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CEventDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_EVENT_DIALOG };
public:
void Startup(CZoneDialog* parent);
void OnDropEventFiles(CString file);
void Parse(CString text);
protected:
CZoneDialog* m_parent;
int m_values[64];
int m_valueCount;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CEdit m_eventEdit;
afx_msg void OnBnClickedButtonEventApply();
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
+607
View File
@@ -0,0 +1,607 @@
// GraphDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "GraphDlg.h"
#include "afxdialogex.h"
#include "WinMessage.h"
#include "cFile.h"
#include <iostream>
#include <fstream>
using namespace std;
// CGraphDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CGraphDlg, CDialogEx)
CGraphDlg::CGraphDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CGraphDlg::IDD, pParent), m_PCCU(0), m_terms(GRAPH_TERM_3SEC), m_bCountryCode(false)
{
m_bChangeGraph = true;
}
CGraphDlg::~CGraphDlg()
{
}
void CGraphDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_YEAR, m_CbbYear);
DDX_Control(pDX, IDC_DAY, m_CBBDAY);
DDX_Control(pDX, IDC_MONTH, m_CBBMONTH);
}
BEGIN_MESSAGE_MAP(CGraphDlg, CDialogEx)
ON_BN_CLICKED(IDC_TODAY, &CGraphDlg::OnBnClickedToday)
ON_BN_CLICKED(IDC_YESTERDAY, &CGraphDlg::OnBnClickedYesterday)
ON_BN_CLICKED(IDC_SERACH, &CGraphDlg::OnBnClickedSerach)
ON_BN_CLICKED(IDC_1WEEK_AGO, &CGraphDlg::OnBnClicked1weekAgo)
END_MESSAGE_MAP()
// CGraphDlg 메시지 처리기입니다.
void CGraphDlg::CreateGraph()
{
CRect rc;
CDC * pDC = GetDC();
GetClientRect(rc);
HDC m_hMemDC = CreateCompatibleDC(pDC->m_hDC);
GetDlgItem(IDC_OSC_CCU)->GetWindowRect(rc) ;
ScreenToClient(rc) ;
m_graphCCU.DestroyWindow();
m_graphCCU.Create(WS_VISIBLE | WS_CHILD, rc, this) ;
m_graphCCU.SetRange( true, 0, 100, 1) ;
m_graphCCU.SetYUnits(_T("")) ;
GetDlgItem(IDC_OSC_CCU)->ShowWindow(SW_HIDE);
}
BOOL CGraphDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
CreateGraph();
CreateMenu();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CGraphDlg::Startup(CString title)
{
m_title = title;
RefreshTitle();
ShowWindow(SW_HIDE);
m_CbbYear.InsertString(0, ("2018"));
m_CbbYear.InsertString(1, ("2019"));
m_CbbYear.InsertString(2, ("2020"));
m_CbbYear.InsertString(3, ("2021"));
m_CbbYear.InsertString(4, ("2022"));
m_CbbYear.InsertString(5, ("2023"));
m_CBBMONTH.InsertString(0, ("1"));
m_CBBMONTH.InsertString(1, ("2"));
m_CBBMONTH.InsertString(2, ("3"));
m_CBBMONTH.InsertString(3, ("4"));
m_CBBMONTH.InsertString(4, ("5"));
m_CBBMONTH.InsertString(5, ("6"));
m_CBBMONTH.InsertString(6, ("7"));
m_CBBMONTH.InsertString(7, ("8"));
m_CBBMONTH.InsertString(8, ("9"));
m_CBBMONTH.InsertString(9, ("10"));
m_CBBMONTH.InsertString(10, ("11"));
m_CBBMONTH.InsertString(11, ("12"));
m_CBBDAY.InsertString(0, ("1"));
m_CBBDAY.InsertString(1, ("2"));
m_CBBDAY.InsertString(2, ("3"));
m_CBBDAY.InsertString(3, ("4"));
m_CBBDAY.InsertString(4, ("5"));
m_CBBDAY.InsertString(5, ("6"));
m_CBBDAY.InsertString(6, ("7"));
m_CBBDAY.InsertString(7, ("8"));
m_CBBDAY.InsertString(8, ("9"));
m_CBBDAY.InsertString(9, ("10"));
m_CBBDAY.InsertString(10, ("11"));
m_CBBDAY.InsertString(11, ("12"));
m_CBBDAY.InsertString(12, ("13"));
m_CBBDAY.InsertString(13, ("14"));
m_CBBDAY.InsertString(14, ("15"));
m_CBBDAY.InsertString(15, ("16"));
m_CBBDAY.InsertString(16, ("17"));
m_CBBDAY.InsertString(17, ("18"));
m_CBBDAY.InsertString(18, ("19"));
m_CBBDAY.InsertString(19, ("20"));
m_CBBDAY.InsertString(20, ("21"));
m_CBBDAY.InsertString(21, ("22"));
m_CBBDAY.InsertString(22, ("23"));
m_CBBDAY.InsertString(23, ("24"));
m_CBBDAY.InsertString(24, ("25"));
m_CBBDAY.InsertString(25, ("26"));
m_CBBDAY.InsertString(26, ("27"));
m_CBBDAY.InsertString(27, ("28"));
m_CBBDAY.InsertString(28, ("29"));
m_CBBDAY.InsertString(29, ("30"));
m_CBBDAY.InsertString(30, ("31"));
}
void CGraphDlg::CreateMenu()
{
m_menu.DestroyMenu();
m_menu.CreatePopupMenu();
CString menu = _T("3 sec");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GRAPH3SEC, (LPCTSTR)menu);
menu = _T("1 min");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GRAPH1MIN, (LPCTSTR)menu);
menu = _T("10 min");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GRAPH10MIN, (LPCTSTR)menu);
}
void CGraphDlg::RefreshTitle()
{
CString temp;
temp.Format(_T("%s - CCU Graph(PCCU : %d)"), GetTitle(), (int)GetPCCU());
SetWindowText(temp);
}
void CGraphDlg::InitDate()
{
m_graphCCU.InitDate();
}
void CGraphDlg::SetRange(bool b, double dLower, double dUpper, int nDecimalPlaces)
{
m_graphCCU.SetRange(b, dLower, dUpper, nDecimalPlaces);
}
void CGraphDlg::AppendPoint(bool bCCU, int nPoint)
{
if(m_bChangeGraph == false)
{
return ;
}
m_bCountryCode = bCCU;
m_points.push_back(nPoint); // 11860(200 * 593) max
if(nPoint > m_PCCU)
{
m_PCCU = nPoint;
RefreshTitle();
}
int term = GetTerm(m_terms);
int divide = m_points.size() % term;
if(divide == 0)
{
m_graphCCU.AppendPoint(m_bCountryCode, nPoint);
}
}
void CGraphDlg::SetXUnits(CString string)
{
if(m_bChangeGraph == false)
{
return ;
}
m_graphCCU.SetXUnits(string);
}
void CGraphDlg::ShowGraph(MSG* pMsg)
{
if(m_graphCCU.GetSafeHwnd() == pMsg->hwnd)
{
//TRACE("Message : %08x\n", pMsg->message);
if(pMsg->message == WM_RBUTTONUP)
{
CPoint pos;
GetCursorPos(&pos);
int term = GetTerm();
for(int i = 1 ; i <= 3 ; i++)
{
if(i == term)
{
m_menu.CheckMenuItem(IDC_SERVICE_GRAPH3SEC+i-1, MF_CHECKED);
}
else
{
m_menu.CheckMenuItem(IDC_SERVICE_GRAPH3SEC+i-1, MF_UNCHECKED);
}
}
m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this);
}
}
}
void CGraphDlg::HideGraph(MSG* pMsg)
{
if(m_graphCCU.GetSafeHwnd() == pMsg->hwnd)
{
//TRACE("Message : %08x\n", pMsg->message);
if(pMsg->message == WM_LBUTTONUP)
{
ShowWindow(SW_HIDE);
}
}
}
void CGraphDlg::ProgressTime(MSG* pMsg)
{
if(m_graphCCU.GetSafeHwnd() == pMsg->hwnd)
{
CString szTime;
int x = GET_X_LPARAM(pMsg->lParam);
int y = GET_Y_LPARAM(pMsg->lParam);
int rightPixel = m_graphCCU.GetRightPixel();
int leftPixel = m_graphCCU.GetLeftPixel();
if( (x < leftPixel) || (x > rightPixel) )
return;
int elapseTime = (rightPixel - x) / 4;
int term = GetTerm(m_terms) * 3;
elapseTime *= term;
CTime nowTime = CTime::GetCurrentTime();
CTime pastTime = nowTime;
pastTime -= elapseTime;
float fPosTerm = (rightPixel - leftPixel)/24.0;
int Diff = x - leftPixel;
int iHour = Diff/fPosTerm;
int iTest = Diff%(int)fPosTerm;
int iMinute = iTest /fPosTerm * 60;
szTime.Format("Time:%02d:%02d", iHour, iMinute);
m_graphCCU.SetToolTip( szTime );;
}
}
int CGraphDlg::GetTerm(const GraphTerms terms)
{
int term = 1;
switch(terms)
{
case GRAPH_TERM_3SEC :
term = 1;
break;
case GRAPH_TERM_1MIN :
//term = 5;
term = 20;
break;
case GRAPH_TERM_10MIN :
//term = 10;
term = 200;
break;
}
return term;
}
BOOL CGraphDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
ProgressTime(pMsg);
HideGraph(pMsg);
ShowGraph(pMsg);
return CDialogEx::PreTranslateMessage(pMsg);
}
void CGraphDlg::Rearrange(const GraphTerms terms)
{
ShowWindow(SW_HIDE);
m_graphCCU.Reset();
m_terms = terms;
int term = GetTerm(terms);
int width = m_graphCCU.GetWidth();
int offset = (width+1) * term;
int start = 0;
if((int)m_points.size() > offset)
{
start = m_points.size() - offset;
}
TRACE("[Rearrange - %d]\n", term);
for(int i = start ; i < (int)m_points.size() ; i += term)
{
m_graphCCU.AppendPoint(m_bCountryCode, m_points[i]);
TRACE("graph : %d\n", m_points[i]);
}
ShowWindow(SW_SHOW);
}
BOOL CGraphDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
int itemIndex = lParam;
switch(wParam)
{
case IDC_SERVICE_GRAPH3SEC :
{
m_terms = GRAPH_TERM_3SEC;
Rearrange(GRAPH_TERM_3SEC);
}
return TRUE;
case IDC_SERVICE_GRAPH1MIN :
{
m_terms = GRAPH_TERM_1MIN;
Rearrange(GRAPH_TERM_1MIN);
}
return TRUE;
case IDC_SERVICE_GRAPH10MIN :
{
m_terms = GRAPH_TERM_10MIN;
Rearrange(GRAPH_TERM_10MIN);
}
return TRUE;
}
return CDialog::OnCommand(wParam, lParam);
}
void CGraphDlg::AppendCCUPoint( double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC )
{
m_graphCCU.AppendCCUPoint(dNewGB, dNewDE, dNewFR, dNewIT, dNewPL, dNewTR, dNewETC);
}
void CGraphDlg::OnBnClickedToday()
{
// 오늘 내역을 출력한다.
__int64 IN_WEEK = (__int64)10000000*60*60*24*7;
__int64 IN_DAY = (__int64)10000000*60*60*24;
__int64 IN_HOUR = (__int64)10000000*60*60;
__int64 IN_MIN = (__int64)10000000*60;
__int64 IN_SEC = (__int64)10000000;
// 어제 내역을 출력한다.
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
GraphSetting(sysTime);
m_bChangeGraph = true;
ComboBoxSetting(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
}
void CGraphDlg::OnBnClickedYesterday()
{
__int64 IN_WEEK = (__int64)10000000*60*60*24*7;
__int64 IN_DAY = (__int64)10000000*60*60*24;
__int64 IN_HOUR = (__int64)10000000*60*60;
__int64 IN_MIN = (__int64)10000000*60;
__int64 IN_SEC = (__int64)10000000;
// 어제 내역을 출력한다.
SYSTEMTIME sysTime;
FILETIME ftm;
LARGE_INTEGER largeInt;
GetLocalTime(&sysTime);
SystemTimeToFileTime(&sysTime, &ftm);
memcpy(&largeInt, &ftm, sizeof(FILETIME));
largeInt.QuadPart += IN_DAY * (-1);
memcpy(&ftm, &largeInt, sizeof(FILETIME));
FileTimeToSystemTime(&ftm, &sysTime);
GraphSetting(sysTime);
m_bChangeGraph = false;
ComboBoxSetting(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
}
void CGraphDlg::OnBnClicked1weekAgo()
{
__int64 IN_WEEK = (__int64)10000000*60*60*24*7;
__int64 IN_DAY = (__int64)10000000*60*60*24;
__int64 IN_HOUR = (__int64)10000000*60*60;
__int64 IN_MIN = (__int64)10000000*60;
__int64 IN_SEC = (__int64)10000000;
// 어제 내역을 출력한다.
SYSTEMTIME sysTime;
FILETIME ftm;
LARGE_INTEGER largeInt;
GetLocalTime(&sysTime);
SystemTimeToFileTime(&sysTime, &ftm);
memcpy(&largeInt, &ftm, sizeof(FILETIME));
largeInt.QuadPart += IN_DAY * (-7);
memcpy(&ftm, &largeInt, sizeof(FILETIME));
FileTimeToSystemTime(&ftm, &sysTime);
GraphSetting(sysTime);
m_bChangeGraph = false;
ComboBoxSetting(sysTime.wYear, sysTime.wMonth, sysTime.wDay);
}
void CGraphDlg::OnBnClickedSerach()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString strYear, strMonth, strDay;
m_CbbYear.GetLBText(m_CbbYear.GetCurSel(), strYear);
m_CBBMONTH.GetLBText(m_CBBMONTH.GetCurSel(), strMonth);
m_CBBDAY.GetLBText(m_CBBDAY.GetCurSel(), strDay);
int iYear = atoi(strYear);
int iMonth = atoi(strMonth);
int iDay = atoi(strDay);
// 어제 내역을 출력한다.
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
sysTime.wYear = iYear;
sysTime.wMonth = iMonth;
sysTime.wDay = iDay;
GraphSetting(sysTime);
m_bChangeGraph = false;
ComboBoxSetting(iYear, iMonth, iDay);
}
void CGraphDlg::GraphSetting(const SYSTEMTIME systime)
{
BOOL billingFlag = FALSE;
TCHAR buffer[512];
TCHAR path[512];
GetCurrentDirectory(sizeof(path), path);
CString fullPath;
fullPath.Format(_T("%s\\%04lu%02lu%02lu.txt"), m_title, systime.wYear, systime.wMonth, systime.wDay);
ifstream ifile;
char line[200]; // 한 줄씩 읽어서 임시로 저장할 공간
CString strTemp;
CString strCount;
int iLastMaxCount = 0;
int imaxValue = 0;
int iMaxCount =0;
ifile.open(fullPath); // 파일 열기
if (ifile.is_open())
{
while (ifile.getline(line, sizeof(line))) // 한 줄씩 읽어 처리를 시작한다.
{
cout << line << endl; // 내용 출력
strTemp = line;
// strTime = strTemp.Right(strTemp.GetLength() - (1));
CString strYear = strTemp.Mid(1, 4);
int iYear = _ttoi(strYear);
CString strMonth = strTemp.Mid(6, 2);
int iMonth = _ttoi(strMonth);
CString strDay = strTemp.Mid(9, 2);
int iDay = _ttoi(strDay);
CString strHour = strTemp.Mid(12, 2);
int iHour = _ttoi(strHour);
CString strMinute = strTemp.Mid(15, 2);
int iMinute = _ttoi(strMinute);
CString strSecond = strTemp.Mid(18, 2);
int iSecond = _ttoi(strSecond);
strCount = strTemp.Left(strTemp.GetLength() - (1));
int iPoint2 = strCount.ReverseFind('[');
strCount = strCount.Right(strCount.GetLength() - (iPoint2 + 1));
int iCount = _ttoi(strCount);
if(iMaxCount < iCount)
{
iMaxCount = iCount;
}
}
if(iLastMaxCount < iMaxCount)
{
if(iMaxCount / 100 == 0) imaxValue = 100;
else if(iMaxCount / 500 == 0) imaxValue = 500;
else if(iMaxCount / 1000 == 0) imaxValue = 1000;
else if(iMaxCount / 2500 == 0) imaxValue = 2500;
else if(iMaxCount / 5000 == 0) imaxValue = 5000;
else if(iMaxCount / 10000 == 0) imaxValue = 10000;
else if(iMaxCount / 20000 == 0) imaxValue = 20000;
else if(iMaxCount / 50000 == 0) imaxValue = 50000;
else if(iMaxCount / 100000 == 0) imaxValue = 100000;
else if(iMaxCount / 500000 == 0) imaxValue = 500000;
else if(iMaxCount / 1000000 == 0) imaxValue = 1000000;
}
if(iLastMaxCount != imaxValue)
{
iLastMaxCount = imaxValue;
}
SetRange(true, 0, imaxValue, 1);
ifile.clear();
ifile.seekg(0, ios::beg);
m_graphCCU.Init();
m_graphCCU.InitDate();
while (ifile.getline(line, sizeof(line))) // 한 줄씩 읽어 처리를 시작한다.
{
cout << line << endl; // 내용 출력
strTemp = line;
// strTime = strTemp.Right(strTemp.GetLength() - (1));
CString strYear = strTemp.Mid(1, 4);
int iYear = _ttoi(strYear);
CString strMonth = strTemp.Mid(6, 2);
int iMonth = _ttoi(strMonth);
CString strDay = strTemp.Mid(9, 2);
int iDay = _ttoi(strDay);
CString strHour = strTemp.Mid(12, 2);
int iHour = _ttoi(strHour);
CString strMinute = strTemp.Mid(15, 2);
int iMinute = _ttoi(strMinute);
CString strSecond = strTemp.Mid(18, 2);
int iSecond = _ttoi(strSecond);
strCount = strTemp.Left(strTemp.GetLength() - (1));
int iPoint2 = strCount.ReverseFind('[');
strCount = strCount.Right(strCount.GetLength() - (iPoint2 + 1));
int iCount = _ttoi(strCount);
AppendDateTimePoint(iYear, iMonth, iDay, iHour, iMinute, iSecond, iCount);
}
}
else
{
SetRange(true, 0, imaxValue, 1);
CString xunits;
m_graphCCU.Init();
xunits.Format(_T("%04d-%02d-%02d"), systime.wYear, systime.wMonth, systime.wDay);
MessageBox(_T("Not Found File"), xunits, MB_OK);
}
CString xunits;
xunits.Format(_T("%04d-%02d-%02d User(%06d/%06d)"), systime.wYear, systime.wMonth, systime.wDay, iMaxCount, iMaxCount);
m_graphCCU.SetXUnits(xunits);
ifile.close(); // 파일 닫기
}
void CGraphDlg::AppendDateTimePoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int nPoint)
{
m_points.push_back(nPoint); // 11860(200 * 593) max
if(nPoint > m_PCCU)
{
m_PCCU = nPoint;
RefreshTitle();
}
int term = GetTerm(m_terms);
int divide = m_points.size() % term;
if(divide == 0)
{
m_graphCCU.AppendDateTimePoint(iYear, iMonth, iDay, iHour, iMinute, iSecond, m_bCountryCode, nPoint);
}
}
void CGraphDlg::ComboBoxSetting(int iYear, int iMonth, int iDay)
{
m_CbbYear.SendMessage(CB_SETCURSEL,iYear - 2018, 0);
m_CBBMONTH.SendMessage(CB_SETCURSEL,iMonth - 1, 0);
m_CBBDAY.SendMessage(CB_SETCURSEL,iDay - 1, 0);
}
+91
View File
@@ -0,0 +1,91 @@
#pragma once
#include "OScopeCtrl.h"
#include "OScopeTimeCtrl.h"
#include <vector>
#include "afxwin.h"
#include "afxcmn.h"
enum GraphTerms
{
GRAPH_TERM_3SEC = 1,
GRAPH_TERM_1MIN,
GRAPH_TERM_10MIN,
GRAPH_TERM_END
};
// CGraphDlg 대화 상자입니다.
class CGraphDlg : public CDialogEx
{
DECLARE_DYNAMIC(CGraphDlg)
public:
CGraphDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CGraphDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_GRAPH_DIALOG };
public:
void Startup(CString title);
void CreateMenu();
void RefreshTitle();
void InitDate();
void SetRange(bool b, double dLower, double dUpper, int nDecimalPlaces=1);
void AppendPoint(bool bCCU, int nPoint);
void SetXUnits(CString string);
double GetPCCU() { return m_PCCU; }
CString GetTitle() { return m_title; }
int GetTerm() { return m_terms; }
public:
void Rearrange(const GraphTerms terms);
void SetCountryCode(bool bCCU) { m_bCountryCode = bCCU; };
void AppendCCUPoint(double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC );
void AppendDateTimePoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, int nPoint);
void ComboBoxSetting(int iYear, int iMonth, int iDay);
protected:
void CreateGraph();
void ShowGraph(MSG* pMsg);
void HideGraph(MSG* pMsg);
void ProgressTime(MSG* pMsg);
int GetTerm(const GraphTerms terms);
void GraphSetting(const SYSTEMTIME systime);
protected:
typedef std::vector<int> POINTS;
POINTS m_points;
// COScopeCtrl m_graphCCU;
COScopeTimeCtrl m_graphCCU;
CString m_title;
double m_PCCU;
GraphTerms m_terms;
CMenu m_menu;
BOOL m_bChangeGraph;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
private:
bool m_bCountryCode;
public:
afx_msg void OnBnClickedToday();
afx_msg void OnBnClickedYesterday();
CComboBox m_CbbYear;
CComboBox m_CBBDAY;
CComboBox m_CBBMONTH;
afx_msg void OnBnClickedSerach();
afx_msg void OnBnClicked1weekAgo();
};
+131
View File
@@ -0,0 +1,131 @@
#include "StdAfx.h"
#include "Network/cryption.h"
#include "IOSecurity.h"
CIOSecurity::CIOSecurity(void)
{
Init();
}
CIOSecurity::~CIOSecurity(void)
{
Destroy();
}
void CIOSecurity::Init()
{
InitState();
}
void CIOSecurity::Destroy()
{
}
void CIOSecurity::InitState()
{
m_SndState.InitState();
m_RcvState.InitState();
}
// Packet CheckSum
void CIOSecurity::EncryptMsg(CPacket &rkPacket)
{
// Check Sum
DWORD dwResult = MakeDigest((BYTE*)rkPacket.GetBuffer(), rkPacket.GetBufferSize());
rkPacket.SetCheckSum( dwResult );
// Encryption
BYTE *pSrc;
pSrc = (BYTE*)rkPacket.GetBuffer() + PK_CKSUM_ADDR;
Encrypt( pSrc, rkPacket.GetBufferSize() - PK_CKSUM_ADDR );
}
void CIOSecurity::DecryptMsg( CPacket &rkPacket )
{
// Decryption
BYTE *pSrc;
pSrc = (BYTE*)rkPacket.GetBuffer() + PK_CKSUM_ADDR;
Decrypt( pSrc, rkPacket.GetBufferSize() - PK_CKSUM_ADDR );
}
bool CIOSecurity::IsCheckSum( CPacket &rkPacket )
{
DecryptMsg( rkPacket );
DWORD dwTemp = rkPacket.GetCheckSum(); //Àӽà ÀúÀå.
rkPacket.SetCheckSum( 0 );
DWORD dwResult = MakeDigest( (BYTE*)rkPacket.GetBuffer(), rkPacket.GetBufferSize() );
rkPacket.SetCheckSum( dwTemp );
return (dwResult == rkPacket.GetCheckSum());
}
// Packet Replay
int CIOSecurity::GetSndState()
{
return m_SndState.GetState();
}
void CIOSecurity::UpdateSndState()
{
m_SndState.UpdateState();
}
int CIOSecurity::GetRcvState()
{
return m_RcvState.GetState();
}
void CIOSecurity::UpdateRcvState()
{
m_RcvState.UpdateState();
}
bool CIOSecurity::CheckState( CPacket &rkPacket )
{
if( GetRcvState() == MAGIC_TOKEN_FSM )
{
m_RcvState.SetState( rkPacket.GetState() );
m_SndState.SetState( rkPacket.GetState() );
UpdateSndState();
}
else
{
if( GetRcvState() != rkPacket.GetState() )
return false;
}
UpdateRcvState();
return true;
}
bool CIOSecurity::CheckNS( CPacket &rkPacket )
{
if( !IsCheckSum( rkPacket ) )
{
return false;
}
if( !CheckState( rkPacket ) )
{
return false;
}
return true;
}
void CIOSecurity::PrepareMsg( CPacket &rkPacket )
{
rkPacket.SetState( GetSndState() );
EncryptMsg( rkPacket );
UpdateSndState();
}
void CIOSecurity::CompletionMsg( CPacket &rkPacket )
{
}
+41
View File
@@ -0,0 +1,41 @@
#pragma once
#include "Network/Packet.h"
#include "Network/FSM.h"
class CIOSecurity
{
public:
CIOSecurity(void);
~CIOSecurity(void);
void Init();
void Destroy();
public:
void InitState();
protected:
void EncryptMsg( CPacket &rkPacket );
void DecryptMsg( CPacket &rkPacket );
public:
virtual bool IsCheckSum( CPacket &rkPacket );
public:
virtual int GetSndState();
virtual void UpdateSndState();
virtual int GetRcvState();
virtual void UpdateRcvState();
virtual bool CheckState( CPacket &rkPacket );
virtual bool CheckNS( CPacket &rkPacket );
public:
virtual void PrepareMsg( CPacket &rkPacket );
virtual void CompletionMsg( CPacket &rkPacket );
protected:
FSM m_SndState;
FSM m_RcvState;
};
+202
View File
@@ -0,0 +1,202 @@
#include "StdAfx.h"
#include "resource.h"
#include "ZoneDialog.h"
#include "WinMessage.h"
#include "IOSocket.h"
CIOSocket::CIOSocket(void) : m_connected(FALSE), m_dlg(NULL), m_bytesSent(0), m_bytesBufferSize(0), m_bytesReceived(0)
{
Init();
}
CIOSocket::~CIOSocket(void)
{
Destroy();
}
void CIOSocket::Init()
{
ZeroMemory(m_sendBuffer, sizeof(m_sendBuffer));
m_billingKeyIndex = -1;
}
void CIOSocket::Destroy()
{
}
BOOL CIOSocket::Create()
{
InitState();
if(CAsyncSocket::Create())
{
BOOL flag = 1;
SetSockOpt(TCP_NODELAY, &flag, sizeof(flag), IPPROTO_TCP);
return TRUE;
}
return FALSE;
}
BOOL CIOSocket::Connect(const ServerTypes serverType, CZoneDialog* dlg, const char* IP, const int port)
{
SetType(serverType);
SetDlg(dlg);
return CAsyncSocket::Connect(IP, port);
}
BOOL CIOSocket::BillingServerConnect(const ServerTypes serverType, CZoneDialog* dlg, const char* IP, const int port, const int billingkeyIndex)
{
SetType(serverType);
SetDlg(dlg);
SetBillingIndex(billingkeyIndex);
return CAsyncSocket::Connect(IP, port);
}
void CIOSocket::Disconnect()
{
CAsyncSocket::Close();
}
void CIOSocket::SendPacket(CPacket &rkPacket)
{
if(IsConnected())
{
PrepareMsg( rkPacket );
m_bytesBufferSize = rkPacket.GetBufferSize();
CopyMemory(m_sendBuffer, rkPacket.GetBuffer(), m_bytesBufferSize);
int sentBytes = CAsyncSocket::Send(rkPacket.GetBuffer(), rkPacket.GetBufferSize());
if(sentBytes > 0)
{
if(sentBytes != rkPacket.GetBufferSize())
{
TRACE(_T("Send loop : %d\r\n"), sentBytes);
}
}
else
{
DWORD error = GetLastError();
TRACE(_T("Send failed : %lu\r\n"), error);
}
CompletionMsg( rkPacket );
}
}
void CIOSocket::OnConnect(int nErrorCode)
{
if(0 == nErrorCode)
{
SetConnected(TRUE);
BOOL flag = 1;
SetSockOpt(TCP_NODELAY, &flag, sizeof(flag), IPPROTO_TCP);
}
else
{
SetConnected(FALSE);
}
GetDlg()->OnConnect(GetType(), nErrorCode, GetBillingIndex());
}
void CIOSocket::OnClose(int nErrorCode)
{
SetConnected(FALSE);
GetDlg()->OnClose(GetType(), nErrorCode, GetBillingIndex());
}
void CIOSocket::OnReceive(int nErrorCode)
{
TCHAR buffer[1024 * 16];
int readBytes = Receive(buffer, _countof(buffer));
switch (readBytes)
{
case 0:
{
Close();
}
break;
case SOCKET_ERROR:
{
if (GetLastError() != WSAEWOULDBLOCK)
{
Close();
}
}
break;
default:
{
// 저장된 버퍼에 복사
CopyMemory(m_recvBuffer + m_bytesReceived, buffer, readBytes);
m_bytesReceived += readBytes;
while(m_bytesReceived > 0)
{
CPacket kPacket((char*)m_recvBuffer, m_bytesReceived);
if( kPacket.IsValidPacket() && m_bytesReceived >= kPacket.GetBufferSize() )
{
if(CheckNS( kPacket))
{
GetDlg()->OnReceive(GetType(), (SP2Packet&)kPacket); //타입이랑, 패킷을 PostMessage로 보내도록 수정해야함
TRACE("right recv byte : %lu, packet size %lu\n", m_bytesReceived, kPacket.GetBufferSize());
m_bytesReceived -= kPacket.GetBufferSize();
CopyMemory(m_recvBuffer, m_recvBuffer+kPacket.GetBufferSize(), m_bytesReceived);
}
else
{
break;
}
}
else
{
// 패킷이 적게 들어옴
TRACE("less recv byte : %lu, packet size %lu\n", m_bytesReceived, kPacket.GetBufferSize());
break;
}
}
}
break;
}
}
void CIOSocket::OnSend(int nErrorCode)
{
TRACE(_T("OnSend : %d\r\n"), nErrorCode);
//while (m_bytesSent < m_bytesBufferSize)
//{
// int sentBytes = Send(m_sendBuffer + m_bytesSent, m_bytesBufferSize - m_bytesSent);
// if(sentBytes == SOCKET_ERROR)
// {
// if (GetLastError() == WSAEWOULDBLOCK)
// {
// break;
// }
// else
// {
// Close();
// }
// }
// else
// {
// m_bytesSent += sentBytes;
// }
//}
//
//if (m_bytesSent == m_bytesBufferSize)
//{
// m_bytesSent = 0;
// m_bytesBufferSize = 0;
// ZeroMemory(m_sendBuffer, sizeof(m_sendBuffer));
//}
}
+57
View File
@@ -0,0 +1,57 @@
#pragma once
#include "IOSecurity.h"
#include "ServerTypes.h"
#include "Network/Packet.h"
class CZoneDialog;
class CIOSocket : public CAsyncSocket, public CIOSecurity
{
public:
CIOSocket(void);
~CIOSocket(void);
void Init();
void Destroy();
public:
BOOL Create();
BOOL Connect(const ServerTypes serverType, CZoneDialog* dlg, const char* IP, const int port);
BOOL BillingServerConnect(const ServerTypes serverType, CZoneDialog* dlg, const char* IP, const int port, const int billingIndex);
void Disconnect();
void SendPacket(CPacket &rkPacket);
protected:
void SetType(const ServerTypes type) { m_serverType = type; }
void SetConnected(const BOOL b) { m_connected = b; }
void SetDlg(CZoneDialog* dlg) { m_dlg = dlg; }
void SetBillingIndex(const int billingkeyIndex) { m_billingKeyIndex = billingkeyIndex; }
ServerTypes GetType() { return m_serverType; }
BOOL IsConnected() { return m_connected; }
CZoneDialog* GetDlg() { return m_dlg; }
int GetBillingIndex() { return m_billingKeyIndex; }
public:
virtual void OnConnect(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
protected:
ServerTypes m_serverType;
CZoneDialog* m_dlg;
int m_billingKeyIndex;
BOOL m_connected;
BYTE m_sendBuffer[1024 * 16];
BYTE m_recvBuffer[1024 * 16];
int m_bytesSent;
int m_bytesBufferSize;
int m_bytesReceived;
};
@@ -0,0 +1,26 @@
#ifndef _FSM_h_
#define _FSM_h_
#define MAGIC_TOKEN_FSM -1
class FSM
{
protected:
int m_iState;
public:
void InitState();
void UpdateState();
public:
bool IsFirst();
int GetState();
void SetState(int iState);
public:
FSM();
};
#endif
@@ -0,0 +1,8 @@
#ifndef _cryption_h_
#define _cryption_h_
void Encrypt(BYTE *szSrc, int len);
void Decrypt(BYTE *szSrc, int len);
#endif
@@ -0,0 +1,22 @@
#ifndef _MD5_H
#define _MD5_H
typedef struct tagMD5Context
{
DWORD buf[4];
DWORD bits[2];
unsigned char in[64];
}MD5Context;
void MD5Init( MD5Context *context );
void MD5Update( MD5Context *context, unsigned char const *buf,
unsigned len );
void MD5Final( unsigned char digest[16], MD5Context *context );
void MD5Transform( DWORD buf[4], DWORD const in[16] );
/*
* This is needed to make RSAREF happy on some MS-DOS compilers.
*/
#endif /* !MD5_H */
@@ -0,0 +1,61 @@
#ifndef _CCLINETOBJECT_H_
#define _CCLINETOBJECT_H_
// 서버에서 클라이언트를 관리할때 사용하는 클래스들이 상속해야하는 클래스
// GameServer의 UserNode, 로그인서버의 UserObject, GameServerObject들이 이범주에 속한다.
#define MAX_MSG_COUNT_ONE_SEC 15
class __EX CClientObject
{
public:
void New(SOCKET csocket,DWORD msg_one_sec_count = MAX_MSG_COUNT_ONE_SEC);
void Delete();
protected:
bool m_bExist;
SOCKET m_socket;
SendBuffer m_SendBuffer;
RecvBuffer m_RecvBuffer;
FSM m_sndState;
FSM m_rcvState;
DWORD m_dwTimeCountZero;
DWORD m_dwRcvMsgCount;
DWORD m_max_one_sec_msg_count;
int m_iCurMagicNum;
public:
bool IsExist(){ return m_bExist; }
bool IsValid();
SOCKET GetSocket() const { return m_socket; }
SendBuffer* GetSendBuffer() { return &m_SendBuffer; }
RecvBuffer* GetRecvBuffer() { return &m_RecvBuffer; }
public:
void InitState();
int GetSndServerState();
int GetRcvServerState();
void SetSndServerState(int iState);
void SetRcvServerState(int iState);
void UpdateSndServerState();
void UpdateRcvServerState();
public:
DWORD GetRcvMsgCount();
bool UpdateMsgCount();
public:
inline void AddMagicNum() { m_iCurMagicNum++; }
inline int GetMagicNum() const { return m_iCurMagicNum; }
inline void ClearMagicNum() { m_iCurMagicNum = 0; }
public:
CClientObject();
CClientObject(SOCKET csocket);
virtual ~CClientObject();
};
#endif
@@ -0,0 +1,28 @@
#ifndef _RECVBUFFER_H_
#define _RECVBUFFER_H_
#include "CGenericMessage.h"
class __EX RecvBuffer
{
private:
CGenericRcvMsg m_RcvMsg;
int m_curRcvSize;
int m_curTotalSize;
public:
void InitBuffer();
bool IsAllRecvMsg();
void UpdateRecvData(int curRcvSize);
public:
LPSTR GetBufferPtr(){ return (LPSTR)((char*)&m_RcvMsg + m_curRcvSize); }
int GetCurBufferSize();
int GetCurTotalSize(){ return m_curTotalSize; }
public:
CGenericRcvMsg* GetRcvMsgPtr(){ return &m_RcvMsg; }
};
#endif
@@ -0,0 +1,42 @@
#ifndef _SENDBUFFER_H_
#define _SENDBUFFER_H_
#define MAX_BUFF_SIZE 16384
#define MAX_TEMP_BUFF 16384
//HARDCODE : MAX_TEMP_BUFF 는 Recv와 비슷한 이유에서 필요함
// WSASend시에 m_pStart부터 보내게 되는데 m_pStart가 마지막쪽에 있는경우
// 앞쪽데이터를 이쪽으로 끌고와서 직선형태의 버퍼로 만들어주어야 하기때문임
class __EX SendBuffer
{
private:
char m_pBuffer[MAX_BUFF_SIZE + MAX_TEMP_BUFF];
char *m_pStart;
char *m_pEnd;
int m_iRestCnt;
bool m_bBlock;
public:
void InitBuffer();
void ClearBuffer();
public:
bool EnqueueData(char *pData, int iPacketSize); // return : Can Now Send ?
int DequeueData(int iTransfered);
public:
int GetRestCnt();
char* GetQueuePtr() { return m_pStart; }
public:
void SetBlock(bool bBlock){ m_bBlock = bBlock; }
bool IsBlocked(){ return m_bBlock; }
public:
SendBuffer();
virtual ~SendBuffer();
};
#endif
@@ -0,0 +1,57 @@
// CClientTCPSocket.h
//
#if !defined(CClientTCPSocket_h)
#define CClientTCPSocket_h
#include "RecvBuffer.h"
#include "SendBuffer.h"
class __EX CClientTCPSocket : public CGenericSocket
{
public:
bool InitClientTCP(HWND ishwnd, UINT imsg, char *iip, int iport);
void CloseClientTCP();
public:
bool EvaluateSocket(WPARAM wParam, LPARAM lParam);
virtual bool SendLoop(char* snd, int snd_size);
int BufferSendLoop();
virtual bool ReceiveLoop(SOCKET rsocket);
virtual bool ReceiveProcess(SOCKET csocket);
bool CheckValidMsg( CGenericRcvMsg *pGeneric );
public:
virtual void ConnectProcess() = 0;
virtual void DisconnectProcess() = 0;
virtual void ProcessRcvMsg(CGenericRcvMsg *pGeneric) = 0;
public:
bool IsConnect(){return m_is_connect;};
SOCKET GetSocket(){return m_socket_object; };
public:
void InitClientState();
void SetSndClientState(int iState);
void SetRcvClientState(int iState);
int GetSndClientState();
int GetRcvClientState();
void UpdateSndClientState();
void UpdateRcvClientState();
public:
CClientTCPSocket();
virtual ~CClientTCPSocket();
protected:
bool m_is_connect;
RecvBuffer m_RecvBuffer;
SendBuffer m_SendBuffer;
FSM m_sndState;
FSM m_rcvState;
};
#endif /* CClientTCPSocket_h */
@@ -0,0 +1,48 @@
// CGenericMessage.h
//
#if !defined(CGenericMessage_h)
#define CGenericMessage_h
#define ERROR_CHECK_CODE 0x2B1C
#define MAX_SOCKET_BUFFER 16384
class __EX CGenericMessage
{
protected:
int m_message_size;
DWORD m_dwType;
DWORD m_error_check;
DWORD m_check_sum;
int m_iState;
public:
void EncryptMsg();
bool CheckError();
bool CheckCheckSum();
protected:
DWORD MakeDigest();
public:
void SetState(int iState);
void SetBasicHeader(int isize, DWORD itype);
public:
DWORD GetType();
DWORD GetSize();
int GetState();
public:
CGenericMessage();
};
class __EX CGenericRcvMsg : public CGenericMessage
{
public:
char m_message[MAX_SOCKET_BUFFER];
};
#endif /* CGenericMessage_h */
@@ -0,0 +1,24 @@
// CGenericSocket.h
//
#if !defined(CGenericSocket_h)
#define CGenericSocket_h
#define MAX_SOCKET_DELAY_COUNT 10
#include <winsock.h>
class __EX CGenericSocket
{
public:
bool InitSocket();
void CloseSocket();
int CheckSocketError(LPSTR filename, int linenum);
protected:
SOCKET m_socket_object;
HWND m_socket_hwnd;
UINT m_wnd_message;
};
#endif /* CGenericSocket_h */
@@ -0,0 +1,48 @@
#ifndef _CSERVERTCPSOCKET_H_
#define _CSERVERTCPSOCKET_H_
#include "CGenericSocket.h"
class RecvBuffer;
class CClientObject;
class CGenericRcvMsg;
#define SEM_NOT_VALID_MSG 1001
#define SEM_TOO_MANY_MSG_ONE_SEC 1002
#define MAX_BYPASS_MAGIC_TOKEN 5
class __EX CServerTCPSocket : public CGenericSocket
{
protected:
bool m_bServerClientSocket;
public:
inline void SetServerClientSocket( bool bClient ) { m_bServerClientSocket = bClient; }
inline bool IsServerClientSocket() const { return m_bServerClientSocket; }
public:
bool InitServerTCP (HWND ishwnd, UINT imsg, int iport);
void CloseServerTCP();
public:
bool EvaluateSocket(WPARAM wParam, LPARAM lParam);
bool SendLoop(CClientObject &client_object, char* snd, int snd_size);
bool BufferSendLoop(CClientObject &client_object);
bool ReceiveProcess(SOCKET csocket);
int ReceiveLoop(SOCKET rsocket, RecvBuffer *pBuffer); // return value > 0 : ¸Þ½ÃÁö »çÀÌÁî '=0' grace close, '-1'¿¡·¯, '-2'ºí·°
bool CheckValidMsg( CClientObject *pObject, CGenericRcvMsg *pGeneric );
public:
virtual CClientObject* FindClientObject(SOCKET csocket) = 0;
virtual void ClientAcceptProcess(SOCKET csocket, LPCTSTR cip) = 0;
virtual void ClientDisconnectProcess(SOCKET csocket) = 0;
virtual void ProcessRcvMsg(SOCKET csocket, CGenericRcvMsg *pGeneric) = 0;
virtual void SocketErrorMsg( SOCKET csocket, int iErrorType ) = 0;
public:
CServerTCPSocket();
virtual ~CServerTCPSocket();
};
#endif /* CServerTCPSocket_h */
@@ -0,0 +1,47 @@
// CUDPSocket.h
//
#if !defined(CUDPSocket_h)
#define CUDPSocket_h
#define SEM_UDP_NOT_VALID_MSG 1001
#define SEM_UDP_STATE_SAME 1002
class __EX CUDPSocket : public CGenericSocket
{
public:
bool InitUDP(HWND ishwnd, UINT imsg, int iport);
void CloseUDP();
bool SendLoop(char* ip, int port, char* snd, int snd_size);
bool ReceiveLoop(SOCKET rsocket, CGenericRcvMsg & Generic);
void GetRecentIPPort(char *ip, int & port);
char* GetMyIP();
public:
bool CheckValidMsg(CGenericRcvMsg *pGeneric);
virtual void SocketErrorMsg(int iType);
protected:
void InitState();
bool SetSndStateIfFirst();
void SetRcvState(int iState);
int GetRcvState();
int GetSndState();
void UpdateSndState();
public:
CUDPSocket();
virtual ~CUDPSocket();
protected:
char m_recent_rcv_ip[16];
int m_recent_rcv_port;
int m_main_port;
char m_pre_recent_rcv_ip[16];
int m_pre_recent_rcv_port;
FSM m_rcvState;
FSM m_sndState;
};
#endif /* CUDPSocket_h */
@@ -0,0 +1,60 @@
/********************************************************************
created: 2003/01/22
created: 22:1:2003 10:40
filename: e:\¡á now\workingdll\iosocketdll\iosocket\iosocketdll.h
file path: e:\¡á now\workingdll\iosocketdll\iosocket
file base: iosocketdll
file ext: h
author: ±èÀÎÁß
purpose:
history:
2003/01/22 Edit IOSocketDLL after Generalizing LogDLL.
*********************************************************************/
#ifndef __IOSOCKETDLL_H__
#define __IOSOCKETDLL_H__
#ifndef __DLL_INFO__
#define __DLL_INFO__
#define WIN32_LEAN_AND_MEAN
//#define __WORK__
//#define __MK_DLL__
#ifdef __WORK__
#define __EX
#else
#ifdef __MK_DLL__
#define __EX __declspec(dllexport)
#else
#define __EX __declspec(dllimport)
#endif
#endif
#endif
#include <stdio.h>
#include <windows.h>
#include "IncludeDLL/LogDLL.h"
#pragma comment(lib, "ws2_32.lib")
#ifdef _DEBUG
#pragma comment(lib, "IncludeDLL/LogDDLL.lib")
#else
#pragma comment(lib, "IncludeDLL/LogDLL.lib")
#endif
#pragma warning(disable:4251)
#include "Encrypt/FSM.h"
#include "IOSocket/cgenericsocket.h"
#include "IOSocket/cgenericmessage.h"
#include "IOSocket/RecvBuffer.h"
#include "IOSocket/SendBuffer.h"
#include "IOSocket/cclienttcpsocket.h"
#include "IOSocket/cservertcpsocket.h"
#include "IOSocket/cudpsocket.h"
#include "IOSocket/CClientObject.h"
#endif
@@ -0,0 +1,75 @@
/********************************************************************
created: 2003/01/22
created: 22:1:2003 10:12
filename: e:\■ now\workingdll\logdll\logdll.h
file path: e:\■ now\workingdll\logdll
file base: logdll
file ext: h
author: 김인중
purpose:
history:
2003.1.23 replace wsprintf by sprintf.
2003.1.22 add ASSERT processing
2003.1.22 add log function, CLog:DebugLOG, DebugMBox
for debug infomation (__FILE__, __LINE__)
2003.1.22 edit DEBUGLOG, DEBUGBOX definition for using this function
2003.2.27 add debug level
*********************************************************************/
#ifndef ___LOG_H__
#define ___LOG_H__
#define WIN32_LEAN_AND_MEAN
//#define __EX __declspec(dllexport)
//#define __EX __declspec(dllimport)
#define __IM __declspec(dllimport)
#include <stdio.h>
#include <windows.h>
#include <direct.h>
#include <assert.h>
#include <conio.h>
/**************** Debuging시 사용 ******************
LOG.DebugLog(__FILE__,__LINE__,
DebugMBox(__FILE__,__LINE__,NULL,
****************************************************/
// assert는 Resize class 적용하면서 충돌이 발생하여 주석 처리함.
//#ifdef ASSERT
//#undef ASSERT
//#endif
//#define ASSERT(f) {if(!(f)) {LOG.DebugLog(0, __FILE__,__LINE__,"ASSERT Fail,return"); assert(f);return;}}
//#define ASSERT_minusone(f) {if(!(f)) {LOG.DebugLog(0, __FILE__,__LINE__,"ASSERT Fail,return -1"); assert(f);return -1;}}
//#define ASSERT_false(f) {if(!(f)) {LOG.DebugLog(0, __FILE__,__LINE__,"ASSERT Fail,return false"); assert(f);return false;}}
class __IM CLog
{
public:
char m_file_name[255];
int m_debug_level;
CRITICAL_SECTION m_critical_section;
void OpenLog(int debuglv, char* fName, bool is_append = false); // debug lv : 0 Release version, 0302(3월2일) private debug version
void CloseLog();
void PrintNoEnterLog(int debuglv, LPSTR fmt,...);
void PrintLog(int debuglv, LPSTR fmt,...);
void PrintTimeAndLog(int debuglv, LPSTR fmt,...);
void DebugLog(int debuglv, LPSTR filename, int linenum, LPSTR fmt,...);
void WriteReadyFolderAndFiles(char *fName);
void PrintConsoleLog(int debuglv,LPSTR fmt,...);
void CloseAndRelease();
CLog();
virtual ~CLog();
protected:
FILE* m_pFile;
};
extern __IM CLog LOG;
__IM void MBox(HWND thwnd, LPSTR title, LPSTR szStr,...);
__IM void DebugMBox(LPSTR filename, int linenum, HWND thwnd, LPSTR szStr,...);
#endif
+296
View File
@@ -0,0 +1,296 @@
// ItemDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "ItemDlg.h"
#include "afxdialogex.h"
// CItemDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CItemDlg, CDialogEx)
CItemDlg::CItemDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CItemDlg::IDD, pParent), m_parent(NULL), m_namePropertyRadio(0)
{
m_namePropertyRadio = MONITER_INSERT_ITEM_PUBLIC_ID;
}
CItemDlg::~CItemDlg()
{
}
void CItemDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_OPITEM, m_itemList);
DDX_Control(pDX, IDC_LIST_OPUSERID, m_userList);
DDX_Control(pDX, IDC_EDIT_ITEMUSERID, m_editUserID);
DDX_Control(pDX, IDC_EDIT_ITEMCODE, m_editItemCode);
DDX_Control(pDX, IDC_CHECK_SEAL, m_seal);
DDX_Radio(pDX, IDC_RADIO_NAME_PUBLIC, m_namePropertyRadio);
}
BEGIN_MESSAGE_MAP(CItemDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_ITEMINSERT, &CItemDlg::OnBnClickedButtonItemInsert)
ON_BN_CLICKED(IDC_BUTTON_ITEMRESET, &CItemDlg::OnBnClickedButtonItemReset)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_OPUSERID, &CItemDlg::OnLvnItemchangedListOpuserid)
ON_BN_CLICKED(IDC_STATIC_ISPUBLIC, &CItemDlg::OnBnClickedStaticIspublic)
ON_CONTROL_RANGE(BN_CLICKED, IDC_RADIO_NAME_PUBLIC, IDC_RADIO_NAME_PRIVATE, &CItemDlg::OnNamePropertyRadioCtrl)
END_MESSAGE_MAP()
// CItemDlg 메시지 처리기입니다.
BOOL CItemDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
InitList();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CItemDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CItemDlg::InitList()
{
m_userList.DeleteAllItems();
m_userList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_userList.InsertColumn(0, _T("ID"), LVCFMT_LEFT, 120);
m_itemList.DeleteAllItems();
m_itemList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_itemList.InsertColumn(0, _T("PresentType"), LVCFMT_LEFT, 75);
m_itemList.InsertColumn(1, _T("Value1"), LVCFMT_LEFT, 100);
m_itemList.InsertColumn(2, _T("Value2"), LVCFMT_LEFT, 100);
}
void CItemDlg::OnBnClickedButtonItemInsert()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
int seal = m_seal.GetCheck();
CString userId, presentType, value1, value2;
for(int i = 0 ; i < m_userList.GetItemCount() ; i++)
{
userId = m_userList.GetItemText(i, 0);
for(int j = 0 ; j < m_itemList.GetItemCount() ; j++)
{
presentType = m_itemList.GetItemText(j, 0);
value1 = m_itemList.GetItemText(j, 1);
value2 = m_itemList.GetItemText(j, 2);
// 아이템 추가
if(seal == 0)
{
ReqeustItemInsert(userId, atoi(presentType), atoi(value1), atoi(value2), 1, m_namePropertyRadio);
}
else
{
ReqeustItemInsert(userId, atoi(presentType), atoi(value1), atoi(value2), 40, m_namePropertyRadio);
}
Sleep(10);
}
}
MessageBox(_T("Completed"), _T("ITEM"), MB_OK);
}
void CItemDlg::InsertUserID(CString userId)
{
if(userId.GetLength() == 0) return;
m_userList.InsertItem(m_userList.GetItemCount(), userId);
}
void CItemDlg::InsertItemCode(CString itemCode)
{
if(itemCode.GetLength() == 0) return;
int index = 0;
CString presentType, value1, value2;
presentType = itemCode.Tokenize(_T("."), index);
if(presentType.IsEmpty()) return;
value1 = itemCode.Tokenize(_T("."), index);
if(value1.IsEmpty()) return;
value2 = itemCode.Tokenize(_T("."), index);
if(value2.IsEmpty()) return;
int itemCount = m_itemList.GetItemCount();
m_itemList.InsertItem(itemCount, presentType);
m_itemList.SetItemText(itemCount, 1, value1);
m_itemList.SetItemText(itemCount, 2, value2);
}
void CItemDlg::OnDropUserFiles(CString file)
{
m_userList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertUserID(line);
}
}
}
}
void CItemDlg::OnDropItemFiles(CString file)
{
m_itemList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertItemCode(line);
}
}
}
}
void CItemDlg::ReqeustItemInsert(CString userId, int presentType, int value1, int value2, int ment, int isPublicIDState)
{
m_parent->RequestItemInsert(userId, presentType, value1, value2, ment, isPublicIDState);
}
BOOL CItemDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_DROPFILES == pMsg->message)
{
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_itemList.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 );
OnDropItemFiles( file );
}
}
}
else if(WM_KEYDOWN == pMsg->message )
{
if(VK_RETURN == pMsg->wParam)
{
if(m_editUserID.GetSafeHwnd() == pMsg->hwnd)
{
CString userId;
m_editUserID.GetWindowText(userId);
m_editUserID.SetWindowText(_T(""));
InsertUserID(userId);
}
else if(m_editItemCode.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCode;
m_editItemCode.GetWindowText(itemCode);
m_editItemCode.SetWindowText(_T(""));
InsertItemCode(itemCode);
}
return TRUE;
}
else if(VK_DELETE == pMsg->wParam)
{
if(m_userList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_userList.GetSelectedCount();
if(count > 0)
{
DeleteListItem(m_userList);
}
}
else if(m_itemList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_itemList.GetSelectedCount();
if(count > 0)
{
DeleteListItem(m_userList);
}
}
return TRUE;
}
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
void CItemDlg::OnBnClickedButtonItemReset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_itemList.DeleteAllItems();
m_userList.DeleteAllItems();
}
void CItemDlg::OnLvnItemchangedListOpuserid(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
void CItemDlg::DeleteListItem(CListCtrl& m_List)
{
int index = -1;
POSITION pos = m_List.GetFirstSelectedItemPosition();
while(pos)
{
int index = m_List.GetNextSelectedItem(pos);
m_List.DeleteItem(index);
pos = m_List.GetFirstSelectedItemPosition();
}
}
void CItemDlg::OnBnClickedStaticIspublic()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
void CItemDlg::OnNamePropertyRadioCtrl( UINT uintID )
{
(uintID == IDC_RADIO_NAME_PUBLIC) ? m_namePropertyRadio = 1 : m_namePropertyRadio = 2;
m_namePropertyRadio;
int a = 0;
}
+58
View File
@@ -0,0 +1,58 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
class CZoneDialog;
// CItemDlg 대화 상자입니다.
class CItemDlg : public CDialogEx
{
DECLARE_DYNAMIC(CItemDlg)
public:
CItemDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CItemDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_ITEM_DIALOG };
public:
void Startup(CZoneDialog* parent);
protected:
void InitList();
void InsertUserID(CString userId);
void InsertItemCode(CString itemCode);
void OnDropUserFiles(CString file);
void OnDropItemFiles(CString file);
void ReqeustItemInsert(CString userId, int presentType, int value1, int value2, int ment = 1, int isPublicIDState =1);
void DeleteListItem(CListCtrl& m_List);
protected:
CZoneDialog* m_parent;
int m_namePropertyRadio;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_itemList;
CListCtrl m_userList;
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnBnClickedButtonItemInsert();
CEdit m_editUserID;
CEdit m_editItemCode;
afx_msg void OnBnClickedButtonItemReset();
afx_msg void OnLvnItemchangedListOpuserid(NMHDR *pNMHDR, LRESULT *pResult);
CButton m_seal;
afx_msg void OnBnClickedStaticIspublic();
afx_msg void OnNamePropertyRadioCtrl(UINT uintID);
};
+103
View File
@@ -0,0 +1,103 @@
// LS_Monitor.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "LS_MonitorDlg.h"
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CLS_MonitorApp
BEGIN_MESSAGE_MAP(CLS_MonitorApp, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
// CLS_MonitorApp construction
CLS_MonitorApp::CLS_MonitorApp()
{
// support Restart Manager
m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
// TODO: add construction code here,
// Place all significant initialization in InitInstance
m_pMonitorDlg = NULL;
}
// The one and only CLS_MonitorApp object
CLS_MonitorApp theApp;
// CLS_MonitorApp initialization
BOOL CLS_MonitorApp::InitInstance()
{
//char* my_pointer;
//long allocReqNum;
//Leak ·ó
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
//_CrtSetBreakAlloc(1039);
// InitCommonControlsEx() is required on Windows XP if an application
// manifest specifies use of ComCtl32.dll version 6 or later to enable
// visual styles. Otherwise, any window creation will fail.
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
// Set this to include all the common control classes you want to use
// in your application.
InitCtrls.dwICC = ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
CWinApp::InitInstance();
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need
// Change the registry key under which our settings are stored
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
CLS_MonitorDlg dlg(m_lpCmdLine);
m_pMainWnd = &dlg;
m_pMonitorDlg = &dlg;
INT_PTR nResponse = dlg.DoModal();
if (nResponse == IDOK)
{
// TODO: Place code here to handle when the dialog is
// dismissed with OK
}
else if (nResponse == IDCANCEL)
{
// TODO: Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed, return FALSE so that we exit the
// application, rather than start the application's message pump.
return FALSE;
}
+34
View File
@@ -0,0 +1,34 @@
// LS_Monitor.h : main header file for the PROJECT_NAME application
//
#pragma once
#ifndef __AFXWIN_H__
#error "include 'stdafx.h' before including this file for PCH"
#endif
#include "resource.h" // main symbols
// CLS_MonitorApp:
// See LS_Monitor.cpp for the implementation of this class
//
class CLS_MonitorDlg;
class CLS_MonitorApp : public CWinApp
{
public:
CLS_MonitorApp();
// Overrides
public:
virtual BOOL InitInstance();
// Implementation
DECLARE_MESSAGE_MAP()
private:
CLS_MonitorDlg* m_pMonitorDlg;
};
extern CLS_MonitorApp theApp;
Binary file not shown.
@@ -0,0 +1,252 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="SRC_EU|Win32">
<Configuration>SRC_EU</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{3B91E7E1-6306-422A-A2DD-CF3C813FEF29}</ProjectGuid>
<RootNamespace>LS_Monitor</RootNamespace>
<Keyword>MFCProj</Keyword>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>Static</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>Static</UseOfMfc>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SRC_EU|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
<UseOfMfc>Static</UseOfMfc>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='SRC_EU|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>true</LinkIncremental>
<OutDir>D:\LostSaga\Work\Monitoring\MonitoringTool</OutDir>
<TargetName>$(ProjectName)D</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>D:\LostSaga\Work\Monitoring\MonitoringTool</OutDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SRC_EU|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>../../../../build/tool/monitors/</OutDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../../src</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>../../../lib;F:\Work\lostsaga\trunk\programming\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>iocpSocketDDLL.lib</AdditionalDependencies>
<StackReserveSize>50000000</StackReserveSize>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../../src</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>F:\Work\lostsaga\trunk\programming\lib;</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SRC_EU|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>../../src</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalLibraryDirectories>F:\Work\lostsaga\trunk\programming\lib;</AdditionalLibraryDirectories>
</Link>
<Midl>
<MkTypLibCompatible>false</MkTypLibCompatible>
<ValidateAllParameters>true</ValidateAllParameters>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</Midl>
<ResourceCompile>
<Culture>0x0409</Culture>
<PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
<None Include="res\bitmap1.bmp" />
<None Include="res\LS_Monitor.ico" />
<None Include="res\LS_Monitor.rc2" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="AnnounceDlg.h" />
<ClInclude Include="AuthDlg.h" />
<ClInclude Include="BlockDlg.h" />
<ClInclude Include="cFile.h" />
<ClInclude Include="CompensationDlg.h" />
<ClInclude Include="CSDialog.h" />
<ClInclude Include="Define.h" />
<ClInclude Include="DisplayDlg.h" />
<ClInclude Include="EventDlg.h" />
<ClInclude Include="GraphDlg.h" />
<ClInclude Include="IOClientSocket.h" />
<ClInclude Include="ioHashString.h" />
<ClInclude Include="IOSecurity.h" />
<ClInclude Include="IOServerSocket.h" />
<ClInclude Include="IOSocket.h" />
<ClInclude Include="ItemDlg.h" />
<ClInclude Include="LogDlg.h" />
<ClInclude Include="LoginDialog.h" />
<ClInclude Include="LS_Monitor.h" />
<ClInclude Include="LS_MonitorDlg.h" />
<ClInclude Include="MonitorListCtrl.h" />
<ClInclude Include="MonitorTabCtrl.h" />
<ClInclude Include="Network\cryption.h" />
<ClInclude Include="Network\FSM.h" />
<ClInclude Include="Network\md5.h" />
<ClInclude Include="Network\Packet.h" />
<ClInclude Include="Network\Protocol.h" />
<ClInclude Include="Network\SP2Packet.h" />
<ClInclude Include="NoticeDlg.h" />
<ClInclude Include="OperatorDlg.h" />
<ClInclude Include="OScopeCtrl.h" />
<ClInclude Include="OScopeTimeCtrl.h" />
<ClInclude Include="PanelDialog.h" />
<ClInclude Include="ProcessCtrl.h" />
<ClInclude Include="Resource.h" />
<ClInclude Include="SecretShopDlg.h" />
<ClInclude Include="ServerTypes.h" />
<ClInclude Include="stdafx.h" />
<ClInclude Include="targetver.h" />
<ClInclude Include="WinMessage.h" />
<ClInclude Include="ZoneDialog.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="AnnounceDlg.cpp" />
<ClCompile Include="AuthDlg.cpp" />
<ClCompile Include="BlockDlg.cpp" />
<ClCompile Include="cFile.cpp" />
<ClCompile Include="CompensationDlg.cpp" />
<ClCompile Include="CSDialog.cpp" />
<ClCompile Include="DisplayDlg.cpp" />
<ClCompile Include="EventDlg.cpp" />
<ClCompile Include="GraphDlg.cpp" />
<ClCompile Include="IOClientSocket.cpp" />
<ClCompile Include="ioHashString.cpp" />
<ClCompile Include="IOSecurity.cpp" />
<ClCompile Include="IOServerSocket.cpp" />
<ClCompile Include="IOSocket.cpp" />
<ClCompile Include="ItemDlg.cpp" />
<ClCompile Include="LogDlg.cpp" />
<ClCompile Include="LoginDialog.cpp" />
<ClCompile Include="LS_Monitor.cpp" />
<ClCompile Include="LS_MonitorDlg.cpp" />
<ClCompile Include="MonitorListCtrl.cpp" />
<ClCompile Include="MonitorTabCtrl.cpp" />
<ClCompile Include="Network\cryption.cpp" />
<ClCompile Include="Network\FSM.cpp" />
<ClCompile Include="Network\md5.cpp" />
<ClCompile Include="Network\Packet.cpp" />
<ClCompile Include="Network\SP2Packet.cpp" />
<ClCompile Include="NoticeDlg.cpp" />
<ClCompile Include="OperatorDlg.cpp" />
<ClCompile Include="OScopeCtrl.cpp" />
<ClCompile Include="OScopeTimeCtrl.cpp" />
<ClCompile Include="PanelDialog.cpp" />
<ClCompile Include="ProcessCtrl.cpp" />
<ClCompile Include="SecretShopDlg.cpp" />
<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='SRC_EU|Win32'">Create</PrecompiledHeader>
</ClCompile>
<ClCompile Include="ZoneDialog.cpp" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="LS_Monitor.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties RESOURCE_FILE="LS_Monitor.rc" />
</VisualStudio>
</ProjectExtensions>
</Project>
@@ -0,0 +1,278 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="소스 파일">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="헤더 파일">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="리소스 파일">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="UI">
<UniqueIdentifier>{f9bc370a-d6bb-45fb-83e8-160605484571}</UniqueIdentifier>
</Filter>
<Filter Include="UI\Controls">
<UniqueIdentifier>{c9adad6f-55d5-453f-b7e9-acbae7502e9f}</UniqueIdentifier>
</Filter>
<Filter Include="Network">
<UniqueIdentifier>{4a991d3e-380f-4666-a337-3063ccac1e04}</UniqueIdentifier>
</Filter>
<Filter Include="File">
<UniqueIdentifier>{51088833-4b56-458e-97aa-aced7790e676}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
<None Include="res\LS_Monitor.rc2">
<Filter>리소스 파일</Filter>
</None>
<None Include="res\LS_Monitor.ico">
<Filter>리소스 파일</Filter>
</None>
<None Include="res\bitmap1.bmp">
<Filter>리소스 파일</Filter>
</None>
</ItemGroup>
<ItemGroup>
<ClInclude Include="LS_Monitor.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="stdafx.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="targetver.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="Resource.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="MonitorListCtrl.h">
<Filter>UI\Controls</Filter>
</ClInclude>
<ClInclude Include="MonitorTabCtrl.h">
<Filter>UI\Controls</Filter>
</ClInclude>
<ClInclude Include="ZoneDialog.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="LS_MonitorDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="OScopeCtrl.h">
<Filter>UI\Controls</Filter>
</ClInclude>
<ClInclude Include="WinMessage.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="ServerTypes.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="Network\SP2Packet.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="IOSocket.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="ioHashString.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="Define.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="Network\Packet.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="IOSecurity.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="Network\FSM.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="Network\cryption.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="Network\md5.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="DisplayDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="CSDialog.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="LoginDialog.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="PanelDialog.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="ProcessCtrl.h">
<Filter>UI\Controls</Filter>
</ClInclude>
<ClInclude Include="AnnounceDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="GraphDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="Network\Protocol.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="OperatorDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="ItemDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="EventDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="AuthDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="cFile.h">
<Filter>File</Filter>
</ClInclude>
<ClInclude Include="BlockDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="LogDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="NoticeDlg.h">
<Filter>UI</Filter>
</ClInclude>
<ClInclude Include="SecretShopDlg.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="CompensationDlg.h">
<Filter>헤더 파일</Filter>
</ClInclude>
<ClInclude Include="OScopeTimeCtrl.h">
<Filter>UI\Controls</Filter>
</ClInclude>
<ClInclude Include="IOServerSocket.h">
<Filter>Network</Filter>
</ClInclude>
<ClInclude Include="IOClientSocket.h">
<Filter>Network</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="LS_Monitor.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="MonitorListCtrl.cpp">
<Filter>UI\Controls</Filter>
</ClCompile>
<ClCompile Include="MonitorTabCtrl.cpp">
<Filter>UI\Controls</Filter>
</ClCompile>
<ClCompile Include="ZoneDialog.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="LS_MonitorDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="OScopeCtrl.cpp">
<Filter>UI\Controls</Filter>
</ClCompile>
<ClCompile Include="Network\SP2Packet.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="IOSocket.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="ioHashString.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="Network\Packet.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="IOSecurity.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="Network\FSM.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="Network\cryption.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="Network\md5.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="DisplayDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="CSDialog.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="LoginDialog.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="PanelDialog.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="ProcessCtrl.cpp">
<Filter>UI\Controls</Filter>
</ClCompile>
<ClCompile Include="AnnounceDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="GraphDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="OperatorDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="ItemDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="EventDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="AuthDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="cFile.cpp">
<Filter>File</Filter>
</ClCompile>
<ClCompile Include="BlockDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="LogDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="NoticeDlg.cpp">
<Filter>UI</Filter>
</ClCompile>
<ClCompile Include="SecretShopDlg.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="CompensationDlg.cpp">
<Filter>소스 파일</Filter>
</ClCompile>
<ClCompile Include="OScopeTimeCtrl.cpp">
<Filter>UI\Controls</Filter>
</ClCompile>
<ClCompile Include="IOServerSocket.cpp">
<Filter>Network</Filter>
</ClCompile>
<ClCompile Include="IOClientSocket.cpp">
<Filter>Network</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="LS_Monitor.rc">
<Filter>리소스 파일</Filter>
</ResourceCompile>
</ItemGroup>
</Project>
File diff suppressed because it is too large. Load diff
+102
View File
@@ -0,0 +1,102 @@
// LS_MonitorDlg.h : header file
//
#pragma once
#include "afxcmn.h"
#include "MonitorTabCtrl.h"
#include "IOServerSocket.h"
#include "IOClientSocket.h"
#include "Network/SP2Packet.h"
// CLS_MonitorDlg dialog
class CLS_MonitorDlg : public CDialogEx
{
DECLARE_EASYSIZE
// Construction
public:
CLS_MonitorDlg(const TCHAR* parameter, CWnd* pParent = NULL); // standard constructor
// Dialog Data
enum { IDD = IDD_LS_MONITOR_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
public:
CString GetIP() { return m_strIP; }
void UpdateTitle(const int currentUser, const int maxUser);
void OnAccept();
void OnClose(int iClientNumber);
CIOClientSocket* OnFindClient(int iClientNumber);
protected:
BOOL LoadBillingFromINI(const TCHAR* file, CString section, BILLINGSERVERTABLE &tempBillingServerTable);
void LoadINI(const TCHAR* file);
void LoadIP();
void AddTab(TCHAR* name, TCHAR* IP, const int port);
protected:
CString m_strIP;
int m_iPort;
CRect m_clientRect;
CString m_parameter;
CIOServerSocket* m_ServerSocket;
int iClientsocketNumber;
std::map<int, CIOClientSocket*> m_ClientSocketList;
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
CMonitorTabCtrl m_zoneTabs;
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpMMI);
virtual BOOL PreTranslateMessage(MSG* pMsg);
virtual void OnDestroy();
public:
void OnReceive(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnTodayNumConnect(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnSearchNumConnect(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnRequipNumConnect(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnRequestMainServerAdminCommand(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnRequestGameServerCommand(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnServerExit(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnGameServerReloadINI(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnGameServerOption(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnReloadCloseInfo(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnResetEventShop(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnResetOldMissionData(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnWhiteListRequest(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnUpdateClientVersion(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnLSResponse(CIOClientSocket* pkClientSocket, SP2Packet& rkPacket);
void OnLoginServerInfo();
void OnLoginServerInfo(CIOClientSocket* pkClientSocket);
void OnLoginServerDisConnect(SERVERINFO* serverInfo, const ServerStates state);
void OnMainServerDisConnect(SERVERINFO* serverInfo, const ServerStates state);
void OnGameServerDisconnect(ioHashString serverIP, int serverPort);
void OnMainServerAdmin(int ClientNumber, CPacket &rkPacket);
};
+97
View File
@@ -0,0 +1,97 @@
// TotalLogDl.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "LogDlg.h"
#include "afxdialogex.h"
// CLogDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CLogDlg, CDialogEx)
CLogDlg::CLogDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CLogDlg::IDD, pParent)
{
}
CLogDlg::~CLogDlg()
{
}
void CLogDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control( pDX, IDC_LIST_LOG, m_logList );
}
BEGIN_MESSAGE_MAP(CLogDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_LOG_RESET, &CLogDlg::OnBnClickedButtonLogReset)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_LOG, &CLogDlg::OnLvnItemchangedListLog)
END_MESSAGE_MAP()
// CLogDlg 메시지 처리기입니다.
void CLogDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CLogDlg::InitList()
{
m_logList.DeleteAllItems();
m_logList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_logList.InsertColumn(0, _T("Time"), LVCFMT_LEFT, 60);
m_logList.InsertColumn(1, _T("Message"), LVCFMT_LEFT, 375);
}
BOOL CLogDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
InitList();
return TRUE;
}
void CLogDlg::InsertLogText( CString text )
{
if( text.IsEmpty() ) return;
CTime nowTime = CTime::GetCurrentTime();
CString nowTimeText;
nowTimeText.Format( _T(" %02d:%02d:%02d"),
nowTime.GetHour(),
nowTime.GetMinute(),
nowTime.GetSecond() );
int logCount = m_logList.GetItemCount();
m_logList.InsertItem( logCount, nowTimeText );
m_logList.SetItemText( logCount, 1, text );
m_logList.EnsureVisible( m_logList.GetItemCount() - 1, TRUE );
}
void CLogDlg::ResetLogText()
{
m_logList.DeleteAllItems();
}
void CLogDlg::OnBnClickedButtonLogReset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
ResetLogText();
}
void CLogDlg::OnLvnItemchangedListLog(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
+44
View File
@@ -0,0 +1,44 @@
#pragma once
class CZoneDialog;
// CLogDlg 대화 상자입니다.
class CLogDlg : public CDialogEx
{
DECLARE_DYNAMIC(CLogDlg)
public:
CLogDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CLogDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_LOG_DIALOG };
public:
void Startup(CZoneDialog* parent);
protected:
void InitList();
public:
void InsertLogText( CString text );
void ResetLogText();
protected:
CZoneDialog* m_parent;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_logList;
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonLogReset();
afx_msg void OnLvnItemchangedListLog(NMHDR *pNMHDR, LRESULT *pResult);
};
+408
View File
@@ -0,0 +1,408 @@
// LoginDialog.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "PanelDialog.h"
#include "ZoneDialog.h"
#include "LoginDialog.h"
#include "WinMessage.h"
#include "afxdialogex.h"
#include <algorithm>
enum LoginPanelTimerIDs
{
PANEL_NONE = 0,
PANEL_REFRESH,
PANEL_END
};
// CLoginDialog 대화 상자입니다.
IMPLEMENT_DYNAMIC(CLoginDialog, CDialogEx)
CLoginDialog::CLoginDialog(CWnd* pParent /*=NULL*/)
: CDialogEx(CLoginDialog::IDD, pParent), m_maxUser(0), m_CCU(0), m_maxPanel(0), m_matrix(0), m_curHeight(0), m_scrollPos(0), m_panelWidth(0), m_panelHeight(0)
{
}
CLoginDialog::~CLoginDialog()
{
for(int i = 0 ; i < (int)m_panels.size() ; i++)
{
delete m_panels[i];
m_panels[i] = NULL;
}
//m_panels._Destroy()
}
void CLoginDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CLoginDialog, CDialogEx)
ON_WM_VSCROLL()
ON_WM_SIZE()
ON_WM_MOUSEWHEEL()
ON_WM_SHOWWINDOW()
ON_WM_TIMER()
ON_WM_CLOSE()
ON_WM_SIZING()
END_MESSAGE_MAP()
// CLoginDialog 메시지 처리기입니다.
BOOL CLoginDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
GetClientRect(m_window);
m_scrollPos = 0;
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CLoginDialog::Startup(CString title, const int maxUser, const int maxServer, const int matrix, CZoneDialog* parent)
{
m_title = title;
SetWindowText(title);
m_parent = parent;
m_maxUser = maxUser;
m_maxPanel = maxServer;
m_matrix = matrix;
}
void CLoginDialog::AddPanel(int serverId, CString name, CString IP, int port, int blockState)
{
if(FindPanel(serverId))
return;
int count = m_panels.size();
RECT rcPanel;
CPanelDialog * panelDlg = new CPanelDialog;
panelDlg->Create(IDD_PANEL_DIALOG, this);
panelDlg->Startup(serverId, name, IP, port, blockState, m_maxUser);
panelDlg->ShowWindow(SW_SHOW);
panelDlg->GetClientRect(&rcPanel);
GeneratePos(m_matrix, count, rcPanel);
panelDlg->MoveWindow(&rcPanel);
panelDlg->SetWindowPos(&wndTopMost, 0 , 0 , 0 , 0 , SWP_NOMOVE|SWP_NOSIZE);
panelDlg->ShowWindow(SW_SHOW);
m_panels.push_back(panelDlg);
if(m_panels.size() == 1)
{
m_panelWidth = rcPanel.right - rcPanel.left;
m_panelHeight = rcPanel.bottom - rcPanel.top;
AdjustWindow(rcPanel.right - rcPanel.left, rcPanel.bottom - rcPanel.top);
MoveWindow(m_window);
}
}
void CLoginDialog::UpdateBegin()
{
int count = m_panels.size();
for(int i = 0; i < count ; i++)
{
CPanelDialog * panelDlg = m_panels[i];
if(!panelDlg) continue;
panelDlg->UpdateBegin();
}
}
void CLoginDialog::UpdateEnd(int CCU)
{
int count = m_panels.size();
for(int i = 0; i < count ; i++)
{
CPanelDialog * panelDlg = m_panels[i];
if(!panelDlg) continue;
panelDlg->UpdateEnd();
}
UpdateTitle(CCU);
}
void CLoginDialog::UpdatePanel(int index, int currentUser, int sendCount, int serverState)
{
CPanelDialog* panelDlg = FindPanel(index);
if(panelDlg)
{
panelDlg->Update(currentUser, sendCount, serverState);
}
}
void CLoginDialog::UpdateTitle(int maxUser)
{
if(maxUser != m_CCU)
{
m_CCU = maxUser;
CString title;
title.Format(_T("%s(CCU : %d)"), m_title, m_CCU);
SetWindowText(title);
}
}
CPanelDialog* CLoginDialog::FindPanel(const int serverId)
{
int count = m_panels.size();
for(int i = 0; i < count ; i++)
{
CPanelDialog * panelDlg = m_panels[i];
if(!panelDlg) continue;
if(panelDlg->GetServerID() == serverId)
return panelDlg;
}
return NULL;
}
void CLoginDialog::AdjustWindow(int width, int height)
{
int col = m_maxPanel % m_matrix;
int row = (m_maxPanel / m_matrix) + (col ? 1 : 0);
m_window.right = m_window.left + (width * m_matrix) + 30;
m_window.bottom = m_window.top + (height * row) + 30;
}
void CLoginDialog::GeneratePos(const int matrix, const int index, RECT& rcPanel)
{
int width = rcPanel.right - rcPanel.left;
int height = rcPanel.bottom - rcPanel.top;
int row = index / (matrix);
int col = index % (matrix);
rcPanel.left = (col) * width;
rcPanel.right = rcPanel.left + width;
rcPanel.top = (row) * height;
rcPanel.bottom = rcPanel.top + height;
}
void CLoginDialog::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
int delta;
int maxPos = m_window.Height() - m_curHeight;
switch (nSBCode)
{
case SB_LINEDOWN:
if (m_scrollPos >= maxPos)
return;
delta = min(max(maxPos/20,5),maxPos-m_scrollPos);
break;
case SB_LINEUP:
if (m_scrollPos <= 0)
return;
delta = -min(max(maxPos/20,5),m_scrollPos);
break;
case SB_PAGEDOWN:
if (m_scrollPos >= maxPos)
return;
delta = min(max(maxPos/20,5),maxPos-m_scrollPos);
break;
case SB_THUMBPOSITION:
delta = (int)nPos - m_scrollPos;
break;
case SB_THUMBTRACK:
case SB_PAGEUP:
if (m_scrollPos <= 0)
return;
delta = -min(max(maxPos/20,5),m_scrollPos);
break;
default:
return;
}
m_scrollPos += delta;
SetScrollPos(SB_VERT,m_scrollPos,TRUE);
ScrollWindow(0,-delta);
CDialogEx::OnVScroll(nSBCode, nPos, pScrollBar);
}
void CLoginDialog::OnSize(UINT nType, int cx, int cy)
{
CDialogEx::OnSize(nType, cx, cy);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
m_curHeight = cy;
SCROLLINFO si;
si.cbSize = sizeof(SCROLLINFO);
si.fMask = SIF_ALL;
si.nMin = 0;
si.nMax = m_window.Height();
si.nPage = cy;
si.nPos = 0;
SetScrollInfo(SB_VERT, &si, TRUE);
}
BOOL CLoginDialog::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
int maxPos = m_window.Height() - m_curHeight;
if (zDelta<0)
{
if (m_scrollPos < maxPos)
{
zDelta = min(max(maxPos/10,5),maxPos-m_scrollPos);
m_scrollPos += zDelta;
SetScrollPos(SB_VERT,m_scrollPos,TRUE);
ScrollWindow(0,-zDelta);
}
}
else
{
if (m_scrollPos > 0)
{
zDelta = -min(max(maxPos/10,5),m_scrollPos);
m_scrollPos += zDelta;
SetScrollPos(SB_VERT,m_scrollPos,TRUE);
ScrollWindow(0,-zDelta);
}
}
return CDialogEx::OnMouseWheel(nFlags, zDelta, pt);
}
void CLoginDialog::OnShowWindow(BOOL bShow, UINT nStatus)
{
CDialogEx::OnShowWindow(bShow, nStatus);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
for(int i = 0; i < (int)m_panels.size() ; i++)
{
CPanelDialog* dlg = m_panels[i];
dlg->ShowWindow(bShow);
}
CRect tmp;
GetClientRect(&tmp);
OnSizing(2, tmp);
ShowScrollBar(SB_VERT, TRUE);
if(bShow)
{
SetTimer(PANEL_REFRESH, 2900, NULL);
}
else
{
KillTimer(PANEL_REFRESH);
}
}
void CLoginDialog::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
switch(nIDEvent)
{
case PANEL_REFRESH:
{
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINREFRESHPANEL);
}
break;
default:
break;
}
CDialogEx::OnTimer(nIDEvent);
}
void CLoginDialog::OnClose()
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
KillTimer(PANEL_REFRESH);
CDialogEx::OnClose();
}
BOOL CLoginDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
switch(wParam)
{
case IDC_SERVICE_LOGINBLOCK :
{
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINBLOCK, lParam);
}
return TRUE;
case IDC_SERVICE_LOGINUNBLOCK :
{
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINUNBLOCK, lParam);
}
return TRUE;
case IDC_SERVICE_LOGINBLOCKALL :
{
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINBLOCKALL, lParam);
}
return TRUE;
case IDC_SERVICE_LOGINUNBLOCKALL :
{
m_parent->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINUNBLOCKALL, lParam);
}
return TRUE;
default :
break;
}
return CDialogEx::OnCommand(wParam, lParam);
}
void CLoginDialog::OnSizing(UINT fwSide, LPRECT pRect)
{
CDialogEx::OnSizing(fwSide, pRect);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
pRect->right = pRect->left + m_window.Width();
int height = pRect->bottom - pRect->top;
if(height < (m_panelHeight+32))
{
pRect->bottom = pRect->top + m_panelHeight + 32;
}
}
BOOL CLoginDialog::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
+68
View File
@@ -0,0 +1,68 @@
#pragma once
#include <vector>
class CPanelDialog;
class CZoneDialog;
// CLoginDialog 대화 상자입니다.
class CLoginDialog : public CDialogEx
{
DECLARE_DYNAMIC(CLoginDialog)
public:
CLoginDialog(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CLoginDialog();
// 대화 상자 데이터입니다.
enum { IDD = IDD_LOGIN_DIALOG };
public:
void Startup(CString title, const int maxUser, const int maxServer, const int matrix, CZoneDialog* parent);
void AddPanel(int serverId, CString name, CString IP, int port, int blockState);
void UpdateBegin();
void UpdateEnd(int CCU);
void UpdatePanel(int index, int currentUser, int sendCount, int serverState);
void UpdateTitle(int CCU);
protected:
CPanelDialog* FindPanel(const int serverId);
void AdjustWindow(int width, int height);
void GeneratePos(const int matrix, const int index, RECT& rcPanel);
public:
int m_maxUser;
int m_CCU;
int m_maxPanel;
int m_matrix;
int m_curHeight;
int m_scrollPos;
int m_panelWidth, m_panelHeight;
CRect m_window;
typedef std::vector<CPanelDialog*> PANELS;
PANELS m_panels;
CString m_title;
CZoneDialog* m_parent;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual BOOL OnInitDialog();
afx_msg BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt);
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnClose();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
@@ -0,0 +1,443 @@
// MonitorListCtrl.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "WinMessage.h"
#include "ZoneDialog.h"
#include "MonitorListCtrl.h"
IMPLEMENT_DYNAMIC(CMonitorListCtrl, CListCtrl)
CMonitorListCtrl::CMonitorListCtrl()
: m_bCountryCount(false)
{
InitToolTip();
}
CMonitorListCtrl::~CMonitorListCtrl()
{
}
BEGIN_MESSAGE_MAP(CMonitorListCtrl, CListCtrl)
ON_NOTIFY_REFLECT(NM_CLICK, &CMonitorListCtrl::OnNMLClick)
ON_NOTIFY_REFLECT(NM_RCLICK, &CMonitorListCtrl::OnNMRClick)
ON_NOTIFY_REFLECT(NM_DBLCLK, &CMonitorListCtrl::OnNMDblclk)
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDrawList)
ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()
// CMonitorListCtrl 메시지 처리기입니다.
void CMonitorListCtrl::Startup(CZoneDialog* parent, const int index)
{
m_parent = parent;
m_ctrlIndex = index;
}
void CMonitorListCtrl::CreatePopup(const ServerTypes serverType)
{
InitToolTip();
switch(serverType)
{
case SERVER_TYPE_MAIN:
{
m_menu.DestroyMenu();
m_menu.CreatePopupMenu();
// 팝업메뉴
CString menu;
if(GetZone()->IsAdministrator())
{
menu = _T("Shutdown immediately");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINSAFECLOSE, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("Shutdown all immediately");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GAMEQUICKCLOSEALL, (LPCTSTR)menu);
menu = _T("Shutdown all safely");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GAMESAFECLOSEALL, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("Reload gameserver INI");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRELOADINI, (LPCTSTR)menu);
menu = _T("Reload gameserver OPTION");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRELOADOPTION, (LPCTSTR)menu);
menu = _T("Reload closing INI");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_RELOAD_CLOSEINI, (LPCTSTR)menu);
menu = _T("Reset the quantity of event shop");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRESETEVENTSHOP, (LPCTSTR)menu);
menu = _T("Reset the quantity of clover shop");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRESETCLOVERSHOP, (LPCTSTR)menu);
menu = _T("Reset the quantity of milege shop");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRESETMILEGESHOP, (LPCTSTR)menu);
menu = _T("Reset all record of the purchase");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAINRESETBUYLOG, (LPCTSTR)menu);
menu = _T("Reset old record of the mission");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAIN_RESET_MISSION, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("White-list on");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAIN_WHITELISTON, (LPCTSTR)menu);
menu = _T("White-list off");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_MAIN_WHITELISTOFF, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
//menu = _T("Tool CS-file");
//m_menu.AppendMenu(MF_STRING, IDC_SERVICE_CSDIALOG, (LPCTSTR)menu);
menu = _T("Operating tool");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_SHOWTOOL, (LPCTSTR)menu);
}
else if(GetZone()->IsOperator())
{
menu = _T("Operating tool");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_SHOWTOOL, (LPCTSTR)menu);
}
else
{
menu = _T("Authenticate");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_AUTHENTICATION, (LPCTSTR)menu);
}
}
break;
case SERVER_TYPE_LOGIN:
{
m_menu.DestroyMenu();
m_menu.CreatePopupMenu();
if(GetZone()->IsAdministrator())
{
// 팝업메뉴
CString menu;
menu = _T("Show panel");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGINSHOWPANEL, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("Shutdown immediately");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGINQUICKEXIT, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("White-list on");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGIN_WHITELISTON, (LPCTSTR)menu);
menu = _T("White-list off");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGIN_WHITELISTOFF, (LPCTSTR)menu);
}
}
break;
case SERVER_TYPE_GAME:
{
m_menu.DestroyMenu();
m_menu.CreatePopupMenu();
if(GetZone()->IsAdministrator())
{
// 팝업메뉴
CString menu;
menu = _T("Shutdown immediately");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GAMEQUICKCLOSE, (LPCTSTR)menu);
menu = _T("Shutdown safely");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_GAMESAFECLOSE, (LPCTSTR)menu);
UINT flag = GetZone()->GetRelayFlag(GetSelectedIndex()) ? MFS_CHECKED : MFS_UNCHECKED;
menu = _T("Relayserver on/off");
m_menu.AppendMenu(flag,IDC_SERVICE_RELAYSERVERCONTROL,(LPCTSTR)menu);
}
}
break;
case SERVER_TYPE_BILLING:
{
m_menu.DestroyMenu();
m_menu.CreatePopupMenu();
// 팝업메뉴
CString menu;
menu = _T("Reload billingsvr INI");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_BILLINGRELOADINI, (LPCTSTR)menu);
/*
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("Nexon PCRoom User Logout");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_BILLINGNEXONLOGOUT, (LPCTSTR)menu);
*/
}
break;
}
}
void CMonitorListCtrl::InitToolTip()
{
if (m_toolTip.m_hWnd == NULL)
{
m_toolTip.Create(this);
m_toolTip.Activate(FALSE);
m_toolTip.SetDelayTime(TTDT_AUTOPOP, 3000);
}
}
void CMonitorListCtrl::SetToolTip(CString text)
{
m_toolTip.DelTool(this, 0);
m_toolTip.AddTool(this, text, NULL, 0);
}
int CMonitorListCtrl::GetSelectedIndex()
{
int index = -1;
for(int i = 0; i < GetItemCount(); i++)
{
if(LVIS_SELECTED == GetItemState(i, LVIS_SELECTED))
{
index = i;
break;
}
}
return index;
}
void CMonitorListCtrl::OnNMLClick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CPoint pos;
GetCursorPos(&pos);
int index = GetSelectedIndex();
if(index != -1)
{
LVITEM item = {0};
item.iItem = index;
item.mask = LVIF_PARAM;
this->GetItem( &item);
ServerTypes serverType = (ServerTypes)item.lParam;
CZoneDialog* dlg = (CZoneDialog*)GetParent();
if(dlg)
{
if(!dlg->m_billingFlag)
{
CString servernName, serverIP;
int serverPort;
//dlg->GetAddress((ServerTypes)item.lParam, item.iItem, servernName, serverIP, serverPort);
CString toolTip;
// if(m_bCountryCount)
// {
// int strENG, strGER, strFRA, strITA, strPOL, strTUR, strETC;
// dlg->GetCCUINFO((ServerTypes)item.iItem, servernName, serverIP, serverPort, strENG, strGER, strFRA, strITA, strPOL, strTUR, strETC);
// if(servernName.Find("_") != -1)
// return;
// toolTip.Format(_T("%s(%s:%d) | ENG( %d), GER( %d), FRA( %d), ITA( %d), POL( %d), TUR( %d), ETC( %d)"), servernName, serverIP, serverPort,
// strENG, strGER, strFRA, strITA, strPOL, strTUR, strETC);
// }
// else
{
dlg->GetAddress((ServerTypes)item.lParam, item.iItem, servernName, serverIP, serverPort);
toolTip.Format(_T("%s(%s:%d)"), servernName, serverIP, serverPort);
}
SetToolTip(toolTip);
m_toolTip.Activate(TRUE);
}
}
}
*pResult = 0;
}
void CMonitorListCtrl::OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CPoint pos;
GetCursorPos(&pos);
int index = GetSelectedIndex();
if(index != -1)
{
//모니터링 끄기 기능은 현재 사용안함
if( m_parent->m_billingFlag == TRUE )
{
LVITEM item = {0};
item.iItem = index;
item.mask = LVIF_PARAM;
this->GetItem( &item);
ServerTypes serverType = SERVER_TYPE_BILLING;
BILLINGSERVERINFO* serverInfo = NULL;
serverInfo = m_parent->GetBillingServerInfo( item.lParam ); //m_billingServerTable의 키값으로 서버 정보 찾음
if( serverInfo != NULL && (serverInfo->billingServerState == SERVERSTATE_ON ) )
{
// 마우스 위치에 팝업메뉴를 출력한다.
CreatePopup(serverType);
m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this);
}
}
else
{
LVITEM item = {0};
item.iItem = index;
item.mask = LVIF_PARAM;
this->GetItem( &item);
ServerTypes serverType = (ServerTypes)item.lParam;
// 마우스 위치에 팝업메뉴를 출력한다.
CreatePopup(serverType);
m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this);
}
}
*pResult = 0;
}
BOOL CMonitorListCtrl::OnCommand(WPARAM wParam, LPARAM lParam)
{
int index = GetSelectedIndex();
if(index != -1)
{
GetParent()->PostMessage(WM_COMMAND, wParam, index);
return TRUE;
}
return CListCtrl::OnCommand(wParam, lParam);
}
void CMonitorListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if(GetZone()->IsAdministrator())
{
int index = GetSelectedIndex();
if(index != -1)
{
LVITEM item = {0};
item.iItem = index;
item.mask = LVIF_PARAM;
this->GetItem( &item);
switch(item.lParam)
{
case SERVER_TYPE_MAIN:
SendMessage(WM_COMMAND, IDC_SERVICE_MAININFO, NULL);
break;
case SERVER_TYPE_LOGIN:
SendMessage(WM_COMMAND, IDC_SERVICE_LOGININFO, NULL);
break;
case SERVER_TYPE_GAME:
SendMessage(WM_COMMAND, IDC_SERVICE_GAMEINFO, index);
break;
}
}
}
else
{
int index = GetSelectedIndex();
if(index != -1)
{
LVITEM item = {0};
item.iItem = index;
item.mask = LVIF_PARAM;
this->GetItem( &item);
if( m_parent->m_billingFlag == TRUE )
{
m_parent->RequestBillingServerLOG(item.lParam); //(ServerTypes)변환필요없음
}
}
}
*pResult = 0;
}
BOOL CMonitorListCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
m_toolTip.RelayEvent(pMsg);
return CListCtrl::PreTranslateMessage(pMsg);
}
void CMonitorListCtrl::OnCustomDrawList( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
int iItemNum = static_cast<int>(pLVCD->iSubItem);
//CString strName = GetItemText(iItemNum, pLVCD->iSubItem);
//CString strName = GetItemText(pLVCD->iSubItem,0); //0번째 텍스트 가져오자!
CString strName = GetItemText(pLVCD->nmcd.dwItemSpec,0); //0번째 텍스트 가져오자!
if( !strName.IsEmpty() && strName.Find("#") != -1 )
{
CFont font;
CRect rc;
CClientDC dc(this);
font.CreateFontA(10,0,0,0,0,FALSE,FALSE,FALSE, DEFAULT_CHARSET,0,0,0,DEFAULT_QUALITY,_T("굴림체"));
dc.SelectObject(font);
GetItemRect(pLVCD->nmcd.dwItemSpec ,&rc ,LVIR_BOUNDS);
rc.left += 7; //위치 조정
CString strNum;
strNum.Format("%d", pLVCD->nmcd.dwItemSpec + 1);
dc.SetBkMode( TRANSPARENT );
DrawText( dc, strNum, 2, rc, DT_LEFT | DT_VCENTER | DT_SINGLELINE );
font.DeleteObject();
}
COLORREF crText = NULL;
if(strName.Find(CCU_ENG) != -1) crText = CCU_RGB_ENG;
else if(strName.Find(CCU_GER) != -1) crText = CCU_RGB_GER;
else if(strName.Find(CCU_FRA) != -1) crText = CCU_RGB_FRA;
else if(strName.Find(CCU_ITA) != -1) crText = CCU_RGB_ITA;
else if(strName.Find(CCU_POL) != -1) crText = CCU_RGB_POL;
else if(strName.Find(CCU_TUR) != -1) crText = CCU_RGB_TUR;
else if(strName.Find(CCU_ETC) != -1) crText = CCU_RGB_ETC;
else crText = RGB(0,0,0);
pLVCD->clrText = crText;
*pResult = CDRF_NOTIFYITEMDRAW;
//*pResult = CDRF_DODEFAULT;
}
@@ -0,0 +1,54 @@
#pragma once
#include "ServerTypes.h"
class CZoneDialog;
// CMonitorListCtrl
class CMonitorListCtrl : public CListCtrl
{
DECLARE_DYNAMIC(CMonitorListCtrl)
public:
CMonitorListCtrl();
virtual ~CMonitorListCtrl();
public:
void Startup(CZoneDialog* parent, const int index);
int GetControlID() { return m_ctrlIndex; }
int GetSelectedIndex();
protected:
void CreatePopup(const ServerTypes serverType);
void InitToolTip();
void SetToolTip(CString text);
CZoneDialog* GetZone() { return m_parent; }
protected:
CMenu m_menu;
CToolTipCtrl m_toolTip;
int m_ctrlIndex;
CZoneDialog* m_parent;
protected:
DECLARE_MESSAGE_MAP()
protected:
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
public:
afx_msg void OnNMLClick(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMRClick(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnCustomDrawList(NMHDR* pNMHDR, LRESULT* pResult);
virtual BOOL PreTranslateMessage(MSG* pMsg);
bool m_bCountryCount;
};
@@ -0,0 +1,153 @@
// MonitorTabCtrl.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "LS_MonitorDlg.h"
#include "ZoneDialog.h"
#include "MonitorTabCtrl.h"
// CMonitorTabCtrl
IMPLEMENT_DYNAMIC(CMonitorTabCtrl, CTabCtrl)
CMonitorTabCtrl::CMonitorTabCtrl()
{
}
BEGIN_MESSAGE_MAP(CMonitorTabCtrl, CTabCtrl)
ON_WM_LBUTTONUP()
ON_WM_SIZE()
ON_WM_DESTROY()
END_MESSAGE_MAP()
int CMonitorTabCtrl::SetDialogIndex(CZoneDialog* arg)
{
UINT index = GetItemCount();
index -= 1;
m_dialogs[index] = arg;
return index;
}
void CMonitorTabCtrl::AddTab(CString& title, CString& main, CString& login, BOOL billingFlag, BILLINGSERVERTABLE& tempBillingServerMap, bool bCountryCode)
{
this->InsertItem(GetItemCount(), title);
// 다이얼로그 처리
if(GetItemCount() == 1) // 최초 한번만 실행
{
CRect tabRect, itemRect;
GetClientRect(&tabRect);
GetItemRect(0, &itemRect);
m_x = itemRect.left;
m_y = itemRect.bottom+1;
m_width = tabRect.right - itemRect.left - 1;
m_height = tabRect.bottom - m_y - 1;
}
CZoneDialog* dlg = new CZoneDialog(this);
dlg->Create(IDD_ZONEINFO_DIALOG, this);
dlg->SetWindowPos(&wndTop, m_x, m_y, m_width, m_height, SWP_HIDEWINDOW);
dlg->m_bCountryCode = bCountryCode;
if( billingFlag == FALSE)
dlg->CreateMonitor(title, main, login);
else
dlg->CreateBillingMonitor(title, billingFlag, tempBillingServerMap);
int index = -1;
index = SetDialogIndex(dlg);
// 포커스 초기화 0으로..
SetCurSel(index);
SetFocus(index);
}
void CMonitorTabCtrl::ShowTab(const UINT index, const BOOL show)
{
CZoneDialog* dlg = GetDialog(index);
if(!dlg) return;
if(show)
{
dlg->Show();
SetCurSel(index);
m_tabIndex = index;
}
else
{
dlg->Hide();
}
}
CZoneDialog* CMonitorTabCtrl::GetDialog(const UINT index)
{
SERVER_DIALOGS::iterator it = m_dialogs.find(index);
if(it != m_dialogs.end())
{
return it->second;
}
return NULL;
}
void CMonitorTabCtrl::SetFocus(const UINT index)
{
if(GetTabIndex() != index)
{
ShowTab(GetTabIndex(), FALSE);
ShowTab(GetCurFocus(), TRUE);
}
else
{
ShowTab(GetTabIndex(), TRUE);
}
}
void CMonitorTabCtrl::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
SetFocus(GetCurFocus());
CTabCtrl::OnLButtonUp(nFlags, point);
}
void CMonitorTabCtrl::OnSize(UINT nType, int cx, int cy)
{
CTabCtrl::OnSize(nType, cx, cy);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
CRect client;
GetClientRect(client);
for(SERVER_DIALOGS::iterator it = m_dialogs.begin(); it != m_dialogs.end() ; ++it)
{
CZoneDialog* dlg = it->second;
if(!dlg) continue;
CRect rc;
dlg->GetClientRect(rc);
if(dlg->IsShow())
{
dlg->SetWindowPos(NULL, rc.left+2, rc.top+26, m_width, cy - 30, SWP_SHOWWINDOW);
}
else
{
dlg->SetWindowPos(NULL, rc.left+2, rc.top+26, m_width, cy - 30, SWP_HIDEWINDOW);
}
}
}
void CMonitorTabCtrl::OnDestroy()
{
for(int i = 0; i < (int)m_dialogs.size(); i++)
SAFEDELETE(m_dialogs[i]);
}
@@ -0,0 +1,42 @@
#pragma once
#include "Define.h"
#include <map>
// CMonitorTabCtrl
class CZoneDialog;
class CMonitorTabCtrl : public CTabCtrl
{
DECLARE_DYNAMIC(CMonitorTabCtrl)
public:
CMonitorTabCtrl();
public:
int SetDialogIndex(CZoneDialog* arg);
void AddTab(CString& title, CString& main, CString& login, BOOL bBilling, BILLINGSERVERTABLE& tempBillingServerMap, bool bCountryCode);
void ShowTab(const UINT index, const BOOL show = TRUE);
const UINT GetTabIndex() { return m_tabIndex; }
CZoneDialog* GetDialog(const UINT index);
protected:
typedef std::map<UINT, CZoneDialog*> SERVER_DIALOGS;
SERVER_DIALOGS m_dialogs;
void SetFocus(const UINT index);
protected:
int m_x, m_y, m_width, m_height;
UINT m_tabIndex;
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnSize(UINT nType, int cx, int cy);
virtual void OnDestroy();
};
@@ -0,0 +1,44 @@
#include "../stdafx.h"
#include "FSM.h"
FSM::FSM()
{
InitState();
}
void FSM::InitState()
{
m_iState = MAGIC_TOKEN_FSM;
}
bool FSM::IsFirst()
{
if( MAGIC_TOKEN_FSM == m_iState )
return true;
return false;
}
int FSM::GetState()
{
return m_iState;
}
void FSM::SetState(int iState)
{
m_iState = iState;
}
void FSM::UpdateState()
{
if( !IsFirst() )
{
m_iState = ( (~m_iState) + 5371 ) * 31;
m_iState = m_iState ^ ( m_iState >> 16);
if( m_iState < 0 )
m_iState = -m_iState;
}
}
+23
View File
@@ -0,0 +1,23 @@
#pragma once
#define MAGIC_TOKEN_FSM -1
class FSM
{
public:
FSM();
public:
void InitState();
void UpdateState();
public:
bool IsFirst();
int GetState();
void SetState(int iState);
protected:
int m_iState;
};
@@ -0,0 +1,63 @@
#include "../stdafx.h"
#include "FSM.h"
#include "Packet.h"
#include "NetworkSecurity.h"
NetworkSecurity::NetworkSecurity()
{
}
NetworkSecurity::~NetworkSecurity()
{
}
// DoS Attack
bool NetworkSecurity::UpdateReceiveCount()
{
return true;
}
// Packet CheckSum
bool NetworkSecurity::IsCheckSum( CPacket &rkPacket )
{
return true;
}
// Packet Replay
int NetworkSecurity::GetSndState()
{
return MAGIC_TOKEN_FSM;
}
void NetworkSecurity::UpdateSndState()
{
}
int NetworkSecurity::GetRcvState()
{
return MAGIC_TOKEN_FSM;
}
void NetworkSecurity::UpdateRcvState()
{
}
bool NetworkSecurity::CheckState( CPacket &rkPacket )
{
return true;
}
void NetworkSecurity::PrepareMsg( CPacket &rkPacket )
{
}
void NetworkSecurity::CompletionMsg( CPacket &rkPacket )
{
}
@@ -0,0 +1,33 @@
#ifndef _NetworkSecurity_h_
#define _NetworkSecurity_h_
class TOWN_PORTAL_API NetworkSecurity
{
// DoS Attack
public:
virtual bool UpdateReceiveCount();
// Packet CheckSum
public:
virtual bool IsCheckSum( CPacket &rkPacket );
// Packet Replay
public:
virtual int GetSndState();
virtual void UpdateSndState();
virtual int GetRcvState();
virtual void UpdateRcvState();
virtual bool CheckState( CPacket &rkPacket );
// Send
public:
virtual void PrepareMsg( CPacket &rkPacket );
virtual void CompletionMsg( CPacket &rkPacket );
public:
NetworkSecurity();
virtual ~NetworkSecurity();
};
#endif
@@ -0,0 +1,142 @@
// Packet.cpp: implementation of the CPacket class.
//
//////////////////////////////////////////////////////////////////////
#include "../stdafx.h"
#include "Packet.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPacket::CPacket()
{
Clear();
}
CPacket::CPacket(DWORD ID)
{
Clear();
*m_packet_header.m_ID = ID;
m_currentPos = sizeof(PACKETHEADER);
}
CPacket::CPacket(char *buffer,int size)
{
Clear();
if( size >= sizeof(PACKETHEADER) )
{
memcpy( &m_pBuffer[0] , buffer, sizeof(PACKETHEADER) );
m_currentPos = sizeof(PACKETHEADER);
if( size >= GetBufferSize() )
memcpy( &m_pBuffer[m_currentPos], &buffer[m_currentPos], GetBufferSize() - m_currentPos );
}
}
CPacket::~CPacket()
{
}
void CPacket::Clear()
{
memset(m_pBuffer,0,MAX_PACKET_BUFFER);
m_currentPos = 0;
m_packet_header.m_ID = (DWORD*)&m_pBuffer[PK_ID_ADDR];
m_packet_header.m_Size = (DWORD*)&m_pBuffer[PK_SIZE_ADDR];
m_packet_header.m_CheckSum = (DWORD*)&m_pBuffer[PK_CKSUM_ADDR];
m_packet_header.m_iState = (int*)&m_pBuffer[PK_FSM_ADDR];
*m_packet_header.m_Size = sizeof(PACKETHEADER);
}
void CPacket::SetBufferCopy(char *pBuf,int size)
{
Clear();
memcpy( m_pBuffer, pBuf, size );
m_currentPos = sizeof(PACKETHEADER);
}
void CPacket::SetDataAdd(char *pBuf,int size)
{
memcpy( &m_pBuffer[m_currentPos], pBuf, size );
m_currentPos += size;
*m_packet_header.m_Size = m_currentPos;
}
void CPacket::SetCheckSum( DWORD dwSum )
{
*m_packet_header.m_CheckSum = dwSum;
}
void CPacket::SetState( int iState )
{
*m_packet_header.m_iState = iState;
}
const char* CPacket::GetBuffer() const
{
return &m_pBuffer[0];
}
const char* CPacket::GetData() const
{
return &m_pBuffer[0] + sizeof(PACKETHEADER);
}
int CPacket::GetBufferSize() const
{
return *m_packet_header.m_Size;
}
int CPacket::GetDataSize() const
{
return *m_packet_header.m_Size - sizeof(PACKETHEADER);
}
DWORD CPacket::GetPacketID() const
{
return *m_packet_header.m_ID;
}
DWORD CPacket::GetCheckSum() const
{
return *m_packet_header.m_CheckSum;
}
int CPacket::GetState() const
{
return *m_packet_header.m_iState;
}
bool CPacket::IsValidHeader() const
{
return (GetBufferSize() >= sizeof(PACKETHEADER) );
}
bool CPacket::IsValidPacket() const
{
if(!IsValidHeader()) return false;
return (GetBufferSize() >= m_currentPos);
}
bool CPacket::CheckLeftPacketSize( int iAddSize )
{
if( m_currentPos + iAddSize >= MAX_PACKET_BUFFER )
{
return false;
}
return true;
}
bool CPacket::CheckRightPacketSize( int iAddSize )
{
if( m_currentPos + iAddSize >= MAX_PACKET_BUFFER )
{
return false;
}
return true;
}
@@ -0,0 +1,73 @@
#pragma once
enum SocketEvents
{
SOCKEVENT_NONE = 0,
SOCKEVENT_CONNECT,
SOCKEVENT_RECEIVE,
SOCKEVENT_SEND,
SOCKEVENT_CLOSE,
SOCKEVENT_END
};
enum
{
PK_ID_ADDR = 0,
PK_SIZE_ADDR = 4,
PK_CKSUM_ADDR = 8,
PK_FSM_ADDR = 12,
PK_HEADER_SIZE = 16,
};
const int MAX_PACKET_BUFFER = 1024 * 16;
class CPacket
{
public:
struct PACKETHEADER
{
DWORD *m_ID;
DWORD *m_Size;
DWORD *m_CheckSum;
int *m_iState;
PACKETHEADER()
{
m_ID = m_Size = m_CheckSum = NULL;
m_iState = NULL;
}
};
protected:
PACKETHEADER m_packet_header;
int m_currentPos;
char m_pBuffer[MAX_PACKET_BUFFER];
bool CheckLeftPacketSize( int iAddSize );
bool CheckRightPacketSize( int iAddSize );
public:
void Clear();
void SetBufferCopy(char *pBuf,int size);
void SetDataAdd(char *pBuf,int size);
void SetCheckSum( DWORD dwSum );
void SetState( int iState );
public:
const char* GetBuffer() const; //패킷 버퍼의 모든 내용(헤더 포함).
const char* GetData() const; //패킷 버퍼의 데이터 내용(헤더 미포함).
int GetBufferSize() const;
int GetDataSize() const;
DWORD GetPacketID() const;
DWORD GetCheckSum() const;
int GetState() const;
bool IsValidHeader() const;
bool IsValidPacket() const;
public:
CPacket();
CPacket( DWORD ID );
CPacket( char *buffer, int size );
virtual ~CPacket();
};
@@ -0,0 +1,234 @@
#ifndef ___PROTOCOL_H__
#define ___PROTOCOL_H__
//CLIENT SEND TCP MONITORING PACKET
#define CTPKM_REQUEST_NUM_CONNECT 0x8001 //
//#define CTPKM_ANNOUNCE 0x8002
#define CTPKM_UPDATE_CLIENT_VERSION 0x8003
#define CTPKM_LOAD_CS3_FILE 0x8004
#define CTPKM_MONITOR_IP 0x8005 //
#define CTPKM_CS3_FILE_VERSION 0x8006
#define CTPKM_SERVER_INFO_REQUEST 0x8007
#define CTPKM_MAINSERVER_EXIT 0x8008 //
#define CTPKM_MAINSERVER_QUICKALLEXIT 0x8009 //
#define CTPKM_MAINSERVER_SAFETYALLEXIT 0x8010 //
#define CTPKM_MAINSERVER_RELOADCLOSEINFO 0x8011
//#define CTPKM_MAINSERVER_DBAGENT_EXTEND 0x8012
#define CTPKM_MAINSERVER_GAMESERVER_OPTION 0x8013
#define CTPKM_MAINSERVER_GAMESERVER_RELOADINI 0x8014
#define CTPKM_MAINSERVER_EXTRAITEM_INI 0x8015
#define CTPKM_MAINSERVER_EVENTSHOP_INI 0x8016
#define CTPKM_GAMESERVER_PROTOCAL 0x8017 //
/*
#define CTPKM_GAMESERVER_RELOAD_HACK_CONSTANT 0x8018
#define CTPKM_GAMESERVER_RELOAD_USER_DISPERSION 0x8019
#define CTPKM_GAMESERVER_RELOAD_PROCESS_INI 0x8020
#define CTPKM_GAMESERVER_RELOAD_INI_CLASS 0x8021
#define CTPKM_GAMESERVER_RELOAD_INI_DECO 0x8022
#define CTPKM_GAMESERVER_RELOAD_INI_ETC 0x8023
#define CTPKM_GAMESERVER_RELOAD_INI_EVENT 0x8024
#define CTPKM_GAMESERVER_RELOAD_QUEST_INI 0x8025
#define CTPKM_GAMESERVER_RELOAD_MODE_INI 0x8026
#define CTPKM_GAMESERVER_RELOAD_PRESENT_INI 0x8027
#define CTPKM_GAMESERVER_RELOAD_FISHING_INI 0x8028
#define CTPKM_GAMESERVER_RELOAD_EXCA 0x8029
#define CTPKM_GAMESERVER_RELOAD_ITEM_COMPOUND_INI 0x8030
#define CTPKM_GAMESERVER_RELOAD_EXTRAITEM_INI 0x8031
#define CTPKM_GAMESERVER_RELOAD_TRADE_INI 0x8032
#define CTPKM_GAMESERVER_RELOAD_LEVELMATCH_INI 0x8033
#define CTPKM_GAMESERVER_RELOAD_ITEM_INIT_CONTROL 0x8034
#define CTPKM_GAMESERVER_RELOAD_CONFIG_INI 0x8035
*/
#define CTPKM_GAMESERVER_QUICK_EXIT 0x8036 //
#define CTPKM_GAMESERVER_SAFETY_EXIT 0x8037 //
//#define CTPKM_MAINSERVER_GS_SETNAGLE_REFCOUNT 0x8038
//#define CTPKM_MAINSERVER_GS_SETNAGLE_TIME 0x8039
#define CTPKM_MAINSERVER_ADMINCOMMAND 0x8040 //
#define CTPKM_GAMESERVER_CHANGE_RELAYSVR_STATE 0x8041 //
#define CTPKM_MAINSERVER_RESETEVENTSHOP 0x8042
#define CTPKM_BILLINGSERVER_USER_REQUEST 0x8043
//#define CTPKM_BILLINGSERVER_FIRST_CONNECT 0x8044
#define CTPKM_BILLINGSERVER_RELOAD_INI 0x8045
//#define CTPKM_BILLINGSERVER_NEXONPCROOM_LOGOUT 0x8046
#define CTPKM_LICENSE_REQUEST 0X8047
#define CTPKM_WHITELIST_REQUEST 0X8048
//#define CTPKM_MAINSERVER_RESETMILEGESHOP 0x8049
#define CTPKM_MAINSERVER_RESET_OLDMISSIONDATA 0x8051
#define CTPKM_MTOOL_GAMESERVER_PROTOCAL 0x8201
#define CTPKM_MTOOL_MAINSERVER_EXIT 0x8202
#define CTPKM_MTOOL_MAINSERVER_QUICKALLEXIT 0x8204
#define CTPKM_MTOOL_MAINSERVER_SAFETYALLEXIT 0x8207
#define CTPKM_MTOOL_MAINSERVER_GAMESERVER_RELOADINI 0x8210
#define CTPKM_MTOOL_MAINSERVER_RELOADCLOSEINFO 0x8213
//SERVER SEND TCP MONITORING PACKET
#define STPKM_ANSWER_NUM_CONNECT 0x8501
#define STPKM_SERVER_DISCONNECT 0x8502
#define STPKM_LOAD_CS3_FILE 0x8503
#define STPKM_CS3_FILE_VERSION 0x8504
#define STPKM_ALL_SERVER_INFO 0x8505
#define STPKM_SERVER_INFO_ACK 0x8506
#define STPKM_ADMIN_RESPONSE 0x8507
#define STPKM_SERVER_INFO_COMPLETE_ACK 0x8508
#define STPKM_BILLING_USER 0x8509
#define STPKM_ANSWER_BILLING_CONNECT 0x8510
#define STPKM_BILLINGSERVER_RELOAD_INI 0x8511
#define STPKM_COUNTRY_CCU_COUNT 0x8512
#define STPKM_LICENSE_ALERT_CHECK 0x8513
#define STPKM_UPDATE_CLIENT_VERSION 0x8516
namespace TOOL_SVR
{
enum PROTOCOL
{
MCTMS_REQUEST_TODAY_CCU = 0x13001,
MSTMC_ANSWER_TODAY_CCU = 0x13003,
MCTMS_REQUEST_NUM_CONNECT = 0x13011,
MSTMC_ANSWER_NUM_CONNECT = 0x13015,
MCTMS_REQUEST_SEARCH_CCU = 0x13017,
MCTMS_ANSWER_SEARCH_CCU = 0x13019,
MSTMC_SERVER_DISCONNECT = 0x13502,
MSTMC_ALL_SERVER_INFO = 0x13505,
MSTMC_M_SERVER_DISCONNECT = 0x13510,
MCTMS_L_CONTROL_SERVER = 0x13586,
MSTMC_L_SERVER_RESPONSE = 0x13590,
MSTMC_L_SERVER_CONNECT = 0x13591,
MSTMC_L_SERVER_DISCONNECT = 0x13593,
MCTMS_C_MAINSERVER_EXIT = 0x14008, // 메인서버 종료
MCTMS_C_MAINSERVER_QUICKALLEXIT = 0x14010, // 게임서버 전체 종료
MCTMS_C_MAINSERVER_SAFETYALLEXIT = 0x14012, // 게임서버 전체 안전종료
MCTMS_C_MAINSERVER_ADMINCOMMAND = 0x14040,
MSTMC_S_ADMIN_RESPONSE = 0x14047,
MCTMS_C_GAMESERVER_PROTOCAL = 0x14050,
MCTMS_C_MAINSERVER_GAMESERVER_RELOADINI = 0x14053,
MCTMS_C_MAINSERVER_GAMESERVER_OPTION = 0x14055,
MCTMS_C_MAINSERVER_RELOADCLOSEINFO = 0x14057,
MCTMS_C_MAINSERVER_RESETEVENTSHOP = 0x14059,
MCTMS_C_MAINSERVER_RESET_OLDMISSIONDATA = 0x14062,
MCTMS_C_WHITELIST_REQUEST = 0x14066,
MCTSC_C_UPDATE_CLIENT_VERSION = 0x14070,
MCTSC_S_UPDATE_CLIENT_VERSION = 0x14072,
};
}
namespace LOGIN_SVR
{
enum PROTOCOL
{
TEST_SEND = 0xd001,
MNSTPK_STATUS_REQUEST = 0x10601,
MNSTPK_STATUS_RESULT = 0x10602,
MNSTPK_CHANGE_REQUEST = 0x10603,
MNSTPK_CHANGE_RESULT = 0x10604,
MNSTPK_CLOSE = 0x10605,
LSTPK_STATUS_REQUEST = 0x10680,
LSTPK_CONNECT_CLIENT = 0x10681,
LSTPK_SVR_STATUS_RESPONSE = 0x10682,
LSPTK_LS_LOGINSVR_CONNECT = 0x10683,
LSPTK_TICKET_REQUEST = 0x10684,
LSPTK_TICKET_RESPONSE = 0x10685,
LSPTK_TIMEOUT_CLOSE_REQUEST = 0x10686,
LSPTK_ERROR = 0x10687,
LSPTK_CONNECT_MONITOR = 0x10688,
LSPTK_CONTROL_SERVER = 0x10689,
LSPTK_SERVER_RESPONSE = 0x10690,
LSPTK_PING = 0x10691,
LSPTK_SERVER_FILLINFO = 0x10692,
LSPTK_WHITELIST_REQUEST = 0x10698,
};
}
// CTPKM_ANNOUNCE
#define ANNOUNCE_TYPE_ALL 1
#define ANNOUNCE_TYPE_ONE 2
#define ANNOUNCE_TYPE_DISCONNECT 3
// STPKM_LOAD_CS3_FILE
#define LOAD_CS3_FILE_SUCCESS 1
#define LOAD_CS3_FILE_FAIL 2
#define LOAD_CS3_FILE_WRONG_VERSION 3
#define LOAD_CS3_FILE_NOT_FILE 4
#define LOAD_CS3_FILE_CHANGE_WRONG 5
#define LOAD_CS3_FILE_EXIST_VERSION 6
// STPKM_CS3_VERSION
#define CS3_VERSION_SUCCESS 1
#define CS3_VERSION_FAIL 2
// 게임서버 종료 타입
#define ALL_SERVER_QUICK_EXIT 0
#define ALL_SERVER_SAFETY_EXIT 1
enum AdminCommandTypes
{
ADMINCOMMAND_NONE = 0,
ADMINCOMMAND_KICK,
ADMINCOMMAND_ANNOUNCE,
ADMINCOMMAND_ITEMINSERT,
ADMINCOMMAND_EVENTINSERT,
ADMINCOMMAND_AUTH,
ADMINCOMMAND_USERBLOCK,
ADMINCOMMAND_USERUNBLOCK,
ADMINCOMMAND_SECRETSHOP,
ADMINCOMMAND_COMPENSATION,
ADMINCOMMAND_PRACTICE,
ADMINCOMMAND_MTOOL_AUTH,
ADMINCOMMAND_MTOOL_KICK,
ADMINCOMMAND_MTOOL_ANNOUNCE,
ADMINCOMMAND_MTOOL_ITEMINSERT,
ADMINCOMMAND_MTOOL_EVENTINSERT,
ADMINCOMMAND_MTOOL_USERBLOCK,
ADMINCOMMAND_MTOOL_USERUNBLOCK,
ADMINCOMMAND_MTOOL_SECRETSHOP,
ADMINCOMMAND_MTOOL_COMPENSATION,
ADMINCOMMAND_MTOOL_PRACTICE,
ADMINCOMMAND_END
};
enum BLOCKTYPE
{
BLOCKTYPE_NONE = 0,
BLOCKTYPE_WARNING, // 주의
BLOCKTYPE_LIMITATION, // 제한
BLOCKTYPE_BLOCK, // 차단
BLOCKTYPE_UNBLOCK, // 해제
BLOCKTYPE_END
};
// DB에 저장되는 값으로 순차적으로 증가하지 않는다.
enum BlockType
{
BKT_NONE = -1,
BKT_NORMAL = 0, // 차단안됨 (정상)
BKT_WARNNING = 10, // 경고 ( 약 )
BKT_LIMITATION = 20, // 제한 ( 중 )
BKT_BLOCK = 100, // 차단 ( 강 )
};
enum AdminLevels
{
ADMIN_LEVEL_NONE = 0,
ADMIN_LEVEL_OPERATOR,
ADMIN_LEVEL_ADMINISTRATOR,
ADMIN_LEVEL_DEVELOPER,
ADMIN_LEVEL_END
};
#endif
@@ -0,0 +1,31 @@
#ifndef _RecvBuffer_h_
#define _RecvBuffer_h_
#include "ioPortalHelp.h"
class RecvBuffer
{
private:
char m_pBuf[MAX_BUFFER];
int m_iCurRcvSize;
char m_pRewindBuf[MAX_BUFFER];
public:
void InitBuffer();
void UpdateRecvSize( int iCurRcvSize );
void RewindBuffer( int iRewindSize );
public:
char* GetStartPtr();
char* GetFreeSpacePtr();
int GetCurRcvSize() const;
int GetFreeSpaceSize() const;
public:
RecvBuffer();
~RecvBuffer();
};
#endif
@@ -0,0 +1,399 @@
#include "../stdafx.h"
#include "SP2Packet.h"
SP2Packet::SP2Packet()
{
}
SP2Packet::SP2Packet(DWORD ID) : CPacket( ID )
{
}
SP2Packet::SP2Packet(char *buffer,int size) : CPacket( buffer, size )
{
}
SP2Packet::~SP2Packet()
{
}
const char* SP2Packet::GetData() const
{
return &m_pBuffer[0] + sizeof(PACKETHEADER);
}
int SP2Packet::GetDataSize() const
{
return *m_packet_header.m_Size - sizeof(PACKETHEADER);
}
void SP2Packet::SetDataAdd( char *buffer, int size )
{
m_currentPos = sizeof(PACKETHEADER);
memcpy( &m_pBuffer[m_currentPos], buffer, size );
m_currentPos += size;
*m_packet_header.m_Size = m_currentPos;
}
void SP2Packet::SetPosBegin()
{
m_currentPos = sizeof(PACKETHEADER);
}
//operator
SP2Packet& SP2Packet::operator = (SP2Packet &packet)
{
Clear();
memcpy(&m_pBuffer[0],packet.GetBuffer(),packet.GetBufferSize());
m_currentPos = sizeof(PACKETHEADER);
return *this;
}
SP2Packet& SP2Packet::operator << (BYTE arg)
{
if( !CheckLeftPacketSize( sizeof(BYTE) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(BYTE));
m_currentPos += sizeof(BYTE);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (bool arg)
{
if( !CheckLeftPacketSize( sizeof(bool) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(bool));
m_currentPos += sizeof(bool);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (int arg)
{
if( !CheckLeftPacketSize( sizeof(int) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(int));
m_currentPos += sizeof(int);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (LONG arg)
{
if( !CheckLeftPacketSize( sizeof(LONG) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(LONG));
m_currentPos += sizeof(LONG);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (WORD arg)
{
if( !CheckLeftPacketSize( sizeof(WORD) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(WORD));
m_currentPos += sizeof(WORD);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (DWORD arg)
{
if( !CheckLeftPacketSize( sizeof(DWORD) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(DWORD));
m_currentPos += sizeof(DWORD);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (__int64 arg)
{
if( !CheckLeftPacketSize( sizeof(__int64) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(__int64));
m_currentPos += sizeof(__int64);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (LPTSTR arg)
{
int nlen = lstrlen(arg) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckLeftPacketSize( nlen ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],arg,nlen);
m_currentPos += nlen;
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (double arg)
{
if( !CheckLeftPacketSize( sizeof(double) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(double));
m_currentPos += sizeof(double);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << (float arg)
{
if( !CheckLeftPacketSize( sizeof(float) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(float));
m_currentPos += sizeof(float);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << ( const ioHashString &arg )
{
int nlen = lstrlen( arg.c_str() ) + 1;
if( !CheckLeftPacketSize( nlen ) ) return *this;
memcpy( &m_pBuffer[m_currentPos], arg.c_str(), nlen );
m_currentPos += nlen;
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << ( const GAMESERVERINFO& arg )
{
if( ! CheckLeftPacketSize( sizeof( GAMESERVERINFO ) ) )
return *this;
memcpy( &m_pBuffer[ m_currentPos ], &arg, sizeof( GAMESERVERINFO ) );
m_currentPos += sizeof( GAMESERVERINFO );
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator << ( const MAINSERVERINFO& arg )
{
if( ! CheckLeftPacketSize( sizeof( MAINSERVERINFO ) ) )
return *this;
memcpy( &m_pBuffer[ m_currentPos ], &arg, sizeof( MAINSERVERINFO ) );
m_currentPos += sizeof( MAINSERVERINFO );
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& SP2Packet::operator >> (BYTE &arg)
{
if( !CheckRightPacketSize( sizeof(BYTE) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(BYTE));
m_currentPos += sizeof(BYTE);
return *this;
}
SP2Packet& SP2Packet::operator >> (bool &arg)
{
if( !CheckRightPacketSize( sizeof(bool) ) )
{
arg = false;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(bool));
m_currentPos += sizeof(bool);
return *this;
}
SP2Packet& SP2Packet::operator >> (int &arg)
{
if( !CheckRightPacketSize( sizeof(int) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(int));
m_currentPos += sizeof(int);
return *this;
}
SP2Packet& SP2Packet::operator >> (LONG &arg)
{
if( !CheckRightPacketSize( sizeof(LONG) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(LONG));
m_currentPos += sizeof(LONG);
return *this;
}
SP2Packet& SP2Packet::operator >> (WORD &arg)
{
if( !CheckRightPacketSize( sizeof(WORD) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(WORD));
m_currentPos += sizeof(WORD);
return *this;
}
SP2Packet& SP2Packet::operator >> (DWORD &arg)
{
if( !CheckRightPacketSize( sizeof(DWORD) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(DWORD));
m_currentPos += sizeof(DWORD);
return *this;
}
SP2Packet& SP2Packet::operator >> (__int64 &arg)
{
if( !CheckRightPacketSize( sizeof(__int64) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(__int64));
m_currentPos += sizeof(__int64);
return *this;
}
SP2Packet& SP2Packet::operator >> (LPTSTR arg)
{
int nlen = lstrlen((LPTSTR)&m_pBuffer[m_currentPos]) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckRightPacketSize( nlen ) )
{
arg[0] = 0;
return *this;
}
memcpy(arg,&m_pBuffer[m_currentPos],nlen);
m_currentPos += nlen;
return *this;
}
SP2Packet& SP2Packet::operator >> (double &arg)
{
if( !CheckRightPacketSize( sizeof(double) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(double));
m_currentPos += sizeof(double);
return *this;
}
SP2Packet& SP2Packet::operator >> (float &arg)
{
if( !CheckRightPacketSize( sizeof(float) ) )
{
arg = 0;
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(float));
m_currentPos += sizeof(float);
return *this;
}
SP2Packet& SP2Packet::operator >> ( ioHashString &arg )
{
int nlen = lstrlen((LPTSTR)&m_pBuffer[m_currentPos]) * sizeof( TCHAR ) + sizeof( TCHAR );
if( !CheckRightPacketSize( nlen ) )
{
arg.Clear();
return *this;
}
arg = &m_pBuffer[m_currentPos];
m_currentPos += nlen;
return *this;
}
SP2Packet& SP2Packet::operator >> ( GAMESERVERINFO& arg )
{
if( ! CheckRightPacketSize( sizeof( GAMESERVERINFO ) ) )
{
ZeroMemory(&arg, sizeof(arg));
return *this;
}
memcpy( &arg, &m_pBuffer[ m_currentPos ], sizeof( GAMESERVERINFO ) );
m_currentPos += sizeof( GAMESERVERINFO );
return *this;
}
SP2Packet& SP2Packet::operator >> ( MAINSERVERINFO& arg )
{
if( ! CheckRightPacketSize( sizeof( MAINSERVERINFO ) ) )
{
ZeroMemory(&arg, sizeof(arg));
return *this;
}
memcpy( &arg, &m_pBuffer[ m_currentPos ], sizeof( MAINSERVERINFO ) );
m_currentPos += sizeof( MAINSERVERINFO );
return *this;
}
SP2Packet& SP2Packet::operator>>( SendRelayInfo_& arg )
{
if( !CheckRightPacketSize( sizeof(SendRelayInfo_) ) )
{
ZeroMemory( &arg, sizeof( SendRelayInfo_ ) );
return *this;
}
memcpy(&arg,&m_pBuffer[m_currentPos],sizeof(SendRelayInfo_));
m_currentPos += sizeof(SendRelayInfo_);
return *this;
}
SP2Packet& SP2Packet::operator<<( SendRelayInfo_& arg )
{
if( !CheckLeftPacketSize( sizeof(SendRelayInfo_) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&arg,sizeof(SendRelayInfo_));
m_currentPos += sizeof(SendRelayInfo_);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
@@ -0,0 +1,70 @@
#pragma once
#include "Packet.h"
#include "../Define.h"
#include "../ioHashString.h"
class SP2Packet : public CPacket
{
public:
SP2Packet();
SP2Packet(DWORD ID);
SP2Packet(char *buffer,int size);
virtual ~SP2Packet();
const char* GetData() const;
int GetDataSize() const;
void SetDataAdd( char *buffer, int size );
void SetPosBegin();
//operator
SP2Packet& operator = (SP2Packet& packet);
SP2Packet& operator << (BYTE arg);
SP2Packet& operator << (bool arg);
SP2Packet& operator << (int arg);
SP2Packet& operator << (LONG arg);
SP2Packet& operator << (WORD arg);
SP2Packet& operator << (DWORD arg);
SP2Packet& operator << (__int64 arg);
SP2Packet& operator << (LPTSTR arg);
SP2Packet& operator << (double arg);
SP2Packet& operator << (float arg);
SP2Packet& operator << ( const ioHashString &arg );
SP2Packet& operator << ( const GAMESERVERINFO& arg );
SP2Packet& operator << ( const MAINSERVERINFO& arg );
SP2Packet& operator >> (BYTE &arg);
SP2Packet& operator >> (bool &arg);
SP2Packet& operator >> (int &arg);
SP2Packet& operator >> (LONG &arg);
SP2Packet& operator >> (WORD &arg);
SP2Packet& operator >> (DWORD &arg);
SP2Packet& operator >> (__int64 &arg);
SP2Packet& operator >> (LPTSTR arg);
SP2Packet& operator >> (double &arg);
SP2Packet& operator >> (float &arg);
SP2Packet& operator >> ( ioHashString &arg );
SP2Packet& operator >> ( GAMESERVERINFO& arg );
SP2Packet& operator >> ( MAINSERVERINFO& arg );
SP2Packet& operator << (LoginServerInfo &data)
{
if( !CheckLeftPacketSize( sizeof(data) ) ) return *this;
memcpy(&m_pBuffer[m_currentPos],&data,sizeof(data));
m_currentPos += sizeof(data);
*m_packet_header.m_Size = m_currentPos;
return *this;
}
SP2Packet& operator >> (LoginServerInfo &data)
{
if( !CheckRightPacketSize( sizeof(data) ) ) return *this;
memcpy(&data,&m_pBuffer[m_currentPos],sizeof(data));
m_currentPos += sizeof(data);
return *this;
}
SP2Packet& operator >> ( SendRelayInfo_& arg);
SP2Packet& operator << ( SendRelayInfo_& arg);
};
@@ -0,0 +1,38 @@
#ifndef _SendBuffer_h_
#define _SendBuffer_h_
class SendBuffer
{
private:
char m_pBuffer[MAX_BUFFER + MAX_TEMP_BUFF];
char *m_pStart;
char *m_pEnd;
int m_iRestCnt;
bool m_bBlock;
public:
void InitBuffer();
void ClearBuffer();
public:
bool EnqueueData( const char *pData, int iPacketSize ); // return : Can Now Send ?
int DequeueData( int iTransfered );
public:
int GetRestCnt();
char* GetQueuePtr() const;
public:
void SetBlock( bool bBlock );
bool IsBlocked() const;
public:
SendBuffer();
~SendBuffer();
};
#endif
@@ -0,0 +1,50 @@
#include "../stdafx.h"
#include "md5.h"
#include "cryption.h"
void Encrypt(BYTE *szSrc, int len)
{
BYTE ch;
BYTE temp;
for( int i=0 ; i<len ; i++ )
{
ch = szSrc[i];
ch ^= 0xff;
temp = (ch & 0xe0) >> 5;
ch <<= 3;
ch |= temp;
szSrc[i] = ch;
}
}
void Decrypt(BYTE *szSrc, int len)
{
BYTE ch;
BYTE temp;
for( int i=0 ; i<len ; i++ )
{
ch = szSrc[i];
temp = (ch & 0x07) << 5;
ch>>=3;
ch |= temp;
ch ^= 0xff;
szSrc[i] = ch;
}
}
DWORD MakeDigest( BYTE *szSrc, int len )
{
MD5Context md5_ctx;
DWORD dwDigest[4];
MD5Init( &md5_ctx );
MD5Update( &md5_ctx, (unsigned char const *)szSrc, len );
MD5Final( (BYTE*)&dwDigest, &md5_ctx );
DWORD dwResult;
dwResult = dwDigest[0] ^ dwDigest[1] ^ dwDigest[2] ^ dwDigest[3];
return dwResult;
}
@@ -0,0 +1,5 @@
#pragma once
void Encrypt(BYTE *szSrc, int len);
void Decrypt(BYTE *szSrc, int len);
DWORD MakeDigest( BYTE *szSrc, int len );
@@ -0,0 +1,217 @@
#include "../stdafx.h"
#include "ioSP2TCPSocket.h"
#include "SP2Packet.h"
#include "Protocol.h"
#include "../LS_MonitorDlg.h"
ioSP2TCPSocket::ioSP2TCPSocket()
{
SetNS( new ioTCPClientSecurity );
}
ioSP2TCPSocket::~ioSP2TCPSocket()
{
SAFEDELETE( m_pNS );
}
void ioSP2TCPSocket::InitState()
{
if( m_pNS )
{
ioTCPClientSecurity *pCS = static_cast<ioTCPClientSecurity *>(m_pNS);
pCS->InitState();
}
}
void ioSP2TCPSocket::ConnectProcess()
{
LOG.PrintTimeAndLog( 0, "Server Connect" );
SP2Packet kPacket(CTPKM_REQUEST_NUM_CONNECT);
SendLoop( kPacket );
if( !AfxGetMainWnd() )
{
LOG.PrintTimeAndLog(0, "ioSP2TCPSocket::ConnectProcess - AfxGetMainWnd == NULL ");
return;
}
CLSMonitorDlg *pDlg = static_cast< CLSMonitorDlg* > ( AfxGetMainWnd() );
if( !pDlg )
{
LOG.PrintTimeAndLog(0, "ioSP2TCPSocket::ConnectProcess - pDlg == NULL ");
return;
}
ioHashString szIP;
pDlg->GetMyIP( szIP );
if( szIP.IsEmpty() )
{
LOG.PrintTimeAndLog(0, "ioSP2TCPSocket::ConnectProcess - IP is Empty. ");
return;
}
SP2Packet kIPPacket( CTPKM_MONITOR_IP );
kIPPacket << szIP;
SendLoop( kIPPacket );
pDlg->OnConnect(m_WndMsg);
}
void ioSP2TCPSocket::DisconnectProcess()
{
LOG.PrintTimeAndLog( 0, "ioSP2TCPSocket::DisconnectProcess - Disconnected Server" );
if(AfxGetApp())
{
CLSMonitorDlg *pWnd = (CLSMonitorDlg*)AfxGetApp()->GetMainWnd();
if(pWnd)
pWnd->Disconnect( m_WndMsg );
}
}
bool ioSP2TCPSocket::CheckNS( CPacket &rkPacket )
{
if( m_pNS == NULL )
{
LOG.PrintTimeAndLog( 0, "ioSP2TCPSocket::CheckNS ( m_pNS == NULL )" );
return true;
}
ioTCPClientSecurity *pCS = (ioTCPClientSecurity*)m_pNS;
if( !pCS->IsCheckSum( rkPacket ) )
{
LOG.PrintTimeAndLog( 0, "ioSP2TCPSocket::CheckNS Check Sum Fail!! [%d : %d]", rkPacket.GetPacketID(), rkPacket.GetCheckSum() );
return false;
}
if( !pCS->CheckState( rkPacket ) )
{
LOG.PrintTimeAndLog( 0, "ioSP2TCPSocket::CheckNSType:%d State Not Same Client:%d, Server:%d",
rkPacket.GetPacketID(), rkPacket.GetState(), pCS->GetRcvState() );
return false;
}
return true;
}
void ioSP2TCPSocket::ProcessPacket( CPacket &rkPacket )
{
if(AfxGetApp())
{
CLSMonitorDlg *pWnd = (CLSMonitorDlg*)AfxGetApp()->GetMainWnd();
if(pWnd)
pWnd->ProcessPacket( m_WndMsg, (SP2Packet&)rkPacket );
}
}
//////////////////////////////////////////////////////////////////////////
ioTCPClientSecurity::ioTCPClientSecurity()
{
InitState();
}
ioTCPClientSecurity::~ioTCPClientSecurity()
{
}
void ioTCPClientSecurity::InitState()
{
m_SndState.InitState();
m_RcvState.InitState();
}
// Packet CheckSum
void ioTCPClientSecurity::EncryptMsg( CPacket &rkPacket )
{
// Check Sum
DWORD dwResult = MakeDigest( (BYTE*)rkPacket.GetBuffer(), rkPacket.GetBufferSize() );
rkPacket.SetCheckSum( dwResult );
// Encryption
BYTE *pSrc;
pSrc = (BYTE*)rkPacket.GetBuffer() + PK_CKSUM_ADDR;
Encrypt( pSrc, rkPacket.GetBufferSize() - PK_CKSUM_ADDR );
}
void ioTCPClientSecurity::DecryptMsg( CPacket &rkPacket )
{
// Decryption
BYTE *pSrc;
pSrc = (BYTE*)rkPacket.GetBuffer() + PK_CKSUM_ADDR;
Decrypt( pSrc, rkPacket.GetBufferSize() - PK_CKSUM_ADDR );
}
bool ioTCPClientSecurity::IsCheckSum( CPacket &rkPacket )
{
//Decrypt
DecryptMsg( rkPacket );
DWORD dwTemp = rkPacket.GetCheckSum(); //Àӽà ÀúÀå.
rkPacket.SetCheckSum( 0 );
DWORD dwResult = MakeDigest( (BYTE*)rkPacket.GetBuffer(), rkPacket.GetBufferSize() );
rkPacket.SetCheckSum( dwTemp );
// Check Sum
return ( dwResult == rkPacket.GetCheckSum() );
}
// Packet Replay
int ioTCPClientSecurity::GetSndState()
{
return m_SndState.GetState();
}
void ioTCPClientSecurity::UpdateSndState()
{
m_SndState.UpdateState();
}
int ioTCPClientSecurity::GetRcvState()
{
return m_RcvState.GetState();
}
void ioTCPClientSecurity::UpdateRcvState()
{
m_RcvState.UpdateState();
}
bool ioTCPClientSecurity::CheckState( CPacket &rkPacket )
{
if( GetRcvState() == MAGIC_TOKEN_FSM )
{
m_RcvState.SetState( rkPacket.GetState() );
m_SndState.SetState( rkPacket.GetState() );
UpdateSndState();
}
else
{
if( GetRcvState() != rkPacket.GetState() )
return false;
}
UpdateRcvState();
return true;
}
void ioTCPClientSecurity::PrepareMsg( CPacket &rkPacket )
{
rkPacket.SetState( GetSndState() );
EncryptMsg( rkPacket );
UpdateSndState();
}
void ioTCPClientSecurity::CompletionMsg( CPacket &rkPacket )
{
}
@@ -0,0 +1,177 @@
#ifndef _ioSP2TCPSocket_h_
#define _ioSP2TCPSocket_h_
#define WM_TCPSOCKET1 (WM_USER + 100)
#define WM_TCPSOCKET2 (WM_USER + 101)
#define WM_TCPSOCKET3 (WM_USER + 102)
#define WM_TCPSOCKET4 (WM_USER + 103)
#define WM_TCPSOCKET5 (WM_USER + 104)
#define WM_TCPSOCKET6 (WM_USER + 105)
#define WM_TCPSOCKET7 (WM_USER + 106)
#define WM_TCPSOCKET8 (WM_USER + 107)
#define WM_TCPSOCKET9 (WM_USER + 108)
#define WM_TCPSOCKET10 (WM_USER + 109)
#define WM_TCPSOCKET11 (WM_USER + 110)
#define WM_TCPSOCKET12 (WM_USER + 111)
#define WM_TCPSOCKET13 (WM_USER + 112)
#define WM_TCPSOCKET14 (WM_USER + 113)
#define WM_TCPSOCKET15 (WM_USER + 114)
#define WM_TCPSOCKET16 (WM_USER + 115)
#define WM_TCPSOCKET17 (WM_USER + 116)
#define WM_TCPSOCKET18 (WM_USER + 117)
#define WM_TCPSOCKET19 (WM_USER + 118)
#define WM_TCPSOCKET20 (WM_USER + 119)
#define WM_TCPSOCKET21 (WM_USER + 120)
#define WM_TCPSOCKET22 (WM_USER + 121)
#define WM_TCPSOCKET23 (WM_USER + 122)
#define WM_TCPSOCKET24 (WM_USER + 123)
#define WM_TCPSOCKET25 (WM_USER + 124)
#define WM_TCPSOCKET26 (WM_USER + 125)
#define WM_TCPSOCKET27 (WM_USER + 126)
#define WM_TCPSOCKET28 (WM_USER + 127)
#define WM_TCPSOCKET29 (WM_USER + 128)
#define WM_TCPSOCKET30 (WM_USER + 129)
#define WM_TCPSOCKET31 (WM_USER + 130)
#define WM_TCPSOCKET32 (WM_USER + 131)
#define WM_TCPSOCKET33 (WM_USER + 132)
#define WM_TCPSOCKET34 (WM_USER + 133)
#define WM_TCPSOCKET35 (WM_USER + 134)
#define WM_TCPSOCKET36 (WM_USER + 135)
#define WM_TCPSOCKET37 (WM_USER + 136)
#define WM_TCPSOCKET38 (WM_USER + 137)
#define WM_TCPSOCKET39 (WM_USER + 138)
#define WM_TCPSOCKET40 (WM_USER + 139)
#define WM_TCPSOCKET41 (WM_USER + 140)
#define WM_TCPSOCKET42 (WM_USER + 141)
#define WM_TCPSOCKET43 (WM_USER + 142)
#define WM_TCPSOCKET44 (WM_USER + 143)
#define WM_TCPSOCKET45 (WM_USER + 144)
#define WM_TCPSOCKET46 (WM_USER + 145)
#define WM_TCPSOCKET47 (WM_USER + 146)
#define WM_TCPSOCKET48 (WM_USER + 147)
#define WM_TCPSOCKET49 (WM_USER + 148)
#define WM_TCPSOCKET50 (WM_USER + 149)
#define WM_TCPSOCKET51 (WM_USER + 150)
#define WM_TCPSOCKET52 (WM_USER + 151)
#define WM_TCPSOCKET53 (WM_USER + 152)
#define WM_TCPSOCKET54 (WM_USER + 153)
#define WM_TCPSOCKET55 (WM_USER + 154)
#define WM_TCPSOCKET56 (WM_USER + 155)
#define WM_TCPSOCKET57 (WM_USER + 156)
#define WM_TCPSOCKET58 (WM_USER + 157)
#define WM_TCPSOCKET59 (WM_USER + 158)
#define WM_TCPSOCKET60 (WM_USER + 159)
#define WM_TCPSOCKET61 (WM_USER + 160)
#define WM_TCPSOCKET62 (WM_USER + 161)
#define WM_TCPSOCKET63 (WM_USER + 162)
#define WM_TCPSOCKET64 (WM_USER + 163)
#define WM_TCPSOCKET65 (WM_USER + 164)
#define WM_TCPSOCKET66 (WM_USER + 165)
#define WM_TCPSOCKET67 (WM_USER + 166)
#define WM_TCPSOCKET68 (WM_USER + 167)
#define WM_TCPSOCKET69 (WM_USER + 168)
#define WM_TCPSOCKET70 (WM_USER + 169)
#define WM_TCPSOCKET71 (WM_USER + 170)
#define WM_TCPSOCKET72 (WM_USER + 171)
#define WM_TCPSOCKET73 (WM_USER + 172)
#define WM_TCPSOCKET74 (WM_USER + 173)
#define WM_TCPSOCKET75 (WM_USER + 174)
#define WM_TCPSOCKET76 (WM_USER + 175)
#define WM_TCPSOCKET77 (WM_USER + 176)
#define WM_TCPSOCKET78 (WM_USER + 177)
#define WM_TCPSOCKET79 (WM_USER + 178)
#define WM_TCPSOCKET80 (WM_USER + 179)
#define WM_TCPSOCKET81 (WM_USER + 180)
#define WM_TCPSOCKET82 (WM_USER + 181)
#define WM_TCPSOCKET83 (WM_USER + 182)
#define WM_TCPSOCKET84 (WM_USER + 183)
#define WM_TCPSOCKET85 (WM_USER + 184)
#define WM_TCPSOCKET86 (WM_USER + 185)
#define WM_TCPSOCKET87 (WM_USER + 186)
#define WM_TCPSOCKET88 (WM_USER + 187)
#define WM_TCPSOCKET89 (WM_USER + 188)
#define WM_TCPSOCKET90 (WM_USER + 189)
#define WM_TCPSOCKET91 (WM_USER + 190)
#define WM_TCPSOCKET92 (WM_USER + 191)
#define WM_TCPSOCKET93 (WM_USER + 192)
#define WM_TCPSOCKET94 (WM_USER + 193)
#define WM_TCPSOCKET95 (WM_USER + 194)
#define WM_TCPSOCKET96 (WM_USER + 195)
#define WM_TCPSOCKET97 (WM_USER + 196)
#define WM_TCPSOCKET98 (WM_USER + 197)
#define WM_TCPSOCKET99 (WM_USER + 198)
#define WM_TCPSOCKET100 (WM_USER + 199)
enum TCPLOGIN
{
WM_TCPLOGIN1 = WM_TCPSOCKET90,
WM_TCPLOGIN2,
WM_TCPLOGIN3,
WM_TCPLOGIN4,
WM_TCPLOGIN5,
WM_TCPLOGIN6,
WM_TCPLOGIN8,
WM_TCPLOGIN9,
WM_TCPLOGIN10,
WM_TCPLOGIN11,
};
#define RIGHT_MSG_CHECK_VALUE "8302kdlso209f&3%#!%&&f"
class ioSP2TCPSocket : public ioClientTCPSocket
{
public:
virtual void ConnectProcess();
virtual void DisconnectProcess();
virtual void ProcessPacket( CPacket &rkPacket );
virtual bool CheckNS( CPacket &rkPacket );
UINT GetWndMsg() {return m_WndMsg;};
public:
void InitState();
public:
ioSP2TCPSocket();
virtual ~ioSP2TCPSocket();
};
//////////////////////////////////////////////////////////////////////////
class FSM;
class ioTCPClientSecurity : public NetworkSecurity
{
FSM m_SndState;
FSM m_RcvState;
public:
void InitState();
// Packet CheckSum
protected:
void EncryptMsg( CPacket &rkPacket );
void DecryptMsg( CPacket &rkPacket );
public:
virtual bool IsCheckSum( CPacket &rkPacket );
// Packet Replay
public:
virtual int GetSndState();
virtual void UpdateSndState();
virtual int GetRcvState();
virtual void UpdateRcvState();
virtual bool CheckState( CPacket &rkPacket );
// Send
public:
virtual void PrepareMsg( CPacket &rkPacket );
virtual void CompletionMsg( CPacket &rkPacket );
public:
ioTCPClientSecurity();
virtual ~ioTCPClientSecurity();
};
#endif
+254
View File
@@ -0,0 +1,254 @@
/*
* This code implements the MD5 message-digest algorithm.
* The algorithm is due to Ron Rivest. This code was
* written by Colin Plumb in 1993, no copyright is claimed.
* This code is in the public domain; do with it what you wish.
*
* Equivalent code is available from RSA Data Security, Inc.
* This code has been tested against that, and is equivalent,
* except that you don't need to include two pages of legalese
* with every copy.
*
* To compute the message digest of a chunk of bytes, declare an
* MD5Context structure, pass it to MD5Init, call MD5Update as
* needed on buffers full of bytes, and then call MD5Final, which
* will fill a supplied 16-byte array with the digest.
*/
#include "../stdafx.h"
#include "md5.h"
#include <memory.h>
#ifndef HIGHFIRST
#define byteReverse(buf, len) /* Nothing */
#else
void byteReverse(unsigned char *buf, unsigned longs);
#ifndef ASM_MD5
/*
* Note: this code is harmless on little-endian machines.
*/
void byteReverse(unsigned char *buf, unsigned longs)
{
DWORD t;
do {
t = (DWORD) ((unsigned) buf[3] << 8 | buf[2]) << 16 |
((unsigned) buf[1] << 8 | buf[0]);
*(DWORD *) buf = t;
buf += 4;
} while (--longs);
}
#endif
#endif
/*
* Start MD5 accumulation. Set bit count to 0 and buffer to mysterious
* initialization constants.
*/
void MD5Init(MD5Context *ctx)
{
ctx->buf[0] = 0x67452301;
ctx->buf[1] = 0xefcdab89;
ctx->buf[2] = 0x98badcfe;
ctx->buf[3] = 0x10325476;
ctx->bits[0] = 0;
ctx->bits[1] = 0;
}
/*
* Update context to reflect the concatenation of another buffer full
* of bytes.
*/
void MD5Update(MD5Context *ctx, unsigned char const *buf, unsigned len)
{
DWORD t;
/* Update bitcount */
t = ctx->bits[0];
if ((ctx->bits[0] = t + ((DWORD) len << 3)) < t)
ctx->bits[1]++; /* Carry from low to high */
ctx->bits[1] += len >> 29;
t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
/* Handle any leading odd-sized chunks */
if (t) {
unsigned char *p = (unsigned char *) ctx->in + t;
t = 64 - t;
if (len < t) {
memcpy(p, buf, len);
return;
}
memcpy(p, buf, t);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (DWORD *) ctx->in);
buf += t;
len -= t;
}
/* Process data in 64-byte chunks */
while (len >= 64) {
memcpy(ctx->in, buf, 64);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (DWORD *) ctx->in);
buf += 64;
len -= 64;
}
/* Handle any remaining bytes of data. */
memcpy(ctx->in, buf, len);
}
/*
* Final wrapup - pad to 64-byte boundary with the bit pattern
* 1 0* (64-bit count of bits processed, MSB-first)
*/
void MD5Final(unsigned char digest[16], MD5Context *ctx)
{
unsigned count;
unsigned char *p;
/* Compute number of bytes mod 64 */
count = (ctx->bits[0] >> 3) & 0x3F;
/* Set the first char of padding to 0x80. This is safe since there is
always at least one byte free */
p = ctx->in + count;
*p++ = 0x80;
/* Bytes of padding needed to make 64 bytes */
count = 64 - 1 - count;
/* Pad out to 56 mod 64 */
if (count < 8) {
/* Two lots of padding: Pad the first block to 64 bytes */
memset(p, 0, count);
byteReverse(ctx->in, 16);
MD5Transform(ctx->buf, (DWORD *) ctx->in);
/* Now fill the next block with 56 bytes */
memset(ctx->in, 0, 56);
} else {
/* Pad block to 56 bytes */
memset(p, 0, count - 8);
}
byteReverse(ctx->in, 14);
/* Append length in bits and transform */
((DWORD *) ctx->in)[14] = ctx->bits[0];
((DWORD *) ctx->in)[15] = ctx->bits[1];
MD5Transform(ctx->buf, (DWORD *) ctx->in);
byteReverse((unsigned char *) ctx->buf, 4);
memcpy(digest, ctx->buf, 16);
memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */
}
#ifndef ASM_MD5
/* The four core functions - F1 is optimized somewhat */
/* #define F1(x, y, z) (x & y | ~x & z) */
#define F1(x, y, z) (z ^ (x & (y ^ z)))
#define F2(x, y, z) F1(z, x, y)
#define F3(x, y, z) (x ^ y ^ z)
#define F4(x, y, z) (y ^ (x | ~z))
/* This is the central step in the MD5 algorithm. */
#define MD5STEP(f, w, x, y, z, data, s) \
( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
/*
* The core of the MD5 algorithm, this alters an existing MD5 hash to
* reflect the addition of 16 longwords of new data. MD5Update blocks
* the data and converts bytes into longwords for this routine.
*/
void MD5Transform(DWORD buf[4], DWORD const in[16])
{
register DWORD a, b, c, d;
a = buf[0];
b = buf[1];
c = buf[2];
d = buf[3];
MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
buf[0] += a;
buf[1] += b;
buf[2] += c;
buf[3] += d;
}
#endif
+22
View File
@@ -0,0 +1,22 @@
#ifndef _MD5_H
#define _MD5_H
typedef struct tagMD5Context
{
DWORD buf[4];
DWORD bits[2];
unsigned char in[64];
}MD5Context;
void MD5Init( MD5Context *context );
void MD5Update( MD5Context *context, unsigned char const *buf,
unsigned len );
void MD5Final( unsigned char digest[16], MD5Context *context );
void MD5Transform( DWORD buf[4], DWORD const in[16] );
/*
* This is needed to make RSAREF happy on some MS-DOS compilers.
*/
#endif /* !MD5_H */
+629
View File
@@ -0,0 +1,629 @@
// NoticeDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "NoticeDlg.h"
#include "afxdialogex.h"
using namespace std;
// CNoticeDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CNoticeDlg, CDialogEx)
CNoticeDlg::CNoticeDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CNoticeDlg::IDD, pParent)
, m_parent(NULL)
{
m_TimeNoticeMap.clear();
}
CNoticeDlg::~CNoticeDlg()
{
m_TimeNoticeMap.clear();
}
void CNoticeDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_START_DATE, m_ListStartDate);
DDX_Control(pDX, IDC_LIST_START_INTERVAL, m_ListInterval);
DDX_Control(pDX, IDC_LIST_END_DATE, m_ListEndDate);
DDX_Control(pDX, IDC_LIST_NOTICE, m_ListNotice);
DDX_Control(pDX, IDC_EDIT_START_DATE, m_EditStartDate);
DDX_Control(pDX, IDC_EDIT_INTERVAL, m_EditInterval);
DDX_Control(pDX, IDC_EDIT_END_DATE, m_EditEndDate);
DDX_Control(pDX, IDC_EDIT_NOTICE, m_EditNotice);
}
BEGIN_MESSAGE_MAP(CNoticeDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_INPUT, &CNoticeDlg::OnBnClickedButtonInput)
ON_BN_CLICKED(IDC_BUTTON_ANNOUNCE_TIME, &CNoticeDlg::OnBnClickedButtonAnnounceTime)
ON_BN_CLICKED(IDC_BUTTON_DELETE, &CNoticeDlg::OnBnClickedButtonDelete)
ON_BN_CLICKED(IDC_BUTTON_CLEAR, &CNoticeDlg::OnBnClickedButtonClear)
ON_WM_TIMER()
END_MESSAGE_MAP()
// CNoticeDlg 메시지 처리기입니다.
void CNoticeDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
BOOL CNoticeDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
InitList();
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CNoticeDlg::InitList()
{
m_ListStartDate.DeleteAllItems();
m_ListStartDate.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_ListStartDate.InsertColumn(0, _T("StartTime"), LVCFMT_LEFT, 80);
m_ListInterval.DeleteAllItems();
m_ListInterval.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_ListInterval.InsertColumn(0, _T("Interval"), LVCFMT_LEFT, 56);
m_ListEndDate.DeleteAllItems();
m_ListEndDate.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_ListEndDate.InsertColumn(0, _T("EndTime"), LVCFMT_LEFT, 80);
m_ListNotice.DeleteAllItems();
m_ListNotice.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_ListNotice.InsertColumn(0, _T("Notice"), LVCFMT_LEFT, 300);
}
void CNoticeDlg::OnBnClickedButtonInput()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString strStartDate;
m_EditStartDate.GetWindowText( strStartDate );
CString strInterval;
m_EditInterval.GetWindowText( strInterval );
CString strEndDate;
m_EditEndDate.GetWindowText( strEndDate );
CString strNotice;
m_EditNotice.GetWindowText( strNotice );
if( strStartDate.GetLength() == 0 ||
strInterval.GetLength() == 0 ||
strEndDate.GetLength() == 0 ||
strNotice.GetLength() == 0 )
return;
m_EditStartDate.SetWindowText( _T("") );
InsertStartDate( strStartDate );
m_EditInterval.SetWindowText( _T("") );
InsertInterval( strInterval );
m_EditEndDate.SetWindowText( _T("") );
InsertEndDate( strEndDate );
m_EditNotice.SetWindowText( _T("") );
InsertNotice( strNotice );
}
void CNoticeDlg::OnBnClickedButtonAnnounceTime()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
// 앞선 데이터 있으면 날려주고
std::map< int, IntervalData >::iterator it = m_TimeNoticeMap.begin();
for( ; it != m_TimeNoticeMap.end(); ++it )
{
KillTimer( it->first );
}
m_TimeNoticeMap.clear();
TimeCheck();
}
void CNoticeDlg::OnBnClickedButtonDelete()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
std::map< int, IntervalData >::iterator it;
UINT count = m_ListStartDate.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListStartDate );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
count = m_ListInterval.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListInterval );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
count = m_ListEndDate.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListEndDate );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
count = m_ListNotice.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListNotice );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
}
void CNoticeDlg::OnBnClickedButtonClear()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_ListStartDate.DeleteAllItems();
m_ListInterval.DeleteAllItems();
m_ListEndDate.DeleteAllItems();
m_ListNotice.DeleteAllItems();
m_EditStartDate.SetWindowText( _T("") );
m_EditInterval.SetWindowText( _T("") );
m_EditEndDate.SetWindowText( _T("") );
m_EditNotice.SetWindowText( _T("") );
std::map< int, IntervalData >::iterator it = m_TimeNoticeMap.begin();
for( ; it != m_TimeNoticeMap.end(); ++it )
{
KillTimer( it->first );
}
m_TimeNoticeMap.clear();
}
BOOL CNoticeDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if( WM_KEYDOWN == pMsg->message )
{
if( VK_RETURN == pMsg->wParam )
{
if( m_EditStartDate.GetSafeHwnd() == pMsg->hwnd )
{
CString strStartDate;
m_EditStartDate.GetWindowText( strStartDate );
m_EditStartDate.SetWindowText( _T("") );
InsertStartDate( strStartDate );
}
else if( m_EditInterval.GetSafeHwnd() == pMsg->hwnd )
{
CString strInterval;
m_EditInterval.GetWindowText( strInterval );
m_EditInterval.SetWindowText( _T("") );
InsertInterval( strInterval );
}
else if( m_EditEndDate.GetSafeHwnd() == pMsg->hwnd )
{
CString strEndDate;
m_EditEndDate.GetWindowText( strEndDate );
m_EditEndDate.SetWindowText( _T("") );
InsertEndDate( strEndDate );
}
else if( m_EditNotice.GetSafeHwnd() == pMsg->hwnd )
{
CString strNotice;
m_EditNotice.GetWindowText( strNotice );
m_EditNotice.SetWindowText( _T("") );
InsertNotice( strNotice );
}
return TRUE;
}
else if( VK_DELETE == pMsg->wParam )
{
std::map< int, IntervalData >::iterator it;
if( m_ListStartDate.GetSafeHwnd() == pMsg->hwnd )
{
UINT count = m_ListStartDate.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListStartDate );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
}
else if( m_ListInterval.GetSafeHwnd() == pMsg->hwnd )
{
UINT count = m_ListInterval.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListInterval );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
}
else if( m_ListEndDate.GetSafeHwnd() == pMsg->hwnd )
{
UINT count = m_ListEndDate.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListEndDate );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
}
else if( m_ListNotice.GetSafeHwnd() == pMsg->hwnd )
{
UINT count = m_ListNotice.GetSelectedCount();
if(count > 0)
{
DeleteListItem( m_ListNotice );
it = m_TimeNoticeMap.find( count );
if( it != m_TimeNoticeMap.end() )
KillTimer( count );
}
}
return TRUE;
}
}
return CDialogEx::PreTranslateMessage(pMsg);
}
void CNoticeDlg::InsertStartDate( CString startDate )
{
if( startDate.GetLength() == 0 )
return;
m_ListStartDate.InsertItem( m_ListStartDate.GetItemCount(), startDate );
}
void CNoticeDlg::InsertInterval( CString interval )
{
if( interval.GetLength() == 0 )
return;
m_ListInterval.InsertItem( m_ListInterval.GetItemCount(), interval );
}
void CNoticeDlg::InsertEndDate( CString endDate )
{
if( endDate.GetLength() == 0 )
return;
m_ListEndDate.InsertItem( m_ListEndDate.GetItemCount(), endDate );
}
void CNoticeDlg::InsertNotice( CString notice )
{
if( notice.GetLength() == 0 )
return;
m_ListNotice.InsertItem( m_ListNotice.GetItemCount(), notice );
}
void CNoticeDlg::DeleteListItem( CListCtrl& AllList )
{
int index = -1;
POSITION pos = AllList.GetFirstSelectedItemPosition();
while( pos )
{
int index = AllList.GetNextSelectedItem( pos );
AllList.DeleteItem( index );
pos = AllList.GetFirstSelectedItemPosition();
}
}
void CNoticeDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
std::map< int, IntervalData >::iterator it;
it = m_TimeNoticeMap.find( nIDEvent );
if( it == m_TimeNoticeMap.end() )
{
KillTimer( nIDEvent );
return;
}
CTime nowTime;
nowTime = CTime::GetCurrentTime();
CString strStartDate, strEndDate, strInterval;
char chStartDate[16] = {0,}, chEndDate[16] = {0,}, chInterval[16] = {0,};
int iStartDate = 0, iEndDate = 0, iInterval = 0;
char chNowDate[16] = {0,};
int iNowDate = 0;
sprintf_s( chNowDate, "%02d%02d%02d%02d", nowTime.GetMonth()
, nowTime.GetDay()
, nowTime.GetHour()
, nowTime.GetMinute() );
iNowDate = atoi( chNowDate );
strEndDate = m_ListEndDate.GetItemText( nIDEvent, 0 );
if( strEndDate.IsEmpty() )
{
KillTimer( nIDEvent );
return;
}
sprintf_s( chEndDate, "%s", strEndDate );
iEndDate = atoi( chEndDate );
strStartDate = m_ListStartDate.GetItemText( nIDEvent, 0 );
if( strStartDate.IsEmpty() )
{
KillTimer( nIDEvent );
return;
}
sprintf_s( chStartDate, "%s", strStartDate );
iStartDate = atoi( chStartDate );
// 공지가 시작 된 타입
if( it->second.eType == NOTICE_START_ON )
{
// 공지 호출
DoAnnounceTime( nIDEvent );
}
// 공지 시작
if( iStartDate == iNowDate )
{
if( it->second.eType == NOTICE_START_BEFORE )
{
it->second.eType = NOTICE_START_ON;
}
// 기존 시작 시점까지의 1분 interval 삭제
KillTimer( nIDEvent );
// 공지 호출
DoAnnounceTime( nIDEvent );
strInterval = m_ListInterval.GetItemText( nIDEvent, 0 );
if( strInterval.IsEmpty() )
return;
// 간격 시간 체크
sprintf_s( chInterval, "%s", strInterval );
iInterval = atoi( chInterval );
iInterval = iInterval * 60 * 1000;
SetTimer( nIDEvent, iInterval, NULL );
}
// 공지 종료
if( iEndDate == iNowDate )
{
m_TimeNoticeMap.erase( it );
// 종료
KillTimer( nIDEvent );
// 마지막 공지 호출
DoAnnounceTime( nIDEvent );
return;
}
// 현재 시각이 공지 시각 보다 뒤인 경우
if( iStartDate < iNowDate )
{
if( it->second.eType == NOTICE_START_AFTER )
{
std::list<int> IntervalTimeList;
IntervalTimeList = it->second.m_IntervalTimeList;
std::list<int>::iterator iter = IntervalTimeList.begin();
for( ; iter != IntervalTimeList.end(); ++iter )
{
// interval 시간값과 동일할 때 시작.
if( iNowDate == *iter )
{
if( it->second.eType == NOTICE_START_BEFORE )
{
it->second.eType = NOTICE_START_ON;
}
// 기존 시작 시점까지의 1분 interval 삭제
KillTimer( nIDEvent );
// 공지 호출
DoAnnounceTime( nIDEvent );
strInterval = m_ListInterval.GetItemText( nIDEvent, 0 );
if( strInterval.IsEmpty() )
return;
// 간격 시간 체크
sprintf_s( chInterval, "%s", strInterval );
iInterval = atoi( chInterval );
iInterval = iInterval * 60 * 1000;
SetTimer( nIDEvent, iInterval, NULL );
return;
}
}
}
}
CDialogEx::OnTimer(nIDEvent);
}
void CNoticeDlg::DoAnnounceTime( int iSelected )
{
CString strNotice;
strNotice = m_ListNotice.GetItemText( iSelected, 0 );
if( !strNotice.IsEmpty() )
{
m_parent->RequestAnnounce( ANNOUNCE_TYPE_ALL, "", strNotice );
}
}
void CNoticeDlg::TimeCheck()
{
CTime nowTime;
nowTime = CTime::GetCurrentTime();
char chNowDate[16] = {0,};
int iNowDate = 0;
CString strStartDate, strEndDate, strInterval;
char chStartDate[16], chEndDate[16], chInterval[16] = {0,};
int iStartDate, iEndDate, iInterval = 0;
sprintf_s( chNowDate, "%02d%02d%02d%02d", nowTime.GetMonth()
, nowTime.GetDay()
, nowTime.GetHour()
, nowTime.GetMinute() );
iNowDate = atoi( chNowDate );
// 종료시간을 보고 Timer 돌지 않을 항목 체크
int iCount = m_ListEndDate.GetItemCount();
for( int i = 0; i < iCount; ++i )
{
strEndDate = m_ListEndDate.GetItemText( i, 0 );
if( strEndDate.IsEmpty() )
continue;
sprintf_s( chEndDate, "%s", strEndDate );
iEndDate = atoi( chEndDate );
// 종료시간 지난 공지
if( iNowDate > iEndDate )
continue;
strStartDate = m_ListStartDate.GetItemText( i, 0 );
if( strStartDate.IsEmpty() )
continue;
sprintf_s( chStartDate, "%s", strStartDate );
iStartDate = atoi( chStartDate );
strInterval = m_ListInterval.GetItemText( i, 0 );
if( strInterval.IsEmpty() )
continue;
// 간격 시간 체크
sprintf_s( chInterval, "%s", strInterval );
iInterval = atoi( chInterval );
// 공지 시작
if( iStartDate == iNowDate )
{
iInterval = iInterval * 60 * 1000;
SetTimer( i, iInterval, NULL );
// 공지 호출
DoAnnounceTime( i );
IntervalData data;
data.eType = NOTICE_START_ON;
m_TimeNoticeMap.insert( pair< int, IntervalData > ( i, data ) );
}
else
{
IntervalData data;
// 시작 시각 전
// 1분마다 interval 을 주면서 해당 시각이 되었을 때 세팅된 interval 을 줌
if( iStartDate > iNowDate )
{
data.eType = NOTICE_START_BEFORE;
m_TimeNoticeMap.insert( pair< int, IntervalData > ( i, data ) );
}
// 시작 시각 후
// 1분마다 interval 을 주면서 iNowDate 가 몇 번의 interval 만큼 더 해졌을때 값이 같을지 세팅
else
{
int iIntervalTime = iStartDate;
data.eType = NOTICE_START_AFTER;
int iTemp = 0;
char chTemp[16] = {0,};
SYSTEMTIME sysTime;
GetLocalTime( &sysTime );
iTemp = iIntervalTime / 1000000;
sysTime.wMonth = iTemp;
iTemp = iIntervalTime / 10000 % 100;
sysTime.wDay = iTemp;
iTemp = iIntervalTime / 100 % 100;
sysTime.wHour = iTemp;
iTemp = iIntervalTime % 100;
sysTime.wMinute = iTemp;
CTime cTime( sysTime );
// Interval 시간 증가 된 값들 리스트로 삽입
while( iIntervalTime < iEndDate )
{
data.m_IntervalTimeList.push_back( iIntervalTime );
cTime += CTimeSpan( iInterval * 60 );
sprintf_s( chTemp, "%02d%02d%02d%02d", cTime.GetMonth()
, cTime.GetDay(), cTime.GetHour(), cTime.GetMinute() );
iIntervalTime = atoi( chTemp );
}
m_TimeNoticeMap.insert( pair< int, IntervalData > ( i, data ) );
}
// 구분자는 i. OnTimer 에서 event ID 로 들어간다.
SetTimer( i, 1000, NULL );
}
}
}
+93
View File
@@ -0,0 +1,93 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
#include <iostream>
#include <map>
#include <algorithm>
#include <list>
class CZoneDialog;
// CNoticeDlg 대화 상자입니다.
class CNoticeDlg : public CDialogEx
{
DECLARE_DYNAMIC(CNoticeDlg)
public:
CNoticeDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CNoticeDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_NOTICEDLG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_ListStartDate;
CListCtrl m_ListInterval;
CListCtrl m_ListEndDate;
CListCtrl m_ListNotice;
CEdit m_EditStartDate;
CEdit m_EditInterval;
CEdit m_EditEndDate;
CEdit m_EditNotice;
protected:
CZoneDialog* m_parent;
enum eNoticeType
{
NOTICE_NONE,
NOTICE_START_ON,
NOTICE_START_BEFORE,
NOTICE_START_AFTER,
NOTICE_END,
NOTICE_MAX
};
struct IntervalData
{
eNoticeType eType;
std::list<int> m_IntervalTimeList;
IntervalData()
{
Init();
}
void Init()
{
eType = NOTICE_NONE;
m_IntervalTimeList.clear();
}
};
std::map< int, IntervalData > m_TimeNoticeMap;
protected:
void InsertStartDate( CString startDate );
void InsertInterval( CString interval);
void InsertEndDate( CString endDate );
void InsertNotice( CString notice );
void TimeCheck();
void DoAnnounceTime( int iSelected );
public:
void Startup( CZoneDialog* parent );
void InitList();
void DeleteListItem( CListCtrl& AllList );
virtual BOOL OnInitDialog();
afx_msg void OnBnClickedButtonInput();
afx_msg void OnBnClickedButtonAnnounceTime();
afx_msg void OnBnClickedButtonDelete();
afx_msg void OnBnClickedButtonClear();
virtual BOOL PreTranslateMessage( MSG* pMsg );
afx_msg void OnTimer(UINT_PTR nIDEvent);
};
+816
View File
@@ -0,0 +1,816 @@
// OScopeCtrl.cpp : implementation file//
#include "stdafx.h"
#include "math.h"
#include "OScopeCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COScopeCtrl
COScopeCtrl::COScopeCtrl()
: m_bCountryCode(false)
{
// since plotting is based on a LineTo for each new point
// we need a starting point (i.e. a "previous" point)
// use 0.0 as the default first point.
// these are public member variables, and can be changed outside
// (after construction). Therefore m_perviousPosition could be set to
// a more appropriate value prior to the first call to SetPosition.
m_dPreviousPosition = 0.0;
// public variable for the number of decimal places on the y axis
m_nYDecimals = 3;
// set some initial values for the scaling until "SetRange" is called.
// these are protected varaibles and must be set with SetRange
// in order to ensure that m_dRange is updated accordingly
m_dLowerLimit = -10.0;
m_dUpperLimit = 10.0;
m_dLowerXLimit = 0.0;
m_dUpperYLimit = 24.0;
m_dRange = m_dUpperLimit - m_dLowerLimit; // protected member variable
// m_nShiftPixels determines how much the plot shifts (in terms of pixels)
// with the addition of a new data point
m_nShiftPixels = 4;
m_nHalfShiftPixels = m_nShiftPixels/2; // protected
m_nPlotShiftPixels = m_nShiftPixels + m_nHalfShiftPixels; // protected
// background, grid and data colors
// these are public variables and can be set directly
m_crBackColor = RGB( 0, 0, 0); // see also SetBackgroundColor
m_crGridColor = RGB( 0, 255, 255); // see also SetGridColor
m_crPlotColor = RGB(255, 255, 255); // see also SetPlotColor
//set country count color
m_crCCUColor[CI_EG] = CCU_RGB_ENG;
m_crCCUColor[CI_GE] = CCU_RGB_GER;
m_crCCUColor[CI_FR] = CCU_RGB_FRA;
m_crCCUColor[CI_IT] = CCU_RGB_ITA;
m_crCCUColor[CI_PL] = CCU_RGB_POL;
m_crCCUColor[CI_TR] = CCU_RGB_TUR;
m_crCCUColor[CI_ETC] = CCU_RGB_ETC;
// protected variables
m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor);
m_brushBack.CreateSolidBrush(m_crBackColor);
//crate ccu pen & CCUArray
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_CCUpen[i].CreatePen(PS_SOLID, 2, m_crCCUColor[i]);
m_dCurCCUPosition[i] = 0;
m_dPreCCUPosition[i] = 0;
}
// public member variables, can be set directly
m_strXUnitsString.Format(_T("Concurrent User(%06d/%06d)"), 0, 0); // can also be set with SetXUnits
m_strYUnitsString.Format(_T("Y units")); // can also be set with SetYUnits
// protected bitmaps to restore the memory DC's
m_pbitmapOldGrid = NULL;
m_pbitmapOldPlot = NULL;
InitToolTip();
} // COScopeCtrl
/////////////////////////////////////////////////////////////////////////////
COScopeCtrl::~COScopeCtrl()
{
// just to be picky restore the bitmaps for the two memory dc's
// (these dc's are being destroyed so there shouldn't be any leaks)
if (m_pbitmapOldGrid != NULL)
m_dcGrid.SelectObject(m_pbitmapOldGrid);
if (m_pbitmapOldPlot != NULL)
m_dcPlot.SelectObject(m_pbitmapOldPlot);
if (m_pbitmapCCUOldPlot[0] != NULL) //CCU
{
for(int i = 0 ; i < CI_MAX ; ++i)
m_dcCCUPlot[i].SelectObject(m_pbitmapCCUOldPlot[i]);
}
} // ~COScopeCtrl
BEGIN_MESSAGE_MAP(COScopeCtrl, CWnd)
//{{AFX_MSG_MAP(COScopeCtrl)
ON_WM_PAINT()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COScopeCtrl message handlers
/////////////////////////////////////////////////////////////////////////////
BOOL COScopeCtrl::Create(DWORD dwStyle, const RECT& rect,
CWnd* pParentWnd, UINT nID)
{
BOOL result;
static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
result = CWnd::CreateEx(
WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
className, NULL, dwStyle,
rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID);
if (result != 0)
InvalidateCtrl();
return result;
} // Create
void COScopeCtrl::SetToolTip(CString text)
{
m_toolTip.AddTool(this, text, NULL, 0);
m_toolTip.Activate(TRUE);
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetRange( bool b, double dLower, double dUpper, int nDecimalPlaces)
{
ASSERT(dUpper > dLower);
m_dLowerLimit = dLower;
m_dUpperLimit = dUpper;
m_nYDecimals = nDecimalPlaces;
m_dRange = m_dUpperLimit - m_dLowerLimit;
m_dVerticalFactor = (double)m_nPlotHeight / m_dRange;
// clear out the existing garbage, re-start with a clean plot
if( b )
InvalidateCtrl();
else
RefreshRange();
} // SetRange
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetXUnits(CString string)
{
m_strXUnitsString = string;
// clear out the existing garbage, re-start with a clean plot
//InvalidateCtrl();
InvalidateXUnits();
} // SetXUnits
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetYUnits(CString string)
{
m_strYUnitsString = string;
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetYUnits
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetGridColor(COLORREF color)
{
m_crGridColor = color;
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetGridColor
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetPlotColor(COLORREF color)
{
m_crPlotColor = color;
m_penPlot.DeleteObject();
m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor);
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetPlotColor
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::SetBackgroundColor(COLORREF color)
{
m_crBackColor = color;
m_brushBack.DeleteObject();
m_brushBack.CreateSolidBrush(m_crBackColor);
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetBackgroundColor
void COScopeCtrl::InitToolTip()
{
if (m_toolTip.m_hWnd == NULL)
{
m_toolTip.Create(this);
m_toolTip.Activate(FALSE);
m_toolTip.SetDelayTime(TTDT_AUTOPOP, 800);
}
}
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::RefreshRange()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
int i = 0;
int nCharacters = 0;
int nTopGridPix = 0, nMidGridPix = 0, nBottomGridPix = 0;
CPen *oldPen = NULL;
CPen solidPen(PS_SOLID, 0, m_crGridColor);
CFont axisFont, yUnitFont, *oldFont;
CString strTemp;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
m_dcGrid.SetBkColor (m_crBackColor);
// fill the grid background
m_dcGrid.FillRect(m_rectClient, &m_brushBack);
// draw the plot rectangle:
// determine how wide the y axis scaling values are
nCharacters = abs((int)log10(fabs(m_dUpperLimit)));
nCharacters = max(nCharacters, abs((int)log10(fabs(m_dLowerLimit))));
//nCharacters = 3;
// add the units digit, decimal point and a minus sign, and an extra space
// as well as the number of decimal places to display
nCharacters = nCharacters + 4 + m_nYDecimals;
// adjust the plot rectangle dimensions
// assume 6 pixels per character (this may need to be adjusted)
m_rectPlot.left = m_rectClient.left + 4*(nCharacters);
m_nPlotWidth = m_rectPlot.Width();
// draw the plot rectangle
oldPen = m_dcGrid.SelectObject (&solidPen);
m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.SelectObject (oldPen);
// draw the dotted lines,
// use SetPixel instead of a dotted pen - this allows for a
// finer dotted line and a more "technical" look
nMidGridPix = (m_rectPlot.top + m_rectPlot.bottom)/2;
nTopGridPix = nMidGridPix - m_nPlotHeight/4;
nBottomGridPix = nMidGridPix + m_nPlotHeight/4;
for (i=m_rectPlot.left; i<m_rectPlot.right; i+=4)
{
m_dcGrid.SetPixel (i, nTopGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nMidGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nBottomGridPix, m_crGridColor);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
yUnitFont.CreateFont (14, 0, 900, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
// y max
m_dcGrid.SetTextColor (m_crGridColor);
m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
//strTemp.Format (_T("%.*lf"), m_nYDecimals, m_dUpperLimit);
strTemp.Format (_T("%d"), (int)m_dUpperLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.top, strTemp);
// y min
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BASELINE);
//strTemp.Format (_T("%.*lf"), m_nYDecimals, m_dLowerLimit);
strTemp.Format (_T("%d"), (int)m_dLowerLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.bottom, strTemp);
//// x min
//m_dcGrid.SetTextAlign (TA_LEFT|TA_TOP);
//m_dcGrid.TextOut (m_rectPlot.left, m_rectPlot.bottom+4, _T("0"));
//// x max
//m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
//strTemp.Format (_T("%d"), m_nPlotWidth/m_nShiftPixels);
//m_dcGrid.TextOut (m_rectPlot.right, m_rectPlot.bottom+4, strTemp);
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2,
m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// y units
oldFont = m_dcGrid.SelectObject(&yUnitFont);
m_dcGrid.SetTextAlign (TA_CENTER|TA_BASELINE);
m_dcGrid.TextOut ((m_rectClient.left+m_rectPlot.left)/2,
(m_rectPlot.bottom+m_rectPlot.top)/2, m_strYUnitsString);
m_dcGrid.SelectObject(oldFont);
// at this point we are done filling the the grid bitmap,
// no more drawing to this bitmap is needed until the setting are changed
// if we don't have one yet, set up a memory dc for the plot
if (m_dcPlot.GetSafeHdc() == NULL)
{
m_dcPlot.CreateCompatibleDC(&dc);
m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot);
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_dcCCUPlot[i].CreateCompatibleDC(&dc);
m_bitmapCCUPlot[i].CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapCCUOldPlot[i] = m_dcCCUPlot[i].SelectObject(&m_bitmapCCUPlot[i]);
}
}
/*
// make sure the plot bitmap is cleared
m_dcPlot.SetBkColor (m_crBackColor);
m_dcPlot.FillRect(m_rectClient, &m_brushBack);
*/
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
}
void COScopeCtrl::InvalidateCtrl()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
int i;
int nCharacters;
int nTopGridPix, nMidGridPix, nBottomGridPix;
CPen *oldPen;
CPen solidPen(PS_SOLID, 0, m_crGridColor);
CFont axisFont, yUnitFont, *oldFont;
CString strTemp;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
m_dcGrid.SetBkColor (m_crBackColor);
// fill the grid background
m_dcGrid.FillRect(m_rectClient, &m_brushBack);
// draw the plot rectangle:
// determine how wide the y axis scaling values are
nCharacters = abs((int)log10(fabs(m_dUpperLimit)));
nCharacters = max(nCharacters, abs((int)log10(fabs(m_dLowerLimit))));
// add the units digit, decimal point and a minus sign, and an extra space
// as well as the number of decimal places to display
nCharacters = nCharacters + 4 + m_nYDecimals;
// adjust the plot rectangle dimensions
// assume 6 pixels per character (this may need to be adjusted)
m_rectPlot.left = m_rectClient.left + 4*(nCharacters);
m_nPlotWidth = m_rectPlot.Width();
// draw the plot rectangle
oldPen = m_dcGrid.SelectObject (&solidPen);
m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.SelectObject (oldPen);
// draw the dotted lines,
// use SetPixel instead of a dotted pen - this allows for a
// finer dotted line and a more "technical" look
nMidGridPix = (m_rectPlot.top + m_rectPlot.bottom)/2;
nTopGridPix = nMidGridPix - m_nPlotHeight/4;
nBottomGridPix = nMidGridPix + m_nPlotHeight/4;
for (i=m_rectPlot.left; i<m_rectPlot.right; i+=4)
{
m_dcGrid.SetPixel (i, nTopGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nMidGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nBottomGridPix, m_crGridColor);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
yUnitFont.CreateFont (14, 0, 900, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
// y max
m_dcGrid.SetTextColor (m_crGridColor);
m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
//strTemp.Format ("%.*lf", m_nYDecimals, m_dUpperLimit);
strTemp.Format (_T("%d"), (int)m_dUpperLimit);
m_dcGrid.TextOut (m_rectPlot.left, m_rectPlot.top, strTemp);
// y min
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BASELINE);
//strTemp.Format ("%.*lf", m_nYDecimals, m_dLowerLimit);
strTemp.Format (_T("%d"), (int)m_dLowerLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.bottom, strTemp);
// x min
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BOTTOM);
strTemp.Format (_T("%d"), (int)m_dUpperYLimit);
m_dcGrid.TextOut (m_rectPlot.right, m_rectPlot.bottom+10, strTemp);
// x max
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BOTTOM);
strTemp.Format ("%d", (int)m_dLowerXLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.bottom+10, strTemp);
if( strTemp == "102" )
{
TRACE( "%s\n", strTemp );
}
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2,
m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// y units
oldFont = m_dcGrid.SelectObject(&yUnitFont);
m_dcGrid.SetTextAlign (TA_CENTER|TA_BASELINE);
m_dcGrid.TextOut ((m_rectClient.left+m_rectPlot.left)/2, (m_rectPlot.bottom+m_rectPlot.top)/2, m_strYUnitsString);
m_dcGrid.SelectObject(oldFont);
// at this point we are done filling the the grid bitmap,
// no more drawing to this bitmap is needed until the setting are changed
// if we don't have one yet, set up a memory dc for the plot
if (m_dcPlot.GetSafeHdc() == NULL)
{
m_dcPlot.CreateCompatibleDC(&dc);
m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot);
}
for(int i = 0 ; i < CI_MAX ; ++i)
{
if(m_dcCCUPlot[i].GetSafeHdc() == NULL)
{
m_dcCCUPlot[i].CreateCompatibleDC(&dc);
m_bitmapCCUPlot[i].CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapCCUOldPlot[i] = m_dcCCUPlot[i].SelectObject(&m_bitmapCCUPlot[i]);
}
}
// make sure the plot bitmap is cleared
m_dcPlot.SetBkColor (m_crBackColor);
m_dcPlot.FillRect(m_rectClient, &m_brushBack);
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
} // InvalidateCtrl
void COScopeCtrl::InvalidateXUnits()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
CFont axisFont, *oldFont;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2, m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
}
/////////////////////////////////////////////////////////////////////////////
double COScopeCtrl::AppendPoint(bool bCCU, double dNewPoint)
{
// append a data point to the plot
// return the previous point
m_bCountryCode = bCCU;
double dPrevious;
dPrevious = m_dCurrentPosition;
m_dCurrentPosition = dNewPoint;
DrawPoint();
Invalidate();
return dPrevious;
} // AppendPoint
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::AppendCCUPoint(double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC )
{
m_dCurCCUPosition[CI_EG] = dNewGB;
m_dCurCCUPosition[CI_GE] = dNewDE;
m_dCurCCUPosition[CI_FR] = dNewFR;
m_dCurCCUPosition[CI_IT] = dNewIT;
m_dCurCCUPosition[CI_PL] = dNewPL;
m_dCurCCUPosition[CI_TR] = dNewTR;
m_dCurCCUPosition[CI_ETC] = dNewETC;
} //AppendCCUPoint
////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC memDC;
CBitmap memBitmap;
CBitmap* oldBitmap; // bitmap originally found in CMemDC
// no real plotting work is performed here,
// just putting the existing bitmaps on the client
// to avoid flicker, establish a memory dc, draw to it
// and then BitBlt it to the client
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap);
if (memDC.GetSafeHdc() != NULL)
{
// first drop the grid on the memory dc
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcGrid, 0, 0, SRCCOPY);
// now add the plot on top as a "pattern" via SRCPAINT.
// works well with dark background and a light plot
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcPlot, 0, 0, SRCPAINT); //SRCPAINT
//CCU
if(m_bCountryCode)
{
for(int i = 0 ; i < CI_MAX ; ++i)
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcCCUPlot[i], 0, 0, SRCPAINT);
}
// finally send the result to the display
dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &memDC, 0, 0, SRCCOPY);
}
memDC.SelectObject(oldBitmap);
} // OnPaint
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::DrawPoint()
{
// this does the work of "scrolling" the plot to the left
// and appending a new data point all of the plotting is
// directed to the memory based bitmap associated with m_dcPlot
// the will subsequently be BitBlt'd to the client in OnPaint
int currX, prevX, currY, prevY;
int currCCUX[CI_MAX], prevCCUX[CI_MAX], currCCUY[CI_MAX], prevCCUY[CI_MAX];
CPen *oldPen;
CPen *oldCCUPen[CI_MAX];
CRect rectCleanUp;
if (m_dcPlot.GetSafeHdc() != NULL)
{
// shift the plot by BitBlt'ing it to itself
// note: the m_dcPlot covers the entire client
// but we only shift bitmap that is the size
// of the plot rectangle
// grab the right side of the plot (exluding m_nShiftPixels on the left)
// move this grabbed bitmap to the left by m_nShiftPixels
m_dcPlot.BitBlt(m_rectPlot.left, m_rectPlot.top+1, m_nPlotWidth, m_nPlotHeight, &m_dcPlot, m_rectPlot.left+m_nShiftPixels, m_rectPlot.top+1, SRCCOPY);
// establish a rectangle over the right side of plot
// which now needs to be cleaned up proir to adding the new point
rectCleanUp = m_rectPlot;
rectCleanUp.left = rectCleanUp.right - m_nShiftPixels;
// fill the cleanup area with the background
m_dcPlot.FillRect(rectCleanUp, &m_brushBack);
// draw the next line segement
// grab the plotting pen
oldPen = m_dcPlot.SelectObject(&m_penPlot);
// move to the previous point
prevX = m_rectPlot.right - m_nPlotShiftPixels;
prevY = m_rectPlot.bottom - (long)((m_dPreviousPosition - m_dLowerLimit) * m_dVerticalFactor);
m_dcPlot.MoveTo (prevX, prevY);
// draw to the current point
currX = m_rectPlot.right-m_nHalfShiftPixels;
currY = m_rectPlot.bottom - (long)((m_dCurrentPosition - m_dLowerLimit) * m_dVerticalFactor);
m_dcPlot.LineTo (currX, currY);
// restore the pen
m_dcPlot.SelectObject(oldPen);
// if the data leaks over the upper or lower plot boundaries
// fill the upper and lower leakage with the background
// this will facilitate clipping on an as needed basis
// as opposed to always calling IntersectClipRect
if ((prevY <= m_rectPlot.top) || (currY <= m_rectPlot.top))
m_dcPlot.FillRect(CRect(prevX, m_rectClient.top, currX+1, m_rectPlot.top+1), &m_brushBack);
if ((prevY >= m_rectPlot.bottom) || (currY >= m_rectPlot.bottom))
m_dcPlot.FillRect(CRect(prevX, m_rectPlot.bottom+1, currX+1, m_rectClient.bottom+1), &m_brushBack);
// store the current point for connection to the next point
m_dPreviousPosition = m_dCurrentPosition;
if(m_bCountryCode)
{
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_dcCCUPlot[i].BitBlt(m_rectPlot.left, m_rectPlot.top+1, m_nPlotWidth, m_nPlotHeight, &m_dcCCUPlot[i], m_rectPlot.left+m_nShiftPixels, m_rectPlot.top+1, SRCCOPY);
if(m_dcCCUPlot[i].GetSafeHdc() != NULL)
{
//grab the plotting pen
oldCCUPen[i] = m_dcCCUPlot[i].SelectObject(&m_CCUpen[i]);
//previous point
prevCCUX[i] = m_rectPlot.right - m_nPlotShiftPixels;
prevCCUY[i] = m_rectPlot.bottom - (long)((m_dPreCCUPosition[i] - m_dLowerLimit) * m_dVerticalFactor);
m_dcCCUPlot[i].MoveTo(prevCCUX[i], prevCCUY[i]);
//current point
currCCUX[i] = m_rectPlot.right-m_nHalfShiftPixels;
currCCUY[i] = m_rectPlot.bottom - (long)((m_dCurCCUPosition[i] - m_dLowerLimit) * m_dVerticalFactor);
m_dcCCUPlot[i].LineTo (currCCUX[i], currCCUY[i]);
//restore the pen
m_dcCCUPlot[i].SelectObject(oldCCUPen[i]);
if ((prevCCUY[i] <= m_rectPlot.top) || (currCCUY[i] <= m_rectPlot.top))
m_dcCCUPlot[i].FillRect(CRect(prevCCUX[i], m_rectClient.top, currCCUX[i]+1, m_rectPlot.top+1), &m_brushBack);
if ((prevCCUY[i] >= m_rectPlot.bottom) || (currCCUY[i] >= m_rectPlot.bottom))
m_dcCCUPlot[i].FillRect(CRect(prevCCUX[i], m_rectPlot.bottom+1, currCCUX[i]+1, m_rectClient.bottom+1), &m_brushBack);
// store the current point for connection to the next point
m_dPreCCUPosition[i] = m_dCurCCUPosition[i];
}
}
}
}
} // end DrawPoint
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// NOTE: OnSize automatically gets called during the setup of the control
GetClientRect(m_rectClient);
// set some member variables to avoid multiple function calls
m_nClientHeight = m_rectClient.Height();
m_nClientWidth = m_rectClient.Width();
// the "left" coordinate and "width" will be modified in
// InvalidateCtrl to be based on the width of the y axis scaling
m_rectPlot.left = 5;
m_rectPlot.top = 5;
m_rectPlot.right = m_rectClient.right-10;
m_rectPlot.bottom = m_rectClient.bottom-20;
// set some member variables to avoid multiple function calls
m_nPlotHeight = m_rectPlot.Height();
m_nPlotWidth = m_rectPlot.Width();
// set the scaling factor for now, this can be adjusted
// in the SetRange functions
m_dVerticalFactor = (double)m_nPlotHeight / m_dRange;
} // OnSize
/////////////////////////////////////////////////////////////////////////////
void COScopeCtrl::Reset()
{
m_dPreviousPosition = 0;
m_dCurrentPosition = 0;
InvalidateCtrl();
}
int COScopeCtrl::GetWidth()
{
int nWidth = m_rectPlot.right - m_rectPlot.left;
return nWidth;
}
BOOL COScopeCtrl::PreTranslateMessage(MSG* pMsg)
{
m_toolTip.RelayEvent(pMsg);
return CWnd::PreTranslateMessage(pMsg);
}
int COScopeCtrl::GetRightPixel()
{
return m_rectPlot.right;
}
int COScopeCtrl::GetLeftPixel()
{
return m_rectPlot.left;
}
+113
View File
@@ -0,0 +1,113 @@
// OScopeCtrl.h : header file
//
#pragma once
/////////////////////////////////////////////////////////////////////////////
// COScopeCtrl window
class COScopeCtrl : public CWnd
{
// Construction
public:
// COScopeCtrl(int iLine = 1);
COScopeCtrl();
virtual ~COScopeCtrl();
// Attributes
public:
double AppendPoint(bool bCCU, double dNewPoint);
void AppendCCUPoint( double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC);
void SetToolTip(CString string);
void SetRange(bool b, double dLower, double dUpper, int nDecimalPlaces=1);
void SetXUnits(CString string);
void SetYUnits(CString string);
void SetGridColor(COLORREF color);
void SetPlotColor(COLORREF color);
void SetBackgroundColor(COLORREF color);
void InitToolTip();
void RefreshRange();
void InvalidateCtrl();
void InvalidateXUnits();
void DrawPoint();
void Reset();
// Operations
public:
int GetWidth();
int GetRightPixel();
int GetLeftPixel();
BOOL PreTranslateMessage(MSG* pMsg);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COScopeCtrl)
public:
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
//}}AFX_VIRTUAL
// Implementation
public:
int m_nShiftPixels; // amount to shift with each new point
int m_nYDecimals;
CString m_strXUnitsString;
CString m_strYUnitsString;
COLORREF m_crBackColor; // background color
COLORREF m_crGridColor; // grid color
COLORREF m_crPlotColor; // data color
COLORREF m_crCCUColor[CI_MAX];
double m_dCurrentPosition; // current position
double m_dPreviousPosition; // previous position
//CCU Point
double m_dCurCCUPosition[CI_MAX]; // current position
double m_dPreCCUPosition[CI_MAX]; // previous position
bool m_bCountryCode;
// Generated message map functions
protected:
//{{AFX_MSG(COScopeCtrl)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
int m_nHalfShiftPixels;
int m_nPlotShiftPixels;
int m_nClientHeight;
int m_nClientWidth;
int m_nPlotHeight;
int m_nPlotWidth;
double m_dLowerLimit; // lower bounds
double m_dUpperLimit; // upper bounds
double m_dLowerXLimit; // lower bounds
double m_dUpperYLimit; // upper bounds
double m_dRange;
double m_dVerticalFactor;
CRect m_rectClient;
CRect m_rectPlot;
CPen m_penPlot;
CPen m_CCUpen[CI_MAX];
CBrush m_brushBack;
CDC m_dcGrid;
CDC m_dcPlot;
CDC m_dcCCUPlot[CI_MAX];
CBitmap *m_pbitmapOldGrid;
CBitmap *m_pbitmapOldPlot;
CBitmap *m_pbitmapCCUOldPlot[CI_MAX];
CBitmap m_bitmapGrid;
CBitmap m_bitmapPlot;
CBitmap m_bitmapCCUPlot[CI_MAX];
CToolTipCtrl m_toolTip;
};
@@ -0,0 +1,942 @@
// OScopeTimeCtrl.cpp : implementation file//
#include "stdafx.h"
#include "math.h"
#include "OScopeTimeCtrl.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COScopeTimeCtrl
COScopeTimeCtrl::COScopeTimeCtrl()
: m_bCountryCode(false)
{
InitDate();
m_nYDecimals = 3;
m_dLowerLimit = -10.0;
m_dUpperLimit = 10.0;
m_dLowerXLimit = 0.0;
m_dUpperYLimit = 24.0;
m_dRange = m_dUpperLimit - m_dLowerLimit; // protected member variable
m_nShiftPixels = 0;
m_nHalfShiftPixels = m_nShiftPixels/2; // protected
m_nPlotShiftPixels = m_nShiftPixels + m_nHalfShiftPixels; // protected
m_crBackColor = RGB( 0, 0, 0); // see also SetBackgroundColor
m_crGridColor = RGB( 0, 255, 255); // see also SetGridColor
m_crPlotColor = RGB(255, 255, 255); // see also SetPlotColor
//set country count color
m_crCCUColor[CI_EG] = CCU_RGB_ENG;
m_crCCUColor[CI_GE] = CCU_RGB_GER;
m_crCCUColor[CI_FR] = CCU_RGB_FRA;
m_crCCUColor[CI_IT] = CCU_RGB_ITA;
m_crCCUColor[CI_PL] = CCU_RGB_POL;
m_crCCUColor[CI_TR] = CCU_RGB_TUR;
m_crCCUColor[CI_ETC] = CCU_RGB_ETC;
// protected variables
m_penPlot.CreatePen(PS_SOLID, 1, m_crPlotColor);
m_brushBack.CreateSolidBrush(m_crBackColor);
//crate ccu pen & CCUArray
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_CCUpen[i].CreatePen(PS_SOLID, 2, m_crCCUColor[i]);
m_dCurCCUPosition[i] = 0;
m_dPreCCUPosition[i] = 0;
}
// public member variables, can be set directly
m_strXUnitsString.Format(_T("Concurrent User(%06d/%06d)"), 0, 0); // can also be set with SetXUnits
m_strYUnitsString.Format(_T("Y units")); // can also be set with SetYUnits
// protected bitmaps to restore the memory DC's
m_pbitmapOldGrid = NULL;
m_pbitmapOldPlot = NULL;
InitToolTip();
} // COScopeTimeCtrl
/////////////////////////////////////////////////////////////////////////////
COScopeTimeCtrl::~COScopeTimeCtrl()
{
if (m_pbitmapOldGrid != NULL)
m_dcGrid.SelectObject(m_pbitmapOldGrid);
if (m_pbitmapOldPlot != NULL)
m_dcPlot.SelectObject(m_pbitmapOldPlot);
if (m_pbitmapCCUOldPlot[0] != NULL) //CCU
{
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_dcCCUPlot[i].SelectObject(m_pbitmapCCUOldPlot[i]);
}
}
} // ~COScopeTimeCtrl
BEGIN_MESSAGE_MAP(COScopeTimeCtrl, CWnd)
ON_WM_PAINT()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COScopeTimeCtrl message handlers
/////////////////////////////////////////////////////////////////////////////
BOOL COScopeTimeCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
BOOL result;
static CString className = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW);
result = CWnd::CreateEx(
WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
className, NULL, dwStyle,
rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
pParentWnd->GetSafeHwnd(), (HMENU)nID);
if (result != 0)
InvalidateCtrl();
return result;
} // Create
void COScopeTimeCtrl::InitDate()
{
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
m_stPrevDateTime = sysTime;
m_stPrevDateTime.wHour = 0;
m_stPrevDateTime.wMinute = 0;
m_stPrevDateTime.wSecond = 0;
m_stPrevDateTime.wMilliseconds = 0;
m_dPreviousPosition = 0.0;
m_bGraph = false;
}
void COScopeTimeCtrl::DateSetting(int iYear, int iMonth, int iDay, int iDayOfWeek, int iHour, int iMinute, int iSecond, int iMilliseconds)
{
m_stPrevDateTime.wYear = iYear;
m_stPrevDateTime.wMonth = iMonth;
m_stPrevDateTime.wDay = iDay;
m_stPrevDateTime.wDayOfWeek = iDayOfWeek;
m_stPrevDateTime.wHour = iHour;
m_stPrevDateTime.wMinute = iMinute;
m_stPrevDateTime.wSecond = iSecond;
m_stPrevDateTime.wMilliseconds = iMilliseconds;
}
void COScopeTimeCtrl::SetToolTip(CString text)
{
m_toolTip.SetMaxTipWidth(10);
m_toolTip.AddTool(this, text, NULL, 0);
m_toolTip.Activate(TRUE);
}
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetRange( bool b, double dLower, double dUpper, int nDecimalPlaces)
{
ASSERT(dUpper >= dLower);
m_dLowerLimit = dLower;
m_dUpperLimit = dUpper;
m_nYDecimals = nDecimalPlaces;
m_dRange = m_dUpperLimit - m_dLowerLimit;
m_dVerticalFactor = (double)m_nPlotHeight / m_dRange;
// clear out the existing garbage, re-start with a clean plot
if( b )
InvalidateCtrl();
else
RefreshRange();
} // SetRange
void COScopeTimeCtrl::SetDay(int iDay)
{
m_day = iDay;
} // SetXUnits
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetXUnits(CString string)
{
m_strXUnitsString = string;
// clear out the existing garbage, re-start with a clean plot
//InvalidateCtrl();
InvalidateXUnits();
} // SetXUnits
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetYUnits(CString string)
{
m_strYUnitsString = string;
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetYUnits
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetGridColor(COLORREF color)
{
m_crGridColor = color;
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetGridColor
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetPlotColor(COLORREF color)
{
m_crPlotColor = color;
m_penPlot.DeleteObject();
m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor);
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetPlotColor
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::SetBackgroundColor(COLORREF color)
{
m_crBackColor = color;
m_brushBack.DeleteObject();
m_brushBack.CreateSolidBrush(m_crBackColor);
// clear out the existing garbage, re-start with a clean plot
InvalidateCtrl();
} // SetBackgroundColor
void COScopeTimeCtrl::InitToolTip()
{
if (m_toolTip.m_hWnd == NULL)
{
m_toolTip.Create(this);
m_toolTip.Activate(FALSE);
m_toolTip.SetDelayTime(TTDT_AUTOPOP, 800);
}
}
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::RefreshRange()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
int i = 0;
int nCharacters = 0;
int nTopGridPix = 0, nMidGridPix = 0, nBottomGridPix = 0;
CPen *oldPen = NULL;
CPen solidPen(PS_SOLID, 0, m_crGridColor);
CFont axisFont, yUnitFont, *oldFont;
CString strTemp;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
m_dcGrid.SetBkColor (m_crBackColor);
// fill the grid background
m_dcGrid.FillRect(m_rectClient, &m_brushBack);
// draw the plot rectangle:
// determine how wide the y axis scaling values are
nCharacters = abs((int)log10(fabs(m_dUpperLimit)));
nCharacters = max(nCharacters, abs((int)log10(fabs(m_dLowerLimit))));
//nCharacters = 3;
// add the units digit, decimal point and a minus sign, and an extra space
// as well as the number of decimal places to display
nCharacters = nCharacters + 4 + m_nYDecimals;
// adjust the plot rectangle dimensions
// assume 6 pixels per character (this may need to be adjusted)
m_rectPlot.left = m_rectClient.left + 4*(nCharacters);
m_nPlotWidth = m_rectPlot.Width();
// draw the plot rectangle
oldPen = m_dcGrid.SelectObject (&solidPen);
m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.SelectObject (oldPen);
// draw the dotted lines,
// use SetPixel instead of a dotted pen - this allows for a
// finer dotted line and a more "technical" look
nMidGridPix = (m_rectPlot.top + m_rectPlot.bottom)/2;
nTopGridPix = nMidGridPix - m_nPlotHeight/4;
nBottomGridPix = nMidGridPix + m_nPlotHeight/4;
for (i=m_rectPlot.left; i<m_rectPlot.right; i+=4)
{
m_dcGrid.SetPixel (i, nTopGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nMidGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nBottomGridPix, m_crGridColor);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
yUnitFont.CreateFont (14, 0, 900, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
// y max
m_dcGrid.SetTextColor (m_crGridColor);
m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
//strTemp.Format (_T("%.*lf"), m_nYDecimals, m_dUpperLimit);
strTemp.Format (_T("%d"), (int)m_dUpperLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.top, strTemp);
// y min
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BASELINE);
//strTemp.Format (_T("%.*lf"), m_nYDecimals, m_dLowerLimit);
strTemp.Format (_T("%d"), (int)m_dLowerLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.bottom, strTemp);
//// x min
//m_dcGrid.SetTextAlign (TA_LEFT|TA_TOP);
//m_dcGrid.TextOut (m_rectPlot.left, m_rectPlot.bottom+4, _T("0"));
//// x max
//m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
//strTemp.Format (_T("%d"), m_nPlotWidth/m_nShiftPixels);
//m_dcGrid.TextOut (m_rectPlot.right, m_rectPlot.bottom+4, strTemp);
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2,
m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// y units
oldFont = m_dcGrid.SelectObject(&yUnitFont);
m_dcGrid.SetTextAlign (TA_CENTER|TA_BASELINE);
m_dcGrid.TextOut ((m_rectClient.left+m_rectPlot.left)/2,
(m_rectPlot.bottom+m_rectPlot.top)/2, m_strYUnitsString);
m_dcGrid.SelectObject(oldFont);
// at this point we are done filling the the grid bitmap,
// no more drawing to this bitmap is needed until the setting are changed
// if we don't have one yet, set up a memory dc for the plot
if (m_dcPlot.GetSafeHdc() == NULL)
{
m_dcPlot.CreateCompatibleDC(&dc);
m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot);
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_dcCCUPlot[i].CreateCompatibleDC(&dc);
m_bitmapCCUPlot[i].CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapCCUOldPlot[i] = m_dcCCUPlot[i].SelectObject(&m_bitmapCCUPlot[i]);
}
}
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
}
void COScopeTimeCtrl::InvalidateCtrl()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
int i;
int nCharacters;
int nTopGridPix, nMidGridPix, nBottomGridPix;
CPen *oldPen;
CPen solidPen(PS_SOLID, 0, m_crGridColor);
CFont axisFont, yUnitFont, *oldFont;
CString strTemp;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
m_dcGrid.SetBkColor (m_crBackColor);
// fill the grid background
m_dcGrid.FillRect(m_rectClient, &m_brushBack);
// draw the plot rectangle:
// determine how wide the y axis scaling values are
nCharacters = abs((int)log10(fabs(m_dUpperLimit)));
nCharacters = max(nCharacters, abs((int)log10(fabs(m_dLowerLimit))));
// add the units digit, decimal point and a minus sign, and an extra space
// as well as the number of decimal places to display
nCharacters = nCharacters + 4 + m_nYDecimals;
// adjust the plot rectangle dimensions
// assume 6 pixels per character (this may need to be adjusted)
m_rectPlot.left = m_rectClient.left + 4*(10);
m_rectPlot.right = (m_rectClient.right - m_rectPlot.left)/ 24*24+m_rectPlot.left;
m_rectPlot.bottom = m_rectClient.bottom - 40;
m_nPlotHeight = m_rectPlot.Height();
m_nPlotWidth = m_rectPlot.Width();
// draw the plot rectangle
oldPen = m_dcGrid.SelectObject (&solidPen);
m_dcGrid.MoveTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left-1, m_rectPlot.top);
m_dcGrid.SelectObject (oldPen);
// draw the dotted lines,
// use SetPixel instead of a dotted pen - this allows for a
// finer dotted line and a more "technical" look
nMidGridPix = (m_rectPlot.top + m_rectPlot.bottom)/2;
nTopGridPix = nMidGridPix - m_nPlotHeight/4;
nBottomGridPix = nMidGridPix + m_nPlotHeight/4;
for (i=m_rectPlot.left; i<m_rectPlot.right; i+=4)
{
m_dcGrid.SetPixel (i, nTopGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nMidGridPix, m_crGridColor);
m_dcGrid.SetPixel (i, nBottomGridPix, m_crGridColor);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
yUnitFont.CreateFont (14, 0, 900, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
CountSetting();
TimeSetting();
if( strTemp == "102" )
{
TRACE( "%s\n", strTemp );
}
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2,
m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// y units
oldFont = m_dcGrid.SelectObject(&yUnitFont);
m_dcGrid.SetTextAlign (TA_CENTER|TA_BASELINE);
m_dcGrid.TextOut ((m_rectClient.left+m_rectPlot.left)/2, (m_rectPlot.bottom+m_rectPlot.top)/2, m_strYUnitsString);
m_dcGrid.SelectObject(oldFont);
// at this point we are done filling the the grid bitmap,
// no more drawing to this bitmap is needed until the setting are changed
// if we don't have one yet, set up a memory dc for the plot
if (m_dcPlot.GetSafeHdc() == NULL)
{
m_dcPlot.CreateCompatibleDC(&dc);
m_bitmapPlot.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot);
}
for(int i = 0 ; i < CI_MAX ; ++i)
{
if(m_dcCCUPlot[i].GetSafeHdc() == NULL)
{
m_dcCCUPlot[i].CreateCompatibleDC(&dc);
m_bitmapCCUPlot[i].CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapCCUOldPlot[i] = m_dcCCUPlot[i].SelectObject(&m_bitmapCCUPlot[i]);
}
}
// make sure the plot bitmap is cleared
m_dcPlot.SetBkColor (m_crBackColor);
m_dcPlot.FillRect(m_rectClient, &m_brushBack);
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
} // InvalidateCtrl
void COScopeTimeCtrl::InvalidateXUnits()
{
// There is a lot of drawing going on here - particularly in terms of
// drawing the grid. Don't panic, this is all being drawn (only once)
// to a bitmap. The result is then BitBlt'd to the control whenever needed.
CFont axisFont, *oldFont;
// in case we haven't established the memory dc's
CClientDC dc(this);
// if we don't have one yet, set up a memory dc for the grid
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
// create some fonts (horizontal and vertical)
// use a height of 14 pixels and 300 weight
// (these may need to be adjusted depending on the display)
axisFont.CreateFont (14, 0, 0, 0, 300,
FALSE, FALSE, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,
DEFAULT_PITCH|FF_SWISS, _T("Arial"));
// grab the horizontal font
oldFont = m_dcGrid.SelectObject(&axisFont);
// x units
m_dcGrid.SetTextAlign (TA_CENTER|TA_TOP);
m_dcGrid.TextOut ((m_rectPlot.left+m_rectPlot.right)/2, m_rectPlot.bottom+20, m_strXUnitsString);
// restore the font
m_dcGrid.SelectObject(oldFont);
// finally, force the plot area to redraw
InvalidateRect(m_rectClient);
}
/////////////////////////////////////////////////////////////////////////////
double COScopeTimeCtrl::AppendPoint(bool bCCU, double dNewPoint)
{
// append a data point to the plot
// return the previous point
m_bCountryCode = bCCU;
double dPrevious;
dPrevious = m_dCurrentPosition;
m_dCurrentPosition = dNewPoint;
DrawPoint();
Invalidate();
return dPrevious;
} // AppendPoint
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::AppendDateTimePoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, bool bCCU, double dNewPoint)
{
m_bCountryCode = bCCU;
double dPrevious;
dPrevious = m_dCurrentPosition;
m_dCurrentPosition = dNewPoint;
DrawPoint(iYear, iMonth, iDay, iHour, iMinute, iSecond, bCCU, dNewPoint);
m_day = iDay;
Invalidate();
}
void COScopeTimeCtrl::AppendCCUPoint(double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC )
{
m_dCurCCUPosition[CI_EG] = dNewGB;
m_dCurCCUPosition[CI_GE] = dNewDE;
m_dCurCCUPosition[CI_FR] = dNewFR;
m_dCurCCUPosition[CI_IT] = dNewIT;
m_dCurCCUPosition[CI_PL] = dNewPL;
m_dCurCCUPosition[CI_TR] = dNewTR;
m_dCurCCUPosition[CI_ETC] = dNewETC;
} //AppendCCUPoint
////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::OnPaint()
{
CPaintDC dc(this); // device context for painting
CDC memDC;
CBitmap memBitmap;
CBitmap* oldBitmap; // bitmap originally found in CMemDC
// no real plotting work is performed here,
// just putting the existing bitmaps on the client
// to avoid flicker, establish a memory dc, draw to it
// and then BitBlt it to the client
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, m_nClientWidth, m_nClientHeight);
oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap);
if (memDC.GetSafeHdc() != NULL)
{
// first drop the grid on the memory dc
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcGrid, 0, 0, SRCCOPY);
// now add the plot on top as a "pattern" via SRCPAINT.
// works well with dark background and a light plot
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcPlot, 0, 0, SRCPAINT); //SRCPAINT
//CCU
if(m_bCountryCode)
{
for(int i = 0 ; i < CI_MAX ; ++i)
memDC.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &m_dcCCUPlot[i], 0, 0, SRCPAINT);
}
// finally send the result to the display
dc.BitBlt(0, 0, m_nClientWidth, m_nClientHeight, &memDC, 0, 0, SRCCOPY);
}
memDC.SelectObject(oldBitmap);
} // OnPaint
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::DrawPoint()
{
TimeCountDraw();
return ;
// this does the work of "scrolling" the plot to the left
// and appending a new data point all of the plotting is
// directed to the memory based bitmap associated with m_dcPlot
// the will subsequently be BitBlt'd to the client in OnPaint
int currX, prevX, currY, prevY;
int currCCUX[CI_MAX], prevCCUX[CI_MAX], currCCUY[CI_MAX], prevCCUY[CI_MAX];
CPen *oldPen;
CPen *oldCCUPen[CI_MAX];
CRect rectCleanUp;
if (m_dcPlot.GetSafeHdc() != NULL)
{
m_dcPlot.BitBlt(m_rectPlot.left, m_rectPlot.top+1, m_nPlotWidth, m_nPlotHeight, &m_dcPlot, m_rectPlot.left+m_nShiftPixels, m_rectPlot.top+1, SRCCOPY);
rectCleanUp = m_rectPlot;
rectCleanUp.left = rectCleanUp.right - m_nShiftPixels;
m_dcPlot.FillRect(rectCleanUp, &m_brushBack);
// draw the next line segement
// grab the plotting pen
// oldPen = m_dcPlot.SelectObject(&m_penPlot);
// move to the previous point
prevX = m_rectPlot.right - m_nPlotShiftPixels;
prevY = m_rectPlot.bottom - (long)((m_dPreviousPosition - m_dLowerLimit) * m_dVerticalFactor);
m_dcPlot.MoveTo (prevX, prevY);
// draw to the current point
currX = m_rectPlot.right-m_nHalfShiftPixels;
currY = m_rectPlot.bottom - (long)((m_dCurrentPosition - m_dLowerLimit) * m_dVerticalFactor);
m_dcPlot.LineTo (currX, currY);
// restore the pen
m_dcPlot.SelectObject(oldPen);
// if the data leaks over the upper or lower plot boundaries
// fill the upper and lower leakage with the background
// this will facilitate clipping on an as needed basis
// as opposed to always calling IntersectClipRect
if ((prevY <= m_rectPlot.top) || (currY <= m_rectPlot.top))
m_dcPlot.FillRect(CRect(prevX, m_rectClient.top, currX+1, m_rectPlot.top+1), &m_brushBack);
if ((prevY >= m_rectPlot.bottom) || (currY >= m_rectPlot.bottom))
m_dcPlot.FillRect(CRect(prevX, m_rectPlot.bottom+1, currX+1, m_rectClient.bottom+1), &m_brushBack);
// store the current point for connection to the next point
m_dPreviousPosition = m_dCurrentPosition;
if(m_bCountryCode)
{
for(int i = 0 ; i < CI_MAX ; ++i)
{
m_dcCCUPlot[i].BitBlt(m_rectPlot.left, m_rectPlot.top+1, m_nPlotWidth, m_nPlotHeight, &m_dcCCUPlot[i], m_rectPlot.left+m_nShiftPixels, m_rectPlot.top+1, SRCCOPY);
if(m_dcCCUPlot[i].GetSafeHdc() != NULL)
{
//grab the plotting pen
oldCCUPen[i] = m_dcCCUPlot[i].SelectObject(&m_CCUpen[i]);
//previous point
prevCCUX[i] = m_rectPlot.right - m_nPlotShiftPixels;
prevCCUY[i] = m_rectPlot.bottom - (long)((m_dPreCCUPosition[i] - m_dLowerLimit) * m_dVerticalFactor);
m_dcCCUPlot[i].MoveTo(prevCCUX[i], prevCCUY[i]);
//current point
currCCUX[i] = m_rectPlot.right-m_nHalfShiftPixels;
currCCUY[i] = m_rectPlot.bottom - (long)((m_dCurCCUPosition[i] - m_dLowerLimit) * m_dVerticalFactor);
m_dcCCUPlot[i].LineTo (currCCUX[i], currCCUY[i]);
//restore the pen
m_dcCCUPlot[i].SelectObject(oldCCUPen[i]);
if ((prevCCUY[i] <= m_rectPlot.top) || (currCCUY[i] <= m_rectPlot.top))
m_dcCCUPlot[i].FillRect(CRect(prevCCUX[i], m_rectClient.top, currCCUX[i]+1, m_rectPlot.top+1), &m_brushBack);
if ((prevCCUY[i] >= m_rectPlot.bottom) || (currCCUY[i] >= m_rectPlot.bottom))
m_dcCCUPlot[i].FillRect(CRect(prevCCUX[i], m_rectPlot.bottom+1, currCCUX[i]+1, m_rectClient.bottom+1), &m_brushBack);
// store the current point for connection to the next point
m_dPreCCUPosition[i] = m_dCurCCUPosition[i];
}
}
}
}
} // end DrawPoint
void COScopeTimeCtrl::DrawPoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecound, bool bCCU, double dNewPoint)
{
if (m_dcPlot.GetSafeHdc() != NULL)
{
CRect rectCleanUp = m_rectPlot;
//시간에 따른 포인트 위치 수정
float fPosTerm = (m_rectPlot.right - m_rectPlot.left)/24.0;
rectCleanUp.left = m_rectPlot.left + (fPosTerm*m_stPrevDateTime.wHour + (fPosTerm * m_stPrevDateTime.wMinute /60));
rectCleanUp.right = m_rectPlot.left + (fPosTerm*iHour + (fPosTerm * iMinute /60));
rectCleanUp.top = m_rectPlot.bottom - (long)((m_dPreviousPosition - m_dLowerLimit) * m_dVerticalFactor);
rectCleanUp.bottom = m_rectPlot.bottom - (long)((m_dCurrentPosition - m_dLowerLimit) * m_dVerticalFactor);
if(false ==((rectCleanUp.left == rectCleanUp.right) && (rectCleanUp.top == rectCleanUp.bottom)))
{
// m_dcPlot.FillRect(rectCleanUp, &m_brushBack);
// grab the plotting pen
CPen *oldPen = m_dcPlot.SelectObject(&m_penPlot);
m_dcPlot.MoveTo (rectCleanUp.left, rectCleanUp.top);
m_dcPlot.LineTo (rectCleanUp.right, rectCleanUp.bottom);
DateSetting(iYear, iMonth, iDay, m_stPrevDateTime.wDayOfWeek, iHour, iMinute, iSecound, m_stPrevDateTime.wMilliseconds);
m_dPreviousPosition = m_dCurrentPosition;
m_dcPlot.SelectObject(oldPen);
}
}
m_bGraph = true;
}
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
// NOTE: OnSize automatically gets called during the setup of the control
GetClientRect(m_rectClient);
// set some member variables to avoid multiple function calls
m_nClientHeight = m_rectClient.Height();
m_nClientWidth = m_rectClient.Width();
// the "left" coordinate and "width" will be modified in
// InvalidateCtrl to be based on the width of the y axis scaling
m_rectPlot.left = 5;
m_rectPlot.top = 5;
m_rectPlot.right = m_rectClient.right-10;
m_rectPlot.bottom = m_rectClient.bottom-20;
// set some member variables to avoid multiple function calls
m_nPlotHeight = m_rectPlot.Height();
m_nPlotWidth = m_rectPlot.Width();
// set the scaling factor for now, this can be adjusted
// in the SetRange functions
m_dVerticalFactor = (double)m_nPlotHeight / m_dRange;
} // OnSize
/////////////////////////////////////////////////////////////////////////////
void COScopeTimeCtrl::Reset()
{
m_dPreviousPosition = 0;
m_dCurrentPosition = 0;
InvalidateCtrl();
}
int COScopeTimeCtrl::GetWidth()
{
int nWidth = m_rectPlot.right - m_rectPlot.left;
return nWidth;
}
BOOL COScopeTimeCtrl::PreTranslateMessage(MSG* pMsg)
{
m_toolTip.RelayEvent(pMsg);
return CWnd::PreTranslateMessage(pMsg);
}
int COScopeTimeCtrl::GetRightPixel()
{
return m_rectPlot.right;
}
int COScopeTimeCtrl::GetLeftPixel()
{
return m_rectPlot.left;
}
// 초기화
void COScopeTimeCtrl::Init()
{
m_dPreviousPosition = 0;
m_dCurrentPosition = 0;
InvalidateCtrl();
}
// 인원수
void COScopeTimeCtrl::CountSetting()
{
CString strTemp;
// y max
m_dcGrid.SetTextColor (m_crGridColor);
m_dcGrid.SetTextAlign (TA_RIGHT|TA_TOP);
strTemp.Format (_T("%d"), (int)m_dUpperLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.top, strTemp);
// y min
m_dcGrid.SetTextAlign (TA_RIGHT|TA_BASELINE);
strTemp.Format (_T("%d"), (int)m_dLowerLimit);
m_dcGrid.TextOut (m_rectPlot.left-4, m_rectPlot.bottom, strTemp);
}
// 밑에 시간
void COScopeTimeCtrl::TimeSetting()
{
float fPosTerm = (m_rectPlot.right - m_rectPlot.left)/24.0;
CString strTemp;
for(int iHour = m_dLowerXLimit; iHour <= m_dUpperYLimit; iHour+=2)
{
strTemp.Format (_T("%d"), (int)iHour);
m_dcGrid.TextOut (m_rectPlot.left + 4 + (fPosTerm*iHour), m_rectPlot.bottom+17, strTemp);
}
}
void COScopeTimeCtrl::TimeCountDraw()
{
if(false == m_bGraph)
{
return ;
}
if (m_dcPlot.GetSafeHdc() != NULL)
{
//시간에 따른 포인트 위치 수정
SYSTEMTIME sysTime;
GetLocalTime(&sysTime);
if(m_day != sysTime.wDay)
{
// 그래프를 초기화한다. 초기화 루틴을 시작한다.
Init();
}
CRect rectCleanUp = m_rectPlot;
float fPosTerm = (m_rectPlot.right - m_rectPlot.left)/24.0;
rectCleanUp.left = m_rectPlot.left + (fPosTerm*m_stPrevDateTime.wHour + (fPosTerm * m_stPrevDateTime.wMinute /60));
rectCleanUp.right = m_rectPlot.left + (fPosTerm*sysTime.wHour + (fPosTerm * sysTime.wMinute /60));
rectCleanUp.top = m_rectPlot.bottom - (long)((m_dPreviousPosition - m_dLowerLimit) * m_dVerticalFactor);
rectCleanUp.bottom = m_rectPlot.bottom - (long)((m_dCurrentPosition - m_dLowerLimit) * m_dVerticalFactor);
if(false ==((rectCleanUp.left == rectCleanUp.right) && (rectCleanUp.top == rectCleanUp.bottom)))
{
// m_dcPlot.BitBlt(m_rectPlot.left, m_rectPlot.top+1, m_nPlotWidth, m_nPlotHeight, &m_dcPlot, m_rectPlot.left+m_nShiftPixels, m_rectPlot.top+1, SRCCOPY);
// m_dcPlot.FillRect(rectCleanUp, &m_brushBack);
// grab the plotting pen
CPen *oldPen = m_dcPlot.SelectObject(&m_penPlot);
m_dcPlot.MoveTo (rectCleanUp.left, rectCleanUp.top);
m_dcPlot.LineTo (rectCleanUp.right, rectCleanUp.bottom);
DateSetting(sysTime.wYear, sysTime.wMonth, sysTime.wDay, sysTime.wDayOfWeek, sysTime.wHour, sysTime.wMinute, sysTime.wSecond, sysTime.wMilliseconds);
m_dPreviousPosition = m_dCurrentPosition;
m_dcPlot.SelectObject(oldPen);
}
m_day = sysTime.wDay;
}
}
@@ -0,0 +1,129 @@
// OScopeTimeCtrl.h : header file
//
#pragma once
/////////////////////////////////////////////////////////////////////////////
// COScopeTimeCtrl window
class COScopeTimeCtrl : public CWnd
{
public:
COScopeTimeCtrl();
virtual ~COScopeTimeCtrl();
// Attributes
public:
void InitDate();
void DateSetting(int iYear, int iMonth, int iDay, int iDayOfWeek, int iHour, int iMinute, int iSecond, int iMilliseconds);
double AppendPoint(bool bCCU, double dNewPoint);
void AppendDateTimePoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, bool bCCU, double dNewPoint);
void AppendCCUPoint( double dNewGB,double dNewDE,double dNewFR,double dNewIT,double dNewPL,double dNewTR, double dNewETC);
void SetToolTip(CString text);
void SetRange(bool b, double dLower, double dUpper, int nDecimalPlaces=1);
void SetDay(int iDay);
void SetXUnits(CString string);
void SetYUnits(CString string);
void SetGridColor(COLORREF color);
void SetPlotColor(COLORREF color);
void SetBackgroundColor(COLORREF color);
void InitToolTip();
void RefreshRange();
void InvalidateCtrl();
void InvalidateXUnits();
void DrawPoint();
void DrawPoint(int iYear, int iMonth, int iDay, int iHour, int iMinute, int iSecond, bool bCCU, double dNewPoint);
void Reset();
void Init();
// Operations
public:
int GetWidth();
int GetRightPixel();
int GetLeftPixel();
BOOL PreTranslateMessage(MSG* pMsg);
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(COScopeTimeCtrl)
public:
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
//}}AFX_VIRTUAL
// Implementation
public:
int m_nShiftPixels; // amount to shift with each new point
int m_nYDecimals;
CString m_strXUnitsString;
CString m_strYUnitsString;
COLORREF m_crBackColor; // background color
COLORREF m_crGridColor; // grid color
COLORREF m_crPlotColor; // data color
COLORREF m_crCCUColor[CI_MAX];
double m_dCurrentPosition; // current position
double m_dPreviousPosition; // previous position
//CCU Point
double m_dCurCCUPosition[CI_MAX]; // current position
double m_dPreCCUPosition[CI_MAX]; // previous position
bool m_bGraph;
SYSTEMTIME m_stPrevDateTime;
bool m_bCountryCode;
private:
void CountSetting();
void TimeSetting();
void TimeCountDraw();
// Generated message map functions
protected:
//{{AFX_MSG(COScopeTimeCtrl)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
int m_nHalfShiftPixels;
int m_nPlotShiftPixels;
int m_nClientHeight;
int m_nClientWidth;
int m_nPlotHeight;
int m_nPlotWidth;
double m_dLowerLimit; // lower bounds
double m_dUpperLimit; // upper bounds
double m_dLowerXLimit; // lower bounds
double m_dUpperYLimit; // upper bounds
double m_dRange;
double m_dVerticalFactor;
int m_day;
CRect m_rectClient;
CRect m_rectPlot;
CPen m_penPlot;
CPen m_CCUpen[CI_MAX];
CBrush m_brushBack;
CDC m_dcGrid;
CDC m_dcPlot;
CDC m_dcCCUPlot[CI_MAX];
CBitmap *m_pbitmapOldGrid;
CBitmap *m_pbitmapOldPlot;
CBitmap *m_pbitmapCCUOldPlot[CI_MAX];
CBitmap m_bitmapGrid;
CBitmap m_bitmapPlot;
CBitmap m_bitmapCCUPlot[CI_MAX];
CToolTipCtrl m_toolTip;
};
+361
View File
@@ -0,0 +1,361 @@
// OperatorDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "ZoneDialog.h"
#include "AnnounceDlg.h"
#include "ItemDlg.h"
#include "EventDlg.h"
#include "CSDialog.h"
#include "BlockDlg.h"
#include "LogDlg.h"
#include "OperatorDlg.h"
#include "NoticeDlg.h"
#include "SecretShopDlg.h"
#include "CompensationDlg.h"
#include "afxdialogex.h"
// COperatorDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(COperatorDlg, CDialogEx)
COperatorDlg::COperatorDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(COperatorDlg::IDD, pParent)
, m_parent(NULL)
, m_announceDlg(NULL)
, m_itemDlg(NULL)
, m_eventDlg(NULL)
, m_csDlg(NULL)
, m_blockDlg(NULL)
, m_logDlg(NULL)
, m_tablIndex(0)
, m_NoticeDlg( NULL )
, m_SecretShopDlg(NULL)
, m_CompensationDlg(NULL)
{
}
COperatorDlg::~COperatorDlg()
{
delete m_announceDlg;
delete m_itemDlg;
delete m_eventDlg;
delete m_csDlg;
delete m_blockDlg;
delete m_logDlg;
delete m_NoticeDlg;
delete m_SecretShopDlg;
delete m_CompensationDlg;
}
void COperatorDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TAB_OPERATOR, m_operatorTab);
}
BEGIN_MESSAGE_MAP(COperatorDlg, CDialogEx)
ON_WM_SHOWWINDOW()
END_MESSAGE_MAP()
// COperatorDlg 메시지 처리기입니다.
void COperatorDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
CWnd* pWnd = GetDesktopWindow();
CenterWindow(pWnd);
CreatePanel();
m_announceDlg->ShowWindow(SW_SHOW);
}
void COperatorDlg::CreatePanel()
{
CRect rc;
m_operatorTab.GetClientRect(rc);
TC_ITEM item;
item.mask = TCIF_TEXT;
item.pszText = _T("Common");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Item");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Event");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("CS");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Block");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Notice");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("SecretShop");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Compensation");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
m_announceDlg = new CAnnounceDlg;
m_announceDlg->Create(IDD_ANNOUNCE_DIALOG, &m_operatorTab);
m_announceDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_announceDlg->Startup(m_parent);
m_itemDlg = new CItemDlg;
m_itemDlg->Create(IDD_ITEM_DIALOG, &m_operatorTab);
m_itemDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_itemDlg->Startup(m_parent);
m_eventDlg = new CEventDlg;
m_eventDlg->Create(IDD_EVENT_DIALOG, &m_operatorTab);
m_eventDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_eventDlg->Startup(m_parent);
m_csDlg = new CCSDialog;
m_csDlg->Create(IDD_CS_DIALOG, &m_operatorTab);
m_csDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_csDlg->Startup(m_parent);
m_blockDlg = new CBlockDlg;
m_blockDlg->Create( IDD_BLOCK_DIALOG, &m_operatorTab );
m_blockDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_blockDlg->Startup(m_parent);
m_logDlg = new CLogDlg;
m_logDlg->Create( IDD_LOG_DIALOG, &m_operatorTab );
m_logDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_logDlg->Startup(m_parent);
m_NoticeDlg = new CNoticeDlg;
m_NoticeDlg->Create( IDD_NOTICEDLG, &m_operatorTab );
m_NoticeDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_NoticeDlg->Startup(m_parent);
m_SecretShopDlg = new CSecretShopDlg;
m_SecretShopDlg->Create(IDD_DIALOG_SECRETSHOP, &m_operatorTab);
m_SecretShopDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_SecretShopDlg->Startup(m_parent);
m_CompensationDlg = new CCompensationDlg;
m_CompensationDlg->Create(IDD_COMPENSATION_DIALOG, &m_operatorTab);
m_CompensationDlg->MoveWindow(rc.left+10, rc.top+30, rc.Width()-30, rc.Height()-35);
m_CompensationDlg->Startup(m_parent);
}
void COperatorDlg::ShowTab(int index)
{
if( GetZone()->IsAdministrator() )
{
switch(index)
{
case 0:
m_announceDlg->ShowWindow(SW_SHOW);
break;
case 1:
m_itemDlg->ShowWindow(SW_SHOW);
break;
case 2:
m_eventDlg->ShowWindow(SW_SHOW);
break;
case 3:
m_csDlg->ShowWindow(SW_SHOW);
break;
case 4:
m_blockDlg->ShowWindow(SW_SHOW);
break;
case 5:
m_logDlg->ShowWindow(SW_SHOW);
break;
case 6:
m_NoticeDlg->ShowWindow(SW_SHOW);
break;
case 7:
m_SecretShopDlg->ShowWindow(SW_SHOW);
break;
case 8:
m_CompensationDlg->ShowWindow(SW_SHOW);
break;
}
}
else if( GetZone()->IsOperator() )
{
switch(index)
{
case 0:
m_announceDlg->ShowWindow(SW_SHOW);
break;
case 1:
m_blockDlg->ShowWindow(SW_SHOW);
break;
case 2:
m_logDlg->ShowWindow(SW_SHOW);
break;
case 3:
m_NoticeDlg->ShowWindow(SW_SHOW);
break;
}
}
}
void COperatorDlg::HideTab(int index)
{
if( GetZone()->IsAdministrator() )
{
switch(index)
{
case 0:
m_announceDlg->ShowWindow(SW_HIDE);
break;
case 1:
m_itemDlg->ShowWindow(SW_HIDE);
break;
case 2:
m_eventDlg->ShowWindow(SW_HIDE);
break;
case 3:
m_csDlg->ShowWindow(SW_HIDE);
break;
case 4:
m_blockDlg->ShowWindow(SW_HIDE);
break;
case 5:
m_logDlg->ShowWindow(SW_HIDE);
break;
case 6:
m_NoticeDlg->ShowWindow(SW_HIDE);
break;
case 7:
m_SecretShopDlg->ShowWindow(SW_HIDE);
break;
case 8:
m_CompensationDlg->ShowWindow(SW_HIDE);
break;
}
}
else if( GetZone()->IsOperator() )
{
switch(index)
{
case 0:
m_announceDlg->ShowWindow(SW_HIDE);
break;
case 1:
m_blockDlg->ShowWindow(SW_HIDE);
break;
case 2:
m_logDlg->ShowWindow(SW_HIDE);
break;
case 3:
m_NoticeDlg->ShowWindow(SW_HIDE);
break;
}
}
}
void COperatorDlg::ShowLogTab()
{
// logDlog는 무조건 제일 뒤에 있도록 설정한다
HideTab( m_tablIndex );
m_tablIndex = m_operatorTab.GetItemCount() - 1;
ShowTab( m_tablIndex );
m_operatorTab.SetCurSel( m_tablIndex );
m_logDlg->SetFocus();
}
void COperatorDlg::WriteLogDlg( CString text )
{
if( !m_logDlg ) return;
m_logDlg->InsertLogText( text );
}
BOOL COperatorDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
LPNMHDR lpnmhdr = (LPNMHDR) lParam;
if(lpnmhdr->code==TCN_SELCHANGE)
{
HideTab(m_tablIndex);
m_tablIndex = m_operatorTab.GetCurSel();
ShowTab(m_tablIndex);
}
return CDialogEx::OnNotify(wParam, lParam, pResult);
}
void COperatorDlg::OnShowWindow(BOOL bShow, UINT nStatus)
{
if(bShow)
{
m_operatorTab.DeleteAllItems();
if(GetZone()->IsAdministrator())
{
TC_ITEM item;
item.mask = TCIF_TEXT;
item.pszText = _T("Common");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Item");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Event");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("CS");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Block");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Log");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Notice");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("SecretShop");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Compensation");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
}
else if(GetZone()->IsOperator())
{
TC_ITEM item;
item.mask = TCIF_TEXT;
item.pszText = _T("Common");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Block");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Log");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
item.pszText = _T("Notice");
m_operatorTab.InsertItem(m_operatorTab.GetItemCount(), &item);
}
}
CDialogEx::OnShowWindow(bShow, nStatus);
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
}
+72
View File
@@ -0,0 +1,72 @@
#pragma once
#include "afxcmn.h"
class CZoneDialog;
class CAnnounceDlg;
class CItemDlg;
class CEventDlg;
class CCSDlg;
class CBlockDlg;
class CLogDlg;
class CNoticeDlg;
class CSecretShopDlg;
class CCompensationDlg;
// COperatorDlg 대화 상자입니다.
class COperatorDlg : public CDialogEx
{
DECLARE_DYNAMIC(COperatorDlg)
public:
COperatorDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~COperatorDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_OPERATOR_DIALOG };
public:
void Startup(CZoneDialog* parent);
void CreatePanel();
CCSDialog* GetCSDlg() { return m_csDlg; }
protected:
void ShowTab(int index);
void HideTab(int index);
CZoneDialog* GetZone() { return m_parent; }
public:
void ShowLogTab();
void WriteLogDlg( CString text );
protected:
CZoneDialog* m_parent;
CAnnounceDlg* m_announceDlg;
CItemDlg* m_itemDlg;
CEventDlg* m_eventDlg;
CCSDialog* m_csDlg;
CBlockDlg* m_blockDlg;
CLogDlg* m_logDlg;
CNoticeDlg * m_NoticeDlg;
CSecretShopDlg* m_SecretShopDlg;
CCompensationDlg* m_CompensationDlg;
int m_tablIndex;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CTabCtrl m_operatorTab;
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult);
afx_msg void OnShowWindow(BOOL bShow, UINT nStatus);
afx_msg void OnTcnSelchangeTabOperator(NMHDR *pNMHDR, LRESULT *pResult);
};
+216
View File
@@ -0,0 +1,216 @@
// PanelDialog.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "PanelDialog.h"
#include "WinMessage.h"
#include "Define.h"
#include "afxdialogex.h"
// CPanelDialog 대화 상자입니다.
IMPLEMENT_DYNAMIC(CPanelDialog, CDialogEx)
CPanelDialog::CPanelDialog(CWnd* pParent /*=NULL*/)
: CDialogEx(CPanelDialog::IDD, pParent), m_maxValue(0), m_current(0), m_serverId(0), m_serverPort(0), m_blockState(0), m_serverState(0)
{
}
CPanelDialog::~CPanelDialog()
{
}
void CPanelDialog::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_TITLE_STATIC, m_title);
}
BEGIN_MESSAGE_MAP(CPanelDialog, CDialogEx)
ON_WM_RBUTTONUP()
END_MESSAGE_MAP()
// CPanelDialog 메시지 처리기입니다.
BOOL CPanelDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
CreatePopup();
CRect rc;
GetDlgItem(IDC_STATIC_MBAR)->GetWindowRect(rc);
ScreenToClient(rc);
m_graph.Create(WS_VISIBLE | WS_CHILD, rc, this);
m_graph.SetRange( 0, 100 );
m_graph.SetPlotColor(RGB(128, 128, 128), FALSE);
m_graph.SetBackgroundColor(RGB(128, 128, 128), TRUE);
m_graph.InitToolTip();
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CPanelDialog::Startup(int serverId, CString title, CString serverIP, int serverPort, int blockState, int maxUser)
{
m_title.SetWindowText(title);
m_graph.SetRange(0, maxUser);
m_graph.DrawGraph(0);
m_serverId = serverId;
m_serverName = title;
m_serverIP = serverIP;
m_serverPort = serverPort;
m_blockState = blockState;
CString tooltip;
tooltip.Format(_T("%s(%s:%d) - %d/%d"), m_serverName, m_serverIP, m_serverPort, m_current, m_maxValue);
m_graph.SetToolTip(tooltip);
UpdatePopup(m_blockState);
}
void CPanelDialog::UpdateBegin()
{
m_serverState = ESOCKET::LS_REQSERVERSTATE;
}
void CPanelDialog::UpdateEnd()
{
switch(m_serverState)
{
case ESOCKET::LS_DISCONNECTED :
m_blockState = 0;
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_UNCHECKED);
m_graph.SetPlotColor(RGB(128, 128, 128), FALSE);
m_graph.SetBackgroundColor(RGB(128, 128, 128), TRUE);
break;
case ESOCKET::LS_RESPSERVERSTATE :
m_blockState = 0;
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_UNCHECKED);
m_graph.SetPlotColor(RGB(128, 255, 128), FALSE);
m_graph.SetBackgroundColor(RGB(0, 0, 0), TRUE);
break;
case ESOCKET::LS_ZOMBIESERVERSTATE :
m_blockState = 0;
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_UNCHECKED);
m_graph.SetPlotColor(RGB(255, 0, 0), FALSE);
m_graph.SetBackgroundColor(RGB(0, 0, 0), TRUE);
break;
case ESOCKET::LS_BLOCKED :
m_blockState = 1;
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_CHECKED);
m_graph.SetPlotColor(RGB(128, 128, 128), FALSE);
m_graph.SetBackgroundColor(RGB(0, 0, 0), TRUE);
break;
}
}
void CPanelDialog::Update(int currentUser, int sendCount, int serverState)
{
m_current = currentUser;
m_serverState = serverState;
if(m_maxValue < m_current)
{
m_maxValue = m_current;
}
CString tooltip;
tooltip.Format(_T("%s(%s:%d) - %d/%d"), m_serverName, m_serverIP, m_serverPort, m_current, m_maxValue);
m_graph.SetToolTip(tooltip);
m_graph.DrawGraph(currentUser);
}
void CPanelDialog::CreatePopup()
{
// 팝업메뉴
m_menu.CreatePopupMenu();
CString menu;
menu = _T("Block");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGINBLOCK, (LPCTSTR)menu);
m_menu.AppendMenu(MF_SEPARATOR);
menu = _T("ALL Block");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGINBLOCKALL, (LPCTSTR)menu);
menu = _T("ALL Unblock");
m_menu.AppendMenu(MF_STRING, IDC_SERVICE_LOGINUNBLOCKALL, (LPCTSTR)menu);
}
void CPanelDialog::UpdatePopup(int blockState)
{
if(blockState == 1)
{
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_CHECKED);
}
else
{
m_menu.CheckMenuItem(IDC_SERVICE_LOGINBLOCK, MF_UNCHECKED);
}
}
void CPanelDialog::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
CPoint pos;
GetCursorPos(&pos);
m_menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pos.x, pos.y, this);
CDialogEx::OnRButtonDown(nFlags, point);
}
BOOL CPanelDialog::OnCommand(WPARAM wParam, LPARAM lParam)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
switch(wParam)
{
case IDC_SERVICE_LOGINBLOCK :
{
if(m_blockState == 1)
{
UpdatePopup(0);
GetParent()->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINUNBLOCK, m_serverId);
}
else
{
UpdatePopup(1);
GetParent()->PostMessage(WM_COMMAND, IDC_SERVICE_LOGINBLOCK, m_serverId);
}
}
break;
case IDC_SERVICE_LOGINBLOCKALL :
case IDC_SERVICE_LOGINUNBLOCKALL :
{
GetParent()->PostMessage(WM_COMMAND, wParam, 0);
}
break;
default :
{
}
break;
}
return CDialogEx::OnCommand(wParam, lParam);
}
BOOL CPanelDialog::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
+56
View File
@@ -0,0 +1,56 @@
#pragma once
#include "afxwin.h"
#include "afxcmn.h"
#include "ProcessCtrl.h"
// CPanelDialog 대화 상자입니다.
class CPanelDialog : public CDialogEx
{
DECLARE_DYNAMIC(CPanelDialog)
public:
CPanelDialog(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CPanelDialog();
// 대화 상자 데이터입니다.
enum { IDD = IDD_PANEL_DIALOG };
public:
void Startup(int serverId, CString title, CString serverIP, int serverPort, int blockState, int maxUser);
void UpdateBegin();
void UpdateEnd();
void Update(int currentUser, int sendCount, int serverState);
void CreatePopup();
void UpdatePopup(int blockState);
int GetServerID() { return m_serverId; }
public:
int m_maxValue;
int m_current;
CString m_serverName;
CString m_serverIP;
int m_serverId;
int m_serverPort;
int m_blockState;
int m_serverState;
CProcessCtrl m_graph;
CMenu m_menu;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CStatic m_title;
virtual BOOL OnInitDialog();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
virtual BOOL PreTranslateMessage(MSG* pMsg);
};
+274
View File
@@ -0,0 +1,274 @@
// CProcessCtrl.cpp: implementation of the CProcessCtrl class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ProcessCtrl.h"
CProcessCtrl::CProcessCtrl() : m_vertical(TRUE)
{
SetRange( 0, 100 );
SetBackgroundColor(RGB(0, 0, 0));
//SetPlotColor(RGB(255, 255, 0));
SetPlotColor(RGB(128, 255, 128));
SetGridColor(RGB(128, 255, 128));
SetAlertColor(RGB(255, 64, 64));
m_pbitmapOldGrid = NULL;
m_pbitmapOldPlot = NULL;
}
CProcessCtrl::~CProcessCtrl()
{
}
BEGIN_MESSAGE_MAP(CProcessCtrl, CWnd)
//{{AFX_MSG_MAP(CProcessCtrl)
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_MOUSEMOVE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CProcessCtrl::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID)
{
BOOL result;
static CString className = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW );
result = CWnd::CreateEx(
WS_EX_CLIENTEDGE | WS_EX_STATICEDGE,
className, NULL, dwStyle,
rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top,
pParentWnd->GetSafeHwnd(),
(HMENU)nID );
if( result != 0 ) InvalidateCtrl();
return result;
}
void CProcessCtrl::SetRange( UINT low, UINT high )
{
m_lowLevel = low;
m_highLevel = high;
m_level = low;
}
void CProcessCtrl::SetGridColor(COLORREF color, BOOL redraw)
{
m_crGridColor = color;
m_penGrid.DeleteObject();
m_penGrid.CreatePen(PS_SOLID, 0, m_crGridColor);
if(redraw)
InvalidateCtrl();
}
void CProcessCtrl::SetAlertColor(COLORREF color, BOOL redraw)
{
m_crAlertColor = color;
m_penAlert.DeleteObject();
m_penAlert.CreatePen(PS_SOLID, 0, m_crGridColor);
if(redraw)
InvalidateCtrl();
}
void CProcessCtrl::SetPlotColor(COLORREF color, BOOL redraw)
{
m_crPlotColor = color;
m_penPlot.DeleteObject();
m_penPlot.CreatePen(PS_SOLID, 0, m_crPlotColor);
if(redraw)
InvalidateCtrl();
}
void CProcessCtrl::SetBackgroundColor(COLORREF color, BOOL redraw)
{
m_crBackColor = color;
m_brushBack.DeleteObject();
m_brushBack.CreateSolidBrush(m_crBackColor);
if(redraw)
InvalidateCtrl();
}
void CProcessCtrl::GetRange(UINT& low, UINT& high)
{
low = m_lowLevel;
high = m_highLevel;
}
void CProcessCtrl::DrawGraph( UINT level )
{
m_level = (UINT)(level * 100.0 / m_highLevel);
if(m_level > 100)
m_level = 100;
InvalidateCtrl();
}
void CProcessCtrl::InvalidateCtrl()
{
CClientDC dc(this);
if (m_dcGrid.GetSafeHdc() == NULL)
{
m_dcGrid.CreateCompatibleDC(&dc);
m_bitmapGrid.CreateCompatibleBitmap(&dc, m_clientWidth, m_clientHeight);
m_pbitmapOldGrid = m_dcGrid.SelectObject(&m_bitmapGrid);
}
m_dcGrid.SetBkColor(m_crBackColor);
m_dcGrid.FillRect(m_rectClient, &m_brushBack);
m_plotHeight = m_rectPlot.Height();
m_plotWidth = m_rectPlot.Width();
// draw the plot rectangle
CPen *oldPen = m_dcGrid.SelectObject (&m_penPlot);
// 테두리
m_dcGrid.MoveTo (m_rectPlot.left, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.top);
m_dcGrid.LineTo (m_rectPlot.right+1, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left, m_rectPlot.bottom+1);
m_dcGrid.LineTo (m_rectPlot.left, m_rectPlot.top);
int middle, range;
if(IsVertical())
{
middle = (m_rectPlot.right + m_rectPlot.left) / 2;
range = (m_rectPlot.bottom - m_rectPlot.top - 1) * m_level / 100;
}
else
{
middle = (m_rectPlot.top + m_rectPlot.bottom) / 2 + 1;
range = (m_rectPlot.right - m_rectPlot.left - 1) * m_level / 100;
}
m_dcGrid.SelectObject (oldPen);
// 그리드
if( m_level >= 90)
{
oldPen = m_dcGrid.SelectObject (&m_penAlert);
}
else
{
oldPen = m_dcGrid.SelectObject (&m_penGrid);
}
for( int i = 0; i < range; i+=2 )
{
if(IsVertical())
{
int height = m_rectPlot.bottom - i - 1;
m_dcGrid.MoveTo( m_rectPlot.left+2, height );
m_dcGrid.LineTo( middle, height );
m_dcGrid.MoveTo( middle+1, height );
m_dcGrid.LineTo( m_rectPlot.right, height );
}
else
{
int width = m_rectPlot.left + i + 2;
m_dcGrid.MoveTo( width, m_rectPlot.top +1 );
m_dcGrid.LineTo( width, m_rectPlot.bottom +1 );
}
}
m_dcGrid.SelectObject (oldPen);
//if (m_dcPlot.GetSafeHdc() == NULL)
//{
// m_dcPlot.CreateCompatibleDC(&dc);
// m_bitmapPlot.CreateCompatibleBitmap(&dc, m_clientWidth, m_clientHeight);
// m_pbitmapOldPlot = m_dcPlot.SelectObject(&m_bitmapPlot);
//}
//m_dcPlot.SetBkColor (m_crBackColor);
//m_dcPlot.FillRect(m_rectClient, &m_brushBack);
InvalidateRect(m_rectClient);
}
void CProcessCtrl::OnPaint()
{
CPaintDC dc(this);
CDC memDC;
CBitmap memBitmap;
CBitmap* oldBitmap;
memDC.CreateCompatibleDC(&dc);
memBitmap.CreateCompatibleBitmap(&dc, m_clientWidth, m_clientHeight);
oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap);
if (memDC.GetSafeHdc() != NULL)
{
memDC.BitBlt(0, 0, m_clientWidth, m_clientHeight, &m_dcGrid, 0, 0, SRCCOPY);
memDC.BitBlt(0, 0, m_clientWidth, m_clientHeight, &m_dcPlot, 0, 0, SRCPAINT);
dc.BitBlt(0, 0, m_clientWidth, m_clientHeight, &memDC, 0, 0, SRCCOPY);
}
memDC.SelectObject(oldBitmap);
}
void CProcessCtrl::OnSize(UINT nType, int cx, int cy)
{
CWnd::OnSize(nType, cx, cy);
GetClientRect(m_rectClient);
m_clientHeight = m_rectClient.Height();
m_clientWidth = m_rectClient.Width();
m_rectPlot.left = 2;
m_rectPlot.top = 2;
m_rectPlot.right = m_rectClient.right - 5;
m_rectPlot.bottom = m_rectClient.bottom - 3;
m_plotHeight = m_rectPlot.Height();
m_plotWidth = m_rectPlot.Width();
}
void CProcessCtrl::InitToolTip()
{
if (m_toolTip.m_hWnd == NULL)
{
m_toolTip.Create(this);
m_toolTip.Activate(FALSE);
m_toolTip.SetDelayTime(TTDT_AUTOPOP, 3000);
}
}
void CProcessCtrl::SetToolTip(CString text)
{
m_toolTip.DelTool(this, 0);
m_toolTip.AddTool(this, text, NULL, 0);
}
BOOL CProcessCtrl::PreTranslateMessage(MSG* pMsg)
{
m_toolTip.RelayEvent(pMsg);
return CWnd::PreTranslateMessage(pMsg);
}
void CProcessCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
m_toolTip.Activate(TRUE);
CWnd::OnMouseMove(nFlags, point);
}
+73
View File
@@ -0,0 +1,73 @@
#pragma once
class CProcessCtrl : public CWnd
{
public:
CProcessCtrl();
virtual ~CProcessCtrl();
public:
virtual BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=NULL);
void SetRange(UINT unLow, UINT unHigh);
void SetGridColor(COLORREF color, BOOL redraw = FALSE);
void SetAlertColor(COLORREF color, BOOL redraw = FALSE);
void SetPlotColor(COLORREF color, BOOL redraw = FALSE);
void SetBackgroundColor(COLORREF color, BOOL redraw = FALSE);
void SetVertical(BOOL b) { m_vertical = b; }
void GetRange(UINT& low, UINT& high);
BOOL IsVertical() { return m_vertical; }
void InvalidateCtrl();
void DrawGraph( UINT unLevel );
void InitToolTip();
void SetToolTip(CString text);
// Generated message map functions
protected:
//{{AFX_MSG(COScopeCtrl)
afx_msg void OnPaint();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
BOOL PreTranslateMessage(MSG* pMsg);
private:
BOOL m_vertical;
CRect m_rectClient;
CRect m_rectPlot;
CDC m_dcGrid;
CDC m_dcPlot;
CBitmap *m_pbitmapOldGrid;
CBitmap *m_pbitmapOldPlot;
CBitmap m_bitmapGrid;
CBitmap m_bitmapPlot;
COLORREF m_crBackColor; // background color
COLORREF m_crGridColor; // grid color
COLORREF m_crAlertColor; // alert color
COLORREF m_crPlotColor; // data color
CPen m_penPlot;
CPen m_penGrid;
CPen m_penAlert;
CBrush m_brushBack;
CToolTipCtrl m_toolTip;
int m_clientHeight;
int m_clientWidth;
int m_plotHeight;
int m_plotWidth;
UINT m_lowLevel;
UINT m_highLevel;
UINT m_level;
};
+103
View File
@@ -0,0 +1,103 @@
================================================================================
MICROSOFT FOUNDATION CLASS LIBRARY : LS_Monitor Project Overview
===============================================================================
The application wizard has created this LS_Monitor application for
you. This application not only demonstrates the basics of using the Microsoft
Foundation Classes but is also a starting point for writing your application.
This file contains a summary of what you will find in each of the files that
make up your LS_Monitor application.
LS_Monitor.vcxproj
This is the main project file for VC++ projects generated using an application wizard.
It contains information about the version of Visual C++ that generated the file, and
information about the platforms, configurations, and project features selected with the
application wizard.
LS_Monitor.vcxproj.filters
This is the filters file for VC++ projects generated using an Application Wizard.
It contains information about the association between the files in your project
and the filters. This association is used in the IDE to show grouping of files with
similar extensions under a specific node (for e.g. ".cpp" files are associated with the
"Source Files" filter).
LS_Monitor.h
This is the main header file for the application. It includes other
project specific headers (including Resource.h) and declares the
CLS_MonitorApp application class.
LS_Monitor.cpp
This is the main application source file that contains the application
class CLS_MonitorApp.
LS_Monitor.rc
This is a listing of all of the Microsoft Windows resources that the
program uses. It includes the icons, bitmaps, and cursors that are stored
in the RES subdirectory. This file can be directly edited in Microsoft
Visual C++. Your project resources are in 1033.
res\LS_Monitor.ico
This is an icon file, which is used as the application's icon. This
icon is included by the main resource file LS_Monitor.rc.
res\LS_Monitor.rc2
This file contains resources that are not edited by Microsoft
Visual C++. You should place all resources not editable by
the resource editor in this file.
/////////////////////////////////////////////////////////////////////////////
The application wizard creates one dialog class:
LS_MonitorDlg.h, LS_MonitorDlg.cpp - the dialog
These files contain your CLS_MonitorDlg class. This class defines
the behavior of your application's main dialog. The dialog's template is
in LS_Monitor.rc, which can be edited in Microsoft Visual C++.
/////////////////////////////////////////////////////////////////////////////
Other Features:
ActiveX Controls
The application includes support to use ActiveX controls.
Windows Sockets
The application has support for establishing communications over TCP/IP networks.
/////////////////////////////////////////////////////////////////////////////
Other standard files:
StdAfx.h, StdAfx.cpp
These files are used to build a precompiled header (PCH) file
named LS_Monitor.pch and a precompiled types file named StdAfx.obj.
Resource.h
This is the standard header file, which defines new resource IDs.
Microsoft Visual C++ reads and updates this file.
LS_Monitor.manifest
Application manifest files are used by Windows XP to describe an applications
dependency on specific versions of Side-by-Side assemblies. The loader uses this
information to load the appropriate assembly from the assembly cache or private
from the application. The Application manifest maybe included for redistribution
as an external .manifest file that is installed in the same folder as the application
executable or it may be included in the executable in the form of a resource.
/////////////////////////////////////////////////////////////////////////////
Other notes:
The application wizard uses "TODO:" to indicate parts of the source code you
should add to or customize.
If your application uses MFC in a shared DLL, you will need
to redistribute the MFC DLLs. If your application is in a language
other than the operating system's locale, you will also have to
redistribute the corresponding localized resources MFC100XXX.DLL.
For more information on both of these topics, please see the section on
redistributing Visual C++ applications in MSDN documentation.
/////////////////////////////////////////////////////////////////////////////
@@ -0,0 +1,282 @@
// SecretShopDlg.cpp : 구현 파일입니다.
//
#include "stdafx.h"
#include "LS_Monitor.h"
#include "SecretShopDlg.h"
#include "ZoneDialog.h"
#include "afxdialogex.h"
// CSecretShopDlg 대화 상자입니다.
IMPLEMENT_DYNAMIC(CSecretShopDlg, CDialogEx)
CSecretShopDlg::CSecretShopDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(CSecretShopDlg::IDD, pParent)
{
}
CSecretShopDlg::~CSecretShopDlg()
{
}
void CSecretShopDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_ITEMCODE, m_itemList);
DDX_Control(pDX, IDC_LIST_ITEMCOUNT, m_itemCount);
DDX_Control(pDX, IDC_EDIT_ITEMCODE, m_editItemCode);
DDX_Control(pDX, IDC_EDIT_ITEMCOUNT, m_editItemCount);
}
BEGIN_MESSAGE_MAP(CSecretShopDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON_INFORESET, &CSecretShopDlg::OnBnClickedButtonInforeset)
ON_EN_CHANGE(IDC_EDIT_ITEMCODE, &CSecretShopDlg::OnEnChangeEditItemcode)
ON_EN_CHANGE(IDC_EDIT_ITEMCOUNT, &CSecretShopDlg::OnEnChangeEditItemcount)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ITEMCODE, &CSecretShopDlg::OnLvnItemchangedListItemcode)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ITEMCOUNT, &CSecretShopDlg::OnLvnItemchangedListItemcount)
ON_BN_CLICKED(IDC_BUTTON_INSERT, &CSecretShopDlg::OnBnClickedButtonInsert)
END_MESSAGE_MAP()
// CSecretShopDlg 메시지 처리기입니다.
void CSecretShopDlg::Startup(CZoneDialog* parent)
{
m_parent = parent;
ShowWindow(SW_HIDE);
}
void CSecretShopDlg::OnBnClickedButtonInforeset()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_itemList.DeleteAllItems();
m_itemCount.DeleteAllItems();
}
void CSecretShopDlg::OnEnChangeEditItemcode()
{
// TODO: RICHEDIT 컨트롤인 경우, 이 컨트롤은
// CDialogEx::OnInitDialog() 함수를 재지정
//하고 마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여 CRichEditCtrl().SetEventMask()를 호출하지 않으면
// 이 알림 메시지를 보내지 않습니다.
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
void CSecretShopDlg::OnEnChangeEditItemcount()
{
// TODO: RICHEDIT 컨트롤인 경우, 이 컨트롤은
// CDialogEx::OnInitDialog() 함수를 재지정
//하고 마스크에 OR 연산하여 설정된 ENM_CHANGE 플래그를 지정하여 CRichEditCtrl().SetEventMask()를 호출하지 않으면
// 이 알림 메시지를 보내지 않습니다.
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
}
void CSecretShopDlg::OnLvnItemchangedListItemcode(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
void CSecretShopDlg::OnLvnItemchangedListItemcount(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
*pResult = 0;
}
BOOL CSecretShopDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// TODO: 여기에 추가 초기화 작업을 추가합니다.
m_itemList.DeleteAllItems();
m_itemList.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_itemList.InsertColumn(0, _T("Code"), LVCFMT_LEFT, 120);
m_itemCount.DeleteAllItems();
m_itemCount.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_LABELTIP | LVS_EX_FULLROWSELECT);
m_itemCount.InsertColumn(0, _T("ResetCount"), LVCFMT_LEFT, 180);
return TRUE; // return TRUE unless you set the focus to a control
// 예외: OCX 속성 페이지는 FALSE를 반환해야 합니다.
}
void CSecretShopDlg::InsertItemCode(CString itemCode)
{
if( itemCode.GetLength() == 0 )
return;
m_itemList.InsertItem(m_itemList.GetItemCount(), itemCode);
}
void CSecretShopDlg::InsertItemCount(CString itemCount)
{
if( itemCount.GetLength() == 0 )
return;
m_itemCount.InsertItem(m_itemCount.GetItemCount(), itemCount);
}
void CSecretShopDlg::OnDropItemFiles(CString file)
{
m_itemList.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertItemCode(line);
}
}
}
}
void CSecretShopDlg::OnDropItemCountFiles(CString file)
{
m_itemCount.DeleteAllItems();
CStdioFile ff;
if(ff.Open(file, CFile::modeRead))
{
CString line;
while(ff.ReadString(line))
{
if(line.GetLength() > 0)
{
InsertItemCount(line);
}
}
}
}
void CSecretShopDlg::DeleteListItem(CListCtrl& m_List)
{
int index = -1;
POSITION pos = m_List.GetFirstSelectedItemPosition();
while(pos)
{
int index = m_List.GetNextSelectedItem(pos);
m_List.DeleteItem(index);
pos = m_List.GetFirstSelectedItemPosition();
}
}
BOOL CSecretShopDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
if(WM_DROPFILES == pMsg->message)
{
if(m_itemList.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 );
OnDropItemFiles( file );
}
}
else if(m_itemCount.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 );
OnDropItemCountFiles( file );
}
}
}
else if(WM_KEYDOWN == pMsg->message )
{
if(VK_RETURN == pMsg->wParam)
{
if(m_editItemCode.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCode;
m_editItemCode.GetWindowText(itemCode);
m_editItemCode.SetWindowText(_T(""));
InsertItemCode(itemCode);
}
else if(m_editItemCount.GetSafeHwnd() == pMsg->hwnd)
{
CString itemCount;
m_editItemCount.GetWindowText(itemCount);
m_editItemCount.SetWindowText(_T(""));
InsertItemCount(itemCount);
}
return TRUE;
}
else if(VK_DELETE == pMsg->wParam)
{
if(m_itemList.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_itemList.GetSelectedCount();
if(count > 0) //kyg 여기에 루프 추가
{
DeleteListItem(m_itemList);
}
}
else if(m_itemCount.GetSafeHwnd() == pMsg->hwnd)
{
UINT count = m_itemCount.GetSelectedCount();
if(count > 0)
{
DeleteListItem(m_itemCount);
}
}
return TRUE;
}
}
if(RestrictMessage(pMsg))
return FALSE;
return CDialogEx::PreTranslateMessage(pMsg);
}
void CSecretShopDlg::ReqeustCountChange(int itemCode, int itemCount)
{
m_parent->RequestSecretShopCountChange(itemCode, itemCount);
}
void CSecretShopDlg::OnBnClickedButtonInsert()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
CString itemCode, itemCount;
for(int i = 0 ; i < m_itemList.GetItemCount() ; i++)
{
itemCode = m_itemList.GetItemText(i, 0);
if( m_itemCount.GetItemCount() <= i )
break;
itemCount = m_itemCount.GetItemText(i, 0);
ReqeustCountChange(atoi(itemCode), atoi(itemCount));
}
}
@@ -0,0 +1,55 @@
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
class CZoneDialog;
// CSecretShopDlg 대화 상자입니다.
class CSecretShopDlg : public CDialogEx
{
DECLARE_DYNAMIC(CSecretShopDlg)
public:
CSecretShopDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CSecretShopDlg();
// 대화 상자 데이터입니다.
enum { IDD = IDD_DIALOG_SECRETSHOP };
public:
void Startup(CZoneDialog* parent);
protected:
CZoneDialog* m_parent;
protected:
void InsertItemCode(CString itemCode);
void InsertItemCount(CString itemCount);
void OnDropItemFiles(CString file);
void OnDropItemCountFiles(CString file);
void DeleteListItem(CListCtrl& m_List);
void ReqeustCountChange(int itemCode, int itemCount);
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CListCtrl m_itemList;
CListCtrl m_itemCount;
afx_msg void OnBnClickedButtonInforeset();
afx_msg void OnEnChangeEditItemcode();
afx_msg void OnEnChangeEditItemcount();
afx_msg void OnLvnItemchangedListItemcode(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnItemchangedListItemcount(NMHDR *pNMHDR, LRESULT *pResult);
virtual BOOL OnInitDialog();
virtual BOOL PreTranslateMessage(MSG* pMsg);
CEdit m_editItemCode;
CEdit m_editItemCount;
afx_msg void OnBnClickedButtonInsert();
};
+10
View File
@@ -0,0 +1,10 @@
#pragma once
enum ServerTypes
{
SERVER_TYPE_NONE = 0,
SERVER_TYPE_MAIN,
SERVER_TYPE_LOGIN,
SERVER_TYPE_GAME,
SERVER_TYPE_BILLING,
SERVER_TYPE_END
};
+28
View File
@@ -0,0 +1,28 @@
#ifndef _TownPortal_h_
#define _TownPortal_h_
#ifdef STATIC_TOWN_PORTAL_API
#define TOWN_PORTAL_API
#else
#ifdef EXPORT_TOWN_PORTAL
#define TOWN_PORTAL_API __declspec(dllexport)
#else
#define TOWN_PORTAL_API __declspec(dllimport)
#endif
#endif
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#include "ioPortalHelp.h"
#include "Packet.h"
#include "ioClientTCPSocket.h"
#include "ioUDPSocket.h"
#include "NetworkSecurity.h"
#include "FSM.h"
#include "cryption.h"
#endif
+51
View File
@@ -0,0 +1,51 @@
#pragma once
#define IDC_SOCKET_CONNECT (WM_USER+1)
#define IDC_SOCKET_CLOSE (WM_USER+2)
#define IDC_SOCKET_RECEIVE (WM_USER+3)
#define IDC_SOCKET_SEND (WM_USER+4)
#define IDC_SERVICE_GAMEINFO (WM_USER+100)
#define IDC_SERVICE_GAMEQUICKCLOSE (WM_USER+110)
#define IDC_SERVICE_GAMESAFECLOSE (WM_USER+111)
#define IDC_SERVICE_LOGININFO (WM_USER+120)
#define IDC_SERVICE_LOGINSHOWPANEL (WM_USER+121)
#define IDC_SERVICE_LOGINREFRESHPANEL (WM_USER+122)
#define IDC_SERVICE_LOGINBLOCK (WM_USER+123)
#define IDC_SERVICE_LOGINUNBLOCK (WM_USER+124)
#define IDC_SERVICE_LOGINBLOCKALL (WM_USER+125)
#define IDC_SERVICE_LOGINUNBLOCKALL (WM_USER+126)
#define IDC_SERVICE_MAININFO (WM_USER+150)
#define IDC_SERVICE_MAINSAFECLOSE (WM_USER+151)
#define IDC_SERVICE_MAINRELOADINI (WM_USER+152)
#define IDC_SERVICE_GAMEQUICKCLOSEALL (WM_USER+153)
#define IDC_SERVICE_GAMESAFECLOSEALL (WM_USER+154)
#define IDC_SERVICE_RELOAD_CLOSEINI (WM_USER+155)
#define IDC_SERVICE_RELOAD_GSINI (WM_USER+156)
#define IDC_SERVICE_LOGINQUICKEXIT (WM_USER+157)
#define IDC_SERVICE_RELAYSERVERCONTROL (WM_USER+158)
#define IDC_SERVICE_MAINRESETEVENTSHOP (WM_USER+159)
#define IDC_SERVICE_MAINRESETCLOVERSHOP (WM_USER+160)
#define IDC_SERVICE_MAINRESETMILEGESHOP (WM_USER+161)
#define IDC_SERVICE_MAINRESETBUYLOG (WM_USER+162)
#define IDC_SERVICE_BILLINGRELOADINI (WM_USER+163)
#define IDC_SERVICE_MAIN_WHITELISTON (WM_USER+164)
#define IDC_SERVICE_MAIN_WHITELISTOFF (WM_USER+165)
#define IDC_SERVICE_LOGIN_WHITELISTON (WM_USER+166)
#define IDC_SERVICE_LOGIN_WHITELISTOFF (WM_USER+167)
#define IDC_SERVICE_MAINRELOADOPTION (WM_USER+168)
#define IDC_SERVICE_MAIN_RESET_MISSION (WM_USER+169)
//#define IDC_SERVICE_BILLINGNEXONLOGOUT (WM_USER+163) 130912 Àӽà »ç¿ë
#define IDC_SERVICE_CSDIALOG (WM_USER+198)
#define IDC_SERVICE_SHOWCS (WM_USER+199)
#define IDC_SERVICE_LOADCS (WM_USER+200)
#define IDC_SERVICE_SHOWTOOL (WM_USER+201)
#define IDC_SERVICE_AUTHENTICATION (WM_USER+202)
#define IDC_SERVICE_GRAPH3SEC (WM_USER+300)
#define IDC_SERVICE_GRAPH1MIN (WM_USER+301)
#define IDC_SERVICE_GRAPH10MIN (WM_USER+302)
#define IDC_SERVICE_REPORT (WM_USER+500)
File diff suppressed because it is too large. Load diff
+298
View File
@@ -0,0 +1,298 @@
#pragma once
#include "afxcmn.h"
#include "IOSocket.h"
#include "OScopeCtrl.h"
#include "OScopeTimeCtrl.h"
#include "ServerTypes.h"
#include "MonitorListCtrl.h"
#include "Network/Protocol.h"
#include "Network/SP2Packet.h"
#include <map>
const int CCU_PORT = 9999;
// 변수명에 userId로 쓰인것은
// publicId와 privateId중 어느 것인지 헤깔리는 부분이 있어
// 추후에 변경해야함
class CDisplayDlg;
class CCSDialog;
class CLoginDialog;
class COperatorDlg;
class CGraphDlg;
class cFileWriter;
typedef std::map<int,SERVERINFO*> SERVERTABLE;
#define BILLING_ANSWER 3
//
// CZoneDialog 대화 상자입니다.
class CZoneDialog : public CDialogEx
{
DECLARE_EASYSIZE
DECLARE_DYNAMIC(CZoneDialog)
public:
CZoneDialog(CWnd* pParent = NULL); // 표준 생성자입니다.
virtual ~CZoneDialog();
// 대화 상자 데이터입니다.
enum { IDD = IDD_ZONEINFO_DIALOG };
public:
void Show();
void Hide();
void CreateMonitor(CString& title, CString& main, CString& login);
void CreateBillingMonitor(CString& title, BOOL billingFlag, BILLINGSERVERTABLE& tempBilling);
void SetBillingFlag(bool bBillingFlag) { m_billingFlag = bBillingFlag; }
bool GetBillingFlag() { return m_billingFlag; }
void SetBillingTable(BILLINGSERVERTABLE& tempBilling) { m_billingServerTable = tempBilling; }
void SetBillingViewList();
void SetBillingConnTimerFlag(bool bTimer) { m_billingConnTimerFlag = bTimer; }
BOOL GetBillingConnTimerFlag() { return m_billingConnTimerFlag; }
void SetBillingTimerFlag(bool bTimer) { m_billingTimerFlag = bTimer; }
BOOL GetBilingTimerFlag() { return m_billingTimerFlag; }
void AddBillingConnectCount() { ++m_billingConnCount; }
void MinusBillingConnectCount() { --m_billingConnCount; }
int GetBillingConnectCount() { return m_billingConnCount; }
void OnConnect(const ServerTypes serverType, const int errCode, const int billingIndex);
void OnClose(const ServerTypes serverType, const int errCode, const int billingKeyIndex);
void OnReceive(const ServerTypes serverType, SP2Packet& rkPacket);
void ReceiveInfo( SP2Packet& rkPacket );
void RequestInfo(int serverType, int index);
void GetAddress(const ServerTypes serverType, const int item, CString& name, CString& IP, int& port);
void GetBillingAddress(const int serverType, const int item, CString& name, CString& IP, int& port);
BOOL GetRelayFlag(int index);
BOOL IsShow() { return m_show; }
BOOL IsAdministrator() { return (ADMIN_LEVEL_ADMINISTRATOR == m_level) ? TRUE : FALSE; }
BOOL IsOperator() { return (ADMIN_LEVEL_OPERATOR == m_level) ? TRUE : FALSE; }
protected:
void CreateSocket();
void CreateGraph();
void CreateList();
void CreateChild();
void CreateLog();
void CreateTimer();
void DestroyTimer();
void CreatePanel();
void CreatePopup();
void CreateServerDownLog(SERVERINFO *serverInfo);
void ReadCurrentUserCCU();
void InsertServer(SERVERINFO* serverInfo, const ServerStates state);
void UpdateServer(SERVERINFO* serverInfo, const ServerStates state);
void UpdateGameInfo(const int item, SERVERINFO& serverInfo);
void UpdateBillingReloadStatus(const int item, BOOL status);
void UpdateBillingUserCountInfo(const int item, BILLINGSERVERINFO& serverInfo, int billingKeyIndex);
void UpdateGraph(const int userCount);
void SortBillingList();
void InsertBillingServer(BILLINGSERVERINFO* serverInfo, const ServerStates state, int billingKeyIndex);
void UpdateBillingServer(BILLINGSERVERINFO* serverInfo, const ServerStates state, int billingKeyIndex);
void UpdateBillingGraph();
public:
void SetTitle(CString& title) { m_title = title; }
CString GetTitle() { return m_title; }
int GetGameServerCount() { return m_gameServerTable.size(); }
SERVERINFO* GetGameServerInfo(const int index);
SERVERINFO* GetGameServerInfo(ioHashString& serverName);
SERVERINFO* GetGameServerInfo(ioHashString& serverIP, int serverPort);
SERVERINFO* GetOtherServerInfo(const int index);
SERVERINFO* GetOtherServerInfo(const ServerTypes serverType);
public :
BILLINGSERVERINFO* GetBillingServerInfo(const int index);
BILLINGSERVERINFO* GetBillingServerListInfo(const int index);
protected :
void AddGameServerInfo(SERVERINFO* serverInfo);
void AddOtherServerInfo(SERVERINFO* serverInfo);
void RequestBillingUserInfoCount(); //접속되어 있는 빌링서버에 유저 카운트 요청함
void ShowInfo(int serverType, int index, CString& title, CString& text);
void ShowGraph(MSG* pMsg);
bool WriteLog(int currentUser);
ULONGLONG DiffTime(SYSTEMTIME time1, SYSTEMTIME time2);
public:
CIOSocket* GetSockMain();
void RequestAuth(CString ID, CString PWD);
void RequestKickUser(CString publicID);
void RequestPractice(CString publicID);
void RequestAnnounce(int msgType, CString publicID, CString announce);
void RequestItemInsert(CString publicID, int presentType, int value1, int value2, int ment, int isPublicID);
void RequestEventInsert(int values[], int valueCount);
void RequestUserBlock(CString publicID, CString note, int64 limitTime, int level);
void RequestUserUnblock(CString publicID);
void RequestBillingServerLOG(int index);
void RequestWhiteList(BOOL bWhiteList, ServerTypes eServerType);
void RequestSecretShopCountChange(int iCode, int iCount);
void RequestCompensation(int iType, int iCode, int iValue, __int64 iEndDate);
void WriteLogDlg( const TCHAR* format, ...);
void WriteLogDlg( CString text );
protected:
BOOL GetIP(CString& localIP);
void UpdateBegin();
void UpdateEnd();
void RequestMonitorIP();
void RequestMainInfo();
void RequestLoginConnect();
void RequestLoginInfo();
void RequestLoginPanel();
void RequestLoginBlock(int serverIndex, int blockState);
void RequestLoginQuickExit();
void RequestGameServerInfo(int index);
void RequestMainClose();
void RequestGameSafeyClose(int index);
void RequestGameQuicklyClose(int index);
void RequestGameSafeyCloseAll();
void RequestGameQuicklyCloseAll();
void RequestShowCSFile();
void RequestLoadCSFile();
void RequestUpdateRivision(int version);
void RequestReloadGSINI();
void RequestReloadOption();
void RequestReloadCloseINI();
void RequestBillingReloadINI( int billingKeyIndex );
//void RequestBillingReloadINI_ALL();
//void RequestBillingNexonPCRoomLogout( int billingKeyIndex );
void ResetEventShopCount();
void ResetCloverShopCount();
void ResetMilegeShopCount();
void ReserPurchaseLog();
void ReserOldMissionData();
void RequestChangeRelayServerState(int index);
void RequestExportReports();
void OnAnswerNumConnect(SP2Packet &rkPacket);
void OnAnswerBillingConnect(SP2Packet &rkPacket);
void OnBillingUserInfo(SP2Packet &rkPacket);
void OnServerDisconnect(SP2Packet &rkPacket);
void OnAllServerInfo(SP2Packet &rkPacket);
void OnLoadCS3File(SP2Packet &rkPacket);
void OnCS3FileVersion(SP2Packet &rkPacket);
void OnUpdateClientVersion(SP2Packet &rkPacket);
void OnServerInfoAck(SP2Packet &rkPacket);
void OnAdminResponse(SP2Packet &rkPacket);
void OnLoginInfoAck(SP2Packet &rkPacket);
void OnLoginServerInfo(SP2Packet& rkPacket);
void OnLoginServerRefresh(SP2Packet& rkPacket);
void OnLoginServerBlock(SP2Packet& rkPacket);
void OnLSResponse(SP2Packet &rkPacket);
void OnAnswerBillingRequest(SP2Packet &rkPacket);
void OnBillingReloadINIStatus(SP2Packet &rkPacket);
void OnReceiveEUCCU(SP2Packet &rkPacket);
void OnReceiveLicenseCheck(SP2Packet &rkPacket);
protected:
BOOL m_show;
CImageList m_imageList;
//COScopeCtrl m_countGraph;
COScopeTimeCtrl m_countGraph;
CString m_title;
WORD m_wLogYear;
WORD m_wLogMonth;
WORD m_wLogDay;
CString m_mainIP, m_loginIP;
int m_mainPort, m_loginPort;
CIOSocket m_sockMain;
CIOSocket m_sockLogin;
SERVERTABLE m_gameServerTable;
SERVERTABLE m_otherServerTable;
BILLINGSERVERTABLE m_billingServerTable; //INI에서 읽어온 빌링서버 정보
std::vector<BILLINGSERVERINFO*> m_billingServerList; //리스트 출력 순대로 저장됨 -> index 를 통해 클릭된 빌링서버 정보 구할 수 있음
int m_maxBillingUser, m_CurrentBillingUser;
int m_lastBillingMax;
int m_billingLOGReceiveCount, m_billingConnCount;
int m_level;
int m_maxUser, m_currentUser;
int m_lastMax;
int m_selectedItem;
public:
CDisplayDlg* m_displayDlg;
CLoginDialog* m_loginDlg;
COperatorDlg* m_operatorDlg;
CGraphDlg* m_graphDlg;
cFileWriter* m_file;
SYSTEMTIME m_BeforeSysTime;
CMenu m_menu;
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
DECLARE_MESSAGE_MAP()
public:
CMonitorListCtrl m_services[2];
BOOL m_billingFlag;
BOOL m_billingTimerFlag;
BOOL m_billingConnTimerFlag;
BOOL m_bCountryCode;
virtual BOOL OnInitDialog();
virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnSizing(UINT fwSide, LPRECT pRect);
virtual BOOL PreTranslateMessage(MSG* pMsg);
afx_msg void OnLvnItemchangedListGamedemons(NMHDR *pNMHDR, LRESULT *pResult);
private:
//EU국가별 접속자수 카운팅 함수 및 변수입니다.
void SetUserEachOfCountry(int iSvrType, int iNum, char* cName, SERVERINFO* svrInfo, const ServerStates iSvrState);
//EU국가별 접속자수 데이터 설정 함수
void SetEachOfCountryData(int iNum, char* cName, DWORD wdConnect);
//문자열 붙이는 함수입니다.
void CStringAddINT(int iData, CString* TStr);
void SetCloseCCU(CString* Tstr);
void MoveToItemData(int iSvrNum, int iSour, int iDest);
SERVERINFO OtherSvrInfo[CI_MAX]; //국가별 카운트용
DWORD m_wdENG, m_wdGER, m_wdFRA, m_wdITA, m_wdPOL, m_wdTUR, m_wdETC;
public:
// afx_msg void OnNMClickListGamedemons(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnLvnKeydownListGamedemons(NMHDR *pNMHDR, LRESULT *pResult);
afx_msg void OnNMDblclkListGamedemons(NMHDR *pNMHDR, LRESULT *pResult);
void GetCCUINFO(const int item, CString& strName, CString& IP, int& port, int& ENGcnt, int& GERcnt, int& FRAcnt, int& ITAcnt, int& POLcnt, int& TURcnt, int& ETCcnt);
};
Loaded 100 of 20588 files, more files were not shown because too many files have changed in this diff. Show more