00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsDownloadRegSaver.h"
00009 #include "DownloadsWnd.h"
00010 #include "fsDownloadMgr.h"
00011 #include "system.h"
00012 #include "mfchelp.h"
00013
00014 #ifdef _DEBUG
00015 #undef THIS_FILE
00016 static char THIS_FILE[]=__FILE__;
00017 #define new DEBUG_NEW
00018 #endif
00019
00020 fsDownloadRegSaver::fsDownloadRegSaver()
00021 {
00022
00023 }
00024
00025 fsDownloadRegSaver::~fsDownloadRegSaver()
00026 {
00027
00028 }
00029
00030 BOOL fsDownloadRegSaver::Save(t_downloads* vDownloads, LPCSTR pszFileName)
00031 {
00032 m_bDontSaveLogs = _App.DontSaveLogs ();
00033
00034 fsString strFileName = pszFileName;
00035 fsString strFileNameBak = pszFileName;
00036
00037 strFileName += ".sav";
00038 strFileNameBak += ".bak";
00039
00040 strFileName = fsGetDataFilePath (strFileName);
00041 strFileNameBak = fsGetDataFilePath (strFileNameBak);
00042
00043 HANDLE hFile = CreateFile (strFileNameBak, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
00044 FILE_ATTRIBUTE_HIDDEN, NULL);
00045
00046 if (hFile == INVALID_HANDLE_VALUE)
00047 return FALSE;
00048
00049 DWORD dw;
00050
00051 fsDLFileHdr hdr;
00052 if (FALSE == WriteFile (hFile, &hdr, sizeof (hdr), &dw, NULL))
00053 {
00054 CloseHandle (hFile);
00055 return FALSE;
00056 }
00057
00058 for (size_t i = 0; i < vDownloads->size (); i++)
00059 {
00060 LPBYTE pBuffer = NULL;
00061 DWORD dwSize;
00062
00063 try {
00064
00065 vmsDownloadSmartPtr dld = vDownloads->at (i);
00066
00067 if (FALSE == SaveDownload (dld, NULL, &dwSize))
00068 {
00069 CloseHandle (hFile);
00070 return FALSE;
00071 }
00072
00073 fsnew (pBuffer, BYTE, dwSize);
00074
00075 if (FALSE == SaveDownload (dld, pBuffer, &dwSize))
00076 {
00077 delete [] pBuffer;
00078 CloseHandle (hFile);
00079 return FALSE;
00080 }
00081
00082 }
00083 catch (...) {
00084 if (pBuffer)
00085 delete [] pBuffer;
00086 CloseHandle (hFile);
00087 return FALSE;
00088 }
00089
00090 if (FALSE == WriteFile (hFile, &dwSize, sizeof (dwSize), &dw, NULL))
00091 {
00092 CloseHandle (hFile);
00093 return FALSE;
00094 }
00095
00096 if (FALSE == WriteFile (hFile, pBuffer, dwSize, &dw, NULL))
00097 {
00098 CloseHandle (hFile);
00099 return FALSE;
00100 }
00101
00102 delete [] pBuffer;
00103 }
00104
00105 FlushFileBuffers (hFile);
00106 CloseHandle (hFile);
00107
00108 if (GetFileAttributes (strFileName) != DWORD (-1))
00109 DeleteFile (strFileName);
00110
00111 return MoveFile (strFileNameBak, strFileName);
00112 }
00113
00114 fsDLLoadResult fsDownloadRegSaver::Load(t_downloads *vDownloads, LPCSTR pszFileName, BOOL bDontLoadIfTooLarge, fsDLLoadFromType lt, BOOL bErrIfNotExists)
00115 {
00116 HANDLE hFile = INVALID_HANDLE_VALUE;
00117 fsDLLoadFromType nlt = DLLFT_SAV;
00118 fsDLFileHdr hdr;
00119 fsString strFileName = pszFileName;
00120 LPBYTE pBuffer = NULL;
00121
00122 switch (lt)
00123 {
00124 case DLLFT_SAV:
00125 strFileName += ".sav";
00126 nlt = DLLFT_BAK;
00127 break;
00128
00129 case DLLFT_BAK:
00130 strFileName += ".bak";
00131 nlt = DLLFT_SAV;
00132 break;
00133 }
00134
00135 strFileName = fsGetDataFilePath (strFileName);
00136
00137 if (GetFileAttributes (strFileName) == UINT (-1))
00138 {
00139
00140 if (nlt == DLLFT_SAV)
00141 return bErrIfNotExists == FALSE ? DLLR_SUCCEEDED : DLLR_FAILED;
00142 else
00143 return Load (vDownloads, pszFileName, bDontLoadIfTooLarge, nlt, bErrIfNotExists);
00144
00145 }
00146
00147 hFile = CreateFile (strFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
00148 OPEN_ALWAYS, 0, NULL);
00149
00150 bErrIfNotExists = TRUE;
00151
00152 if (hFile == INVALID_HANDLE_VALUE)
00153 goto _lErr;
00154
00155 if (bDontLoadIfTooLarge && 5*1024*1024 < GetFileSize (hFile, NULL))
00156 {
00157 CloseHandle (hFile);
00158 return DLLR_TOOLARGESIZE;
00159 }
00160
00161 DWORD dwFileSize;
00162 DWORD dw;
00163 BOOL bUseOLD;
00164 WORD wVer;
00165
00166 dwFileSize = GetFileSize (hFile, NULL);
00167 bUseOLD = FALSE;
00168 wVer = 0;
00169
00170 if (FALSE == ReadFile (hFile, &hdr, sizeof (hdr), &dw, NULL) ||
00171 strnicmp (hdr.szSig, DLFILE_SIG, strlen (DLFILE_SIG)) )
00172 {
00173
00174 SetFilePointer (hFile, 0, NULL, FILE_BEGIN);
00175 bUseOLD = TRUE;
00176 }
00177 else
00178 {
00179 dwFileSize -= dw;
00180 wVer = hdr.wVer;
00181 if (wVer > DLFILE_CURRENT_VERSION)
00182 goto _lErr;
00183 }
00184
00185 vDownloads->clear ();
00186
00187 while (dwFileSize)
00188 {
00189 DWORD dwSize;
00190
00191 pBuffer = NULL;
00192
00193 vmsDownloadSmartPtr dld;
00194 dld.CreateInstance ();
00195 dld->pMgr.CreateInstance ();
00196
00197 if (!ReadFile (hFile, &dwSize, sizeof (dwSize), &dw, NULL) || dw != sizeof (dwSize))
00198 goto _lErr;
00199
00200 if (dwFileSize < sizeof (dwSize) + dwSize)
00201 goto _lErr;
00202
00203 dwFileSize -= sizeof (dwSize) + dwSize;
00204
00205 fsnew (pBuffer, BYTE, dwSize);
00206
00207
00208 if (!ReadFile (hFile, pBuffer, dwSize, &dw, NULL) || dw != dwSize)
00209 goto _lErr;
00210
00211 try{
00212
00213 if (bUseOLD)
00214 {
00215 if (FALSE == OLD_LoadDownload (dld, pBuffer, &dwSize))
00216 goto _lErr;
00217 }
00218 else
00219 {
00220 if (FALSE == LoadDownload (dld, pBuffer, &dwSize, wVer))
00221 goto _lErr;
00222 }
00223
00224 }catch (...) {goto _lErr;}
00225
00226 delete [] pBuffer;
00227
00228 vDownloads->push_back (dld);
00229 }
00230
00231 CloseHandle (hFile);
00232
00233 return DLLR_SUCCEEDED;
00234
00235 _lErr:
00236 if (hFile != INVALID_HANDLE_VALUE)
00237 CloseHandle (hFile);
00238
00239 if (pBuffer)
00240 delete [] pBuffer;
00241
00242 DeleteFile (strFileName);
00243
00244 if (nlt == DLLFT_SAV)
00245 return DLLR_FAILED;
00246
00247 return Load (vDownloads, pszFileName, bDontLoadIfTooLarge, nlt, bErrIfNotExists);
00248 }
00249
00250 BOOL fsDownloadRegSaver::SaveDownload(vmsDownloadSmartPtr dld, LPVOID pBuffer, LPDWORD pdwSize)
00251 {
00252 DWORD dwNeedSize;
00253
00254 if (FALSE == dld->pMgr->SaveState (NULL, &dwNeedSize))
00255 return FALSE;
00256
00257 dwNeedSize += sizeof (dld->bAutoStart);
00258
00259 int iReserved = 0;
00260 dwNeedSize += sizeof (iReserved);
00261 dwNeedSize += sizeof (dld->nID);
00262 dwNeedSize += dld->strComment.GetLength () + sizeof (DWORD);
00263 dwNeedSize += sizeof (UINT);
00264 dwNeedSize += sizeof (dld->dwFlags);
00265 dwNeedSize += sizeof (dld->dwReserved);
00266 dwNeedSize += sizeof (dld->dateAdded);
00267
00268 DWORD cEvents = dld->vEvents.size ();
00269 if (m_bDontSaveLogs)
00270 cEvents = 0;
00271 dwNeedSize += sizeof (DWORD);
00272
00273 for (DWORD i = 0; i < cEvents; i++)
00274 dwNeedSize += 2*sizeof (COLORREF) + sizeof (FILETIME) + sizeof (int) + dld->vEvents [i].strEvent.GetLength () + sizeof (DWORD);
00275
00276 if (pBuffer == NULL)
00277 {
00278 *pdwSize = dwNeedSize;
00279 return TRUE;
00280 }
00281
00282 if (*pdwSize < dwNeedSize)
00283 {
00284 *pdwSize = dwNeedSize;
00285 return FALSE;
00286 }
00287
00288 LPBYTE pB = LPBYTE (pBuffer);
00289
00290 DWORD dw = *pdwSize;
00291 if (FALSE == dld->pMgr->SaveState (pB, &dw))
00292 return FALSE;
00293 pB += dw;
00294
00295 CopyMemory (pB, &dld->bAutoStart, sizeof (dld->bAutoStart));
00296 pB += sizeof (dld->bAutoStart);
00297
00298 CopyMemory (pB, &iReserved, sizeof (iReserved));
00299 pB += sizeof (iReserved);
00300
00301 CopyMemory (pB, &dld->nID, sizeof (dld->nID));
00302 pB += sizeof (dld->nID);
00303
00304 dw = dld->strComment.GetLength ();
00305 CopyMemory (pB, &dw, sizeof (dw));
00306 pB += sizeof (dw);
00307 CopyMemory (pB, dld->strComment, dw);
00308 pB += dw;
00309
00310 CopyMemory (pB, &dld->pGroup->nId, sizeof (UINT));
00311 pB += sizeof (UINT);
00312
00313 CopyMemory (pB, &dld->dwFlags, sizeof (dld->dwFlags));
00314 pB += sizeof (dld->dwFlags);
00315
00316 CopyMemory (pB, &dld->dwReserved, sizeof (dld->dwReserved));
00317 pB += sizeof (dld->dwReserved);
00318
00319 CopyMemory (pB, &dld->dateAdded, sizeof (dld->dateAdded));
00320 pB += sizeof (dld->dateAdded);
00321
00322 CopyMemory (pB, &cEvents, sizeof (DWORD));
00323 pB += sizeof (DWORD);
00324
00325 for (i = 0; i < cEvents; i++)
00326 {
00327 fsDownloadEvents *ev = &dld->vEvents [i];
00328
00329 CopyMemory (pB, &ev->clrBg, sizeof (ev->clrBg));
00330 pB += sizeof (ev->clrBg);
00331
00332 CopyMemory (pB, &ev->clrText, sizeof (ev->clrText));
00333 pB += sizeof (ev->clrText);
00334
00335 CopyMemory (pB, &ev->timeEvent, sizeof (ev->timeEvent));
00336 pB += sizeof (ev->timeEvent);
00337
00338 CopyMemory (pB, &ev->iImage, sizeof (ev->iImage));
00339 pB += sizeof (ev->iImage);
00340
00341 dw = ev->strEvent.GetLength ();
00342 CopyMemory (pB, &dw, sizeof (dw));
00343 pB += sizeof (dw);
00344 CopyMemory (pB, dld->vEvents [i].strEvent, dw);
00345 pB += dw;
00346 }
00347
00348 *pdwSize = dwNeedSize;
00349
00350 return TRUE;
00351 }
00352
00353 BOOL fsDownloadRegSaver::LoadDownload(vmsDownloadSmartPtr dld, LPVOID lpBuffer, LPDWORD lpdwSize, WORD wVer)
00354 {
00355 #define CHECK_BOUNDS(need) if (need < 0 || need > int(*lpdwSize) - (pB - LPBYTE (lpBuffer))) return FALSE;
00356
00357 LPBYTE pB = LPBYTE (lpBuffer);
00358 DWORD dw = *lpdwSize;
00359 LPSTR szStr;
00360 int iReserved;
00361
00362 if (FALSE == dld->pMgr->LoadState (pB, &dw, wVer))
00363 return FALSE;
00364 pB += dw;
00365
00366 CHECK_BOUNDS (sizeof (dld->bAutoStart));
00367
00368 CopyMemory (&dld->bAutoStart, pB, sizeof (dld->bAutoStart));
00369 pB += sizeof (dld->bAutoStart);
00370
00371 CHECK_BOUNDS (sizeof (iReserved));
00372
00373 CopyMemory (&iReserved, pB, sizeof (iReserved));
00374 pB += sizeof (iReserved);
00375
00376 CHECK_BOUNDS (sizeof (dld->nID));
00377
00378 CopyMemory (&dld->nID, pB, sizeof (dld->nID));
00379 pB += sizeof (dld->nID);
00380
00381 CHECK_BOUNDS (sizeof (dw));
00382
00383 CopyMemory (&dw, pB, sizeof (dw));
00384 CHECK_BOUNDS (int (dw));
00385 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00386 CopyMemory (szStr, pB, dw);
00387 szStr [dw] = 0; dld->strComment = szStr; delete [] szStr;
00388 pB += dw;
00389
00390 if (wVer < 9)
00391 {
00392 CHECK_BOUNDS (sizeof (dw));
00393
00394 CopyMemory (&dw, pB, sizeof (dw));
00395 CHECK_BOUNDS (int (dw));
00396 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00397 CopyMemory (szStr, pB, dw);
00398 szStr [dw] = 0;
00399 dld->pGroup = _DldsGrps.FindGroupByName (szStr);
00400 delete [] szStr;
00401 pB += dw;
00402 }
00403 else
00404 {
00405 UINT nGrpId;
00406 CHECK_BOUNDS (sizeof (UINT));
00407 CopyMemory (&nGrpId, pB, sizeof (UINT));
00408 pB += sizeof (UINT);
00409 dld->pGroup = _DldsGrps.FindGroup (nGrpId);
00410 }
00411
00412 if (dld->pGroup == NULL)
00413 dld->pGroup = _DldsGrps.FindGroup (GRP_OTHER_ID);
00414
00415 CHECK_BOUNDS (sizeof (dld->dwFlags));
00416 CopyMemory (&dld->dwFlags, pB, sizeof (dld->dwFlags));
00417 pB += sizeof (dld->dwFlags);
00418
00419 CHECK_BOUNDS (sizeof (dld->dwReserved));
00420 CopyMemory (&dld->dwReserved, pB, sizeof (dld->dwReserved));
00421 pB += sizeof (dld->dwReserved);
00422
00423 CHECK_BOUNDS (sizeof (dld->dateAdded));
00424 CopyMemory (&dld->dateAdded, pB, sizeof (dld->dateAdded));
00425 pB += sizeof (dld->dateAdded);
00426
00427 DWORD cEvents;
00428 CHECK_BOUNDS (sizeof (cEvents));
00429 CopyMemory (&cEvents, pB, sizeof (cEvents));
00430 pB += sizeof (cEvents);
00431
00432 dld->vEvents.clear ();
00433
00434 while (cEvents--)
00435 {
00436 fsDownloadEvents ev;
00437
00438 CHECK_BOUNDS (sizeof (ev.clrBg));
00439
00440 CopyMemory (&ev.clrBg, pB, sizeof (ev.clrBg));
00441 pB += sizeof (ev.clrBg);
00442
00443 CHECK_BOUNDS (sizeof (ev.clrText));
00444
00445 CopyMemory (&ev.clrText, pB, sizeof (ev.clrText));
00446 pB += sizeof (ev.clrText);
00447
00448 CHECK_BOUNDS (sizeof (ev.timeEvent));
00449
00450 CopyMemory (&ev.timeEvent, pB, sizeof (ev.timeEvent));
00451 pB += sizeof (ev.timeEvent);
00452
00453 CHECK_BOUNDS (sizeof (ev.iImage));
00454
00455 CopyMemory (&ev.iImage, pB, sizeof (ev.iImage));
00456 pB += sizeof (ev.iImage);
00457
00458 CHECK_BOUNDS (sizeof (dw));
00459
00460 CopyMemory (&dw, pB, sizeof (dw));
00461 CHECK_BOUNDS (int (dw));
00462 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00463 CopyMemory (szStr, pB, dw);
00464 szStr [dw] = 0; ev.strEvent = szStr; delete [] szStr;
00465 pB += dw;
00466
00467 dld->vEvents.add (ev);
00468 }
00469
00470 *lpdwSize = pB - LPBYTE (lpBuffer);
00471
00472 return TRUE;
00473 }
00474
00475 BOOL fsDownloadRegSaver::OLD_LoadDownload(vmsDownloadSmartPtr dld, LPVOID lpBuffer, LPDWORD lpdwSize)
00476 {
00477 #define CHECK_BOUNDS(need) if (need < 0 || need > int(*lpdwSize) - (pB - LPBYTE (lpBuffer))) return FALSE;
00478
00479 LPBYTE pB = LPBYTE (lpBuffer);
00480 DWORD dw = *lpdwSize;
00481 LPSTR szStr;
00482 int iReserved = 0;
00483
00484 if (FALSE == dld->pMgr->LoadState (pB, &dw, 0))
00485 return FALSE;
00486 pB += dw;
00487
00488 CHECK_BOUNDS (sizeof (dld->bAutoStart));
00489
00490 CopyMemory (&dld->bAutoStart, pB, sizeof (dld->bAutoStart));
00491 pB += sizeof (dld->bAutoStart);
00492
00493 CHECK_BOUNDS (sizeof (iReserved));
00494
00495 CopyMemory (&iReserved, pB, sizeof (iReserved));
00496 pB += sizeof (iReserved);
00497
00498 CHECK_BOUNDS (sizeof (dld->nID));
00499
00500 CopyMemory (&dld->nID, pB, sizeof (dld->nID));
00501 pB += sizeof (dld->nID);
00502
00503 CHECK_BOUNDS (sizeof (dw));
00504
00505 CopyMemory (&dw, pB, sizeof (dw));
00506 CHECK_BOUNDS (int (dw));
00507 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00508 CopyMemory (szStr, pB, dw);
00509 szStr [dw] = 0; dld->strComment = szStr; delete [] szStr;
00510 pB += dw;
00511
00512 CHECK_BOUNDS (sizeof (dw));
00513
00514 CopyMemory (&dw, pB, sizeof (dw));
00515 CHECK_BOUNDS (int (dw));
00516 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00517 CopyMemory (szStr, pB, dw);
00518 szStr [dw] = 0;
00519 dld->pGroup = _DldsGrps.FindGroupByName (szStr);
00520 if (dld->pGroup == NULL)
00521 dld->pGroup = _DldsGrps.FindGroup (GRP_OTHER_ID);
00522 delete [] szStr;
00523 pB += dw;
00524
00525 dld->dwFlags = dld->dwReserved = 0;
00526
00527 DWORD cEvents;
00528 CHECK_BOUNDS (sizeof (cEvents));
00529 CopyMemory (&cEvents, pB, sizeof (cEvents));
00530 pB += sizeof (cEvents);
00531
00532 dld->vEvents.clear ();
00533
00534 while (cEvents--)
00535 {
00536 fsDownloadEvents ev;
00537
00538 CHECK_BOUNDS (sizeof (ev.clrBg));
00539
00540 CopyMemory (&ev.clrBg, pB, sizeof (ev.clrBg));
00541 pB += sizeof (ev.clrBg);
00542
00543 CHECK_BOUNDS (sizeof (ev.clrText));
00544
00545 CopyMemory (&ev.clrText, pB, sizeof (ev.clrText));
00546 pB += sizeof (ev.clrText);
00547
00548 CHECK_BOUNDS (sizeof (ev.timeEvent));
00549
00550 CopyMemory (&ev.timeEvent, pB, sizeof (ev.timeEvent));
00551 pB += sizeof (ev.timeEvent);
00552
00553 CHECK_BOUNDS (sizeof (ev.iImage));
00554
00555 CopyMemory (&ev.iImage, pB, sizeof (ev.iImage));
00556 pB += sizeof (ev.iImage);
00557
00558 CHECK_BOUNDS (sizeof (dw));
00559
00560 CopyMemory (&dw, pB, sizeof (dw));
00561 CHECK_BOUNDS (int (dw));
00562 pB += sizeof (dw); fsnew (szStr, CHAR, dw+1);
00563 CopyMemory (szStr, pB, dw);
00564 szStr [dw] = 0; ev.strEvent = szStr; delete [] szStr;
00565 pB += dw;
00566
00567 dld->vEvents.add (ev);
00568 }
00569
00570 *lpdwSize = pB - LPBYTE (lpBuffer);
00571
00572 return TRUE;
00573 }