diff -r 000000000000 -r 6474c204b198 toolkit/components/downloads/nsDownloadScanner.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolkit/components/downloads/nsDownloadScanner.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,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 +#define AVVENDOR +#include +#include +#include + +#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 mScanCLSID; + bool IsAESAvailable(); + bool EnumerateOAVProviders(); + + nsAutoPtr mWatchdog; + + static unsigned int __stdcall ScannerThreadFunction(void *p); + class Scan : public nsRunnable + { + 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; + nsRefPtr 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 +