00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsSitesMgr.h"
00009 #include "inetutil.h"
00010 #include "misc.h"
00011
00012 #ifdef _DEBUG
00013 #undef THIS_FILE
00014 static char THIS_FILE[]=__FILE__;
00015 #define new DEBUG_NEW
00016 #endif
00017
00018 fsSitesMgr::fsSitesMgr()
00019 {
00020 m_pfnEvents = NULL;
00021 }
00022
00023 fsSitesMgr::~fsSitesMgr()
00024 {
00025
00026 }
00027
00028 int fsSitesMgr::AddSite(fsSiteInfo &site)
00029 {
00030 m_vSites.add (site);
00031 Event (SM_SITEADDED, &m_vSites [m_vSites.size () - 1]);
00032 return m_vSites.size () - 1;
00033 }
00034
00035 fsSiteInfo* fsSitesMgr::GetSite(int iIndex)
00036 {
00037 return &m_vSites [iIndex];
00038 }
00039
00040 int fsSitesMgr::FindSite(LPCSTR pszName, DWORD dwValidFor, BOOL bAllReq)
00041 {
00042 for (int i = 0; i < m_vSites.size (); i++)
00043 {
00044 fsSiteInfo &site = m_vSites [i];
00045 if (fsIsServersEqual (site.strName, pszName, site.dwValidFor & SITE_VALIDFOR_SUBDOMAINS))
00046 {
00047 if (bAllReq)
00048 {
00049 if ((site.dwValidFor & dwValidFor) == dwValidFor)
00050 return i;
00051 }
00052 else
00053 {
00054 if (site.dwValidFor & dwValidFor)
00055 return i;
00056 }
00057 }
00058 }
00059
00060 return -1;
00061 }
00062
00063 fsSiteInfo* fsSitesMgr::FindSite2(LPCSTR pszSite, DWORD dwValidFor, BOOL bAllReq)
00064 {
00065 int iIndex = FindSite (pszSite, dwValidFor, bAllReq);
00066
00067 if (iIndex == -1)
00068 return NULL;
00069
00070 return &m_vSites [iIndex];
00071 }
00072
00073 void fsSitesMgr::DeleteSite(fsSiteInfo *pSite)
00074 {
00075 int iIndex = FindSite (pSite->strName, pSite->dwValidFor);
00076 if (iIndex == -1)
00077 return;
00078 Event (SM_SITEDELETED, &m_vSites [iIndex]);
00079 m_vSites.del (iIndex);
00080 }
00081
00082 void fsSitesMgr::DeleteAllTempSites()
00083 {
00084 m_vSites.lock ();
00085
00086 for (int i = m_vSites.size () - 1; i >= 0; i--)
00087 {
00088 if (m_vSites [i].bTemp)
00089 {
00090 Event (SM_SITEDELETED, &m_vSites [i]);
00091 m_vSites.del (i);
00092 }
00093 }
00094
00095 m_vSites.unlock ();
00096 }
00097
00098 int fsSitesMgr::GetSiteCount()
00099 {
00100 return m_vSites.size ();
00101 }
00102
00103 void fsSitesMgr::SetEventsFunc(fntSitesMgrEvents pfn, LPVOID lpParam)
00104 {
00105 m_pfnEvents = pfn;
00106 m_lpEventsParam = lpParam;
00107 }
00108
00109 void fsSitesMgr::Event(fsSitesMgrEvent ev, fsSiteInfo* site)
00110 {
00111 if (m_pfnEvents)
00112 m_pfnEvents (ev, site, m_lpEventsParam);
00113 }
00114
00115 BOOL fsSitesMgr::SaveToFile(HANDLE hFile)
00116 {
00117 m_vSites.lock ();
00118
00119 int cPermSites = GetSiteCount () - GetTempSiteCount ();
00120
00121 DWORD dw;
00122
00123 fsSitesFileHdr hdr;
00124
00125 if (!WriteFile (hFile, &hdr, sizeof (hdr), &dw, NULL))
00126 {
00127 m_vSites.unlock ();
00128 return FALSE;
00129 }
00130
00131 if (!WriteFile (hFile, &cPermSites, sizeof (cPermSites), &dw, NULL))
00132 {
00133 m_vSites.unlock ();
00134 return FALSE;
00135 }
00136
00137 BOOL bMaySavePwds = _App.SM_KeepPasswords () &&
00138 _App.SM_DontSavePwdsToDisk () == FALSE;
00139
00140 for (int i = 0; i < GetSiteCount (); i++)
00141 {
00142 fsSiteInfo *site = GetSite (i);
00143
00144 if (site->bTemp)
00145 continue;
00146
00147 if (!fsSaveStrToFile (site->strName, hFile))
00148 {
00149 m_vSites.unlock ();
00150 return FALSE;
00151 }
00152
00153 if (!fsSaveStrToFile (bMaySavePwds ? site->strPassword : NULL, hFile))
00154 {
00155 m_vSites.unlock ();
00156 return FALSE;
00157 }
00158
00159 if (!fsSaveStrToFile (bMaySavePwds ? site->strUser : NULL, hFile))
00160 {
00161 m_vSites.unlock ();
00162 return FALSE;
00163 }
00164
00165 UINT nGrpId = site->pGroup ? site->pGroup->nId : (UINT)-1;
00166 if (!WriteFile (hFile, &nGrpId, sizeof (UINT), &dw, NULL))
00167 {
00168 m_vSites.unlock ();
00169 return FALSE;
00170 }
00171
00172 if (!WriteFile (hFile, &site->dwFtpFlags, sizeof (site->dwFtpFlags), &dw, NULL))
00173 {
00174 m_vSites.unlock ();
00175 return FALSE;
00176 }
00177
00178 if (!WriteFile (hFile, &site->cConnsNow, sizeof (site->cConnsNow), &dw, NULL))
00179 {
00180 m_vSites.unlock ();
00181 return FALSE;
00182 }
00183
00184 if (!WriteFile (hFile, &site->cMaxConns, sizeof (site->cMaxConns), &dw, NULL))
00185 {
00186 m_vSites.unlock ();
00187 return FALSE;
00188 }
00189
00190 if (!WriteFile (hFile, &site->dwValidFor, sizeof (site->dwValidFor), &dw, NULL))
00191 {
00192 m_vSites.unlock ();
00193 return FALSE;
00194 }
00195 }
00196
00197 m_vSites.unlock ();
00198 return TRUE;
00199 }
00200
00201 int fsSitesMgr::GetTempSiteCount()
00202 {
00203 int c = 0;
00204
00205 for (int i = m_vSites.size () - 1; i >= 0; i--)
00206 if (m_vSites [i].bTemp)
00207 c++;
00208
00209 return c;
00210 }
00211
00212 BOOL fsSitesMgr::LoadFromFile(HANDLE hFile)
00213 {
00214 int cSites;
00215
00216 DWORD dw;
00217 BOOL bOldVer = FALSE;
00218
00219 m_vSites.clear ();
00220
00221 fsSitesFileHdr hdr;
00222 if (!ReadFile (hFile, &hdr, sizeof (hdr), &dw, NULL))
00223 bOldVer = TRUE;
00224 else
00225 {
00226 if (strcmp (hdr.szSig, SITESFILE_SIG))
00227 {
00228 bOldVer = TRUE;
00229 SetFilePointer (hFile, 0, NULL, FILE_BEGIN);
00230 }
00231 else if (hdr.wVer > SITESFILE_CURRENT_VERSION)
00232 return FALSE;
00233 }
00234
00235 if (!ReadFile (hFile, &cSites, sizeof (cSites), &dw, NULL) || dw != sizeof (cSites))
00236 return FALSE;
00237
00238 for (int i = 0; i < cSites; i++)
00239 {
00240 fsSiteInfo site;
00241
00242 if (bOldVer)
00243 {
00244 fsSiteInfo_v1 sitev1;
00245 if (!ReadFile (hFile, &sitev1, sizeof (fsSiteInfo_v1), &dw, NULL) || dw != sizeof (fsSiteInfo_v1))
00246 return FALSE;
00247
00248 site.dwFtpFlags = sitev1.bFtpPassive;
00249 site.bTemp = sitev1.bTemp;
00250 site.cConnsNow = sitev1.cConnsNow;
00251 site.cMaxConns = sitev1.cMaxConns;
00252 site.dwValidFor = SITE_VALIDFOR_HTTP|SITE_VALIDFOR_HTTPS|SITE_VALIDFOR_FTP|SITE_VALIDFOR_SUBDOMAINS;
00253 }
00254 else
00255 {
00256 if (hdr.wVer < 3)
00257 {
00258 fsSiteInfo_v2 sitev2;
00259
00260 if (!ReadFile (hFile, &sitev2, sizeof (sitev2), &dw, NULL) || dw != sizeof (sitev2))
00261 return FALSE;
00262
00263 if (!fsReadStrFromFile (&sitev2.strGroup.pszString, hFile))
00264 return FALSE;
00265
00266 site.dwFtpFlags = sitev2.dwFtpFlags;
00267 site.bTemp = sitev2.bTemp;
00268 site.cConnsNow = sitev2.cConnsNow;
00269 site.cMaxConns = sitev2.cMaxConns;
00270 site.dwValidFor = sitev2.dwValidFor;
00271 }
00272 }
00273
00274 if (!fsReadStrFromFile (&site.strName.pszString, hFile))
00275 return FALSE;
00276
00277 if (!fsReadStrFromFile (&site.strPassword.pszString, hFile))
00278 return FALSE;
00279
00280 if (!fsReadStrFromFile (&site.strUser.pszString, hFile))
00281 return FALSE;
00282
00283 if (hdr.wVer >= 3)
00284 {
00285 UINT nId;
00286 if (!ReadFile (hFile, &nId, sizeof (nId), &dw, NULL))
00287 return FALSE;
00288 site.pGroup = nId != (UINT)-1 ? _DldsGrps.FindGroup (nId) : NULL;
00289
00290 if (!ReadFile (hFile, &site.dwFtpFlags, sizeof (site.dwFtpFlags), &dw, NULL))
00291 return FALSE;
00292
00293 if (!ReadFile (hFile, &site.cConnsNow, sizeof (site.cConnsNow), &dw, NULL))
00294 return FALSE;
00295
00296 if (!ReadFile (hFile, &site.cMaxConns, sizeof (site.cMaxConns), &dw, NULL))
00297 return FALSE;
00298
00299 if (!ReadFile (hFile, &site.dwValidFor, sizeof (site.dwValidFor), &dw, NULL))
00300 return FALSE;
00301 }
00302
00303 site.cConnsNow = 0;
00304 site.bTemp = FALSE;
00305
00306 AddSite (site);
00307 }
00308
00309 return TRUE;
00310 }
00311
00312 void fsSitesMgr::SiteUpdated(fsSiteInfo *pSite)
00313 {
00314 Event (SM_SITEUPDATED, pSite);
00315 }
00316
00317 void fsSitesMgr::DeleteAllPasswords()
00318 {
00319 for (int i = m_vSites.size () - 1; i >= 0; i--)
00320 {
00321 fsSiteInfo* site = &m_vSites [i];
00322 site->strUser = NULL;
00323 site->strPassword = NULL;
00324 SiteUpdated (site);
00325 }
00326 }
00327
00328 void fsSitesMgr::CheckGroups()
00329 {
00330 std::vector <fsSiteInfo*> v;
00331
00332 m_vSites.lock ();
00333
00334 for (int i = m_vSites.size () - 1; i >= 0; i--)
00335 {
00336 fsSiteInfo *site = &m_vSites [i];
00337 if (site->pGroup != NULL && site->pGroup->bAboutToBeDeleted)
00338 {
00339 site->pGroup = NULL;
00340 v.push_back (site);
00341 }
00342 }
00343
00344 m_vSites.unlock ();
00345
00346 for (size_t j = 0; j < v.size (); j++)
00347 SiteUpdated (v [j]);
00348 }