00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsDownloads_GroupsMgr.h"
00009 #include "DownloadsWnd.h"
00010 #include "system.h"
00011
00012 #ifdef _DEBUG
00013 #undef THIS_FILE
00014 static char THIS_FILE[]=__FILE__;
00015 #define new DEBUG_NEW
00016 #endif
00017
00018 #define GRPREG_OUTFOLDER "OutFolder"
00019 #define GRPREG_EXTENSIONS "Extensions"
00020 #define GRPREG_OTHER "Other"
00021
00022 fsDownloads_GroupsMgr::fsDownloads_GroupsMgr()
00023 {
00024 m_hGroups = NULL;
00025 }
00026
00027 fsDownloads_GroupsMgr::~fsDownloads_GroupsMgr()
00028 {
00029 if (m_hGroups)
00030 RegCloseKey (m_hGroups);
00031 }
00032
00033 BOOL fsDownloads_GroupsMgr::LoadGroups()
00034 {
00035 CString strKey = _T ("Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Groups");
00036
00037 if (m_hGroups == NULL)
00038 {
00039 LONG lResult;
00040 lResult = RegOpenKeyEx (HKEY_CURRENT_USER, strKey, 0, KEY_READ, &m_hGroups);
00041
00042 if (lResult != ERROR_SUCCESS)
00043 return FALSE;
00044 }
00045
00046 return LoadGroupsFromReg () && m_vGroups.size () != 0;
00047 }
00048
00049 BOOL fsDownloads_GroupsMgr::LoadGroupsFromReg()
00050 {
00051 LONG lResult;
00052 DWORD dwIndex = 0;
00053 CHAR szGroup [MAX_GROUP_LEN];
00054 DWORD dwSize;
00055 FILETIME lastTime;
00056 HKEY hGroup;
00057 fsDownloadGroup grp;
00058 BOOL bHaveOther = FALSE;
00059 LONG lRes = ERROR_SUCCESS;
00060
00061 m_vGroups.clear ();
00062
00063 do
00064 {
00065 dwSize = MAX_GROUP_LEN;
00066 lResult = RegEnumKeyEx (m_hGroups, dwIndex++, szGroup, &dwSize, NULL, NULL, NULL, &lastTime);
00067
00068 if (lResult != ERROR_SUCCESS)
00069 {
00070 if (lResult == ERROR_NO_MORE_ITEMS)
00071 break;
00072
00073 return LastError (lResult);
00074 }
00075
00076 lResult = RegOpenKeyEx (m_hGroups, szGroup, 0, KEY_READ, &hGroup);
00077 if (lResult != ERROR_SUCCESS)
00078 {
00079 lRes = lResult;
00080 RegDeleteKey (m_hGroups, szGroup);
00081 continue;
00082 }
00083
00084 strcpy (grp.szName, szGroup);
00085
00086 dwSize = MY_MAX_PATH;
00087 lResult = RegQueryValueEx (hGroup, GRPREG_OUTFOLDER, NULL, NULL, (LPBYTE) grp.szOutFolder, &dwSize);
00088 if (lResult != ERROR_SUCCESS)
00089 {
00090 lRes = lResult;
00091 strcpy (grp.szOutFolder, "C:\\Downloads\\");
00092 }
00093
00094 dwSize = MAX_EXTS_LEN;
00095 lResult = RegQueryValueEx (hGroup, GRPREG_EXTENSIONS, NULL, NULL, (LPBYTE) grp.szExts, &dwSize);
00096 if (lResult != ERROR_SUCCESS)
00097 {
00098 lRes = lResult;
00099 *grp.szExts = 0;
00100 }
00101 else if (dwSize == 0)
00102 {
00103 *grp.szExts = 0;
00104 }
00105
00106 dwSize = sizeof (BOOL);
00107 lResult = RegQueryValueEx (hGroup, GRPREG_OTHER, NULL, NULL, (LPBYTE) &grp.bOther, &dwSize);
00108 if (lResult != ERROR_SUCCESS)
00109 {
00110 lRes = lResult;
00111 grp.bOther = FALSE;
00112 }
00113
00114 RegCloseKey (hGroup);
00115
00116 bHaveOther = bHaveOther || grp.bOther;
00117
00118 m_vGroups.add (grp);
00119
00120 } while (TRUE);
00121
00122 if (bHaveOther == FALSE)
00123 {
00124 for (int i = 0; i < m_vGroups.size (); i++)
00125 {
00126 if (lstrcmpi (m_vGroups [i].szName, GRP_OTHER_NAME) == 0) {
00127 m_vGroups [i].bOther = TRUE;
00128 bHaveOther = TRUE;
00129 lRes = 0;
00130 break;
00131 }
00132 }
00133 }
00134
00135 if (dwIndex == 1 || bHaveOther == FALSE)
00136 {
00137 m_vGroups.clear ();
00138 SetLastError (ERROR_BAD_ENVIRONMENT);
00139 return FALSE;
00140 }
00141
00142 return LastError (lRes);
00143 }
00144
00145 BOOL fsDownloads_GroupsMgr::LastError(LONG lResult)
00146 {
00147 SetLastError (lResult);
00148 return lResult == ERROR_SUCCESS;
00149 }
00150
00151 BOOL fsDownloads_GroupsMgr::SaveGroups()
00152 {
00153 LONG lResult = ERROR_SUCCESS;
00154 LONG lRes = ERROR_SUCCESS;
00155
00156 for (int i = 0; i < m_vGroups.size (); i++)
00157 {
00158 fsDownloadGroup grp = m_vGroups [i];
00159 HKEY hGroup;
00160
00161 lResult = RegCreateKeyEx (m_hGroups, grp.szName, 0, NULL, REG_OPTION_NON_VOLATILE,
00162 KEY_WRITE, NULL, &hGroup, NULL);
00163
00164 if (lResult != ERROR_SUCCESS)
00165 {
00166 lRes = lResult;
00167 continue;
00168 }
00169
00170 lResult = RegSetValueEx (hGroup, GRPREG_OUTFOLDER, 0, REG_SZ, (LPBYTE) grp.szOutFolder, strlen (grp.szOutFolder));
00171 if (lResult != ERROR_SUCCESS)
00172 lRes = lResult;
00173
00174 lResult = RegSetValueEx (hGroup, GRPREG_EXTENSIONS, 0, REG_SZ, (LPBYTE) grp.szExts, strlen (grp.szExts));
00175 if (lResult != ERROR_SUCCESS)
00176 lRes = lResult;
00177
00178 lResult = RegSetValueEx (hGroup, GRPREG_OTHER, 0, REG_DWORD, (LPBYTE) &grp.bOther, sizeof (grp.bOther));
00179 if (lResult != ERROR_SUCCESS)
00180 lRes = lResult;
00181
00182 RegCloseKey (hGroup);
00183 }
00184
00185 if (lRes != ERROR_SUCCESS)
00186 return LastError (lRes);
00187
00188 return TRUE;
00189 }
00190
00191 int fsDownloads_GroupsMgr::GetCount()
00192 {
00193 return m_vGroups.size ();
00194 }
00195
00196 BOOL fsDownloads_GroupsMgr::GetGroup(fsDownloadGroup *pGroup, int iGroup)
00197 {
00198 if (iGroup >= GetCount () || iGroup < 0)
00199 iGroup = FindGroupByName (GRP_OTHER_NAME);
00200 *pGroup = m_vGroups [iGroup];
00201 return TRUE;
00202 }
00203
00204 int fsDownloads_GroupsMgr::FindGroupByExt(LPCSTR pszExt)
00205 {
00206 for (int grp = 0; grp < m_vGroups.size (); grp++)
00207 {
00208 fsDownloadGroup *pgrp = &m_vGroups [grp];
00209 if (IsExtInExtsStr (pgrp->szExts, pszExt))
00210 return grp;
00211 }
00212
00213 return -1;
00214 }
00215
00216 int fsDownloads_GroupsMgr::FindGroupByName(LPCSTR pszName)
00217 {
00218 for (int i = 0; i < m_vGroups.size (); i++)
00219 if (!fsStrCmpNC (m_vGroups [i].szName, pszName))
00220 return i;
00221
00222 return -1;
00223 }
00224
00225 void fsDownloads_GroupsMgr::DeleteGroup(LPCSTR pszGroup)
00226 {
00227 int grp = FindGroupByName (pszGroup);
00228 if (grp == -1)
00229 return;
00230
00231 m_vGroups.del (grp);
00232
00233 CRegKey key;
00234 key.Attach (m_hGroups);
00235 key.RecurseDeleteKey (pszGroup);
00236 key.Detach ();
00237 }
00238
00239 void fsDownloads_GroupsMgr::CreateGroup(fsDownloadGroup *grp)
00240 {
00241 m_vGroups.add (*grp);
00242 }
00243
00244 void fsDownloads_GroupsMgr::UpdateGroup(int iGrp, fsDownloadGroup *grp)
00245 {
00246 if (strcmp (m_vGroups [iGrp].szName, grp->szName))
00247 RegDeleteKey (m_hGroups, m_vGroups [iGrp].szName);
00248
00249 m_vGroups [iGrp] = *grp;
00250 }
00251
00252 LPCSTR fsDownloads_GroupsMgr::GetGroupName(int iGrp)
00253 {
00254 return m_vGroups [iGrp].szName;
00255 }
00256
00257 LPCSTR fsDownloads_GroupsMgr::GetGroupFolder(int iGrp)
00258 {
00259 return m_vGroups [iGrp].szOutFolder;
00260 }
00261
00262 void fsDownloads_GroupsMgr::SetGroupFolder(int iGrp, LPCSTR pszFldr)
00263 {
00264 lstrcpy (m_vGroups [iGrp].szOutFolder, pszFldr);
00265 }