You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
238 lines
8.0 KiB
238 lines
8.0 KiB
//=================================================
|
|
//
|
|
// File : httpwfh.h
|
|
//
|
|
// purpose : definition of the Cwfolders class
|
|
//
|
|
//=================================================
|
|
// Chad Lindhorst, 1998
|
|
|
|
#ifndef __HTTPWFH_H_
|
|
#define __HTTPWFH_H_
|
|
|
|
#include <mshtmhst.h>
|
|
|
|
#include "iextag.h" // for IID_Iwfolders... etc.
|
|
#include "resource.h" // main symbols
|
|
#include "oledb.h"
|
|
|
|
// This is used to fix the max size for strings loaded from the
|
|
// string table.
|
|
#define MAX_LOADSTRING MAX_PATH
|
|
|
|
// This is the longest URL we should send to office. (anything longer
|
|
// will get an error dialog.) (Should be MAX_PATH - talk to office...)
|
|
#define MAX_WEB_FOLDER_LENGTH MAX_PATH
|
|
|
|
// This is the guid we use for active setup....
|
|
static const GUID CLSID_IOD =
|
|
{ 0x73fa19d0, 0x2d75, 0x11d2, { 0x99, 0x5d, 0x00, 0xc0, 0x4f, 0x98, 0xbb, 0xc9 } };
|
|
|
|
// Just to look nice.
|
|
#define BAILOUT(HR) {hr=HR; goto cleanup;}
|
|
#define FAILONBAD_HR(HR) {if (FAILED(HR)) BAILOUT(HR);}
|
|
|
|
// These typedefs and statics are for the target frame creation code taken
|
|
// out of shdocvw.
|
|
typedef enum _TARGET_TYPE {
|
|
TARGET_FRAMENAME,
|
|
TARGET_SELF,
|
|
TARGET_PARENT,
|
|
TARGET_BLANK,
|
|
TARGET_TOP,
|
|
TARGET_MAIN,
|
|
TARGET_SEARCH
|
|
} TARGET_TYPE;
|
|
|
|
typedef struct _TARGETENTRY {
|
|
TARGET_TYPE targetType;
|
|
const WCHAR *pTargetValue;
|
|
} TARGETENTRY;
|
|
|
|
static const TARGETENTRY targetTable[] =
|
|
{
|
|
{TARGET_SELF, L"_self"},
|
|
{TARGET_PARENT, L"_parent"},
|
|
{TARGET_BLANK, L"_blank"},
|
|
{TARGET_TOP, L"_top"},
|
|
{TARGET_MAIN, L"_main"},
|
|
{TARGET_SEARCH, L"_search"},
|
|
{TARGET_SELF, NULL}
|
|
};
|
|
|
|
// Custom Window Messages
|
|
#define WM_WEBFOLDER_NAV WM_USER + 2000
|
|
#define WM_WEBFOLDER_CANCEL WM_WEBFOLDER_NAV + 1
|
|
#define WM_WEBFOLDER_DONE WM_WEBFOLDER_NAV + 2
|
|
#define WM_WEBFOLDER_INIT WM_WEBFOLDER_NAV + 3
|
|
|
|
// Used to keep the state of the message window. They are void * to cram into
|
|
// the window properties.
|
|
#define STATUS_READY (void *) 1
|
|
#define STATUS_CANCELED (void *) 2
|
|
|
|
// Window Property Names
|
|
#define __INFO L"__WFOLDER_INFO"
|
|
#define __CANCEL L"__WFOLDER_CANCEL"
|
|
|
|
// Name of the class of windows that handles all the messages from ParseDisplayName
|
|
#define WFOLDERSWNDCLASS L"WebFolderSilentMessageHandlerWindowClass"
|
|
|
|
// These values help the various parts of this program know what is going on.
|
|
// They are to be used in ONE DIRECTION ONLY because they are often carried
|
|
// to different threads, and the variable they are used with is NOT
|
|
// synchronized.
|
|
#define READY_WORKING 0
|
|
#define READY_INITIALIZED 1
|
|
#define READY_CANCEL 10
|
|
#define READY_DONE 11
|
|
|
|
// These are my different UI codes. You pass one (or all) of these to NavigateInternal
|
|
// to change what UI gets seen.
|
|
#define USE_NO_UI 0
|
|
#define USE_ERROR_BOXES 1
|
|
#define USE_FAILED_QUESTION 2
|
|
#define USE_WEB_PAGE_UI 4
|
|
|
|
#define USE_ALL_UI USE_ERROR_BOXES | USE_FAILED_QUESTION | USE_WEB_PAGE_UI
|
|
|
|
//+------------------------------------------------------------------------
|
|
//
|
|
// Class: Cwfolders
|
|
//
|
|
// Synopsis: Implements a behavior which allows the browser to
|
|
// navigate to a folder view of a given URL. The most
|
|
// important method here is Navigate.
|
|
//
|
|
//-------------------------------------------------------------------------
|
|
|
|
class ATL_NO_VTABLE Cwfolders :
|
|
public CComObjectRootEx<CComSingleThreadModel>,
|
|
public CComCoClass<Cwfolders,&CLSID_wfolders>,
|
|
public IDispatchImpl<Iwfolders, &IID_Iwfolders, &LIBID_IEXTagLib>,
|
|
public IObjectSafetyImpl<Cwfolders>,
|
|
public IElementBehavior
|
|
{
|
|
// METHODS
|
|
// -------
|
|
|
|
public:
|
|
Cwfolders();
|
|
|
|
~Cwfolders();
|
|
|
|
DECLARE_REGISTRY_RESOURCEID(IDR_WFOLDERS)
|
|
|
|
BEGIN_COM_MAP(Cwfolders)
|
|
COM_INTERFACE_ENTRY(IDispatch)
|
|
COM_INTERFACE_ENTRY(Iwfolders)
|
|
COM_INTERFACE_ENTRY(IElementBehavior)
|
|
COM_INTERFACE_ENTRY_IMPL(IObjectSafety)
|
|
END_COM_MAP()
|
|
|
|
// Iwfolders
|
|
STDMETHOD(navigate)(BSTR bstrUrl, BSTR * pbstrRetVal);
|
|
STDMETHOD(navigateFrame)(BSTR bstrUrl, BSTR bstrTargetFrame, /*BSTR bstrProtocol,*/ BSTR * pbstrRetVal);
|
|
STDMETHOD(navigateNoSite)(BSTR bstrUrl, BSTR bstrTargetFrame, /*BSTR bstrProtocol,*/
|
|
DWORD dwhwnd, IUnknown* punk);
|
|
|
|
// IObjectSafety
|
|
STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid,
|
|
DWORD dwSupportedOptions, DWORD dwEnabledOptions);
|
|
|
|
// IElementBehavior
|
|
HRESULT STDMETHODCALLTYPE Init (IElementBehaviorSite __RPC_FAR *pBehaviorSite);
|
|
HRESULT STDMETHODCALLTYPE Notify (LONG lEvent, VARIANT __RPC_FAR *pVar);
|
|
STDMETHOD(Detach)() { return S_OK; };
|
|
|
|
|
|
private:
|
|
// The function that actually does all the navigation.
|
|
// all other (including exported) functions call this one.
|
|
STDMETHOD(navigateInternal)(BSTR bstrUrl, BSTR bstrTargetFrame, /*BSTR bstrProtocol,*/ int iUI, IUnknown* punk);
|
|
|
|
// show UI for four different kinds of errors.
|
|
void ShowNavigationFailedQuestion (BSTR bstrUrl, BSTR bstrTargetFrame);
|
|
void ShowError (HWND hWnd, unsigned int IDSmessage, unsigned int IDStitle, BSTR bstrUrl);
|
|
void ShowNavigationFailed (HWND hWnd, BSTR bstrUrl, BSTR bstrTargetFrame,
|
|
WCHAR * wszResource);
|
|
|
|
// STATIC METHODS
|
|
// --------------
|
|
|
|
public:
|
|
// message handler for my window (the "connecting..." dialog)
|
|
static INT_PTR CALLBACK WaitDlgProc (HWND hDlg, UINT message,
|
|
WPARAM wParam, LPARAM lParam);
|
|
// message handler for a silent, invisible message window that
|
|
// stays around to listen for ParseDisplayName to finish
|
|
static INT_PTR CALLBACK NavMessageProc (HWND hDlg, UINT message, WPARAM wParam,
|
|
LPARAM lParam);
|
|
|
|
private:
|
|
// These two (unexported) functions were taken from the shdocvw code.
|
|
static TARGET_TYPE ParseTargetType(LPCOLESTR pszTarget);
|
|
static HRESULT CreateTargetFrame(LPCOLESTR pszTargetName, LPUNKNOWN *ppunk);
|
|
|
|
// Some helper functions for pidl stuffing
|
|
static HRESULT InitVARIANTFromPidl(LPVARIANT pvar, LPITEMIDLIST pidl);
|
|
static LPSAFEARRAY MakeSafeArrayFromData(LPBYTE pData, DWORD cbData);
|
|
static UINT ILGetSize(LPITEMIDLIST pidl);
|
|
|
|
// My thread proc
|
|
static DWORD WINAPI RunParseDisplayName (LPVOID pArguments);
|
|
|
|
// General helper functions (destined for utils.cxx?)
|
|
static HRESULT NavToPidl (LPITEMIDLIST pidl, BSTR bstrTargetFrame,
|
|
IWebBrowser2 * pwb);
|
|
|
|
// Some code mostly supplied by Chris Guzak that gets a pidl from
|
|
// an url.
|
|
static HRESULT CreateWebFolderIDList(BSTR bstrUrl, LPITEMIDLIST *ppidl, HWND hwnd, IUnknown *punk);
|
|
static void SetScriptErrorMessage (HRESULT hr, BSTR * pbstr);
|
|
|
|
// DATA MEMBERS
|
|
// ------------
|
|
|
|
public:
|
|
IWebBrowser2 * m_pwb;
|
|
HWND m_hwndOwner;
|
|
IElementBehaviorSite *m_pSite;
|
|
};
|
|
|
|
// Using this to pass arguments to my child thread.
|
|
class CThreadArgs
|
|
{
|
|
public:
|
|
CThreadArgs()
|
|
{
|
|
m_bstrUrl = NULL;
|
|
}
|
|
~CThreadArgs()
|
|
{
|
|
SysFreeString (m_bstrUrl);
|
|
}
|
|
|
|
// holds the URL ask office for a pidl with
|
|
BSTR m_bstrUrl;
|
|
// holds the hwnd of the message window, once
|
|
// it is created and initialized. (0 otherwise)
|
|
HWND m_hwndMessage;
|
|
// holds the hwnd of the dialog window, once
|
|
// it is created and initialized. (0 otherwise)
|
|
HWND m_hwndDialog;
|
|
// holds the HRESULT returned by office
|
|
HRESULT m_hrReady;
|
|
// holds the pidl returned by office
|
|
// (this actually only carries the pidl between the
|
|
// message window and the navigateInternal call...
|
|
// the pidl gets from the PDN thread to the message
|
|
// window through the WM_WEBFOLDER_NAV message)
|
|
LPITEMIDLIST m_pidl;
|
|
// Holds the status of the message window
|
|
int m_imsgStatus;
|
|
// Holds the status of the PDN thread
|
|
int m_ipdnStatus;
|
|
};
|
|
|
|
#endif //__HTTPWFH_H_
|