00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsFindDownloadMgr.h"
00009 #include "WaitDlg.h"
00010 #include "DownloadsWnd.h"
00011
00012 extern CDownloadsWnd* _pwndDownloads;
00013 extern LPCSTR fsStrStrNoCase(LPCSTR pszIn, LPCSTR pszWhat);
00014
00015 #ifdef _DEBUG
00016 #undef THIS_FILE
00017 static char THIS_FILE[]=__FILE__;
00018 #define new DEBUG_NEW
00019 #endif
00020
00021 fsFindDownloadMgr::fsFindDownloadMgr()
00022 {
00023 m_iIndex = -1;
00024 }
00025
00026 fsFindDownloadMgr::~fsFindDownloadMgr()
00027 {
00028
00029 }
00030
00031 void fsFindDownloadMgr::ReadSettings()
00032 {
00033 m_dwFlags = _App.Find_Flags ();
00034 m_strWhat = _App.Find_What ();
00035 m_pGroup = _DldsGrps.FindGroup (_App.Find_GroupId ());
00036 if (m_pGroup == NULL)
00037 m_pGroup = _DldsGrps.FindGroup (GRP_OTHER_ID);
00038 m_tFrom = _App.Find_TimeFrom ();
00039 m_tTo = _App.Find_TimeTo ();
00040 m_uFileSizeFrom = _App.Find_FileSizeFrom ();
00041 m_uFileSizeTo = _App.Find_FileSizeTo ();
00042 }
00043
00044 void fsFindDownloadMgr::PrepareFind()
00045 {
00046 ReadSettings ();
00047
00048 if (m_dwFlags & SEARCHWH_LISTOFDLDS)
00049 m_enWI = WII_LISTOFDLDS;
00050 else if (m_dwFlags & SEARCHWH_HISTOFDLDS)
00051 m_enWI = WII_HISTOFDLDS;
00052 else if (m_dwFlags & SEARCHWH_DELETED)
00053 m_enWI = WII_DELETED;
00054 else
00055 {
00056 m_iIndex = -1;
00057 return;
00058 }
00059
00060 m_iIndex = 0;
00061 }
00062
00063 BOOL fsFindDownloadMgr::FindNext()
00064 {
00065 if (m_iIndex == -1)
00066 return FALSE;
00067
00068 int cElems = GetElementCount ();
00069
00070 if (cElems == 0)
00071 {
00072 m_iIndex = -1;
00073 return FALSE;
00074 }
00075
00076 if (cElems < 600)
00077 FindNext_imp ();
00078 else
00079 {
00080 CWaitDlg dlg;
00081 dlg.StartWaiting (LS (L_SEARCHISPERFORMED), _threadFindNext, TRUE, this);
00082 }
00083
00084 if (m_iIndex == -1)
00085 return FALSE;
00086
00087 m_iIndex++;
00088
00089 switch (m_enWI)
00090 {
00091 case WII_LISTOFDLDS:
00092 _pwndDownloads->ShowAllDownloads ();
00093 _pwndDownloads->SelectDownload ((fsDownload*)m_pFoundElement);
00094 break;
00095
00096 case WII_HISTOFDLDS:
00097 _pwndDownloads->ShowAllHistory ();
00098 _pwndDownloads->SelectHistRecord ((fsDLHistoryRecord*)m_pFoundElement);
00099 break;
00100
00101 case WII_DELETED:
00102 _pwndDownloads->ShowDeletedDownloads ();
00103 _pwndDownloads->SelectDeletedDownload ((fsDownload*)m_pFoundElement);
00104 break;
00105 }
00106
00107 return TRUE;
00108 }
00109
00110 int fsFindDownloadMgr::GetElementCount()
00111 {
00112 int cElements = 0;
00113
00114 if (m_dwFlags & SEARCHWH_LISTOFDLDS)
00115 cElements += _DldsMgr.GetCount ();
00116
00117 if (m_dwFlags & SEARCHWH_HISTOFDLDS)
00118 cElements += _DldsMgr.m_histmgr.GetRecordCount ();
00119
00120 if (m_dwFlags & SEARCHWH_DELETED)
00121 cElements += _DldsMgr.Get_DeletedDownloadCount ();
00122
00123 return cElements;
00124 }
00125
00126 void fsFindDownloadMgr::FindNext_imp(BOOL* pbCancel, int* piProgress)
00127 {
00128 do
00129 {
00130 if (m_iIndex == -1)
00131 m_iIndex = 0;
00132
00133 switch (m_enWI)
00134 {
00135 case WII_LISTOFDLDS:
00136 FindNext_InListOfDlds (pbCancel, piProgress);
00137 break;
00138
00139 case WII_HISTOFDLDS:
00140 FindNext_InHistoryOfDlds (pbCancel, piProgress);
00141 break;
00142
00143 case WII_DELETED:
00144 FindNext_InDeleted (pbCancel, piProgress);
00145 break;
00146 }
00147
00148
00149 if (m_iIndex == -1 && NextFindSource (m_enWI) == FALSE)
00150 break;
00151 }
00152 while (m_iIndex == -1);
00153 }
00154
00155 DWORD WINAPI fsFindDownloadMgr::_threadFindNext(LPVOID lp)
00156 {
00157 ProcWaitInfo *info = (ProcWaitInfo*) lp;
00158 fsFindDownloadMgr* pThis = (fsFindDownloadMgr*) info->lpParam1;
00159 pThis->FindNext_imp (&info->bNeedStop, &info->iProgress);
00160 info->bWaitDone = TRUE;
00161 return 0;
00162 }
00163
00164 BOOL fsFindDownloadMgr::NextFindSource(fsFDM_WhereIsIndex &wi)
00165 {
00166 switch (wi)
00167 {
00168 case WII_LISTOFDLDS:
00169 if (m_dwFlags & SEARCHWH_HISTOFDLDS)
00170 wi = WII_HISTOFDLDS;
00171 else if (m_dwFlags & SEARCHWH_DELETED)
00172 wi = WII_DELETED;
00173 else
00174 return FALSE;
00175 break;
00176
00177 case WII_HISTOFDLDS:
00178 if (m_dwFlags & SEARCHWH_DELETED)
00179 wi = WII_DELETED;
00180 else
00181 return FALSE;
00182
00183 default:
00184 return FALSE;
00185 }
00186
00187 return TRUE;
00188 }
00189
00190 void fsFindDownloadMgr::FindNext_InListOfDlds(BOOL *pbCancel, int *piProgress)
00191 {
00192 int cElems = GetElementCount ();
00193 int cDlds = _DldsMgr.GetCount ();
00194
00195 for (int i = m_iIndex; i < cDlds; i++)
00196 {
00197 if (pbCancel && *pbCancel)
00198 break;
00199
00200 vmsDownloadSmartPtr dld = _DldsMgr.GetDownload (i);
00201 if (IsSatisfies (dld))
00202 {
00203 m_iIndex = i;
00204 m_pFoundElement = dld;
00205 return;
00206 }
00207
00208 if (piProgress)
00209 *piProgress = int ((double) cDlds / cElems * 100.0);
00210 }
00211
00212 m_iIndex = -1;
00213 }
00214
00215 void fsFindDownloadMgr::FindNext_InHistoryOfDlds(BOOL *pbCancel, int *piProgress)
00216 {
00217 int cElems = GetElementCount ();
00218 fsDownloadsHistoryMgr* mgr = &_DldsMgr.m_histmgr;
00219 int cRecs = mgr->GetRecordCount ();
00220 int cDidElems = 0;
00221
00222 if (m_dwFlags & SEARCHWH_LISTOFDLDS)
00223 cDidElems += _DldsMgr.GetCount ();
00224
00225 for (int i = m_iIndex; i < cRecs; i++)
00226 {
00227 if (pbCancel && *pbCancel)
00228 break;
00229
00230 fsDLHistoryRecord* rec = mgr->GetRecord (i);
00231 if (IsSatisfies (rec))
00232 {
00233 m_iIndex = i;
00234 m_pFoundElement = rec;
00235 return;
00236 }
00237
00238 if (piProgress)
00239 *piProgress = int ((double) (cRecs + cDidElems) / cElems * 100.0);
00240 }
00241
00242 m_iIndex = -1;
00243 }
00244
00245 void fsFindDownloadMgr::FindNext_InDeleted(BOOL *pbCancel, int *piProgress)
00246 {
00247 int cElems = GetElementCount ();
00248 int cDlds = _DldsMgr.Get_DeletedDownloadCount ();
00249 int cDidElems = 0;
00250
00251 if (m_dwFlags & SEARCHWH_LISTOFDLDS)
00252 cDidElems += _DldsMgr.GetCount ();
00253 if (m_dwFlags & SEARCHWH_HISTOFDLDS)
00254 cDidElems += _DldsMgr.m_histmgr.GetRecordCount ();
00255
00256 for (int i = m_iIndex; i < cDlds; i++)
00257 {
00258 if (pbCancel && *pbCancel)
00259 break;
00260
00261 vmsDownloadSmartPtr dld = _DldsMgr.Get_DeletedDownload (i);
00262 if (IsSatisfies (dld))
00263 {
00264 m_iIndex = i;
00265 m_pFoundElement = dld;
00266 return;
00267 }
00268
00269 if (piProgress)
00270 *piProgress = int ((double) (cDlds + cDidElems) / cElems * 100.0);
00271 }
00272
00273 m_iIndex = -1;
00274 }
00275
00276 BOOL fsFindDownloadMgr::IsSatisfies(vmsDownloadSmartPtr dld)
00277 {
00278 if (m_dwFlags & SEARCHU_DLDGROUP)
00279 {
00280 if (dld->pGroup != m_pGroup)
00281 return FALSE;
00282 }
00283
00284 if (m_dwFlags & SEARCHU_FILESIZE)
00285 {
00286 UINT64 size = dld->pMgr->GetLDFileSize ();
00287 if (size < m_uFileSizeFrom || size > m_uFileSizeTo)
00288 return FALSE;
00289 }
00290
00291 if (m_dwFlags & SEARCHIN_COMMENT)
00292 if (fsStrStrNoCase (dld->strComment, m_strWhat))
00293 return TRUE;
00294
00295 if (m_dwFlags & SEARCHIN_LOCFILENAME)
00296 {
00297 if (fsStrStrNoCase (dld->pMgr->get_OutputFilePathName (), m_strWhat))
00298 return TRUE;
00299
00300 if (dld->pMgr->GetBtDownloadMgr ())
00301 {
00302 for (int i = 1; i < dld->pMgr->GetBtDownloadMgr ()->get_FileCount (); i++)
00303 {
00304 if (fsStrStrNoCase (dld->pMgr->GetBtDownloadMgr ()->get_OutputFilePathName (i), m_strWhat))
00305 return TRUE;
00306 }
00307 }
00308 }
00309
00310 if (m_dwFlags & SEARCHIN_URL)
00311 {
00312 if (fsStrStrNoCase (dld->pMgr->get_URL (), m_strWhat))
00313 return TRUE;
00314 }
00315
00316 if (m_dwFlags & SEARCHIN_FILENAME)
00317 {
00318 char sz [10000];
00319 CDownloads_Tasks::GetFileName (dld, sz);
00320 if (fsStrStrNoCase (sz, m_strWhat))
00321 return TRUE;
00322 }
00323
00324 return FALSE;
00325 }
00326
00327 BOOL fsFindDownloadMgr::IsSatisfies(fsDLHistoryRecord *rec)
00328 {
00329 if (m_dwFlags & SEARCHU_FILESIZE)
00330 {
00331 if (rec->uFileSize < m_uFileSizeFrom || rec->uFileSize > m_uFileSizeTo)
00332 return FALSE;
00333 }
00334
00335 if (m_dwFlags & SEARCHU_TIME)
00336 {
00337 fsDldHistRecFilter_Custom filter;
00338 filter.SetTimeRange (m_tFrom, m_tTo);
00339 if (filter.IsSatisfies (rec) == FALSE)
00340 return FALSE;
00341 }
00342
00343 if (m_dwFlags & SEARCHIN_COMMENT)
00344 if (fsStrStrNoCase (rec->strComment, m_strWhat))
00345 return TRUE;
00346
00347 if (m_dwFlags & SEARCHIN_LOCFILENAME)
00348 if (fsStrStrNoCase (rec->strSavedTo, m_strWhat))
00349 return TRUE;
00350
00351 if (m_dwFlags & SEARCHIN_URL)
00352 {
00353 if (fsStrStrNoCase (rec->strURL, m_strWhat))
00354 return TRUE;
00355 }
00356
00357 if (m_dwFlags & SEARCHIN_FILENAME)
00358 {
00359 if (fsStrStrNoCase (rec->strFileName, m_strWhat))
00360 return TRUE;
00361 }
00362
00363 return FALSE;
00364 }
00365
00366 BOOL fsFindDownloadMgr::IsFindNextAvail()
00367 {
00368 return m_iIndex != -1;
00369 }