00001
00002
00003
00004
00005
00006 #include "FDMForFirefox.h"
00007 #include <windows.h>
00008 #include "../../lngphrases.h"
00009 #include "vmsFirefoxExtensionInstaller.h"
00010 #include "FDMUrlReceiver.h"
00011 #include <assert.h>
00012 #include <atlbase.h>
00013 #include <fsString.h>
00014
00015 _COM_SMARTPTR_TYPEDEF(IFDMFlashVideoDownloads, __uuidof(IFDMFlashVideoDownloads));
00016
00017 #define FLASHGOT_CID "{19503e42-ca3c-4c27-b1e2-9cdb2170ee34}"
00018
00019 NS_IMPL_ISUPPORTS1(CFDMForFirefox, IFDMForFirefox)
00020
00021 CFDMForFirefox::CFDMForFirefox()
00022 {
00023 m_keyFDM.Open (HKEY_CURRENT_USER,
00024 "Software\\OpenDownloadManager.ORG\\Open Download Manager");
00025
00026 m_keyFDMMonitor.Open (m_keyFDM, "Settings\\Monitor", KEY_READ);
00027
00028 char szPath [MAX_PATH] = "";
00029 DWORD dw = sizeof (szPath);
00030 m_keyFDM.QueryValue (szPath, "Path", &dw);
00031 if (*szPath)
00032 {
00033 if (szPath [lstrlen (szPath) - 1] != '\\')
00034 lstrcat (szPath, "\\");
00035
00036 lstrcat (szPath, "Language");
00037
00038
00039 m_lm.Initialize (szPath);
00040
00041 char szLang [100] = "English";
00042 dw = sizeof (szLang);
00043 CRegKey key;
00044 key.Open (m_keyFDM, "Settings\\View", KEY_READ);
00045
00046 key.QueryValue (szLang, "Language", &dw);
00047
00048 int nIndex = m_lm.FindLngByName (szLang);
00049 if (nIndex != -1)
00050 m_lm.LoadLng (nIndex);
00051 }
00052
00053 if (ERROR_SUCCESS != m_keyFDMFfStgs.Open (m_keyFDM, "FirefoxSettings\\Proxy"))
00054 m_keyFDMFfStgs.Create (m_keyFDM, "FirefoxSettings\\Proxy");
00055
00056 CoInitialize (NULL);
00057 }
00058
00059 CFDMForFirefox::~CFDMForFirefox()
00060 {
00061
00062 CoUninitialize ();
00063 }
00064
00065 NS_IMETHODIMP CFDMForFirefox::GetLngString(const char *strIDString, PRUnichar **_retval)
00066 {
00067 *_retval = new wchar_t [1000];
00068
00069 LPCSTR psz = NULL;
00070
00071 if (lstrcmp (strIDString, "dllink") == 0)
00072 {
00073 psz = m_lm.GetString (L_DLTHISIEMENU);
00074 if (psz == NULL || *psz == 0)
00075 psz = "Download with Free Download Manager";
00076 }
00077
00078 else if (lstrcmp (strIDString, "dlall") == 0)
00079 {
00080 psz = m_lm.GetString (L_DLALLIEMENU);
00081 if (psz == NULL || *psz == 0)
00082 psz = "Download all with Free Download Manager";
00083 }
00084
00085 else if (lstrcmp (strIDString, "dlselected") == 0)
00086 {
00087 psz = m_lm.GetString (L_DLSELECTEDIEMENU);
00088 if (psz == NULL || *psz == 0)
00089 psz = "Download selected with Free Download Manager";
00090 }
00091
00092 else if (lstrcmp (strIDString, "dlvideo") == 0)
00093 {
00094 psz = m_lm.GetString (L_DLFLASHVIDEOIEMENU);
00095 if (psz == NULL || *psz == 0)
00096 psz = "Download video with Free Download Manager";
00097 }
00098
00099 **_retval = 0;
00100
00101 if (psz && *psz)
00102 {
00103 MultiByteToWideChar (CP_ACP, 0, psz, -1, *_retval, 1000);
00104 (*_retval) [lstrlen (psz)] = 0;
00105 }
00106
00107 return NS_OK;
00108 }
00109
00110 NS_IMETHODIMP CFDMForFirefox::IsContextMenuItemShouldBeHidden(const char *strMenuItemID, PRBool *_retval)
00111 {
00112 if (is_FlashGotInstalled ())
00113 {
00114 *_retval = TRUE;
00115 return NS_OK;
00116 }
00117
00118 CRegKey key;
00119
00120 key.Open (m_keyFDM, "Settings\\Monitor\\IEMenu", KEY_READ);
00121
00122 DWORD dwShow = TRUE;
00123
00124 key.QueryValue (dwShow, "Enable");
00125
00126 if (dwShow)
00127 {
00128 if (lstrcmp (strMenuItemID, "dllink") == 0)
00129 key.QueryValue (dwShow, "DLThis");
00130
00131 else if (lstrcmp (strMenuItemID, "dlall") == 0)
00132 key.QueryValue (dwShow, "DLAll");
00133
00134 else if (lstrcmp (strMenuItemID, "dlselected") == 0)
00135 key.QueryValue (dwShow, "DLSelected");
00136
00137 else if (lstrcmp (strMenuItemID, "dlvideo") == 0)
00138 key.QueryValue (dwShow, "DLFlashVideo");
00139 }
00140
00141 *_retval = !dwShow;
00142
00143 return NS_OK;
00144 }
00145
00146 bool CFDMForFirefox::is_FlashGotInstalled()
00147 {
00148 static int _isInstalled = -1;
00149 if (_isInstalled == -1)
00150 _isInstalled = vmsFirefoxExtensionInstaller::IsInstalled (FLASHGOT_CID, true);
00151 return _isInstalled != 0;
00152 }
00153
00154 NS_IMETHODIMP CFDMForFirefox::IsALTShouldBePressed(PRBool *_retval)
00155 {
00156 if (is_FlashGotInstalled ())
00157 {
00158 *_retval = FALSE;
00159 return NS_OK;
00160 }
00161
00162 DWORD dw1 = TRUE, dw2 = FALSE;
00163
00164 m_keyFDMMonitor.QueryValue (dw1, "Firefox");
00165
00166 if (dw1)
00167 m_keyFDMMonitor.QueryValue (dw2, "ALTShouldPressed");
00168
00169 *_retval = dw1 && dw2;
00170
00171 return NS_OK;
00172 }
00173
00174 NS_IMETHODIMP CFDMForFirefox::IsLinkShouldBeSkipped(IFDMUrl *url, const PRUnichar *wstrSuggFileName, PRBool *_retval)
00175 {
00176 *_retval = TRUE;
00177
00178 if (is_FlashGotInstalled ())
00179 return NS_OK;
00180
00181 DWORD dw = TRUE;
00182
00183 m_keyFDMMonitor.QueryValue (dw, "Firefox");
00184 if (dw == FALSE)
00185 return NS_OK;
00186
00187 dw = FALSE;
00188 m_keyFDMMonitor.QueryValue (dw, "ALTShouldPressed");
00189 if (dw)
00190 return NS_OK;
00191
00192 *_retval = IsUrlShouldBeSkipped (url, wstrSuggFileName);
00193
00194 return NS_OK;
00195 }
00196
00197 NS_IMETHODIMP CFDMForFirefox::CatchLink(IFDMUrl *url, const PRUnichar *wstrSuggFileName, PRBool *_retval)
00198 {
00199 IsLinkShouldBeSkipped (url, wstrSuggFileName, _retval);
00200 if (*_retval)
00201 return NS_OK;
00202
00203 *_retval = TransferUrlToFDM (url);
00204
00205 return NS_OK;
00206 }
00207
00208 LPCSTR strcmp_m (LPCSTR pszWhere, LPCSTR pszWhat)
00209 {
00210 if (*pszWhere == 0)
00211 return *pszWhat == 0 ? pszWhere : NULL;
00212
00213 if (*pszWhat == 0)
00214 return NULL;
00215
00216 if (*pszWhat == '*')
00217 {
00218 if (pszWhat [1] == 0)
00219 return pszWhere;
00220
00221
00222 LPCSTR psz = strcmp_m (pszWhere, pszWhat+1);
00223 if (psz)
00224 return psz;
00225
00226
00227 return strcmp_m (pszWhere+1, pszWhat);
00228 }
00229
00230 if (*pszWhat != '?')
00231 {
00232 if (*pszWhere != *pszWhat)
00233 return NULL;
00234 }
00235
00236 return strcmp_m (pszWhere+1, pszWhat+1) ? pszWhere : NULL;
00237 }
00238
00239 LPCSTR strcmpi_m (LPCSTR pszWhere, LPCSTR pszWhat)
00240 {
00241 char *psz1 = new char [lstrlen (pszWhere) + 1];
00242 char *psz2 = new char [lstrlen (pszWhat) + 1];
00243
00244 lstrcpy (psz1, pszWhere);
00245 lstrcpy (psz2, pszWhat);
00246
00247 CharLower (psz1);
00248 CharLower (psz2);
00249
00250 LPCSTR psz = strcmp_m (psz1, psz2);
00251 LPCSTR pszRet = NULL;
00252 if (psz)
00253 pszRet = pszWhere + (psz - psz1);
00254
00255 delete [] psz1;
00256 delete [] psz2;
00257
00258 return pszRet;
00259 }
00260
00261 BOOL IsExtStrEq (LPCSTR pszMasked, LPCSTR psz2)
00262 {
00263 return strcmpi_m (psz2, pszMasked) != NULL;
00264 }
00265
00266 BOOL IsExtInExtsStr (LPCSTR pszExts, LPCSTR pszExt)
00267 {
00268 if (pszExt == NULL)
00269 return FALSE;
00270
00271 int len = lstrlen (pszExts);
00272 int i = 0;
00273 CHAR szExt [10000];
00274
00275 do
00276 {
00277 int j = 0;
00278
00279 while (i < len && pszExts [i] != ' ')
00280 szExt [j++] = pszExts [i++];
00281
00282 szExt [j] = 0;
00283 i++;
00284
00285 if (IsExtStrEq (szExt, pszExt))
00286 return TRUE;
00287
00288 } while (i < len);
00289
00290 return FALSE;
00291 }
00292
00293 BOOL IsServerInServersStr (LPCSTR pszServers, LPCSTR pszServer)
00294 {
00295 if (pszServer == NULL)
00296 return FALSE;
00297
00298 int len = lstrlen (pszServers);
00299 int i = 0;
00300 CHAR szServer [10000];
00301
00302 do
00303 {
00304 int j = 0;
00305
00306 while (i < len && pszServers [i] != ' ')
00307 szServer [j++] = pszServers [i++];
00308
00309 szServer [j] = 0;
00310 i++;
00311
00312 if (IsExtStrEq (szServer, pszServer))
00313 return TRUE;
00314
00315 fsString str;
00316 str = "*."; str += szServer;
00317 if (IsExtStrEq (str, pszServer))
00318 return TRUE;
00319
00320 } while (i < len);
00321
00322 return FALSE;
00323 }
00324
00325 fsString DomainFromUrl(LPCSTR pszUrl)
00326 {
00327 LPCSTR pszS = strstr (pszUrl, "://");
00328 if (pszS == NULL)
00329 pszS = strstr (pszUrl, ":\\\\");
00330 if (pszS == NULL)
00331 pszS = pszUrl;
00332 else
00333 pszS += 3;
00334 LPCSTR pszE = pszS;
00335 while (*pszE && *pszE != '\\' && *pszE != '/')
00336 pszE++;
00337
00338 char sz [1000];
00339 if (pszE - pszS > sizeof (sz))
00340 return "";
00341
00342 lstrcpyn (sz, pszS, pszE - pszS + 1);
00343 return sz;
00344 }
00345
00346 bool CFDMForFirefox::IsServerToSkip (IFDMUrl *url)
00347 {
00348 USES_CONVERSION;
00349
00350 wchar_t *wsz;
00351 url->GetUrl (&wsz);
00352 fsString strDomain = DomainFromUrl (W2A (wsz));
00353 delete [] wsz;
00354
00355 char szServers [10000] = ""; DWORD dw = sizeof (szServers);
00356 m_keyFDMMonitor.QueryValue (szServers, "SkipServers", &dw);
00357
00358 return IsServerInServersStr (szServers, strDomain) != 0;
00359 }
00360
00361 bool CFDMForFirefox::IsUrlShouldBeSkipped(IFDMUrl *url, const wchar_t *pwszSuggFileName)
00362 {
00363 char szExts [10000] = "pls m3u"; DWORD dw = sizeof (szExts);
00364 m_keyFDMMonitor.QueryValue (szExts, "SkipExtensions", &dw);
00365
00366 char szFile [1000] = "";
00367 WideCharToMultiByte (CP_ACP, 0, pwszSuggFileName, -1, szFile, sizeof (szFile),
00368 NULL, NULL);
00369 szFile [wcslen (pwszSuggFileName)] = 0;
00370
00371 LPCSTR pszExt = strrchr (szFile, '.');
00372 if (pszExt++ == NULL)
00373 return false;
00374
00375 return IsExtInExtsStr (szExts, pszExt) != FALSE ||
00376 IsServerToSkip (url);
00377 }
00378
00379 PRBool CFDMForFirefox::TransferUrlToFDM(IFDMUrl *url)
00380 {
00381 IWGUrlReceiverPtr spUrlRcvr;
00382 spUrlRcvr.CreateInstance (__uuidof (WGUrlReceiver));
00383
00384 assert (spUrlRcvr != NULL);
00385 if (spUrlRcvr == NULL)
00386 return FALSE;
00387
00388 if (NS_OK != CFDMUrlReceiver::ApplyUrlToReceiver (spUrlRcvr, url))
00389 return FALSE;
00390
00391 spUrlRcvr->put_IgnoreSize (FALSE);
00392
00393 if (FAILED (spUrlRcvr->ShowAddDownloadDialog ()))
00394 return FALSE;
00395
00396 DWORD dwAllow = TRUE;
00397 m_keyFDMMonitor.QueryValue (dwAllow, "AllowDownload");
00398 if (dwAllow == FALSE)
00399 return TRUE;
00400
00401 BSTR bstrState = NULL;
00402 do {
00403 if (bstrState)
00404 SysFreeString (bstrState);
00405 Sleep (5);
00406 spUrlRcvr->get_UIState (&bstrState);
00407 } while (wcsicmp (bstrState, L"in_progress") == 0);
00408
00409 BOOL bAdded = wcsicmp (bstrState, L"added") == 0;
00410 SysFreeString (bstrState);
00411
00412 return bAdded;
00413 }
00414
00415 NS_IMETHODIMP CFDMForFirefox::SetProxyType(PRInt32 nType)
00416 {
00417 m_keyFDMFfStgs.SetValue (nType, "ProxyType");
00418 return NS_OK;
00419 }
00420
00421 NS_IMETHODIMP CFDMForFirefox::SetProxy(const char *strProtocol, const char *strAddr, PRInt32 nPort)
00422 {
00423 fsString str = strProtocol;
00424 fsString strAddrName = str; strAddrName += "_addr";
00425 fsString strPortName = str; strPortName += "_port";
00426
00427 m_keyFDMFfStgs.SetValue (strAddr, strAddrName);
00428 m_keyFDMFfStgs.SetValue (nPort, strPortName);
00429
00430 return NS_OK;
00431 }
00432
00433 NS_IMETHODIMP CFDMForFirefox::IsDomainSupportedForVideoDownloads(const PRUnichar *wstrDomain, PRBool *_retval)
00434 {
00435 if (_wcsnicmp (wstrDomain, L"www.", 4) == 0)
00436 wstrDomain += 4;
00437
00438 *_retval = wcsicmp (wstrDomain, L"youtube.com") == 0;
00439
00440 return NS_OK;
00441 }
00442
00443 NS_IMETHODIMP CFDMForFirefox::ProcessVideoDocument(const PRUnichar *wstrDomain, const PRUnichar *wstrReferer, const PRUnichar *wstrHTML, PRBool *_retval)
00444 {
00445 *_retval = FALSE;
00446
00447 IFDMFlashVideoDownloadsPtr spFVDownloads;
00448 spFVDownloads.CreateInstance (__uuidof (FDMFlashVideoDownloads));
00449
00450 assert (spFVDownloads != NULL);
00451 if (spFVDownloads == NULL)
00452 return NS_OK;
00453
00454 BSTR bstrDomain = SysAllocString (wstrDomain);
00455 BSTR bstrHtml = SysAllocString (wstrHTML);
00456
00457 spFVDownloads->ProcessHtml (bstrDomain, bstrHtml);
00458
00459 *_retval = TRUE;
00460
00461 return NS_OK;
00462 }
00463
00464 NS_IMETHODIMP CFDMForFirefox::CreateVideoDownloadFromUrl(const PRUnichar *wstrUrl, PRBool *_retval)
00465 {
00466 *_retval = FALSE;
00467
00468 IFDMFlashVideoDownloadsPtr spFVDownloads;
00469 spFVDownloads.CreateInstance (__uuidof (FDMFlashVideoDownloads));
00470
00471 assert (spFVDownloads != NULL);
00472 if (spFVDownloads == NULL)
00473 return NS_OK;
00474
00475 spFVDownloads->CreateFromUrl (SysAllocString (wstrUrl));
00476
00477 *_retval = TRUE;
00478
00479 return NS_OK;
00480 }