www.gusucode.com > eMule电驴下载VC++源代码-源码程序 > eMule电驴下载VC++源代码-源码程序\code\srchybrid\SharedFilesCtrl.cpp
//Download by http://www.NewXing.com //this file is part of eMule //Copyright (C)2002 Merkur ( merkur-@users.sourceforge.net / http://www.emule-project.net ) // //This program is free software; you can redistribute it and/or //modify it under the terms of the GNU General Public License //as published by the Free Software Foundation; either //version 2 of the License, or (at your option) any later version. // //This program is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with this program; if not, write to the Free Software //Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "stdafx.h" #include "emule.h" #include "emuledlg.h" #include "SharedFilesCtrl.h" #include "OtherFunctions.h" #include "CommentDialog.h" #include "FileInfoDialog.h" #include "MetaDataDlg.h" #include "ResizableLib/ResizableSheet.h" #include "KnownFile.h" #include "MapKey.h" #include "SharedFileList.h" #include "MemDC.h" #include "PartFile.h" #include "MenuCmds.h" #include "IrcWnd.h" #include "SharedFilesWnd.h" #include "Opcodes.h" #include "InputBox.h" #include "WebServices.h" #include "TransferWnd.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////////////// // CSharedFileDetailsSheet class CSharedFileDetailsSheet : public CResizableSheet { DECLARE_DYNAMIC(CSharedFileDetailsSheet) public: CSharedFileDetailsSheet(const CTypedPtrList<CPtrList, CKnownFile*>& aFiles); virtual ~CSharedFileDetailsSheet(); protected: CSimpleArray<const CKnownFile*> m_aKnownFiles; CFileInfoDialog m_wndMediaInfo; CMetaDataDlg m_wndMetaData; static int sm_iLastActivePage; virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() afx_msg void OnDestroy(); }; int CSharedFileDetailsSheet::sm_iLastActivePage; IMPLEMENT_DYNAMIC(CSharedFileDetailsSheet, CResizableSheet) BEGIN_MESSAGE_MAP(CSharedFileDetailsSheet, CResizableSheet) ON_WM_DESTROY() END_MESSAGE_MAP() CSharedFileDetailsSheet::CSharedFileDetailsSheet(const CTypedPtrList<CPtrList, CKnownFile*>& aFiles) { POSITION pos = aFiles.GetHeadPosition(); while (pos) m_aKnownFiles.Add(aFiles.GetNext(pos)); m_psh.dwFlags &= ~PSH_HASHELP; m_psh.dwFlags |= PSH_NOAPPLYNOW; m_wndMediaInfo.m_psp.dwFlags &= ~PSP_HASHELP; m_wndMetaData.m_psp.dwFlags &= ~PSP_HASHELP; m_wndMediaInfo.SetMyfile(&m_aKnownFiles); if (m_aKnownFiles.GetSize() == 1 && thePrefs.IsExtControlsEnabled()) m_wndMetaData.SetFile(m_aKnownFiles[0]); AddPage(&m_wndMediaInfo); if (m_aKnownFiles.GetSize() == 1 && thePrefs.IsExtControlsEnabled()) AddPage(&m_wndMetaData); } CSharedFileDetailsSheet::~CSharedFileDetailsSheet() { } void CSharedFileDetailsSheet::OnDestroy() { sm_iLastActivePage = GetActiveIndex(); CResizableSheet::OnDestroy(); } BOOL CSharedFileDetailsSheet::OnInitDialog() { EnableStackedTabs(FALSE); BOOL bResult = CResizableSheet::OnInitDialog(); InitWindowStyles(this); EnableSaveRestore(_T("SharedFileDetailsSheet")); // call this after(!) OnInitDialog if (m_aKnownFiles.GetSize() == 1) SetWindowText(GetResString(IDS_DETAILS) + _T(": ") + m_aKnownFiles[0]->GetFileName()); else SetWindowText(GetResString(IDS_DETAILS)); if (sm_iLastActivePage < GetPageCount()) SetActivePage(sm_iLastActivePage); return bResult; } ////////////////////////////////////////////////////////////////////////////// // CSharedFilesCtrl IMPLEMENT_DYNAMIC(CSharedFilesCtrl, CMuleListCtrl) CSharedFilesCtrl::CSharedFilesCtrl() { memset(&sortstat, 0, sizeof(sortstat)); } CSharedFilesCtrl::~CSharedFilesCtrl(){ } void CSharedFilesCtrl::Init(){ CImageList ilDummyImageList; //dummy list for getting the proper height of listview entries ilDummyImageList.Create(1, theApp.GetSmallSytemIconSize().cy,theApp.m_iDfltImageListColorFlags|ILC_MASK, 1, 1); SetImageList(&ilDummyImageList, LVSIL_SMALL); ASSERT( (GetStyle() & LVS_SHAREIMAGELISTS) == 0 ); ilDummyImageList.Detach(); SetExtendedStyle(LVS_EX_FULLROWSELECT); ModifyStyle(LVS_SINGLESEL,0); InsertColumn(0, GetResString(IDS_DL_FILENAME) ,LVCFMT_LEFT,250,0); InsertColumn(1,GetResString(IDS_DL_SIZE),LVCFMT_LEFT,100,1); InsertColumn(2,GetResString(IDS_TYPE),LVCFMT_LEFT,50,2); InsertColumn(3,GetResString(IDS_PRIORITY),LVCFMT_LEFT,70,3); InsertColumn(4,GetResString(IDS_FILEID),LVCFMT_LEFT,220,4); InsertColumn(5,GetResString(IDS_SF_REQUESTS),LVCFMT_LEFT,100,5); InsertColumn(6,GetResString(IDS_SF_ACCEPTS),LVCFMT_LEFT,100,6); InsertColumn(7,GetResString(IDS_SF_TRANSFERRED),LVCFMT_LEFT,120,7); InsertColumn(8,GetResString(IDS_UPSTATUS),LVCFMT_LEFT,100,8); InsertColumn(9,GetResString(IDS_FOLDER),LVCFMT_LEFT,200,9); InsertColumn(10,GetResString(IDS_COMPLSOURCES),LVCFMT_LEFT,100,10); InsertColumn(11,GetResString(IDS_SHAREDTITLE),LVCFMT_LEFT,200,11); CreateMenues(); LoadSettings(CPreferences::tableShared); // Barry - Use preferred sort order from preferences int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableShared); bool sortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableShared); SetSortArrow(sortItem, sortAscending); SortItems(SortProc, sortItem + (sortAscending ? 0:20)); } void CSharedFilesCtrl::Localize() { CHeaderCtrl* pHeaderCtrl = GetHeaderCtrl(); HDITEM hdi; hdi.mask = HDI_TEXT; CString strRes; strRes = GetResString(IDS_DL_FILENAME); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(0, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_DL_SIZE); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(1, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_TYPE); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(2, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_PRIORITY); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(3, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_FILEID); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(4, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_SF_REQUESTS); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(5, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_SF_ACCEPTS); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(6, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_SF_TRANSFERRED); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(7, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_UPSTATUS); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(8, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_FOLDER); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(9, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_COMPLSOURCES); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(10, &hdi); strRes.ReleaseBuffer(); strRes = GetResString(IDS_SHAREDTITLE); hdi.pszText = strRes.GetBuffer(); pHeaderCtrl->SetItem(11, &hdi); strRes.ReleaseBuffer(); CreateMenues(); } void CSharedFilesCtrl::ShowFileList(const CSharedFileList* pSharedFiles) { DeleteAllItems(); CCKey bufKey; CKnownFile* cur_file; for (POSITION pos = pSharedFiles->m_Files_map.GetStartPosition(); pos != 0; ){ pSharedFiles->m_Files_map.GetNextAssoc(pos, bufKey, cur_file); ShowFile(cur_file); } ShowFilesCount(); } #define DLC_DT_TEXT (DT_LEFT|DT_SINGLELINE|DT_VCENTER|DT_NOPREFIX|DT_END_ELLIPSIS) void CSharedFilesCtrl::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { if( !theApp.emuledlg->IsRunning() ) return; if( !lpDrawItemStruct->itemData) return; CDC* odc = CDC::FromHandle(lpDrawItemStruct->hDC); BOOL bCtrlFocused = ((GetFocus() == this ) || (GetStyle() & LVS_SHOWSELALWAYS)); if( odc && (lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED )){ if(bCtrlFocused) odc->SetBkColor(m_crHighlight); else odc->SetBkColor(m_crNoHighlight); } else odc->SetBkColor(m_crWindow); const CKnownFile* file = (CKnownFile*)lpDrawItemStruct->itemData; CMemDC dc(CDC::FromHandle(lpDrawItemStruct->hDC), &lpDrawItemStruct->rcItem); CFont* pOldFont = dc.SelectObject(GetFont()); RECT cur_rec = lpDrawItemStruct->rcItem; COLORREF crOldTextColor = dc.SetTextColor(m_crWindowText); int iOldBkMode; if (m_crWindowTextBk == CLR_NONE){ DefWindowProc(WM_ERASEBKGND, (WPARAM)(HDC)dc, 0); iOldBkMode = dc.SetBkMode(TRANSPARENT); } else iOldBkMode = OPAQUE; CString buffer; CHeaderCtrl *pHeaderCtrl = GetHeaderCtrl(); int iCount = pHeaderCtrl->GetItemCount(); const int iMarginX = 4; cur_rec.right = cur_rec.left - iMarginX*2; cur_rec.left += iMarginX; int iIconDrawWidth = theApp.GetSmallSytemIconSize().cx + 3; for(int iCurrent = 0; iCurrent < iCount; iCurrent++){ int iColumn = pHeaderCtrl->OrderToIndex(iCurrent); if( !IsColumnHidden(iColumn) ){ UINT uDTFlags = DLC_DT_TEXT; cur_rec.right += GetColumnWidth(iColumn); switch(iColumn){ case 0:{ int iImage = theApp.GetFileTypeSystemImageIdx(file->GetFileName()); if (theApp.GetSystemImageList() != NULL) ::ImageList_Draw(theApp.GetSystemImageList(), iImage, dc->GetSafeHdc(), cur_rec.left, cur_rec.top, ILD_NORMAL|ILD_TRANSPARENT); cur_rec.left += iIconDrawWidth; buffer = file->GetFileName(); break; } case 1: buffer = CastItoXBytes(file->GetFileSize()); uDTFlags |= DT_RIGHT; break; case 2: buffer = file->GetFileType(); break; case 3:{ switch (file->GetUpPriority()) { case PR_VERYLOW : buffer = GetResString(IDS_PRIOVERYLOW); break; case PR_LOW : if( file->IsAutoUpPriority() ) buffer = GetResString(IDS_PRIOAUTOLOW); else buffer = GetResString(IDS_PRIOLOW); break; case PR_NORMAL : if( file->IsAutoUpPriority() ) buffer = GetResString(IDS_PRIOAUTONORMAL); else buffer = GetResString(IDS_PRIONORMAL); break; case PR_HIGH : if( file->IsAutoUpPriority() ) buffer = GetResString(IDS_PRIOAUTOHIGH); else buffer = GetResString(IDS_PRIOHIGH); break; case PR_VERYHIGH : buffer = GetResString(IDS_PRIORELEASE); break; default: buffer.Empty(); } break; } case 4: buffer = md4str(file->GetFileHash()); break; case 5: buffer.Format(_T("%u (%u)"), file->statistic.GetRequests(), file->statistic.GetAllTimeRequests()); break; case 6: buffer.Format(_T("%u (%u)"), file->statistic.GetAccepts(), file->statistic.GetAllTimeAccepts()); break; case 7: buffer.Format(_T("%s (%s)"), CastItoXBytes(file->statistic.GetTransferred()), CastItoXBytes(file->statistic.GetAllTimeTransferred())); break; case 8: if( file->GetPartCount()){ cur_rec.bottom--; cur_rec.top++; file->DrawShareStatusBar(dc,&cur_rec,false,thePrefs.UseFlatBar()); cur_rec.bottom++; cur_rec.top--; } break; case 9: buffer = file->GetPath(); PathRemoveBackslash(buffer.GetBuffer()); buffer.ReleaseBuffer(); break; case 10: if (file->m_nCompleteSourcesCountLo == 0){ buffer.Format("< %u", file->m_nCompleteSourcesCountHi); } else if (file->m_nCompleteSourcesCountLo == file->m_nCompleteSourcesCountHi) buffer.Format("%u", file->m_nCompleteSourcesCountLo); else buffer.Format("%u - %u", file->m_nCompleteSourcesCountLo, file->m_nCompleteSourcesCountHi); break; case 11:{ CString ed2k; if(file->GetPublishedED2K()) buffer = GetResString(IDS_YES); else buffer = GetResString(IDS_NO); buffer += "|"; if( (uint32)time(NULL)-file->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES ) buffer += GetResString(IDS_YES); else buffer += GetResString(IDS_NO); break; } } if( iColumn != 8 ) dc->DrawText(buffer, buffer.GetLength(),&cur_rec,uDTFlags); if( iColumn == 0 ) cur_rec.left -= iIconDrawWidth; cur_rec.left += GetColumnWidth(iColumn); } } ShowFilesCount(); if ((lpDrawItemStruct->itemAction | ODA_SELECT) && (lpDrawItemStruct->itemState & ODS_SELECTED)) { RECT outline_rec = lpDrawItemStruct->rcItem; outline_rec.top--; outline_rec.bottom++; dc->FrameRect(&outline_rec, &CBrush(m_crWindow)); outline_rec.top++; outline_rec.bottom--; outline_rec.left++; outline_rec.right--; if (lpDrawItemStruct->itemID > 0 && GetItemState(lpDrawItemStruct->itemID - 1, LVIS_SELECTED)) outline_rec.top--; if (lpDrawItemStruct->itemID + 1 < (UINT)GetItemCount() && GetItemState(lpDrawItemStruct->itemID + 1, LVIS_SELECTED)) outline_rec.bottom++; if(bCtrlFocused) dc->FrameRect(&outline_rec, &CBrush(m_crFocusLine)); else dc->FrameRect(&outline_rec, &CBrush(m_crNoFocusLine)); } if (m_crWindowTextBk == CLR_NONE) dc.SetBkMode(iOldBkMode); dc.SelectObject(pOldFont); dc.SetTextColor(crOldTextColor); } void CSharedFilesCtrl::ShowFile(const CKnownFile* file) { uint32 itemnr = GetItemCount(); itemnr = InsertItem(LVIF_TEXT|LVIF_PARAM,itemnr,LPSTR_TEXTCALLBACK,0,0,0,(LPARAM)file); UpdateFile(file); } void CSharedFilesCtrl::RemoveFile(const CKnownFile *toRemove) { LVFINDINFO info; info.flags = LVFI_PARAM; info.lParam = (LPARAM)toRemove; int nItem = FindItem(&info); if(nItem != -1) DeleteItem(nItem); ShowFilesCount(); } BEGIN_MESSAGE_MAP(CSharedFilesCtrl, CMuleListCtrl) ON_WM_CONTEXTMENU() ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick) ON_NOTIFY_REFLECT(NM_DBLCLK, OnNMDblclk) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo) ON_WM_KEYDOWN() END_MESSAGE_MAP() // CSharedFilesCtrl message handlers void CSharedFilesCtrl::OnContextMenu(CWnd* pWnd, CPoint point) { // get merged settings bool bFirstItem = true; int iSelectedItems = GetSelectedCount(); int iCompleteFileSelected = -1; UINT uPrioMenuItem = 0; POSITION pos = GetFirstSelectedItemPosition(); while (pos) { const CKnownFile* pFile = (CKnownFile*)GetItemData(GetNextSelectedItem(pos)); int iCurCompleteFile = pFile->IsPartFile() ? 0 : 1; if (bFirstItem) iCompleteFileSelected = iCurCompleteFile; else if (iCompleteFileSelected != iCurCompleteFile) iCompleteFileSelected = -1; UINT uCurPrioMenuItem = 0; if (pFile->IsAutoUpPriority()) uCurPrioMenuItem = MP_PRIOAUTO; else if (pFile->GetUpPriority() == PR_VERYLOW) uCurPrioMenuItem = MP_PRIOVERYLOW; else if (pFile->GetUpPriority() == PR_LOW) uCurPrioMenuItem = MP_PRIOLOW; else if (pFile->GetUpPriority() == PR_NORMAL) uCurPrioMenuItem = MP_PRIONORMAL; else if (pFile->GetUpPriority() == PR_HIGH) uCurPrioMenuItem = MP_PRIOHIGH; else if (pFile->GetUpPriority() == PR_VERYHIGH) uCurPrioMenuItem = MP_PRIOVERYHIGH; else ASSERT(0); if (bFirstItem) uPrioMenuItem = uCurPrioMenuItem; else if (uPrioMenuItem != uCurPrioMenuItem) uPrioMenuItem = 0; bFirstItem = false; } m_SharedFilesMenu.EnableMenuItem((UINT_PTR)m_PrioMenu.m_hMenu, iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED); m_PrioMenu.CheckMenuRadioItem(MP_PRIOVERYLOW, MP_PRIOAUTO, uPrioMenuItem, 0); bool bSingleCompleteFileSelected = (iSelectedItems == 1 && iCompleteFileSelected == 1); m_SharedFilesMenu.EnableMenuItem(MP_OPEN, bSingleCompleteFileSelected ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_OPENFOLDER, bSingleCompleteFileSelected ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_RENAME, bSingleCompleteFileSelected ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_REMOVE, iCompleteFileSelected > 0 ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.SetDefaultItem(bSingleCompleteFileSelected ? MP_OPEN : -1); m_SharedFilesMenu.EnableMenuItem(MP_CMT, iSelectedItems == 1 ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_DETAIL, iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_GETED2KLINK, iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_GETHTMLED2KLINK, iSelectedItems > 0 ? MF_ENABLED : MF_GRAYED); m_SharedFilesMenu.EnableMenuItem(MP_GETSOURCEED2KLINK, (iSelectedItems > 0 && theApp.IsConnected() && !theApp.IsFirewalled()) ? MF_ENABLED : MF_GRAYED); // itsonlyme: hostnameSource if (iSelectedItems > 0 && theApp.IsConnected() && !theApp.IsFirewalled() && !CString(thePrefs.GetYourHostname()).IsEmpty() && CString(thePrefs.GetYourHostname()).Find(_T(".")) != -1) m_SharedFilesMenu.EnableMenuItem(MP_GETHOSTNAMESOURCEED2KLINK, MF_ENABLED); else m_SharedFilesMenu.EnableMenuItem(MP_GETHOSTNAMESOURCEED2KLINK, MF_GRAYED); // itsonlyme: hostnameSource m_SharedFilesMenu.EnableMenuItem(Irc_SetSendLink, iSelectedItems == 1 && theApp.emuledlg->ircwnd->IsConnected() ? MF_ENABLED : MF_GRAYED); CMenu WebMenu; WebMenu.CreateMenu(); int iWebMenuEntries = theWebServices.GetFileMenuEntries(WebMenu); UINT flag2 = (iWebMenuEntries == 0 || iSelectedItems != 1) ? MF_GRAYED : MF_STRING; m_SharedFilesMenu.AppendMenu(flag2 | MF_POPUP, (UINT_PTR)WebMenu.m_hMenu, GetResString(IDS_WEBSERVICES)); GetPopupMenuPos(*this, point); m_SharedFilesMenu.TrackPopupMenu(TPM_LEFTALIGN |TPM_RIGHTBUTTON,point.x,point.y,this); m_SharedFilesMenu.RemoveMenu(m_SharedFilesMenu.GetMenuItemCount()-1,MF_BYPOSITION); VERIFY( WebMenu.DestroyMenu() ); } BOOL CSharedFilesCtrl::OnCommand(WPARAM wParam, LPARAM lParam) { CTypedPtrList<CPtrList, CKnownFile*> selectedList; POSITION pos = GetFirstSelectedItemPosition(); while (pos != NULL){ int index = GetNextSelectedItem(pos); if (index >= 0) selectedList.AddTail((CKnownFile*)GetItemData(index)); } if (selectedList.GetCount() > 0) { CKnownFile* file = NULL; if (selectedList.GetCount() == 1) file = selectedList.GetHead(); switch (wParam){ case Irc_SetSendLink: if (file) theApp.emuledlg->ircwnd->SetSendFileString(CreateED2kLink(file)); break; case MP_GETED2KLINK:{ CString str; POSITION pos = selectedList.GetHeadPosition(); while (pos != NULL) { file = selectedList.GetNext(pos); if (!str.IsEmpty()) str += _T("\r\n"); str += CreateED2kLink(file); } theApp.CopyTextToClipboard(str); break; } case MP_GETHTMLED2KLINK:{ CString str; POSITION pos = selectedList.GetHeadPosition(); while (pos != NULL) { file = selectedList.GetNext(pos); if (!str.IsEmpty()) str += _T("<br />\r\n"); str += CreateHTMLED2kLink(file); } theApp.CopyTextToClipboard(str); break; } case MP_GETSOURCEED2KLINK:{ CString str; POSITION pos = selectedList.GetHeadPosition(); while (pos != NULL) { file = selectedList.GetNext(pos); if (!str.IsEmpty()) str += _T("\r\n"); str += theApp.CreateED2kSourceLink(file); } theApp.CopyTextToClipboard(str); break; } case MP_GETHOSTNAMESOURCEED2KLINK:{ CString str; POSITION pos = selectedList.GetHeadPosition(); while (pos != NULL) { file = selectedList.GetNext(pos); if (!str.IsEmpty()) str += _T("\r\n"); str += theApp.CreateED2kHostnameSourceLink(file); } theApp.CopyTextToClipboard(str); break; } // file operations case MP_OPEN: if (file && !file->IsPartFile()) OpenFile(file); break; case MP_OPENFOLDER: if (file && !file->IsPartFile()){ CString path = file->GetPath(); int bspos = path.ReverseFind(_T('\\')); ShellExecute(NULL, _T("open"), path.Left(bspos), NULL, NULL, SW_SHOW); } break; case MP_RENAME: case MPG_F2: if (file && !file->IsPartFile()){ InputBox inputbox; CString title = GetResString(IDS_RENAME); title.Remove(_T('&')); inputbox.SetLabels(title, GetResString(IDS_DL_FILENAME), file->GetFileName()); inputbox.SetEditFilenameMode(); inputbox.DoModal(); CString newname = inputbox.GetInput(); if (!inputbox.WasCancelled() && newname.GetLength()>0) { // at least prevent users from specifying something like "..\dir\file" static const TCHAR _szInvFileNameChars[] = _T("\\/:*?\"<>|"); if (newname.FindOneOf(_szInvFileNameChars) != -1){ AfxMessageBox(GetErrorMessage(ERROR_BAD_PATHNAME)); break; } CString newpath; PathCombine(newpath.GetBuffer(MAX_PATH), file->GetPath(), newname); newpath.ReleaseBuffer(); if (_trename(file->GetFilePath(), newpath) != 0){ CString strError; strError.Format(GetResString(IDS_ERR_RENAMESF), file->GetFilePath(), newpath, strerror(errno)); AfxMessageBox(strError); break; } if (file->IsKindOf(RUNTIME_CLASS(CPartFile))) file->SetFileName(newname); else { theApp.sharedfiles->RemoveKeywords(file); file->SetFileName(newname); theApp.sharedfiles->AddKeywords(file); } file->SetFilePath(newpath); UpdateFile(file); } } else if (wParam == MPG_F2) MessageBeep((UINT)-1); break; case MP_REMOVE: case MPG_DELETE:{ if (IDNO == AfxMessageBox(GetResString(IDS_CONFIRM_FILEDELETE),MB_ICONWARNING | MB_ICONQUESTION | MB_DEFBUTTON2 | MB_YESNO)) return TRUE; while (!selectedList.IsEmpty()) { CKnownFile* myfile = selectedList.GetHead(); selectedList.RemoveHead(); if (!myfile || myfile->IsPartFile()) continue; bool delsucc = false; if (!PathFileExists(myfile->GetFilePath())) delsucc = true; else{ // Delete if (!thePrefs.GetRemoveToBin()){ delsucc = DeleteFile(myfile->GetFilePath()); } else{ // delete to recycle bin :( TCHAR todel[MAX_PATH+1]; memset(todel, 0, sizeof todel); _tcsncpy(todel, myfile->GetFilePath(), ARRSIZE(todel)-2); SHFILEOPSTRUCT fp = {0}; fp.wFunc = FO_DELETE; fp.hwnd = theApp.emuledlg->m_hWnd; fp.pFrom = todel; fp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_SILENT;// | FOF_NOERRORUI delsucc = (SHFileOperation(&fp) == 0); } } if (delsucc){ theApp.sharedfiles->RemoveFile(myfile); if (myfile->IsKindOf(RUNTIME_CLASS(CPartFile))) theApp.emuledlg->transferwnd->downloadlistctrl.ClearCompleted(static_cast<CPartFile*>(myfile)); } else{ CString strError; strError.Format(_T("Failed to delete file \"%s\"\r\n\r\n%s"), myfile->GetFilePath(), GetErrorMessage(GetLastError())); AfxMessageBox(strError); } } break; } case MP_CMT: if (file) ShowComments(file); break; case MPG_ALTENTER: case MP_DETAIL:{ CSharedFileDetailsSheet sheet(selectedList); sheet.DoModal(); break; } case MP_PRIOVERYLOW: case MP_PRIOLOW: case MP_PRIONORMAL: case MP_PRIOHIGH: case MP_PRIOVERYHIGH: case MP_PRIOAUTO: { POSITION pos = selectedList.GetHeadPosition(); while (pos != NULL) { CKnownFile* file = selectedList.GetNext(pos); switch (wParam) { case MP_PRIOVERYLOW: file->SetAutoUpPriority(false); file->SetUpPriority(PR_VERYLOW); UpdateItem(file); break; case MP_PRIOLOW: file->SetAutoUpPriority(false); file->SetUpPriority(PR_LOW); UpdateItem(file); break; case MP_PRIONORMAL: file->SetAutoUpPriority(false); file->SetUpPriority(PR_NORMAL); UpdateItem(file); break; case MP_PRIOHIGH: file->SetAutoUpPriority(false); file->SetUpPriority(PR_HIGH); UpdateItem(file); break; case MP_PRIOVERYHIGH: file->SetAutoUpPriority(false); file->SetUpPriority(PR_VERYHIGH); UpdateItem(file); break; case MP_PRIOAUTO: file->SetAutoUpPriority(true); file->UpdateAutoUpPriority(); UpdateFile(file); break; } } break; } default: if (wParam>=MP_WEBURL && wParam<=MP_WEBURL+256){ theWebServices.RunURL(file, wParam); } break; } } return TRUE; } void CSharedFilesCtrl::UpdateItem(CKnownFile* file) { LVFINDINFO info; info.flags = LVFI_PARAM; info.lParam = (LPARAM)file; int iItem = FindItem(&info); if (iItem >= 0) Update(iItem); } void CSharedFilesCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // Barry - Store sort order in preferences // Determine ascending based on whether already sorted on this column int sortItem = thePrefs.GetColumnSortItem(CPreferences::tableShared); bool m_oldSortAscending = thePrefs.GetColumnSortAscending(CPreferences::tableShared); bool sortAscending = (sortItem != pNMListView->iSubItem) ? true : !m_oldSortAscending; // Item is column clicked sortItem = pNMListView->iSubItem; // Save new preferences thePrefs.SetColumnSortItem(CPreferences::tableShared, sortItem); thePrefs.SetColumnSortAscending(CPreferences::tableShared, sortAscending); // Ornis 4-way-sorting int adder=0; if (pNMListView->iSubItem>=5 && pNMListView->iSubItem<=7) { ASSERT( pNMListView->iSubItem - 5 < ARRSIZE(sortstat) ); if (!sortAscending) sortstat[pNMListView->iSubItem - 5] = !sortstat[pNMListView->iSubItem - 5]; adder = sortstat[pNMListView->iSubItem-5] ? 0 : 100; } else if (pNMListView->iSubItem==11) { ASSERT( 3 < ARRSIZE(sortstat) ); if (!sortAscending) sortstat[3] = !sortstat[3]; adder = sortstat[3] ? 0 : 100; } // Sort table if (adder==0) SetSortArrow(sortItem, sortAscending); else SetSortArrow(sortItem, sortAscending ? arrowDoubleUp : arrowDoubleDown); SortItems(SortProc, sortItem + adder + (sortAscending ? 0:20)); *pResult = 0; } int CSharedFilesCtrl::SortProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { const CKnownFile* item1 = (CKnownFile*)lParam1; const CKnownFile* item2 = (CKnownFile*)lParam2; switch(lParamSort){ case 0: //filename asc return _tcsicmp(item1->GetFileName(),item2->GetFileName()); case 20: //filename desc return _tcsicmp(item2->GetFileName(),item1->GetFileName()); case 1: //filesize asc return item1->GetFileSize()==item2->GetFileSize()?0:(item1->GetFileSize()>item2->GetFileSize()?1:-1); case 21: //filesize desc return item1->GetFileSize()==item2->GetFileSize()?0:(item2->GetFileSize()>item1->GetFileSize()?1:-1); case 2: //filetype asc return item1->GetFileType().CompareNoCase(item2->GetFileType()); case 22: //filetype desc return item2->GetFileType().CompareNoCase(item1->GetFileType()); case 3: //prio asc { uint8 p1=item1->GetUpPriority() +1; if(p1==5) p1=0; uint8 p2=item2->GetUpPriority() +1; if(p2==5) p2=0; return p1-p2; } case 23: //prio desc { uint8 p1=item1->GetUpPriority() +1; if(p1==5) p1=0; uint8 p2=item2->GetUpPriority() +1; if(p2==5) p2=0; return p2-p1; } case 4: //fileID asc return memcmp(item1->GetFileHash(), item2->GetFileHash(), 16); case 24: //fileID desc return memcmp(item2->GetFileHash(), item1->GetFileHash(), 16); case 5: //requests asc return item1->statistic.GetRequests() - item2->statistic.GetRequests(); case 25: //requests desc return item2->statistic.GetRequests() - item1->statistic.GetRequests(); case 6: //acc requests asc return item1->statistic.GetAccepts() - item2->statistic.GetAccepts(); case 26: //acc requests desc return item2->statistic.GetAccepts() - item1->statistic.GetAccepts(); case 7: //all transferred asc return item1->statistic.GetTransferred()==item2->statistic.GetTransferred()?0:(item1->statistic.GetTransferred()>item2->statistic.GetTransferred()?1:-1); case 27: //all transferred desc return item1->statistic.GetTransferred()==item2->statistic.GetTransferred()?0:(item2->statistic.GetTransferred()>item1->statistic.GetTransferred()?1:-1); case 9: //folder asc return _tcsicmp(item1->GetPath(),item2->GetPath()); case 29: //folder desc return _tcsicmp(item2->GetPath(),item1->GetPath()); case 10: //complete sources asc return CompareUnsigned(item1->m_nCompleteSourcesCount, item2->m_nCompleteSourcesCount); case 30: //complete sources desc return CompareUnsigned(item2->m_nCompleteSourcesCount, item1->m_nCompleteSourcesCount); case 11: //ed2k shared asc return item1->GetPublishedED2K() - item2->GetPublishedED2K(); case 31: //ed2k shared desc return item2->GetPublishedED2K() - item1->GetPublishedED2K(); case 105: //all requests asc return item1->statistic.GetAllTimeRequests() - item2->statistic.GetAllTimeRequests(); case 125: //all requests desc return item2->statistic.GetAllTimeRequests() - item1->statistic.GetAllTimeRequests(); case 106: //all acc requests asc return item1->statistic.GetAllTimeAccepts() - item2->statistic.GetAllTimeAccepts(); case 126: //all acc requests desc return item2->statistic.GetAllTimeAccepts() - item1->statistic.GetAllTimeAccepts(); case 107: //all transferred asc return item1->statistic.GetAllTimeTransferred()==item2->statistic.GetAllTimeTransferred()?0:(item1->statistic.GetAllTimeTransferred()>item2->statistic.GetAllTimeTransferred()?1:-1); case 127: //all transferred desc return item1->statistic.GetAllTimeTransferred()==item2->statistic.GetAllTimeTransferred()?0:(item2->statistic.GetAllTimeTransferred()>item1->statistic.GetAllTimeTransferred()?1:-1); case 111:{ //kad shared asc uint32 tNow = time(NULL); int i1 = (tNow - item1->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0; int i2 = (tNow - item2->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0; return i1 - i2; } case 131:{ //kad shared desc uint32 tNow = time(NULL); int i1 = (tNow - item1->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0; int i2 = (tNow - item2->GetLastPublishTimeKadSrc() < KADEMLIAREPUBLISHTIMES) ? 1 : 0; return i2 - i1; } default: return 0; } } void CSharedFilesCtrl::UpdateFile(const CKnownFile* toupdate) { if (!theApp.emuledlg->IsRunning()) return; LVFINDINFO find; find.flags = LVFI_PARAM; find.lParam = (LPARAM)toupdate; sint16 result = FindItem(&find); if (result != -1) { Update(result); // Added by Tarod to real time refresh - DonGato - 11/11/2002 theApp.emuledlg->sharedfileswnd->Check4StatUpdate(toupdate); } } void CSharedFilesCtrl::ShowFilesCount() { CString counter; // SLUGFILLER: SafeHash - hashing counter if (theApp.sharedfiles->GetHashingCount()) counter.Format(_T(" (%i, %s %i)"), theApp.sharedfiles->GetCount(), GetResString(IDS_HASHING) ,theApp.sharedfiles->GetHashingCount()); else counter.Format(_T(" (%i)"), theApp.sharedfiles->GetCount()); // SLUGFILLER: SafeHash theApp.emuledlg->sharedfileswnd->GetDlgItem(IDC_TRAFFIC_TEXT)->SetWindowText(GetResString(IDS_SF_FILES)+counter ); } void CSharedFilesCtrl::OpenFile(const CKnownFile* file) { ShellOpenFile(file->GetFilePath(), NULL); } void CSharedFilesCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) { int iSel = GetNextItem(-1, LVIS_SELECTED | LVIS_FOCUSED); if (iSel != -1) { CKnownFile* file = (CKnownFile*)GetItemData(iSel); if (file) { if (GetKeyState(VK_MENU) & 0x8000) { CTypedPtrList<CPtrList, CKnownFile*> aFiles; aFiles.AddHead(file); CSharedFileDetailsSheet sheet(aFiles); sheet.DoModal(); } else if (!file->IsPartFile()) OpenFile(file); } } *pResult = 0; } void CSharedFilesCtrl::CreateMenues() { if (m_PrioMenu) VERIFY( m_PrioMenu.DestroyMenu() ); if (m_SharedFilesMenu) VERIFY( m_SharedFilesMenu.DestroyMenu() ); m_PrioMenu.CreateMenu(); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOVERYLOW,GetResString(IDS_PRIOVERYLOW)); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOLOW,GetResString(IDS_PRIOLOW)); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIONORMAL,GetResString(IDS_PRIONORMAL)); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOHIGH, GetResString(IDS_PRIOHIGH)); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOVERYHIGH, GetResString(IDS_PRIORELEASE)); m_PrioMenu.AppendMenu(MF_STRING,MP_PRIOAUTO, GetResString(IDS_PRIOAUTO));//UAP m_SharedFilesMenu.CreatePopupMenu(); m_SharedFilesMenu.AddMenuTitle(GetResString(IDS_SHAREDFILES)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_OPEN, GetResString(IDS_OPENFILE)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_OPENFOLDER, GetResString(IDS_OPENFOLDER)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_RENAME, GetResString(IDS_RENAME) + _T("...")); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_REMOVE, GetResString(IDS_DELETE)); m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR); m_SharedFilesMenu.AppendMenu(MF_STRING|MF_POPUP,(UINT_PTR)m_PrioMenu.m_hMenu, GetResString(IDS_PRIORITY) +" ("+GetResString(IDS_PW_CON_UPLBL)+")" ); m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_DETAIL, GetResString(IDS_SHOWDETAILS)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_CMT, GetResString(IDS_CMT_ADD)); m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_GETED2KLINK, GetResString(IDS_DL_LINK1)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_GETHTMLED2KLINK, GetResString(IDS_DL_LINK2)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_GETSOURCEED2KLINK, GetResString(IDS_CREATESOURCELINK)); m_SharedFilesMenu.AppendMenu(MF_STRING,MP_GETHOSTNAMESOURCEED2KLINK, GetResString(IDS_CREATEHOSTNAMESRCLINK)); // itsonlyme: hostnameSource m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR); m_SharedFilesMenu.AppendMenu(MF_STRING,Irc_SetSendLink,GetResString(IDS_IRC_ADDLINKTOIRC)); m_SharedFilesMenu.AppendMenu(MF_STRING|MF_SEPARATOR); } void CSharedFilesCtrl::ShowComments(CKnownFile* file) { if (file){ CCommentDialog dialog(file); dialog.DoModal(); } } void CSharedFilesCtrl::OnGetDispInfo(NMHDR *pNMHDR, LRESULT *pResult) { NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); if (theApp.emuledlg->IsRunning()){ // Although we have an owner drawn listview control we store the text for the primary item in the listview, to be // capable of quick searching those items via the keyboard. Because our listview items may change their contents, // we do this via a text callback function. The listview control will send us the LVN_DISPINFO notification if // it needs to know the contents of the primary item. // // But, the listview control sends this notification all the time, even if we do not search for an item. At least // this notification is only sent for the visible items and not for all items in the list. Though, because this // function is invoked *very* often, no *NOT* put any time consuming code here in. if (pDispInfo->item.mask & LVIF_TEXT){ const CKnownFile* pFile = reinterpret_cast<CKnownFile*>(pDispInfo->item.lParam); if (pFile != NULL){ switch (pDispInfo->item.iSubItem){ case 0: if (pDispInfo->item.cchTextMax > 0){ _tcsncpy(pDispInfo->item.pszText, pFile->GetFileName(), pDispInfo->item.cchTextMax); pDispInfo->item.pszText[pDispInfo->item.cchTextMax-1] = _T('\0'); } break; default: // shouldn't happen pDispInfo->item.pszText[0] = _T('\0'); break; } } } } *pResult = 0; } void CSharedFilesCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == 'C' && (GetKeyState(VK_CONTROL) & 0x8000)) { // Ctrl+C: Copy listview items to clipboard SendMessage(WM_COMMAND, MP_GETED2KLINK); return; } CMuleListCtrl::OnKeyDown(nChar, nRepCnt, nFlags); }