Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

252 lines
9.5 KiB

/*******************************************************************************
*
* (C) COPYRIGHT MICROSOFT CORPORATION, 2000
*
* TITLE: RUNNPWIZ.CPP
*
* VERSION: 1.0
*
* AUTHOR: ShaunIv
*
* DATE: 6/15/2000
*
* DESCRIPTION: Runs the Web Publishing Wizard
*
*******************************************************************************/
#include "precomp.h"
#pragma hdrstop
#include <windows.h>
#include <atlbase.h>
#include "runnpwiz.h"
#include <simidlst.h>
#include <shellext.h>
#include <shlobj.h>
#include <shlguid.h>
#include <shlwapi.h>
#include <wiadebug.h>
#include <simreg.h>
namespace NetPublishingWizard
{
static const TCHAR *c_pszPublishWizardSuffix = TEXT(".publishwizard");
static const TCHAR *c_pszClassIdPrefix = TEXT("CLSID\\");
HRESULT GetClassIdOfPublishingWizard( CLSID &clsidWizard )
{
WIA_PUSH_FUNCTION((TEXT("GetClassIdOfPublishingWizard")));
//
// Assume failure
//
HRESULT hr = E_FAIL;
//
// Try to get the class id from the registry
//
CSimpleString strWizardClsid = CSimpleReg( HKEY_CLASSES_ROOT, c_pszPublishWizardSuffix, false, KEY_READ ).Query( TEXT(""), TEXT("") );
WIA_TRACE((TEXT("strWizardClsid = %s"), strWizardClsid.String()));
//
// Make sure we have a string, and make sure the CLSID\ prefix is there
//
if (strWizardClsid.Length() && strWizardClsid.Left(lstrlen(c_pszClassIdPrefix)).ToUpper() == CSimpleString(c_pszClassIdPrefix))
{
//
// Convert the string, minus the CLSID\, to a CLSID
//
hr = CLSIDFromString( const_cast<LPOLESTR>(CSimpleStringConvert::WideString(strWizardClsid.Right(strWizardClsid.Length()-6)).String()), &clsidWizard );
}
return hr;
}
HRESULT RunNetPublishingWizard( const CSimpleDynamicArray<CSimpleString> &strFiles )
{
WIA_PUSH_FUNCTION((TEXT("RunNetPublishingWizard")));
HRESULT hr;
//
// Make sure there are some files in the list
//
if (strFiles.Size())
{
//
// Get the CLSID of the publishing wizard from the registry
//
CLSID clsidWizard = IID_NULL;
hr = GetClassIdOfPublishingWizard(clsidWizard);
if (SUCCEEDED(hr))
{
WIA_PRINTGUID((clsidWizard,TEXT("Wizard class ID")));
//
// Get the data object for this list of files
//
CComPtr<IDataObject> pDataObject;
hr = CreateDataObjectFromFileList( strFiles, &pDataObject );
if (SUCCEEDED(hr))
{
//
// Create the wizard
//
CComPtr<IDropTarget> pDropTarget;
hr = CoCreateInstance( clsidWizard, NULL, CLSCTX_INPROC_SERVER, IID_IDropTarget, (void**)&pDropTarget );
if (SUCCEEDED(hr))
{
//
// Perform the drop
//
DWORD dwEffect = DROPEFFECT_LINK | DROPEFFECT_MOVE | DROPEFFECT_COPY;
POINTL pt = { 0, 0 };
hr = pDropTarget->Drop( pDataObject, 0, pt, &dwEffect );
}
}
}
}
else
{
hr = E_INVALIDARG;
}
if (FAILED(hr))
{
WIA_PRINTHRESULT((hr,TEXT("RunNetPublishingWizard is returning")));
}
return hr;
}
HRESULT CreateDataObjectFromFileList( const CSimpleDynamicArray<CSimpleString> &strFiles, IDataObject **ppDataObject )
{
WIA_PUSH_FUNCTION((TEXT("CreateDataObjectFromFileList")));
HRESULT hr;
//
// Make sure there are some files in the list
//
if (strFiles.Size())
{
//
// Get the desktop folder
//
CComPtr<IShellFolder> pDesktopFolder;
hr = SHGetDesktopFolder( &pDesktopFolder );
if (SUCCEEDED(hr) && pDesktopFolder.p)
{
//
// Allocate memory to hold the source folder name
//
LPTSTR pszPath = new TCHAR[strFiles[0].Length()+1];
if (pszPath)
{
//
// Copy the first filename to the folder name, and remove all but the directory
//
lstrcpy( pszPath, strFiles[0] );
if (PathRemoveFileSpec(pszPath))
{
//
// Get the pidl for the source folder
//
LPITEMIDLIST pidlFolder;
hr = pDesktopFolder->ParseDisplayName( NULL, NULL, const_cast<LPWSTR>(CSimpleStringConvert::WideString(CSimpleString(pszPath)).String()), NULL, &pidlFolder, NULL );
if (SUCCEEDED(hr))
{
WIA_TRACE((TEXT("pidlFolder: %s"), CSimpleIdList(pidlFolder).Name().String()));
//
// Get an IShellFolder for the source folder
//
CComPtr<IShellFolder> pSourceFolder;
hr = pDesktopFolder->BindToObject( pidlFolder, NULL, IID_IShellFolder, (void**)&pSourceFolder );
ILFree(pidlFolder);
if (SUCCEEDED(hr) && pSourceFolder.p)
{
//
// Create an array of pidls to hold the files
//
LPITEMIDLIST *pidlItems = new LPITEMIDLIST[strFiles.Size()];
if (pidlItems)
{
//
// Make sure we start out with NULL pidls
//
ZeroMemory( pidlItems, sizeof(LPITEMIDLIST)*strFiles.Size() );
//
// Get the pidls for the files
//
for (int i=0;i<strFiles.Size();i++)
{
//
// Get the filename alone. We want relative pidls.
//
CSimpleString strFilename = PathFindFileName(strFiles[i]);
WIA_TRACE((TEXT("strFilename = %s"), strFilename.String()));
//
// Create the relative pidl
//
hr = pSourceFolder->ParseDisplayName( NULL, NULL, const_cast<LPWSTR>(CSimpleStringConvert::WideString(strFilename).String()), NULL, pidlItems+i, NULL );
if (FAILED(hr))
{
WIA_PRINTHRESULT((hr,TEXT("pSourceFolder->ParseDisplayName returned")));
break;
}
}
//
// Make sure everything is still going OK
//
if (SUCCEEDED(hr))
{
//
// Get the IDataObject for the source folder, and give it the list of file pidls
//
hr = pSourceFolder->GetUIObjectOf( NULL, strFiles.Size(), const_cast<LPCITEMIDLIST*>(pidlItems), IID_IDataObject, NULL, reinterpret_cast<LPVOID*>(ppDataObject) );
}
for (int i=0;i<strFiles.Size();i++)
{
if (pidlItems[i])
{
ILFree(pidlItems[i]);
}
}
delete [] pidlItems;
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
}
else
{
hr = E_FAIL;
}
//
// Free the folder name
//
delete[] pszPath;
}
else
{
hr = E_OUTOFMEMORY;
}
}
}
else
{
hr = E_INVALIDARG;
}
if (FAILED(hr))
{
WIA_PRINTHRESULT((hr,TEXT("CreateDataObjectFromFileList is returning")));
}
return hr;
}
}