00001
00002
00003
00004
00005
00006 #include "stdafx.h"
00007 #include "FdmApp.h"
00008 #include "fsIECatchMgr.h"
00009 #include "misc.h"
00010 #include "inetutil.h"
00011 #include "DownloadsWnd.h"
00012 #include "iefdm/iefdm.h"
00013 #include "iefdm/iefdmdm/iefdmdm.h"
00014 #include "iefdm/iecooks/iecooks.h"
00015
00016 extern CDownloadsWnd* _pwndDownloads;
00017
00018 #ifdef _DEBUG
00019 #undef THIS_FILE
00020 static char THIS_FILE[]=__FILE__;
00021 #define new DEBUG_NEW
00022 #endif
00023
00024 _COM_SMARTPTR_TYPEDEF(IFDMIEStat, __uuidof(IFDMIEStat));
00025
00026 fsIECatchMgr::fsIECatchMgr()
00027 {
00028 m_pfnEvents = NULL;
00029 m_bNeedStop = false;
00030 m_bMonitorIEActivityRunning = false;
00031 }
00032
00033 fsIECatchMgr::~fsIECatchMgr()
00034 {
00035 m_bNeedStop = true;
00036 while (m_bMonitorIEActivityRunning)
00037 Sleep (10);
00038 }
00039
00040 HRESULT fsIECatchMgr::Initialize()
00041 {
00042 DWORD dw;
00043 m_bMonitorIEActivityRunning = true;
00044 CloseHandle (
00045 CreateThread (NULL, 0, _threadMonitorIEActivity, this, 0, &dw));
00046
00047 return S_OK;
00048 }
00049
00050 BOOL fsIECatchMgr::OnBeforeNavigate(LPCSTR pszUrl, BOOL bCheckALT)
00051 {
00052 try {
00053
00054 CHAR szFile [MY_MAX_PATH] = "";
00055 LPCSTR pszExt;
00056 fsURL url;
00057
00058 if (bCheckALT)
00059 {
00060 if ( (GetKeyState (VK_MENU) & 0x8000) == FALSE && m_bALTShouldPressed)
00061 return TRUE;
00062 }
00063
00064 if (url.Crack (pszUrl) != IR_SUCCESS)
00065 return TRUE;
00066
00067 fsFileNameFromUrlPath (url.GetPath (), url.GetInternetScheme () == INTERNET_SCHEME_FTP,
00068 TRUE, szFile, sizeof (szFile));
00069
00070 if (*szFile == 0)
00071 return TRUE;
00072
00073 pszExt = strrchr (szFile, '.');
00074 if (pszExt)
00075 pszExt++;
00076 else
00077 return TRUE;
00078
00079 BOOL bExtPresent = IsExtInExtsStr (m_strSkipExts, pszExt);
00080
00081 if (bExtPresent)
00082 return TRUE;
00083
00084 return _pwndDownloads->CreateDownload (pszUrl, TRUE) == FALSE;
00085
00086 }
00087 catch (...)
00088 {
00089 return TRUE;
00090 }
00091 }
00092
00093 void fsIECatchMgr::ReadSettings()
00094 {
00095 m_strSkipExts = _App.Monitor_SkipExts ();
00096
00097 m_bALTShouldPressed = _App.Monitor_ALTShouldPressed ();
00098 m_bCatchClicks = FALSE;
00099 }
00100
00101 void fsIECatchMgr::Detach()
00102 {
00103 }
00104
00105 BOOL fsIECatchMgr::IsActive()
00106 {
00107 return m_bMonitorIEActivityRunning;
00108 }
00109
00110 void fsIECatchMgr::SetEventsFunc(fntIECatchMgrEvents pfn, LPVOID lpParam)
00111 {
00112 m_pfnEvents = pfn;
00113 m_lpEventsParam = lpParam;
00114 }
00115
00116 void fsIECatchMgr::Event(fsIECatchMgrEvent ev)
00117 {
00118 if (m_pfnEvents)
00119 m_pfnEvents (ev, m_lpEventsParam);
00120 }
00121
00122 BOOL fsIECatchMgr::IsIE2Active()
00123 {
00124 static bool _bCreated = FALSE;
00125
00126 if (_bCreated == FALSE)
00127 {
00128 if (IsMonitoringDllRegistered ())
00129 {
00130 _bCreated = TRUE;
00131 return _App.Monitor_IE2 ();
00132 }
00133
00134 _App.Monitor_IE2 (FALSE);
00135 return FALSE;
00136 }
00137
00138 return _App.Monitor_IE2 ();
00139 }
00140
00141 typedef HRESULT (_stdcall *fntDllRegUnregServer)(void);
00142
00143 BOOL fsIECatchMgr::ActivateIE2(BOOL bActivate)
00144 {
00145 fntDllRegUnregServer pfnDll = NULL;
00146
00147 DWORD dw1, dw2, dw3, dw4;
00148 GetIEVersion (&dw1, &dw2, &dw3, &dw4);
00149
00150
00151 HMODULE hLib = LoadLibrary ("iefdm.dll");
00152 if (hLib == NULL)
00153 return FALSE;
00154
00155 if (bActivate && dw1 < 6)
00156 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllRegisterServer");
00157 else
00158 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllUnregisterServer");
00159
00160 if (pfnDll == NULL)
00161 {
00162 FreeLibrary (hLib);
00163 return FALSE;
00164 }
00165
00166 if (FAILED (pfnDll ()))
00167 {
00168 FreeLibrary (hLib);
00169 return FALSE;
00170 }
00171
00172 FreeLibrary (hLib);
00173
00174
00175 hLib = LoadLibrary ("iefdmdm.dll");
00176 if (hLib == NULL)
00177 return FALSE;
00178
00179 if (bActivate && dw1 >= 6)
00180 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllRegisterServer");
00181 else
00182 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllUnregisterServer");
00183
00184 if (pfnDll == NULL)
00185 {
00186 FreeLibrary (hLib);
00187 return FALSE;
00188 }
00189
00190 if (FAILED (pfnDll ()))
00191 {
00192 FreeLibrary (hLib);
00193 return FALSE;
00194 }
00195
00196 FreeLibrary (hLib);
00197
00198
00199 hLib = LoadLibrary ("iefdm2.dll");
00200 if (hLib == NULL)
00201 return FALSE;
00202
00203 if (bActivate && dw1 >= 6)
00204 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllRegisterServer");
00205 else
00206 pfnDll = (fntDllRegUnregServer) GetProcAddress (hLib, "DllUnregisterServer");
00207
00208 if (pfnDll == NULL)
00209 {
00210 FreeLibrary (hLib);
00211 return FALSE;
00212 }
00213
00214 if (FAILED (pfnDll ()))
00215 {
00216 FreeLibrary (hLib);
00217 return FALSE;
00218 }
00219
00220 FreeLibrary (hLib);
00221
00222 return TRUE;
00223 }
00224
00225 void fsIECatchMgr::CleanIEPluginKey()
00226 {
00227 CRegKey key;
00228
00229 if (ERROR_SUCCESS != key.Open (HKEY_LOCAL_MACHINE,
00230 "Software\\Microsoft\\Internet Explorer\\Plugins\\Extension"))
00231 return;
00232
00233 int i = 0;
00234 char szKey [1000];
00235 fs::list <fsString> vKeys;
00236 while (RegEnumKey (key, i++, szKey, sizeof (szKey)) == ERROR_SUCCESS)
00237 {
00238 CRegKey key2;
00239 key2.Open (key, szKey);
00240
00241 char szValue [1000]; DWORD dw = sizeof (szValue);
00242 key2.QueryValue (szValue, NULL, &dw);
00243
00244 key2.Close ();
00245
00246 if (strnicmp (szValue, "Free Download Manager", strlen ("Free Download Manager")) == 0)
00247 vKeys.add (szKey);
00248 }
00249
00250 for (i = 0; i < vKeys.size (); i++)
00251 key.RecurseDeleteKey (vKeys [i]);
00252 }
00253
00254 BOOL fsIECatchMgr::IsMonitoringDllRegistered()
00255 {
00256 IUnknown* p;
00257
00258 HRESULT hr1 = CoCreateInstance (CLSID_WgBHO, NULL, CLSCTX_ALL, IID_IUnknown, (void**) &p);
00259
00260 if (SUCCEEDED (hr1))
00261 p->Release ();
00262
00263 HRESULT hr2 = CoCreateInstance (CLSID_IEWGDM, NULL, CLSCTX_ALL, IID_IUnknown, (void**) &p);
00264
00265 if (SUCCEEDED (hr2))
00266 p->Release ();
00267
00268 if (SUCCEEDED (hr1) && SUCCEEDED (hr2))
00269 ActivateIE2 (TRUE);
00270
00271
00272 if (SUCCEEDED (hr2))
00273 ActivateIE2 (TRUE);
00274
00275 return SUCCEEDED (hr1) || SUCCEEDED (hr2);
00276 }
00277
00278 DWORD WINAPI fsIECatchMgr::_threadMonitorIEActivity(LPVOID lp)
00279 {
00280 fsIECatchMgr* pthis = (fsIECatchMgr*)lp;
00281 CoInitialize (NULL);
00282
00283 IFDMIEStatPtr spStat;
00284 spStat.CreateInstance (__uuidof (FDMIEStat));
00285
00286 if (spStat != NULL)
00287 {
00288 int iStarted = -1;
00289
00290 while (pthis->m_bNeedStop == false)
00291 {
00292 long lCount;
00293 spStat->get_DownloadCount (&lCount);
00294
00295
00296
00297 if (iStarted == -1 || (!iStarted != !lCount))
00298 {
00299 iStarted = lCount != 0;
00300 pthis->Event (iStarted ? ICME_DLSTARTED : ICME_DLCOMPLETED);
00301 }
00302
00303 Sleep (500);
00304 }
00305 }
00306
00307 CoUninitialize ();
00308 pthis->m_bMonitorIEActivityRunning = false;
00309 return 0;
00310 }