// RemoteView.cpp : ±¸Çö ÆÄÀÏÀÔ´Ï´Ù. // #include "stdafx.h" #include "ConsoleApp.h" #include "RemoteView.h" #include "WaitMessageDlg.h" #include "MainFrm.h" #include "LocalView.h" CString BYTE2KMBYTE(__int64 nBytes, int nFlag, bool bShowDecimalPoint); CString NumericFormat(__int64 nNumeric); CString GetValidFileName(LPCTSTR pszFileName); typedef struct { HCOMMLIB hcl; CString sPath; UINT nFileCount; PCLFILE_STRUCT pclf; }THREAD_PARAM,*LPTHREAD_PARAM; DWORD WINAPI GetFileListThread(LPVOID lpParam); // CRemoteView IMPLEMENT_DYNCREATE(CRemoteView, CFormView) CRemoteView::CRemoteView() : CFormView(CRemoteView::IDD) { m_bClosing = false; m_bDragSplitter = FALSE; m_cxSplitter = COptions::GetOptionVal(OPTION_REMOTETREESIZE); m_nTotalCount = 0; m_nTotalBytes = 0; m_nTotalFiles = 0; m_nSelectedCount = 0; m_nSelectedBytes = 0; m_nSelectedFiles = 0; m_bUpdating = FALSE; m_nTimer = 0; } CRemoteView::~CRemoteView() { COptions::SetOption(OPTION_REMOTETREESIZE, m_cxSplitter); } BEGIN_MESSAGE_MAP(CRemoteView, CFormView) ON_WM_CREATE() ON_WM_DESTROY() ON_WM_SIZE() ON_WM_ERASEBKGND() ON_WM_TIMER() ON_BN_CLICKED(IDC_REMOTE_TITLE, OnRemoteTitle) ON_BN_CLICKED(IDC_REMOTE_BTN_UP_ADDR, OnRemoteBtnUpAddr) ON_BN_CLICKED(IDC_REMOTE_BTN_LISTSTYLE, OnRemoteBtnListStyle) ON_NOTIFY(TVN_SELCHANGED, IDC_REMOTE_TREE, OnTreeSelchanged) ON_NOTIFY(TVN_ITEMEXPANDING, IDC_REMOTE_TREE, OnTreeItemexpanding) ON_NOTIFY(TVN_ITEMEXPANDED, IDC_REMOTE_TREE, OnTreeItemexpanded) ON_NOTIFY(TVN_BEGINLABELEDIT, IDC_REMOTE_TREE, OnTreeBeginlabeledit) ON_NOTIFY(TVN_ENDLABELEDIT, IDC_REMOTE_TREE, OnTreeEndlabeledit) ON_NOTIFY(LVN_BEGINLABELEDIT, IDC_REMOTE_LIST, OnListBeginlabeledit) ON_NOTIFY(LVN_ENDLABELEDIT, IDC_REMOTE_LIST, OnListEndlabeledit) ON_NOTIFY(LVN_ITEMCHANGED, IDC_REMOTE_LIST, OnListItemChanged) ON_NOTIFY(NM_CLICK, IDC_REMOTE_LIST, OnListNMClick) ON_MESSAGE(WMU_SHOW_VOLUMELIST, OnShowVolumelist) ON_MESSAGE(WMU_EXPAND_FOLDERLIST, OnExpandFolderlist) ON_MESSAGE(WMU_SHOW_FOLDERLIST, OnShowFolderlist) ON_MESSAGE(WMU_SHOW_OBJECTLIST, OnShowObjectlist) END_MESSAGE_MAP() void CRemoteView::DoDataExchange(CDataExchange* pDX) { CFormView::DoDataExchange(pDX); DDX_Control(pDX, IDC_REMOTE_CBO_ADDR, m_cboAddr); DDX_Control(pDX, IDC_REMOTE_TREE, m_tree); DDX_Control(pDX, IDC_REMOTE_LIST, m_list); } void CRemoteView::OnInitialUpdate() { static BOOL bInited = FALSE; CFormView::OnInitialUpdate(); if (!bInited) { m_cboAddr.OnCreate(NULL); m_tree.OnCreate(NULL); m_list.OnCreate(NULL); bInited = TRUE; } ApplyListStyle(); SetControlStatus(FALSE); } // CRemoteView Áø´ÜÀÔ´Ï´Ù. #ifdef _DEBUG void CRemoteView::AssertValid() const { CFormView::AssertValid(); } void CRemoteView::Dump(CDumpContext& dc) const { CFormView::Dump(dc); } #endif //_DEBUG // CRemoteView ±×¸®±â void CRemoteView::OnDraw(CDC* pDC) { RECT rc, rcClient; CBrush br; GetClientRect(&rcClient); /////////////////////////////////////////////////////////////////////////////// // 3D À½¿µ // ÃÖ»ó´Ü br.CreateSysColorBrush(COLOR_BTNHIGHLIGHT); rc = rcClient; rc.top = 0; rc.bottom = HIGHLIGHT_SIZE; pDC->FillRect(&rc, &br); // ¸ÇÁÂÃø rc = rcClient; rc.left = 0; rc.right = HIGHLIGHT_SIZE; pDC->FillRect(&rc, &br); br.DeleteObject(); // ¸Ç¿ìÃø br.CreateSysColorBrush(COLOR_BTNSHADOW); rc = rcClient; rc.left = rc.right - 1; pDC->FillRect(&rc, &br); br.DeleteObject(); RedrawFocus(); } ///////////////////////////////////////////////////////////////////////////// // CRemoteView ¸Þ½ÃÁö 󸮱âÀÔ´Ï´Ù. BOOL CRemoteView::PreTranslateMessage(MSG* pMsg) { static int xOldSplitter = -77; int x, y; switch (pMsg->message) { case WM_MOUSEMOVE: x = LOWORD(pMsg->lParam); y = HIWORD(pMsg->lParam); if (m_bDragSplitter) { if (xOldSplitter != -77) InvertTracker(xOldSplitter); InvertTracker(xOldSplitter = x + 2); return TRUE; } else if (pMsg->hwnd == GetSafeHwnd()) { RECT rc; GetClientRect(&rc); rc.left = m_cxSplitter; rc.right = m_cxSplitter + SPLITTER_SIZE; rc.top = CAPTION_HEIGHT; rc.bottom -= STATUS_HEIGHT; if (x >= rc.left && x <= rc.right && y >= rc.top && y <= rc.bottom) SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEWE)); } break; case WM_LBUTTONDOWN: ((CMainFrame *)AfxGetMainWnd())->SetFocus(this); x = LOWORD(pMsg->lParam); y = HIWORD(pMsg->lParam); if (pMsg->hwnd == m_hWnd) { RECT rc; GetClientRect(&rc); rc.left = m_cxSplitter; rc.right = m_cxSplitter + SPLITTER_SIZE; rc.top = CAPTION_HEIGHT; rc.bottom -= STATUS_HEIGHT; if (x >= rc.left && x <= rc.right && y >= rc.top && y <= rc.bottom) { GetWindowRect(&rc); ClipCursor(&rc); SetCursor(AfxGetApp()->LoadStandardCursor(IDC_SIZEWE)); SetCapture(); m_bDragSplitter = TRUE; xOldSplitter = -77; return TRUE; } } break; case WM_LBUTTONUP: ((CMainFrame *)AfxGetMainWnd())->SetFocus(this); if (m_bDragSplitter) { InvertTracker(xOldSplitter); ClipCursor(NULL); ReleaseCapture(); SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW)); m_bDragSplitter = FALSE; RECT rc; GetClientRect(&rc); x = LOWORD(pMsg->lParam); if (x < MIN_TREE_WIDTH) x = MIN_TREE_WIDTH; else if (x > rc.right - MIN_LIST_WIDTH) x = rc.right - MIN_LIST_WIDTH; m_cxSplitter = x; RedrawControl(rc.right, rc.bottom); return TRUE; } break; case WM_RBUTTONDOWN: ((CMainFrame *)AfxGetMainWnd())->SetFocus(this); break; } return CFormView::PreTranslateMessage(pMsg); } BOOL CRemoteView::PreCreateWindow(CREATESTRUCT& cs) { cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS; cs.dwExStyle |= WS_EX_STATICEDGE; return CFormView::PreCreateWindow(cs); } int CRemoteView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFormView::OnCreate(lpCreateStruct) == -1) return -1; CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); CString sCaption; // Æ®¸® »ý¼º if (!m_capTitleIcon.Create("", WS_VISIBLE | BS_OWNERDRAW, CRect(4,4,20,20), this, 0)) { AfxMessageBox("IDC_REMOTE_TITLEICON »ý¼º ½ÇÆÐ.\n"); return -1; } m_capTitleIcon.LoadBitmaps(IDB_CAP_REMOTE); #ifdef _LGU // 2014.07.16 // LG U+ sCaption = "X-CDN"; #else // KTICS sCaption = "ICS"; #endif // if (!m_capTitle.Create(this, " " + sCaption, CPWS_EX_CLOSEBUTTON, WS_VISIBLE, CRect(0, 0, 0, 0), IDC_REMOTE_TITLE)) { AfxMessageBox("IDC_REMOTE_TITLE »ý¼º ½ÇÆÐ.\n"); return -1; } m_capTitle.SetFont(&pmf->m_font); /* if (!m_tree.CreateEx(WS_EX_CLIENTEDGE, WS_VISIBLE | WS_CLIPCHILDREN | WS_CHILD | TVS_HASBUTTONS | TVS_HASLINES | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_TRACKSELECT, CRect(0,0,0,0), this, IDC_REMOTE_TREE)) { AfxMessageBox( "IDC_REMOTE_TREE »ý¼º ½ÇÆÐ.\n" ); return -1; } m_tree.SetFont(&pmf->m_font); */ // ¸®½ºÆ® »ý¼º sCaption = "À§Ä¡"; if (!m_capAddr.Create(sCaption, WS_VISIBLE | SS_CENTER | SS_CENTERIMAGE, CRect(0,0,0,0), this, IDC_REMOTE_STC_ADDR)) { AfxMessageBox("IDC_REMOTE_STC_ADDR »ý¼º ½ÇÆÐ.\n"); return -1; } m_capAddr.SetFont(&pmf->m_font); /* if (!m_cboAddr.Create(WS_VISIBLE | CBS_DROPDOWN, CRect(0,0,0,200), this, IDC_REMOTE_CBO_ADDR)) { AfxMessageBox("IDC_REMOTE_CBO_ADDR »ý¼º ½ÇÆÐ.\n"); return -1; } m_cboAddr.SetFont(&pmf->m_font); */ if (!m_btnGoAddr.Create("", WS_VISIBLE | BS_OWNERDRAW, CRect(0,0,0,0), this, IDC_REMOTE_BTN_GO_ADDR)) { AfxMessageBox("IDC_REMOTE_BTN_GO_ADDR »ý¼º ½ÇÆÐ.\n"); return -1; } m_btnGoAddr.SetXButtonStyle(BS_XT_WINXP_COMPAT); m_btnGoAddr.SetBitmap(0, IDB_BTN_GO); if (!m_btnUpAddr.Create("", WS_VISIBLE | BS_OWNERDRAW, CRect(0,0,0,0), this, IDC_REMOTE_BTN_UP_ADDR)) { AfxMessageBox("IDC_REMOTE_BTN_UP_ADDR »ý¼º ½ÇÆÐ.\n"); return -1; } m_btnUpAddr.SetXButtonStyle(BS_XT_WINXP_COMPAT); m_btnUpAddr.SetBitmap(0, IDB_BTN_UP); if (!m_btnListStyle.Create("", WS_VISIBLE | BS_OWNERDRAW, CRect(0,0,0,0), this, IDC_REMOTE_BTN_LISTSTYLE)) { AfxMessageBox("IDC_REMOTE_BTN_LISTSTYLE »ý¼º ½ÇÆÐ.\n"); return -1; } m_btnListStyle.SetXButtonStyle(BS_XT_WINXP_COMPAT); m_btnListStyle.SetBitmap(0, IDB_BTN_LISTSTYLE); /* if (!m_list.CreateEx(WS_EX_CLIENTEDGE, WS_VISIBLE | LVS_SHAREIMAGELISTS | LVS_EDITLABELS | LVS_SHOWSELALWAYS, CRect(0,0,0,0), this, IDC_REMOTE_LIST)) { AfxMessageBox("IDC_REMOTE_LIST »ý¼º ½ÇÆÐ.\n"); return -1; } m_list.SetFont(&pmf->m_font); */ if (!m_capStatus.Create(this, "", CPWS_EX_RAISED_EDGE, WS_VISIBLE, CRect(0, 0, 0, 0), 0)) { AfxMessageBox("IDC_LOCAL_TITLE »ý¼º ½ÇÆÐ.\n"); return -1; } m_capStatus.SetFont(&pmf->m_font); if (!m_prgStatusSpace.Create(WS_VISIBLE, CRect(0, 0, 0, 0), this, 0)) { AfxMessageBox("IDC_LOCAL_STATUS_SPACE »ý¼º ½ÇÆÐ.\n"); return -1; } m_prgStatusSpace.SetFont(&pmf->m_font); m_prgStatusSpace.SetRange(0, 100); m_prgStatusSpace.SetText(" "); m_prgStatusSpace.SetStep(1); m_prgStatusSpace.ShowWindow(SW_HIDE); if (!m_stcStatusSpace.Create("", WS_VISIBLE, CRect(0, 0, 0, 0), this)) { AfxMessageBox("IDC_LOCAL_STATUS_SPACE »ý¼º ½ÇÆÐ.\n"); return -1; } m_stcStatusSpace.SetFont(&pmf->m_font); if (!m_stcStatusObject.Create("", WS_VISIBLE, CRect(0, 0, 0, 0), this)) { AfxMessageBox("IDC_LOCAL_STATUS_OBJECT »ý¼º ½ÇÆÐ.\n"); return -1; } m_stcStatusObject.SetFont(&pmf->m_font); if (!m_stcStatusMsg.Create("", WS_VISIBLE, CRect(0, 0, 0, 0), this)) { AfxMessageBox("IDC_LOCAL_STATUS_MSG »ý¼º ½ÇÆÐ.\n"); return -1; } m_stcStatusMsg.SetFont(&pmf->m_font); if (!m_stcSeparator1.Create("", WS_VISIBLE | WS_BORDER, CRect(0, 0, 1, STATUS_HEIGHT - 2), this)) { AfxMessageBox("IDC_LOCAL_STATUS_SEPARATOR »ý¼º ½ÇÆÐ.\n"); return -1; } m_stcSeparator1.ModifyStyleEx(NULL, WS_EX_STATICEDGE); if (!m_stcSeparator2.Create("", WS_VISIBLE | WS_BORDER, CRect(0, 0, 1, STATUS_HEIGHT - 2), this)) { AfxMessageBox("IDC_LOCAL_STATUS_SEPARATOR »ý¼º ½ÇÆÐ.\n"); return -1; } m_stcSeparator2.ModifyStyleEx(NULL, WS_EX_STATICEDGE); // ¹«ÀÎÁõ Æú´õ ¾ÆÀÌÄÜ ¼³Á¤ SHFILEINFO shfi; HIMAGELIST hil = (HIMAGELIST)SHGetFileInfo("", 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_SMALLICON); m_pilSmall = CImageList::FromHandle(hil); hil = (HIMAGELIST)SHGetFileInfo("", 0, &shfi, sizeof(shfi), SHGFI_ICON | SHGFI_SYSICONINDEX | SHGFI_LARGEICON); m_pilLarge = CImageList::FromHandle(hil); // ¹Ýµå½Ã bOpen == false ¸ÕÀú È£Ãâ InsertAnonyFolderIcon(true, false); InsertAnonyFolderIcon(true, true); InsertAnonyFolderIcon(false, false); InsertAnonyFolderIcon(false, true); return 0; } void CRemoteView::OnDestroy() { m_bClosing = true; m_tree.DeleteAllItems(); m_list.DeleteAllItems(); CFormView::OnDestroy(); } void CRemoteView::OnSize(UINT nType, int cx, int cy) { CFormView::OnSize(nType, cx, cy); int nTreeWidth = m_cxSplitter > 0 ? m_cxSplitter : 250; m_cxSplitter = nTreeWidth; RedrawControl(cx, cy); } BOOL CRemoteView::OnEraseBkgnd(CDC* pDC) { return TRUE; } void CRemoteView::OnRemoteTitle() { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); ASSERT_VALID(pmf); pmf->OnViewRtree(); RedrawControl(); } void CRemoteView::OnRemoteBtnUpAddr() { HTREEITEM hti = m_tree.GetSelectedItem(); if (m_tree.GetRootItem() == hti) return; hti = m_tree.GetParentItem(hti); m_tree.SelectItem(hti); } void CRemoteView::OnRemoteBtnListStyle() { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->m_nRemoteListType++; if (pmf->m_nRemoteListType == 5) pmf->m_nRemoteListType = 1; ApplyListStyle(); } void CRemoteView::OnTreeSelchanged(NMHDR *pNMHDR, LRESULT *pResult) { if (m_bClosing) return; LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); AfxGetMainWnd()->PostMessage(WMU_UPDATE_CONTROL_STATUS); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(pNMTreeView->itemNew.hItem); ASSERT(prti); PostMessage(prti->nClass == TNS_ROOT ? WMU_SHOW_VOLUMELIST : WMU_SHOW_FOLDERLIST, (WPARAM)pNMTreeView->itemNew.hItem, (LPARAM)FALSE); *pResult = 0; } void CRemoteView::OnTreeItemexpanding(NMHDR *pNMHDR, LRESULT *pResult) { if (m_bClosing) return; LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); if (pNMTreeView->action == TVE_COLLAPSE) return; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(pNMTreeView->itemNew.hItem); ASSERT(prti); if (prti->paObject.GetCount() == 0 && prti->nClass != TNS_ROOT) PostMessage(WMU_EXPAND_FOLDERLIST, (WPARAM)pNMTreeView->itemNew.hItem, (LPARAM)FALSE); *pResult = 0; } void CRemoteView::OnTreeItemexpanded(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTREEVIEW pNMTreeView = reinterpret_cast(pNMHDR); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(pNMTreeView->itemNew.hItem); ASSERT(prti); if (prti->nClass == TNS_FOLDER) { SHFILEINFO shfi; if (prti->saAttr[1] == "1") { shfi.iIcon = ((CMainFrame*)AfxGetMainWnd())->m_iAnonyAuthIcon; if (pNMTreeView->itemNew.state & TVIS_EXPANDED) shfi.iIcon++; } else SHGetFileInfo("", FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_SYSICONINDEX | (pNMTreeView->itemNew.state & TVIS_EXPANDED ? SHGFI_OPENICON : NULL)); m_tree.SetItemImage(pNMTreeView->itemNew.hItem, shfi.iIcon, shfi.iIcon); } HTREEITEM hti = m_tree.GetChildItem(pNMTreeView->itemNew.hItem); if (hti && !m_tree.GetItemData(hti) && m_tree.GetItemText(hti) == "") m_tree.DeleteItem(hti); *pResult = 0; } void CRemoteView::OnTreeBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR); PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(pTVDispInfo->item.hItem); if (prti->nClass == TNS_ROOT || prti->nClass == TNS_VOLUME) { *pResult = -1; return; } m_sOldFileName = pTVDispInfo->item.pszText; *pResult = 0; } void CRemoteView::OnTreeEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { LPNMTVDISPINFO pTVDispInfo = reinterpret_cast(pNMHDR); if (!pTVDispInfo->item.pszText) return; CString sNewFileName = GetValidFileName(pTVDispInfo->item.pszText); if (sNewFileName == "" || IsExistsFileName(m_tree.GetParentItem(pTVDispInfo->item.hItem), m_sOldFileName, sNewFileName)) { *pResult = FALSE; m_tree.SetFocus(); m_tree.EditLabel(pTVDispInfo->item.hItem); return; } HTREEITEM hti = m_tree.GetParentItem(pTVDispInfo->item.hItem); CString sPath = m_tree.GetPath(hti); CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (!pmf->Move1RemoteObject(m_tree.GetVolumeItem(hti), sPath + "/" + m_sOldFileName, sPath + "/" + sNewFileName)) return; strcpy(pTVDispInfo->item.pszText, sNewFileName); m_tree.SetItemText(pTVDispInfo->item.hItem, sNewFileName); m_tree.Sort(m_tree.GetParentItem(pTVDispInfo->item.hItem)); pmf->PostMessage(WMU_UPDATE_CONTROL_STATUS); *pResult = TRUE; } void CRemoteView::OnListBeginlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { LV_DISPINFO* pLVDispInfo = (LV_DISPINFO*)pNMHDR; if (m_tree.GetRootItem() == m_tree.GetSelectedItem()) { *pResult = -1; return; } m_sOldFileName = m_list.GetItemText(pLVDispInfo->item.iItem, 0); *pResult = 0; } void CRemoteView::OnListEndlabeledit(NMHDR *pNMHDR, LRESULT *pResult) { LV_DISPINFO* pLVDispInfo = (LV_DISPINFO*)pNMHDR; if (!pLVDispInfo->item.pszText) return; CString sNewFileName = GetValidFileName(pLVDispInfo->item.pszText); if (sNewFileName == "" || IsExistsFileName(m_tree.GetSelectedItem(), m_sOldFileName, sNewFileName)) { *pResult = -1; m_list.SetFocus(); lstrcpy(pLVDispInfo->item.pszText,m_sOldFileName); m_list.EditLabel(pLVDispInfo->item.iItem); return; } HTREEITEM htiSelected = m_tree.GetSelectedItem(); CString sPath = m_tree.GetPath(htiSelected); CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (!pmf->Move1RemoteObject(m_tree.GetVolumeItem(htiSelected), sPath + "/" + m_sOldFileName, sPath + "/" + sNewFileName)) return; strcpy(pLVDispInfo->item.pszText, sNewFileName); m_list.SetItemText(pLVDispInfo->item.iItem, 0, sNewFileName); if (((PRLISTITEM_STRUCT)m_list.GetItemData(pLVDispInfo->item.iItem))->bFolder) { HTREEITEM hti = m_tree.GetChildItem(htiSelected); while (hti) { if (m_tree.GetItemText(hti) == m_sOldFileName) { m_tree.SetItemText(hti, sNewFileName); break; } hti = m_tree.GetNextSiblingItem(hti); } m_tree.Sort(htiSelected); } else { SHFILEINFO shfi; DWORD dwAttr = FILE_ATTRIBUTE_NORMAL; if (!SHGetFileInfo(sNewFileName.Mid(sNewFileName.ReverseFind('.')), dwAttr, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME)) { shfi.iIcon = -1; shfi.szTypeName[0] = NULL; } m_list.SetItem(pLVDispInfo->item.iItem,0,LVIF_IMAGE,NULL,shfi.iIcon,LVIS_SELECTED ,LVIS_SELECTED,0); } m_list.Sort(); pmf->PostMessage(WMU_UPDATE_CONTROL_STATUS); *pResult = 0; } void CRemoteView::OnListItemChanged(NMHDR *pNMHDR, LRESULT *pResult) { if (m_bUpdating) return; LPNMLISTVIEW pNMLV = reinterpret_cast(pNMHDR); if (!(pNMLV->uChanged & LVIS_DROPHILITED)) return; if (pNMLV->uNewState & LVIS_SELECTED && !(pNMLV->uOldState & LVIS_SELECTED)) { m_nSelectedCount++; PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)m_list.GetItemData(pNMLV->iItem); if (!prli->bFolder) { m_nSelectedBytes += prli->nSize; m_nSelectedFiles++; } } else if (!(pNMLV->uNewState & LVIS_SELECTED) && pNMLV->uOldState & LVIS_SELECTED) { m_nSelectedCount--; PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)m_list.GetItemData(pNMLV->iItem); if (!prli->bFolder) { m_nSelectedBytes -= prli->nSize; m_nSelectedFiles--; } } if (m_nTimer != 0) KillTimer(m_nTimer); if (m_nSelectedCount > 0) m_nTimer = (UINT)SetTimer(TIMER_ID_UPDATESTATUS, 20, 0); else ShowStatusObject(FALSE, FALSE); *pResult = 0; } void CRemoteView::OnListNMClick(NMHDR *pNMHDR, LRESULT *pResult) { ((CMainFrame *)AfxGetMainWnd())->SetFocus(this); *pResult = 0; } void CRemoteView::OnTimer(UINT nIDEvent) { KillTimer(m_nTimer); m_nTimer = 0; if (nIDEvent == TIMER_ID_UPDATESTATUS) { if (m_nSelectedFiles > 0) m_stcStatusObject.SetWindowText(NumericFormat(m_nSelectedCount) + " °³Ã¼°¡ ¼±ÅõÊ, " + BYTE2KMBYTE(m_nSelectedBytes, 0, TRUE)); else m_stcStatusObject.SetWindowText(NumericFormat(m_nSelectedCount) + " °³Ã¼°¡ ¼±ÅõÊ"); AfxGetMainWnd()->PostMessage(WMU_UPDATE_CONTROL_STATUS); } CFormView::OnTimer(nIDEvent); } LRESULT CRemoteView::OnShowVolumelist(WPARAM wParam, LPARAM lParam) { if (m_bClosing) return S_OK; HTREEITEM htiRoot = (HTREEITEM)wParam; BOOL bRefresh = (BOOL)lParam; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (!bRefresh && htiRoot) { PostMessage(WMU_SHOW_OBJECTLIST, (WPARAM)htiRoot); return S_OK; } pmf->BeginWaitMessage(); HCOMMLIB hcl = pmf->m_mapHcl[NULL]; ASSERT(hcl); UINT nServiceCount; OutputDebugString("XXX RemoteView : cl_get_service_list\n"); PCLSERVICE_STRUCT pcls = cl_get_service_list(hcl, &nServiceCount); if (!pcls || nServiceCount == 0) { cl_free_service_list(hcl, pcls); pmf->EndWaitMessage(); AfxMessageBox(cl_get_error_message(hcl), MB_ICONERROR); pmf->Disconnect(); pmf->ShowLoginDialog(); return S_FALSE; } m_tree.DeleteAllItems(); PRTREEITEM_STRUCT prtiRoot = new RTREEITEM_STRUCT; prtiRoot->nClass = TNS_ROOT; prtiRoot->bCached = true; prtiRoot->sName = pmf->m_sUserId; htiRoot = m_tree.InsertItem(pmf->m_sUserId, pmf->m_iNetworkIcon, pmf->m_iNetworkIcon); m_tree.SetItemData(htiRoot, (DWORD_PTR)prtiRoot); for (UINT i = 0; i < nServiceCount; i++) { CString sName = (LPCSTR)pcls[i].id; HTREEITEM hti = m_tree.InsertItem(sName, pmf->m_iDriveIcon, pmf->m_iDriveIcon, htiRoot); PRTREEITEM_STRUCT prti = new RTREEITEM_STRUCT; prti->bCached = false; prti->nClass = TNS_VOLUME; prti->sName = sName; prti->saAttr.Add(""); // datetime prti->saAttr.Add((LPCSTR)pcls[i].domain2); // url prti->saAttr.Add(""); // total bytes prti->saAttr.Add(""); // used bytes m_tree.SetItemData(hti, (DWORD_PTR)prti); m_tree.InsertItem("", -1, -1, hti); PRLISTITEM_STRUCT prli = new RLISTITEM_STRUCT; prli->bFolder = true; prli->sName = sName; prli->nSize = -1; prli->saAttr.Add(sName.MakeUpper()); prli->saAttr.Add(""); prli->saAttr.Add("¼­ºñ½º"); prli->saAttr.Add(""); prtiRoot->paObject.Add(prli); CString sURL = (LPCSTR)pcls[i].domain2; sURL += "/dav"; CString sUserId = (LPCSTR)pcls[i].id; sUserId += "@" + pmf->m_sUserId; HCOMMLIB hcl = cl_init(sURL,pcls[i].domain,sUserId, pmf->m_sPassword, pmf->GetProxyHost(), pmf->GetProxyPort()); ASSERT(hcl); pmf->m_mapHcl.SetAt(hti, hcl); // TRACE("%x : %s : %s\n",hcl,sURL,pcls[i].domain); pmf->UpdateVolumeInfo(hti); } cl_free_service_list(hcl, pcls); m_tree.SelectItem(htiRoot); m_tree.Expand(htiRoot, TVE_EXPAND); SetControlStatus(TRUE); m_cboAddr.Init(); pmf->PostMessage(WMU_UPDATE_CONTROL_STATUS); pmf->EndWaitMessage(); return S_OK; } LRESULT CRemoteView::OnExpandFolderlist(WPARAM wParam, LPARAM lParam) { if (!RefreshObjectlist((HTREEITEM)wParam, (BOOL)lParam)) return S_FALSE; return S_OK; } LRESULT CRemoteView::OnShowFolderlist(WPARAM wParam, LPARAM lParam) { if (!RefreshObjectlist((HTREEITEM)wParam, (BOOL)lParam)) return S_FALSE; PostMessage(WMU_SHOW_OBJECTLIST, wParam); return S_OK; } bool CRemoteView::RefreshObjectlist(HTREEITEM htiFolder, BOOL bRefresh) { PRTREEITEM_STRUCT prtiX = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiFolder); ASSERT(prtiX); if (m_bClosing) return S_OK; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); HTREEITEM htiVolume = m_tree.GetVolumeItem(htiFolder); ASSERT(htiVolume); HCOMMLIB hcl = pmf->m_mapHcl[htiVolume]; ASSERT(hcl); CString sPath = m_tree.GetPath(htiFolder); pmf->BeginWaitMessage(); PRTREEITEM_STRUCT prtiFolder = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiFolder); CWaitMessageDlg* pdlg; pdlg = new CWaitMessageDlg; pdlg->Create(IDD_WAITMESSAGE); pdlg->ShowWindow(TRUE); pdlg->CenterWindow(); pdlg->SetForegroundWindow(); pdlg->GetDlgItem(IDC_CANCEL_BTN)->ShowWindow(FALSE); pdlg->m_prg1.ShowWindow(FALSE); pdlg->m_stc1.SetWindowText("Æú´õ ¸ñ·ÏÀ» ¹Þ¾Æ¿À´ÂÁß..."); THREAD_PARAM tp; tp.hcl = hcl; tp.sPath = sPath; HANDLE ht = ::CreateThread(NULL,0,GetFileListThread,(LPVOID)&tp,0,NULL); pdlg->m_nMode = 0; while(1) { MSG msg; if(PeekMessage(&msg, NULL, 0, WM_PAINT, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if (WaitForSingleObject(ht,1) == WAIT_OBJECT_0) break; } if (!tp.pclf || tp.nFileCount == 0) { cl_free_file_list(hcl, tp.pclf); pdlg->ShowWindow(FALSE); ::DestroyWindow(pdlg->m_hWnd); delete pdlg; pmf->EndWaitMessage(); CString strmsg = cl_get_error_message(hcl); if(!strmsg.IsEmpty()) AfxMessageBox(strmsg, MB_ICONERROR); m_tree.SelectItem(m_tree.GetRootItem()); return false; } prtiFolder->saAttr[0] = tp.pclf->lastModified; m_tree.DeleteChildItem(htiFolder); pdlg->m_prg1.ShowWindow(TRUE); pdlg->m_prg1.SetRange(0,tp.nFileCount); pdlg->m_nMode =1; pdlg->GetDlgItem(IDC_CANCEL_BTN)->ShowWindow(TRUE); for (UINT i = 1; i < tp.nFileCount; i++) { MSG msg; if(PeekMessage(&msg, NULL, 0, WM_PAINT, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } if(PeekMessage(&msg, pdlg->m_hWnd, 0,0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if(msg.message == WM_CANCEL_MAKETREE) { DWORD dwCode; GetExitCodeThread(ht,&dwCode); TerminateThread(ht,dwCode); break; } } CString strTemp; strTemp.Format("Æú´õÆ®¸® ±¸¼ºÁß:(%d/%d)",i,tp.nFileCount); pdlg->m_stc1.SetWindowText(strTemp); pdlg->m_prg1.SetPos(i); AppendObject(htiFolder, tp.pclf[i].attr & CLFILEATTR_FOLDER, tp.pclf[i].path, tp.pclf[i].size, tp.pclf[i].lastModified); } pdlg->ShowWindow(FALSE); ::DestroyWindow(pdlg->m_hWnd); delete pdlg; cl_free_file_list(hcl, tp.pclf); prtiFolder->bCached = true; if (prtiFolder->nClass == TNS_VOLUME) { UINT nPathCount; PCLPATHINFO_STRUCT pclpi = cl_get_path_auth(hcl, m_tree.GetItemText(htiVolume), &nPathCount); if (!pclpi && cl_get_error_number(hcl) != CLERRNO_NOAVAILPATH_LIST) { AfxMessageBox(cl_get_error_message(hcl), MB_ICONERROR); m_tree.SelectItem(m_tree.GetRootItem()); return false; } for (UINT i = 0; i < nPathCount; i++) SetAnonyFolder(htiVolume, pclpi[i].path, true); cl_free_path_auth(hcl, pclpi); } pmf->EndWaitMessage(); return true; } LRESULT CRemoteView::OnShowObjectlist(WPARAM wParam, LPARAM lParam) { if (m_bClosing) return S_OK; HTREEITEM hti = (HTREEITEM)wParam; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(hti); CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->BeginWaitMessage(); m_list.DeleteAllItems(); m_bUpdating = TRUE; m_list.SetRedraw(FALSE); m_nTotalCount = 0; m_nTotalBytes = 0; m_nTotalFiles = 0; CString sSize; m_cboAddr.Add(hti); switch (prti->nClass) { case TNS_ROOT: m_nTotalCount = (long)prti->paObject.GetCount(); for (int i = 0; i < m_nTotalCount; i++) { PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)prti->paObject[i]; // sSize.Format("%s ³²À½", BYTE2KMBYTE(prli->nSize - _atoi64(prli->saAttr[0]), 3, true)); sSize.Format("Àüü %s" , BYTE2KMBYTE(_atoi64(prli->saAttr[1]), 0, true)); m_list.InsertItem(i, prli->sName, pmf->m_iDriveIcon); m_list.SetItemText(i, 1, sSize); m_list.SetItemText(i, 2, "¼­ºñ½º"); m_list.SetItemText(i, 3, ""); m_list.SetItemData(i, (DWORD_PTR)prli); } break; case TNS_VOLUME: case TNS_FOLDER: m_nTotalCount = (long)prti->paObject.GetCount(); for (int i = 0; i < m_nTotalCount; i++) { PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)prti->paObject[i]; if (prli->bFolder) sSize = ""; else { sSize = BYTE2KMBYTE(prli->nSize, 1, false); m_nTotalBytes = prli->nSize; m_nTotalFiles++; } m_list.InsertItem(i, prli->sName, prli->iIcon); m_list.SetItemText(i, 1, sSize); m_list.SetItemText(i, 2, prli->saAttr[2]); m_list.SetItemText(i, 3, prli->saAttr[3]); m_list.SetItemData(i, (DWORD_PTR)prli); /* MSG msg; while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } */ } break; } m_list.Sort(); if (m_list.GetItemCount() > 0) m_list.SetItemState(0, LVIS_FOCUSED, LVIS_FOCUSED); m_list.SetRedraw(TRUE); m_bUpdating = FALSE; ShowStatusSpace(); ShowStatusObject(FALSE, FALSE); pmf->PostMessage(WMU_UPDATE_CONTROL_STATUS); pmf->EndWaitMessage(); return S_OK; } void CRemoteView::RedrawFocus() { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (!pmf->m_bShowRemoteTree) return; RECT rc; GetClientRect(&rc); CDC* pDC = GetDC(); CBrush br; br.CreateSysColorBrush(COLOR_CAPTIONTEXT); rc.left = m_cxSplitter; rc.right = m_cxSplitter + SPLITTER_SIZE - 1; rc.top = CAPTION_HEIGHT + 1; rc.bottom -= STATUS_HEIGHT; pDC->FillRect(&rc, &br); br.DeleteObject(); br.CreateSysColorBrush(pmf->m_fl == FL_REMOTE ? COLOR_ACTIVECAPTION : COLOR_INACTIVECAPTION); rc.left = m_cxSplitter + 1; rc.right = m_cxSplitter + SPLITTER_SIZE - 2; pDC->FillRect(&rc, &br); br.DeleteObject(); ReleaseDC(pDC); } void CRemoteView::RedrawControl(int cx, int cy) { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); if (!pmf) return; int cxList; int cyStatusBar = pmf->m_bShowRemoteStatus ? STATUS_HEIGHT : 0; HDWP hdwp = BeginDeferWindowPos(13); if (hdwp) { if (pmf->m_bShowRemoteTree) { cxList = m_cxSplitter + SPLITTER_SIZE; DeferWindowPos(hdwp, m_capTitle.m_hWnd, HWND_TOP, 1, HIGHLIGHT_SIZE, m_cxSplitter + 1, CAPTION_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_tree.m_hWnd, HWND_TOP, -1, HEADER_HEIGHT, m_cxSplitter + 1, cy - HEADER_HEIGHT - cyStatusBar, SWP_NOZORDER); } else { cxList = 0; DeferWindowPos(hdwp, m_capTitle.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); DeferWindowPos(hdwp, m_tree.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); } DeferWindowPos(hdwp, m_capAddr.m_hWnd, HWND_TOP, cxList - 3, HIGHLIGHT_SIZE, ADDRESS_WIDTH + 3, CAPTION_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_cboAddr.m_hWnd, HWND_TOP, cxList + ADDRESS_WIDTH, HIGHLIGHT_SIZE, cx - (cxList + (ADDRESS_BTN_WIDTH << 1)) - ADDRESS_WIDTH - 1, 200, SWP_NOZORDER); DeferWindowPos(hdwp, m_btnUpAddr.m_hWnd, HWND_TOP, cx - (ADDRESS_BTN_WIDTH << 1) - 1, HIGHLIGHT_SIZE, ADDRESS_BTN_WIDTH, CAPTION_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_btnListStyle.m_hWnd, HWND_TOP, cx - ADDRESS_BTN_WIDTH - 1, HIGHLIGHT_SIZE, ADDRESS_BTN_WIDTH, CAPTION_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_list.m_hWnd, HWND_TOP, cxList - 1, HEADER_HEIGHT, cx - cxList + 1, cy - HEADER_HEIGHT - cyStatusBar, SWP_NOZORDER); DeferWindowPos(hdwp, m_capStatus.m_hWnd, HWND_TOP, 0, cy - cyStatusBar, cx, cyStatusBar, SWP_NOZORDER); if (pmf->m_bShowRemoteStatus) { int nTop = cy - cyStatusBar + 4; DeferWindowPos(hdwp, m_prgStatusSpace.m_hWnd, HWND_TOP, 1, nTop - 4, 77, cyStatusBar - 1, SWP_NOZORDER | SWP_FRAMECHANGED); DeferWindowPos(hdwp, m_stcStatusSpace.m_hWnd, HWND_TOP, 80, nTop, 170, STATUS_TEXT_HEIGHT, SWP_NOZORDER | SWP_FRAMECHANGED); DeferWindowPos(hdwp, m_stcStatusObject.m_hWnd, HWND_TOP, 255, nTop, 170, STATUS_TEXT_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcStatusMsg.m_hWnd, HWND_TOP, 430, nTop, cx - 435, STATUS_TEXT_HEIGHT, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcSeparator1.m_hWnd, HWND_TOP, 253, nTop - 3, 0, 0, SWP_NOZORDER | SWP_NOSIZE); DeferWindowPos(hdwp, m_stcSeparator2.m_hWnd, HWND_TOP, 428, nTop - 3, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } else { DeferWindowPos(hdwp, m_prgStatusSpace.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcStatusSpace.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcStatusObject.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcStatusMsg.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER); DeferWindowPos(hdwp, m_stcSeparator1.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE); DeferWindowPos(hdwp, m_stcSeparator2.m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE); } EndDeferWindowPos(hdwp); } RedrawFocus(); } void CRemoteView::RedrawControl() { RECT rc; GetClientRect(&rc); RedrawControl(rc.right, rc.bottom); } void CRemoteView::ApplyListStyle() { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); ASSERT(pmf); m_list.SetListStyle(pmf->m_nRemoteListType); } void CRemoteView::MakeNewFolder() { HTREEITEM htiSelected = m_tree.GetSelectedItem(); if (!htiSelected) return; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiSelected); if (!prti || prti->nClass == TNS_ROOT) return; CString sFolderName = "NewFolder"; int iFolder = 2; BOOL bFoundFolder = TRUE; while (bFoundFolder) { bFoundFolder = FALSE; HTREEITEM hti = m_tree.GetChildItem(htiSelected); while (hti) { if (sFolderName == m_tree.GetItemText(hti)) { bFoundFolder = TRUE; break; } hti = m_tree.GetNextSiblingItem(hti); } if (bFoundFolder) sFolderName.Format("NewFolder(%d)", iFolder++); } CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); CString sPath = m_tree.GetPath(htiSelected) + "/" + sFolderName; if (!pmf->MakeRemoteFolder(m_tree.GetVolumeItem(htiSelected), sPath)) return; CTime time(CTime::GetCurrentTime()); CString sTime = time.Format("%Y-%m-%d %p %I:%M:%S"); sTime.Replace("AM", "¿ÀÀü"); sTime.Replace("PM", "¿ÀÈÄ"); AppendObject(htiSelected, true, sPath, 0, sTime); SendMessage(WMU_SHOW_OBJECTLIST, (WPARAM)htiSelected); for (int i = 0; i < m_list.GetItemCount(); i++) { if (m_list.GetItemText(i, 0) != sFolderName) continue; m_list.SetItemState(i, LVIS_FOCUSED, LVIF_TEXT); m_list.EditLabel(i); } } void CRemoteView::AppendObject(HTREEITEM htiParent, bool bFolder, LPCTSTR pszPath, __int64 nSize, LPCTSTR pszLastModified) { CString sName = pszPath; sName = sName.Mid(sName.ReverseFind('/') + 1); CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); SHFILEINFO shfi; DWORD dwAttr; CString sSize; if (bFolder) { HTREEITEM hti = m_tree.InsertItem(sName, pmf->m_iFolderIcon, pmf->m_iFolderIcon, htiParent); PRTREEITEM_STRUCT prti = new RTREEITEM_STRUCT; prti->bCached = false; prti->nClass = TNS_FOLDER; prti->sName = sName; prti->saAttr.Add(pszLastModified); prti->saAttr.Add(""); m_tree.SetItemData(hti, (DWORD_PTR)prti); m_tree.InsertItem("", -1, -1, hti); dwAttr = FILE_ATTRIBUTE_DIRECTORY; sSize = ""; } else { dwAttr = FILE_ATTRIBUTE_NORMAL; sSize.Format("%15I64d", nSize); } if (!SHGetFileInfo(sName.Mid(sName.ReverseFind('.')), dwAttr, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_TYPENAME)) { shfi.iIcon = -1; shfi.szTypeName[0] = NULL; } PRLISTITEM_STRUCT prli = new RLISTITEM_STRUCT; prli->iIcon = shfi.iIcon; prli->bFolder = bFolder; prli->sName = sName; prli->nSize = nSize; prli->saAttr.Add(sName.MakeUpper()); prli->saAttr.Add(sSize); prli->saAttr.Add(shfi.szTypeName); prli->saAttr.Add(pszLastModified); ((PRTREEITEM_STRUCT)m_tree.GetItemData(htiParent))->paObject.Add(prli); } bool CRemoteView::IsExistsFileName(HTREEITEM htiParent, LPCTSTR pszOldFileName, LPCTSTR pszNewFileName) { CString sOldFileName = pszOldFileName; CString sNewFileName = pszNewFileName; // sOldFileName.MakeLower(); // sNewFileName.MakeLower(); if (sOldFileName == sNewFileName) return false; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiParent); for (int i = 0; i < prti->paObject.GetCount(); i++) { PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)prti->paObject[i]; CString sName = prli->sName; // sName.MakeLower(); if (sName == sOldFileName) continue; if (sName == sNewFileName) { AfxMessageBox("ÀÌ¹Ì Á¸ÀçÇÏ´Â ÆÄÀÏ À̸§ÀÔ´Ï´Ù. ´Ù¸§ À̸§À» ÀÔ·Â ÇϽʽÿÀ.", MB_ICONEXCLAMATION); return true; } } return false; } void CRemoteView::DeleteTreeItem(HTREEITEM htiDelete) { if (htiDelete == m_tree.GetRootItem() || ((PRTREEITEM_STRUCT)m_tree.GetItemData(htiDelete))->nClass != TNS_FOLDER) return; if (AfxMessageBox("¼±ÅÃµÈ Æú´õ¸¦ »èÁ¦ÇϽðڽÀ´Ï±î?", MB_YESNO) != IDYES) return; HTREEITEM htiVolume = m_tree.GetVolumeItem(htiDelete); CString sPath = m_tree.GetPath(htiDelete); CString sText = m_tree.GetItemText(htiDelete); CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->BeginWaitMessage(); if (!pmf->Delete1RemoteObject(htiVolume, sPath)) { pmf->EndWaitMessage(); return; } m_tree.DeleteChildItem(htiDelete); if (m_tree.GetSelectedItem() == m_tree.GetParentItem(htiDelete)) { for (int i = 0; i < m_list.GetItemCount(); i++) { if (m_list.GetItemText(i, 0) == sText) { m_list.DeleteItem(i); break; } } } m_tree.DeleteItem(htiDelete); m_tree.SetFocus(); pmf->PostMessage(WMU_UPDATE_CONTROL_STATUS); pmf->EndWaitMessage(); } void CRemoteView::DeleteListItem() { POSITION pos = m_list.GetFirstSelectedItemPosition(); if (!pos) return; if (AfxMessageBox("¼±ÅÃµÈ ÆÄÀÏÀ» »èÁ¦ÇϽðڽÀ´Ï±î?", MB_YESNO) != IDYES) return; CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); pmf->BeginWaitMessage(); m_bUpdating = TRUE; CDWordArray m_anSelectedItems; HTREEITEM htiSelected = m_tree.GetSelectedItem(); CString sPath = m_tree.GetPath(htiSelected); CStringArray saFile; while (pos) { int iItem = m_list.GetNextSelectedItem(pos); saFile.Add(sPath + "/" + m_list.GetItemText(iItem, 0)); } CStringArray saSucceed; pmf->DeleteRemoteObject(m_tree.GetVolumeItem(htiSelected), saFile, saSucceed); m_bUpdating = FALSE; pmf->EndWaitMessage(); if (saSucceed.GetCount() == 0) return; RefreshItem(); } void CRemoteView::RefreshItem() { HTREEITEM htiSelected = m_tree.GetSelectedItem(); if (!htiSelected) return; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiSelected); ASSERT(prti); PostMessage(prti->nClass == TNS_ROOT ? WMU_SHOW_VOLUMELIST : WMU_SHOW_FOLDERLIST, (WPARAM)htiSelected, (LPARAM)TRUE); } void CRemoteView::SetControlStatus(BOOL bConnected) { m_cboAddr.EnableWindow(bConnected); m_btnUpAddr.EnableWindow(bConnected); } void CRemoteView::ShowStatusSpace() { if (m_bUpdating) return; HTREEITEM hti = m_tree.GetSelectedItem(); if (!hti) return; PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(hti); if (prti->nClass == TNS_ROOT) { m_stcStatusSpace.SetWindowText(""); m_prgStatusSpace.ShowWindow(SW_HIDE); } else { prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(m_tree.GetVolumeItem(hti)); __int64 nTotalBytes = _atoi64(prti->saAttr[2]); __int64 nUsedBytes = _atoi64(prti->saAttr[3]); if (nTotalBytes > 0) { CString sText = " ¼­ºñ½º ¿©À¯ °ø°£: "; sText += BYTE2KMBYTE(nTotalBytes - nUsedBytes, 0, TRUE); m_stcStatusSpace.SetWindowText(sText); double fPercent = 100.0 - ((nUsedBytes * 100.0) / nTotalBytes); sText.Format("%d.%02d%% ³²À½", (int)fPercent, (int)fPercent%100); m_prgStatusSpace.SetPos(100 - (int)fPercent, sText); m_prgStatusSpace.ShowWindow(SW_SHOW); } else { m_stcStatusSpace.SetWindowText("¾Ë¼ö¾øÀ½"); m_prgStatusSpace.SetPos(0, "N/A"); m_prgStatusSpace.ShowWindow(SW_SHOW); } } } void CRemoteView::ShowStatusObject(BOOL bSelected, BOOL bUpdate, BOOL bAllSelected) { if (!bSelected) { m_nSelectedCount = 0; m_nSelectedBytes = 0; m_nSelectedFiles = 0; if (bUpdate) { m_nTotalCount = m_list.GetItemCount(); m_nTotalBytes = 0; m_nTotalFiles = 0; for (int i = 0; i < m_nTotalCount; i++) { PRLISTITEM_STRUCT prli = (PRLISTITEM_STRUCT)m_list.GetItemData(i); if (!prli->bFolder) { m_nTotalBytes += prli->nSize; m_nTotalFiles++; } } } SHOW_TOTALOBJECTSTATUS: if (m_nTotalFiles > 0) m_stcStatusObject.SetWindowText(NumericFormat(m_nTotalCount) + " °³Ã¼, " + BYTE2KMBYTE(m_nTotalBytes, 0, TRUE)); else m_stcStatusObject.SetWindowText(NumericFormat(m_nTotalCount) + " °³Ã¼"); } else { if (!bAllSelected && bUpdate) { m_nSelectedCount = 0; m_nSelectedBytes = 0; m_nSelectedFiles = 0; POSITION pos = m_list.GetFirstSelectedItemPosition(); while (pos) { int iItem = m_list.GetNextSelectedItem(pos); m_nSelectedCount++; PRLISTITEM_STRUCT pobj = (PRLISTITEM_STRUCT)m_list.GetItemData(iItem); if (!pobj->bFolder) { m_nSelectedBytes += pobj->nSize; m_nSelectedFiles++; } } } if (bAllSelected) { m_nSelectedCount = m_nTotalCount; m_nSelectedBytes = m_nTotalBytes; m_nSelectedFiles = m_nTotalFiles; } if (m_nSelectedCount == 0) goto SHOW_TOTALOBJECTSTATUS; if (m_nSelectedFiles > 0) m_stcStatusObject.SetWindowText(NumericFormat(m_nSelectedCount) + " °³Ã¼°¡ ¼±ÅõÊ, " + BYTE2KMBYTE(m_nSelectedBytes, 0, TRUE)); else m_stcStatusObject.SetWindowText(NumericFormat(m_nSelectedCount) + " °³Ã¼°¡ ¼±ÅõÊ"); } AfxGetMainWnd()->PostMessage(WMU_UPDATE_CONTROL_STATUS); } BOOL CRemoteView::GetSelectedObject(CStringArray& saObject) { CMainFrame *pmf = (CMainFrame *)AfxGetMainWnd(); BOOL bFoundVolume = FALSE; if (pmf->m_pwndRemote == &m_list) { CString sPath = m_tree.GetPath(); POSITION pos = m_list.GetFirstSelectedItemPosition(); while (pos) { int iItem = m_list.GetNextSelectedItem(pos); CString sItem = sPath + "/" + m_list.GetItemText(iItem, 0); saObject.Add(sItem); } } else { if (m_tree.GetSelectedItem() == m_tree.GetRootItem()) bFoundVolume = TRUE; else saObject.Add(m_tree.GetPath()); } if (bFoundVolume) AfxMessageBox("¼­ºñ½º´Â ´Ù¿î·Îµå ÇÒ ¼ö ¾ø½À´Ï´Ù.", MB_ICONEXCLAMATION); return saObject.GetCount() > 0 ? TRUE : FALSE; } void CRemoteView::SetAnonyFolder(HTREEITEM htiVolume, LPCTSTR pszFolder, bool bSet, bool bRefresh) { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); HTREEITEM hti = m_tree.GetChildItem(htiVolume); while (hti) { if (((PRTREEITEM_STRUCT)m_tree.GetItemData(hti))->sName == pszFolder) { if (bSet) { int iIcon = pmf->m_iAnonyAuthIcon;// + (m_tree.GetItemState(hti, TVIS_EXPANDED) ? 1 : 0); m_tree.SetItemImage(hti, iIcon, iIcon); ((PRTREEITEM_STRUCT)m_tree.GetItemData(hti))->saAttr.SetAt(1, "1"); } else { int iIcon = pmf->m_iFolderIcon;// + (m_tree.GetItemState(hti, TVIS_EXPANDED) ? 1 : 0); m_tree.SetItemImage(hti, iIcon, iIcon); ((PRTREEITEM_STRUCT)m_tree.GetItemData(hti))->saAttr.SetAt(1, ""); } break; } hti = m_tree.GetNextSiblingItem(hti); } PRTREEITEM_STRUCT prti = (PRTREEITEM_STRUCT)m_tree.GetItemData(htiVolume); for (int i = 0; i < prti->paObject.GetCount(); i++) { if (((PRLISTITEM_STRUCT)prti->paObject[i])->sName == pszFolder) { if (bSet) { ((PRLISTITEM_STRUCT)prti->paObject[i])->iIcon = pmf->m_iAnonyAuthIcon; } else { ((PRLISTITEM_STRUCT)prti->paObject[i])->iIcon = pmf->m_iFolderIcon; } break; } } if (bRefresh && m_tree.GetSelectedItem() == htiVolume) PostMessage(WMU_SHOW_OBJECTLIST, (WPARAM)htiVolume); } void CRemoteView::ClearAllData() { m_bClosing = true; OutputDebugString(_T("Clear Addr Combo")); // dadamin add for(int i = m_cboAddr.GetCount() -1; i >= 0; --i) { m_cboAddr.DeleteItem(i); } // dadamin add m_cboAddr.Clear(); OutputDebugString(_T("Clear Tree")); m_tree.DeleteAllItems(); OutputDebugString(_T("Clear List")); m_list.DeleteAllItems(); OutputDebugString(_T("Clear End")); SetControlStatus(FALSE); m_bClosing = false; } void CRemoteView::InvertTracker(int x) { CMainFrame* pmf = (CMainFrame*)AfxGetMainWnd(); CRect rc; GetWindowRect(&rc); pmf->ScreenToClient(&rc); rc.top += (CAPTION_HEIGHT + 1); rc.bottom -= STATUS_HEIGHT; CDC* pDC = pmf->GetDC(); CBrush* pBrush = CBrush::FromHandle((HBRUSH)::GetStockObject(WHITE_BRUSH)); HBRUSH hOldBrush = NULL; if (pBrush != NULL) hOldBrush = (HBRUSH)SelectObject(pDC->m_hDC, pBrush->m_hObject); pDC->PatBlt(x, rc.top, SPLITTER_SIZE - 1, rc.Height(), PATINVERT); if (hOldBrush != NULL) SelectObject(pDC->m_hDC, hOldBrush); ReleaseDC(pDC); } void CRemoteView::InsertAnonyFolderIcon(bool bLarge, bool bOpen) { SHFILEINFO shfi; SHGetFileInfo("", FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_ICON | (bLarge ? SHGFI_LARGEICON : SHGFI_SMALLICON) | (bOpen ? SHGFI_OPENICON : 0)); HICON hicon = ::LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ANONY_FOLDER)); HBRUSH hbBkgnd = ::CreateSolidBrush(RGB(255, 255, 255)); RECT rc; rc.left = rc.top = 0; rc.right = bLarge ? 32 : 16; rc.bottom = bLarge ? 32 : 16; CImageList* pil = bLarge ? m_pilLarge : m_pilSmall; int iIcon = pil->GetImageCount(); pil->SetImageCount(iIcon + 1); CClientDC cdc(this); HDC hdc = ::CreateCompatibleDC(cdc.m_hDC); HBITMAP hbm = CreateCompatibleBitmap(cdc.m_hDC, rc.right, rc.bottom); HBITMAP hbmOld = (HBITMAP)SelectObject(hdc, hbm); ::FillRect(hdc, &rc, hbBkgnd); DrawIconEx(hdc, 0, 0, shfi.hIcon, rc.right, rc.bottom, 0, NULL, DI_NORMAL | DI_COMPAT); DrawIconEx(hdc, 0, 0, hicon, rc.right, rc.bottom, 0, NULL, DI_NORMAL | DI_COMPAT); DestroyIcon(shfi.hIcon); SelectObject(hdc, hbmOld); // Attach to Bitmap and Replace image in CImageList CBitmap bm; bm.Attach(hbm); pil->Replace(iIcon, &bm, NULL); if (!bOpen) ((CMainFrame*)AfxGetMainWnd())->m_iAnonyAuthIcon = iIcon; DeleteDC(hdc); DeleteObject(hbm); DeleteObject(hbBkgnd); } DWORD WINAPI GetFileListThread(LPVOID lpParam) { LPTHREAD_PARAM ptp = (LPTHREAD_PARAM)lpParam; DWORD dwRet; ptp->pclf = cl_get_file_list(ptp->hcl, ptp->sPath, 1, &ptp->nFileCount); if(ptp->pclf) dwRet = ERROR_SUCCESS; else dwRet = -1; return dwRet; }