mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
Bug 393305 - "Determine multi-scan behavior" [p=jmathies@mozilla.com (Jim Mathies) r=gavin a=blocking-firefox3+]
This commit is contained in:
parent
3b6503ef54
commit
8fe8cc641b
@ -99,14 +99,15 @@ nsDownloadScanner::Init()
|
||||
// codebase. All other COM calls/objects are made on different threads.
|
||||
nsresult rv = NS_OK;
|
||||
CoInitialize(NULL);
|
||||
if (FindCLSID() < 0)
|
||||
if (ListCLSID() < 0)
|
||||
rv = NS_ERROR_NOT_AVAILABLE;
|
||||
CoUninitialize();
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
PRInt32
|
||||
nsDownloadScanner::FindCLSID()
|
||||
nsDownloadScanner::ListCLSID()
|
||||
{
|
||||
nsRefPtr<ICatInformation> catInfo;
|
||||
HRESULT hr;
|
||||
@ -124,12 +125,17 @@ nsDownloadScanner::FindCLSID()
|
||||
NS_WARNING("Could not get class enumerator for category\n");
|
||||
return -2;
|
||||
}
|
||||
|
||||
ULONG nReceived;
|
||||
clsidEnumerator->Next(1, &mScannerCLSID, &nReceived);
|
||||
if (nReceived == 0) {
|
||||
CLSID clsid;
|
||||
while(clsidEnumerator->Next(1, &clsid, &nReceived) == S_OK && nReceived == 1)
|
||||
mScanCLSID.AppendElement(clsid);
|
||||
|
||||
if (mScanCLSID.Length() == 0) {
|
||||
// No installed Anti Virus program
|
||||
return -3;
|
||||
}
|
||||
|
||||
mHaveAVScanner = PR_TRUE;
|
||||
return 0;
|
||||
}
|
||||
@ -145,7 +151,7 @@ nsDownloadScanner::ScannerThreadFunction(void *p)
|
||||
}
|
||||
|
||||
nsDownloadScanner::Scan::Scan(nsDownloadScanner *scanner, nsDownload *download)
|
||||
: mDLScanner(scanner), mAVScanner(NULL), mThread(NULL),
|
||||
: mDLScanner(scanner), mThread(NULL),
|
||||
mDownload(download), mStatus(AVSCAN_NOTSTARTED)
|
||||
{
|
||||
}
|
||||
@ -254,35 +260,46 @@ nsDownloadScanner::Scan::DoScan()
|
||||
|
||||
info.pwzHostName = mName.BeginWriting();
|
||||
info.u.pwzFullPath = mPath.BeginWriting();
|
||||
|
||||
info.pwzOrigURL = mOrigin.BeginWriting();
|
||||
|
||||
CoInitialize(NULL);
|
||||
hr = CoCreateInstance(mDLScanner->mScannerCLSID, NULL, CLSCTX_ALL,
|
||||
IID_IOfficeAntiVirus, getter_AddRefs(mAVScanner));
|
||||
if (FAILED(hr)) {
|
||||
NS_WARNING("Could not instantiate antivirus scanner");
|
||||
mStatus = AVSCAN_FAILED;
|
||||
} else {
|
||||
mStatus = AVSCAN_SCANNING;
|
||||
hr = mAVScanner->Scan(&info);
|
||||
switch (hr) {
|
||||
case S_OK:
|
||||
mStatus = AVSCAN_GOOD;
|
||||
break;
|
||||
case S_FALSE:
|
||||
mStatus = AVSCAN_UGLY;
|
||||
break;
|
||||
case E_FAIL:
|
||||
mStatus = AVSCAN_BAD;
|
||||
break;
|
||||
default:
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
NS_WARNING("Downloaded file disappeared before it could be scanned");
|
||||
|
||||
for (PRUint32 i = 0; i < mDLScanner->mScanCLSID.Length(); i++) {
|
||||
nsRefPtr<IOfficeAntiVirus> vScanner;
|
||||
hr = CoCreateInstance(mDLScanner->mScanCLSID[i], NULL, CLSCTX_ALL,
|
||||
IID_IOfficeAntiVirus, getter_AddRefs(vScanner));
|
||||
if (FAILED(hr)) {
|
||||
NS_WARNING("Could not instantiate antivirus scanner");
|
||||
mStatus = AVSCAN_FAILED;
|
||||
break;
|
||||
} else {
|
||||
mStatus = AVSCAN_SCANNING;
|
||||
|
||||
hr = vScanner->Scan(&info);
|
||||
|
||||
if (hr == S_OK) { // Passed the scan
|
||||
mStatus = AVSCAN_GOOD;
|
||||
continue;
|
||||
}
|
||||
else if (hr == S_FALSE) { // Failed but cleaned up
|
||||
mStatus = AVSCAN_UGLY;
|
||||
continue;
|
||||
}
|
||||
else if (hr == ERROR_FILE_NOT_FOUND) {
|
||||
NS_WARNING("Downloaded file disappeared before it could be scanned");
|
||||
mStatus = AVSCAN_FAILED;
|
||||
break;
|
||||
}
|
||||
else if (hr == E_FAIL) { // Failed
|
||||
mStatus = AVSCAN_BAD;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
mStatus = AVSCAN_FAILED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CoUninitialize();
|
||||
|
||||
// We need to do a few more things on the main thread
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "nsAutoPtr.h"
|
||||
#include "nsThreadUtils.h"
|
||||
#include "nsDownloadManager.h"
|
||||
#include "nsTArray.h"
|
||||
|
||||
enum AVScanState
|
||||
{
|
||||
@ -34,8 +35,8 @@ public:
|
||||
|
||||
private:
|
||||
PRBool mHaveAVScanner;
|
||||
CLSID mScannerCLSID;
|
||||
PRInt32 FindCLSID();
|
||||
nsTArray<CLSID> mScanCLSID;
|
||||
PRInt32 ListCLSID();
|
||||
|
||||
static unsigned int __stdcall ScannerThreadFunction(void *p);
|
||||
class Scan : public nsRunnable
|
||||
@ -46,7 +47,6 @@ private:
|
||||
|
||||
private:
|
||||
nsDownloadScanner *mDLScanner;
|
||||
nsRefPtr<IOfficeAntiVirus> mAVScanner;
|
||||
HANDLE mThread;
|
||||
nsRefPtr<nsDownload> mDownload;
|
||||
AVScanState mStatus;
|
||||
|
Loading…
Reference in New Issue
Block a user