// oleInst.h : Declaration of the COleInstall

#ifndef __OLEINSTALL_H_
#define __OLEINSTALL_H_

#include "CPinst.h"         // Template for connection point

#define WM_ON_PROGRESS      (WM_USER+100)
#define WM_INSTALL_ERROR    (WM_USER+101)

#define FILEBUFSIZE         1024
#define MAXFILELEN          64
#define MAXTRY              10000
#define MAX_INET_RETRY      3
#define RET_SUCCESS         1
#define RET_SERVER_ERROR    2
#define RET_OTHER_ERROR     3

typedef class  OleInstallData {
public:
    LONG        m_lCount;
    LPTSTR      m_pszTempWebpnpFile;
    LPTSTR      m_pPrinterUncName;
    LPTSTR      m_pPrinterUrl;
    HWND        m_hwnd;
    BOOL        m_bValid;
    BOOL        m_bRPC;         // Should we do an RPC install?

    OleInstallData (LPTSTR      pPrinterUncName,
                    LPTSTR      pPrinterUrl, 
                    HWND        hwnd,
                    BOOL        m_bRPC);
    ~OleInstallData ();
    
} OleInstallData;


/////////////////////////////////////////////////////////////////////////////
// COleInstall
class ATL_NO_VTABLE COleInstall :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<COleInstall, &CLSID_OleInstall>,
    public COlePrnSecComControl<COleInstall>,
    public IDispatchImpl<IOleInstall, &IID_IOleInstall, &LIBID_OLEPRNLib>,
    public IProvideClassInfo2Impl<&CLSID_OleInstall, &DIID__InstallEvent, &LIBID_OLEPRNLib>,
    public IPersistStreamInitImpl<COleInstall>,
    public IPersistStorageImpl<COleInstall>,
    public IQuickActivateImpl<COleInstall>,
    public IOleControlImpl<COleInstall>,
    public IOleObjectImpl<COleInstall>,
    public IOleInPlaceActiveObjectImpl<COleInstall>,
    public IViewObjectExImpl<COleInstall>,
    public IOleInPlaceObjectWindowlessImpl<COleInstall>,
    public IDataObjectImpl<COleInstall>,
    public ISpecifyPropertyPagesImpl<COleInstall>,
    public CProxy_InstallEvents<COleInstall>,
    public IConnectionPointContainerImpl<COleInstall>
{
public:

DECLARE_REGISTRY_RESOURCEID(IDR_OLEINSTALL)

BEGIN_COM_MAP(COleInstall)
    COM_INTERFACE_ENTRY(IOleInstall)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY_IMPL(IViewObjectEx)
    COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject2, IViewObjectEx)
    COM_INTERFACE_ENTRY_IMPL_IID(IID_IViewObject, IViewObjectEx)
    COM_INTERFACE_ENTRY_IMPL(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleInPlaceObject, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY_IMPL_IID(IID_IOleWindow, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY_IMPL(IOleInPlaceActiveObject)
    COM_INTERFACE_ENTRY_IMPL(IOleControl)
    COM_INTERFACE_ENTRY_IMPL(IOleObject)
    COM_INTERFACE_ENTRY_IMPL(IQuickActivate)
    COM_INTERFACE_ENTRY_IMPL(IPersistStorage)
    COM_INTERFACE_ENTRY_IMPL(IPersistStreamInit)
    COM_INTERFACE_ENTRY_IMPL(ISpecifyPropertyPages)
    COM_INTERFACE_ENTRY_IMPL(IDataObject)
    COM_INTERFACE_ENTRY(IProvideClassInfo)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
    COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
    COM_INTERFACE_ENTRY_IMPL(IObjectSafety)
END_COM_MAP()

BEGIN_PROPERTY_MAP(COleInstall)
    // Example entries
    // PROP_ENTRY("Property Description", dispid, clsid)
    PROP_PAGE(CLSID_StockColorPage)
END_PROPERTY_MAP()

BEGIN_CONNECTION_POINT_MAP(COleInstall)
   CONNECTION_POINT_ENTRY(DIID__InstallEvent)
END_CONNECTION_POINT_MAP()


BEGIN_MSG_MAP(COleInstall)
    MESSAGE_HANDLER(WM_PAINT, OnPaint)
    MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus)
    MESSAGE_HANDLER(WM_KILLFOCUS, OnKillFocus)
END_MSG_MAP()


// IViewObjectEx
    STDMETHOD(GetViewStatus)(DWORD* pdwStatus)
    {
        ATLTRACE(_T("IViewObjectExImpl::GetViewStatus\n"));
        *pdwStatus = VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE;
        return S_OK;
    }

// IOleInstall
public:
    STDMETHOD(OpenPrintersFolder)();
    STDMETHOD(InstallPrinter)(BSTR pbstrUncName, BSTR pbstrUrl);
    
    COleInstall();
    ~COleInstall();
    HRESULT     OnDraw(ATL_DRAWINFO& di);

private:
    HWND m_hwnd;
    LPTSTR      m_pPrinterUncName;          // holds the printers'UNC name
    LPTSTR      m_pPrinterUrl;              // holds the printer URL
    OleInstallData *m_pThreadData;

    HRESULT             InitWin (BOOL bRPC);
    
    static LRESULT CALLBACK WndProc(
                            HWND hWnd, 
                            UINT uMsg, 
                            WPARAM wParam, 
                            LPARAM lParam);
    
    static BOOL         WorkingThread(
                            void * pParam);
    
    static BOOL         StartInstall(
                            OleInstallData *pThreadData);
    
    static BOOL         SyncExecute(
                            LPTSTR pszFileName, 
                            int nShow);

    static DWORD        GetWebpnpFile(
                            OleInstallData *pData, 
                            LPTSTR pszURL,
                            LPTSTR *ppErrMsg);

    static HANDLE       GetTempFile(
                            LPTSTR pExtension, 
                            LPTSTR * ppFileName);

    static BOOL         IsHttpPreferred(void);

    static BOOL         GetHttpPrinterFile(
                            OleInstallData *pData, 
                            LPTSTR pbstrURL);

    static BOOL         InstallHttpPrinter(
                            OleInstallData *pData);

    static BOOL         CheckAndSetDefaultPrinter(void);
    
    static BOOL         UpdateUI (
                            OleInstallData *pData,
                            UINT message, 
                            WPARAM wParam);

    static BOOL         UpdateProgress (
                            OleInstallData *pData, 
                            DWORD dwProgress);

    static BOOL         UpdateError (
                            OleInstallData *pData);

    HRESULT             CanIOpenPrintersFolder(void);  
    
    HRESULT             CanIInstallRPC(IN LPTSTR lpszPrinter, IN LPTSTR lpszWebPrinter);

    static LPTSTR       RemoveURLVars(LPTSTR);      // Get rid of everything after ?

    static LPTSTR       GetNTPrint(void);

    static LPTSTR       CreatePrinterBaseName(
                            LPCTSTR lpszPrinterURL,
                            LPCTSTR lpszPrinterName);
    
};


#endif //__OLEINSTALL_H_

/******************************************************************
** End of File (oleinst.h)
******************************************************************/