1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* vim: se cin sw=2 ts=2 et : */
#ifndef nsDownloadScanner_h_
#define nsDownloadScanner_h_
#ifdef WIN32_LEAN_AND_MEAN
#undef WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#define AVVENDOR
#include <objidl.h>
#include <msoav.h>
#include <shlobj.h>
#include "nsAutoPtr.h"
#include "nsThreadUtils.h"
#include "nsTArray.h"
#include "nsIObserver.h"
#include "nsIURI.h"
enum AVScanState
{
AVSCAN_NOTSTARTED = 0,
AVSCAN_SCANNING,
AVSCAN_GOOD,
AVSCAN_BAD,
AVSCAN_UGLY,
AVSCAN_FAILED,
AVSCAN_TIMEDOUT
};
enum AVCheckPolicyState
{
AVPOLICY_DOWNLOAD,
AVPOLICY_PROMPT,
AVPOLICY_BLOCKED
};
// See nsDownloadScanner.cpp for declaration and definition
class nsDownloadScannerWatchdog;
class nsDownload;
class nsDownloadScanner
{
public:
nsDownloadScanner();
~nsDownloadScanner();
nsresult Init();
nsresult ScanDownload(nsDownload *download);
AVCheckPolicyState CheckPolicy(nsIURI *aSource, nsIURI *aTarget);
private:
bool mAESExists;
nsTArray<CLSID> mScanCLSID;
bool IsAESAvailable();
bool EnumerateOAVProviders();
nsAutoPtr<nsDownloadScannerWatchdog> mWatchdog;
static unsigned int __stdcall ScannerThreadFunction(void *p);
class Scan : public mozilla::Runnable
{
public:
Scan(nsDownloadScanner *scanner, nsDownload *download);
~Scan();
nsresult Start();
// Returns the time that Start was called
PRTime GetStartTime() const { return mStartTime; }
// Returns a copy of the thread handle that can be waited on, but not
// terminated
// The caller is responsible for closing the handle
// If the thread has terminated, then this will return the pseudo-handle
// INVALID_HANDLE_VALUE
HANDLE GetWaitableThreadHandle() const;
// Called on a secondary thread to notify the scan that it has timed out
// this is used only by the watchdog thread
bool NotifyTimeout();
private:
nsDownloadScanner *mDLScanner;
PRTime mStartTime;
HANDLE mThread;
RefPtr<nsDownload> mDownload;
// Guards mStatus
CRITICAL_SECTION mStateSync;
AVScanState mStatus;
nsString mPath;
nsString mName;
nsString mOrigin;
// Also true if it is an ftp download
bool mIsHttpDownload;
bool mSkipSource;
/* @summary Sets the Scan's state to newState if the current state is
expectedState
* @param newState The new state of the scan
* @param expectedState The state that the caller expects the scan to be in
* @return If the old state matched expectedState
*/
bool CheckAndSetState(AVScanState newState, AVScanState expectedState);
NS_IMETHOD Run();
void DoScan();
bool DoScanAES();
bool DoScanOAV();
friend unsigned int __stdcall nsDownloadScanner::ScannerThreadFunction(void *);
};
// Used to give access to Scan
friend class nsDownloadScannerWatchdog;
};
#endif
|