00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007
00008 #include "..\FDM.h"
00009 #include <comdef.h>
00010 #include <inetfile/inetfile.h>
00011
00012 BOOL fsOnNavigateUrl (LPCSTR pszUrl)
00013 {
00014 BOOL bALT = GetKeyState (VK_MENU) & 0x8000;
00015 BOOL bCTRL = GetKeyState (VK_CONTROL) & 0x8000;
00016
00017 if (bCTRL && bALT)
00018 return TRUE;
00019
00020 CRegKey wgKey;
00021
00022 DWORD bALTShouldPressed = FALSE;
00023
00024 if (ERROR_SUCCESS == wgKey.Open (HKEY_CURRENT_USER, "Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Monitor",
00025 KEY_READ))
00026 wgKey.QueryValue (bALTShouldPressed, "ALTShouldPressed");
00027
00028
00029 if (bALT == FALSE && bALTShouldPressed)
00030 return FALSE;
00031
00032 return TRUE;
00033 }
00034
00035 LPCSTR strcmp_m (LPCSTR pszWhere, LPCSTR pszWhat)
00036 {
00037 if (*pszWhere == 0)
00038 return *pszWhat == 0 ? pszWhere : NULL;
00039
00040 if (*pszWhat == 0)
00041 return NULL;
00042
00043 if (*pszWhat == '*')
00044 {
00045 if (pszWhat [1] == 0)
00046 return pszWhere;
00047
00048 LPCSTR psz = strcmp_m (pszWhere, pszWhat+1);
00049 if (psz)
00050 return psz;
00051
00052 return strcmp_m (pszWhere+1, pszWhat);
00053 }
00054
00055 if (*pszWhat != '?')
00056 {
00057 if (*pszWhere != *pszWhat)
00058 return NULL;
00059 }
00060
00061 return strcmp_m (pszWhere+1, pszWhat+1) ? pszWhere : NULL;
00062 }
00063
00064 LPCSTR strcmpi_m (LPCSTR pszWhere, LPCSTR pszWhat)
00065 {
00066 char *psz1 = new char [lstrlen (pszWhere) + 1];
00067 char *psz2 = new char [lstrlen (pszWhat) + 1];
00068
00069 lstrcpy (psz1, pszWhere);
00070 lstrcpy (psz2, pszWhat);
00071
00072 CharLower (psz1);
00073 CharLower (psz2);
00074
00075 LPCSTR psz = strcmp_m (psz1, psz2);
00076 LPCSTR pszRet = NULL;
00077 if (psz)
00078 pszRet = pszWhere + (psz - psz1);
00079
00080 delete [] psz1;
00081 delete [] psz2;
00082
00083 return pszRet;
00084 }
00085
00086 BOOL IsExtStrEq (LPCSTR pszMasked, LPCSTR psz2)
00087 {
00088 return strcmpi_m (psz2, pszMasked) != NULL;
00089 }
00090
00091 BOOL IsExtInExtsStr (LPCSTR pszExts, LPCSTR pszExt)
00092 {
00093 if (pszExt == NULL)
00094 return FALSE;
00095
00096 int len = lstrlen (pszExts);
00097 int i = 0;
00098 CHAR szExt [10000];
00099
00100 do
00101 {
00102 int j = 0;
00103
00104 while (i < len && pszExts [i] != ' ')
00105 szExt [j++] = pszExts [i++];
00106
00107 szExt [j] = 0;
00108 i++;
00109
00110 if (IsExtStrEq (szExt, pszExt))
00111 return TRUE;
00112
00113 } while (i < len);
00114
00115 return FALSE;
00116 }
00117
00118 BOOL IsServerInServersStr (LPCSTR pszServers, LPCSTR pszServer)
00119 {
00120 if (pszServer == NULL)
00121 return FALSE;
00122
00123 int len = lstrlen (pszServers);
00124 int i = 0;
00125 CHAR szServer [10000];
00126
00127 do
00128 {
00129 int j = 0;
00130
00131 while (i < len && pszServers [i] != ' ')
00132 szServer [j++] = pszServers [i++];
00133
00134 szServer [j] = 0;
00135 i++;
00136
00137 if (IsExtStrEq (szServer, pszServer))
00138 return TRUE;
00139
00140 fsString str;
00141 str = "*."; str += szServer;
00142 if (IsExtStrEq (str, pszServer))
00143 return TRUE;
00144
00145 } while (i < len);
00146
00147 return FALSE;
00148 }
00149
00150 BOOL fsFileNameFromUrlPath (LPCSTR pszUrl, BOOL bUsingFTP, BOOL bDecode, LPSTR pszBuf, UINT uSize)
00151 {
00152 *pszBuf = 0;
00153
00154 int len = strlen (pszUrl);
00155 int pos;
00156
00157 if (len == 0)
00158 return TRUE;
00159
00160 int end = bUsingFTP ? strlen (pszUrl)-1 : strcspn (pszUrl, "?=#") - 1;
00161
00162 if (end < 0)
00163 return FALSE;
00164
00165 if (end >= len)
00166 end = len - 1;
00167
00168 pos = end;
00169
00170 while (pos && pszUrl [pos] != '/' && pszUrl [pos] != '\\')
00171 pos--;
00172
00173 if (pszUrl [pos] != '/' && pszUrl [pos] != '\\')
00174 return FALSE;
00175
00176 if (UINT(len - pos) > uSize)
00177 return FALSE;
00178
00179 strcpy (pszBuf, pszUrl + pos + 1);
00180
00181 pszBuf [end - pos] = 0;
00182
00183 return TRUE;
00184 }
00185
00186 LPCSTR Monitor_OnlyExts ()
00187 {
00188 static char* pszExts = "\
00189 EXE ZIP ARJ RAR LZH Z GZ TGZ GZIP TAR BIN MP3 M4A WAV RA RAM AAC AIF AVI MPG\
00190 MPEG QT PLJ ASF MOV RM MP4 WMA WMV MPE MPA R0* R1* A0* A1* TIF TIFF PDF MSI\
00191 ACE ISO OGG 7Z SEA SIT SITX PPT PPS";
00192
00193 return pszExts;
00194 }
00195
00196 LPCSTR Monitor_SkipExts ()
00197 {
00198 static char szExts [10000];
00199 lstrcpy (szExts, "pls m3u");
00200 CRegKey wgKey;
00201 if (ERROR_SUCCESS == wgKey.Open (HKEY_CURRENT_USER, "Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Monitor",
00202 KEY_READ))
00203 {
00204 DWORD dw = sizeof (szExts);
00205 wgKey.QueryValue (szExts, "SkipExtensions", &dw);
00206 }
00207 return szExts;
00208 }
00209
00210 LPCSTR Monitor_SkipServers ()
00211 {
00212 static char szServers [10000];
00213 CRegKey wgKey;
00214 if (ERROR_SUCCESS == wgKey.Open (HKEY_CURRENT_USER, "Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Monitor",
00215 KEY_READ))
00216 {
00217 DWORD dw = sizeof (szServers);
00218 wgKey.QueryValue (szServers, "SkipServers", &dw);
00219 }
00220 return szServers;
00221 }
00222
00223 BOOL is_ExtToSkip (LPCSTR pszURL, BOOL bUseSkipExtsList)
00224 {
00225 fsURL url;
00226
00227 if (url.Crack (pszURL) != IR_SUCCESS)
00228 return bUseSkipExtsList == FALSE;
00229
00230 char szFile [10000];
00231 fsFileNameFromUrlPath (url.GetPath (), url.GetInternetScheme () == INTERNET_SCHEME_FTP,
00232 TRUE, szFile, sizeof (szFile));
00233
00234 if (*szFile == 0)
00235 return bUseSkipExtsList == FALSE;
00236
00237 LPCSTR pszExt = strrchr (szFile, '.');
00238 if (pszExt++ == NULL)
00239 return bUseSkipExtsList == FALSE;
00240
00241 if (bUseSkipExtsList == FALSE && IsExtInExtsStr (Monitor_OnlyExts (), pszExt) == FALSE)
00242 return TRUE;
00243
00244 return IsExtInExtsStr (Monitor_SkipExts (), pszExt);
00245 }
00246
00247 BOOL is_ServerToSkip (LPCSTR psz)
00248 {
00249 fsURL url;
00250 if (IR_SUCCESS != url.Crack (psz))
00251 return TRUE;
00252
00253 return IsServerInServersStr (Monitor_SkipServers (), url.GetHostName ());
00254 }
00255
00256 BOOL fsUrlToFdm (LPCSTR pszUrl, LPCSTR pszReferer, LPCSTR pszCookies, LPCSTR pszPostData, BOOL bUseSkipExtsList)
00257 {
00258 if (is_ServerToSkip (pszUrl))
00259 return FALSE;
00260
00261 if (pszReferer && is_ServerToSkip (pszReferer))
00262 return FALSE;
00263
00264 if (is_ExtToSkip (pszUrl, bUseSkipExtsList))
00265 return FALSE;
00266
00267 IWGUrlReceiver* wg;
00268 HRESULT hr;
00269 if (FAILED (hr=CoCreateInstance (CLSID_WGUrlReceiver, NULL, CLSCTX_ALL, IID_IWGUrlReceiver, (void**) &wg)))
00270 {
00271 char szMsg [1000];
00272 lstrcpy (szMsg, "Free Download Manager is not properly installed! Please reinstall Free Download Manager or try to reboot your PC.\n\nError code: 0x");
00273 char sz [100];
00274 itoa ((UINT)hr, sz, 16);
00275 lstrcat (szMsg, sz);
00276 MessageBox (NULL, szMsg, "Error", MB_ICONERROR);
00277 return FALSE;
00278 }
00279
00280 wg->put_IgnoreSize (FALSE);
00281
00282 _bstr_t url = pszUrl;
00283 wg->put_Url (url);
00284 if (pszCookies)
00285 {
00286 _bstr_t cookies = pszCookies;
00287 wg->put_Cookies (cookies);
00288 }
00289 if (pszReferer)
00290 {
00291 _bstr_t referer = pszReferer;
00292 wg->put_Referer (referer);
00293 }
00294 if (pszPostData)
00295 {
00296 _bstr_t ah = pszPostData;
00297 wg->put_PostData (ah);
00298 }
00299 wg->put_CheckExtension (FALSE);
00300 hr = wg->AddDownload ();
00301
00302 if (FAILED (hr))
00303 return FALSE;
00304
00305 CRegKey wgKey;
00306 if (ERROR_SUCCESS == wgKey.Open (HKEY_CURRENT_USER, "Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Monitor", KEY_READ))
00307 {
00308 DWORD b = FALSE;
00309 if (ERROR_SUCCESS != wgKey.QueryValue (b, "AllowDownload"))
00310 b = TRUE;
00311 if (b == FALSE)
00312 {
00313 wg->Release ();
00314 return TRUE;
00315 }
00316 }
00317
00318 CComBSTR bstrState;
00319 do {
00320 Sleep (10);
00321 wg->get_UIState (&bstrState);
00322 } while (bstrState == L"in_progress");
00323
00324 wg->Release ();
00325
00326 return bstrState == L"added";
00327 }
00328
00329 BOOL fsIsMonitoringTurnedOn ()
00330 {
00331 CRegKey key;
00332 if (ERROR_SUCCESS != key.Open (HKEY_CURRENT_USER,
00333 "Software\\OpenDownloadManager.ORG\\Open Download Manager\\Settings\\Monitor", KEY_READ))
00334 return TRUE;
00335
00336 DWORD dwMonitor;
00337
00338 if (ERROR_SUCCESS != key.QueryValue (dwMonitor, "IE2"))
00339 return TRUE;
00340
00341 return dwMonitor;
00342 }