Update of /cvsroot/pywin32/pywin32/com/win32comext/shell/src
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31039/com/win32comext/shell/src
Modified Files:
shell.cpp
Added Files:
PyIEmptyVolumeCache.cpp PyIEmptyVolumeCache.h
PyIEmptyVolumeCacheCallBack.cpp PyIEmptyVolumeCacheCallBack.h
Log Message:
Support for IEmptyVolumeCache, IEmptyVolumeCache2 and
IEmptyVolumeCacheCallBack contributed by Sidnei da Silva from Enfold.
--- NEW FILE: PyIEmptyVolumeCache.h ---
// This file declares the IEmptyVolumeCache Gateway for Python.
// ---------------------------------------------------
//
// Gateway Declaration
class PyGEmptyVolumeCache : public PyGatewayBase, public IEmptyVolumeCache
{
protected:
PyGEmptyVolumeCache(PyObject *instance) : PyGatewayBase(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGEmptyVolumeCache, IEmptyVolumeCache, IID_IEmptyVolumeCache, PyGatewayBase)
// IEmptyVolumeCache
STDMETHOD(Initialize)(
HKEY hkRegKey,
LPCWSTR pcwszVolume,
LPWSTR * ppwszDisplayName,
LPWSTR * ppwszDescription,
DWORD * pdwFlags);
STDMETHOD(GetSpaceUsed)(
DWORDLONG * pdwlSpaceUsed,
IEmptyVolumeCacheCallBack * picb);
STDMETHOD(Purge)(
DWORDLONG dwlSpaceToFree,
IEmptyVolumeCacheCallBack * picb);
STDMETHOD(ShowProperties)(
HWND hwnd);
STDMETHOD(Deactivate)(
DWORD * pdwFlags);
};
class PyGEmptyVolumeCache2 : public PyGEmptyVolumeCache, public IEmptyVolumeCache2
{
protected:
PyGEmptyVolumeCache2(PyObject *instance) : PyGEmptyVolumeCache(instance) { ; }
PYGATEWAY_MAKE_SUPPORT2(PyGEmptyVolumeCache2, IEmptyVolumeCache2, IID_IEmptyVolumeCache2, PyGEmptyVolumeCache)
// IEmptyVolumeCache
STDMETHOD(Initialize)(
HKEY hkRegKey,
LPCWSTR pcwszVolume,
LPWSTR * ppwszDisplayName,
LPWSTR * ppwszDescription,
DWORD * pdwFlags) {
return PyGEmptyVolumeCache::Initialize(hkRegKey, pcwszVolume, ppwszDisplayName, ppwszDescription, pdwFlags);
}
STDMETHOD(GetSpaceUsed)(
DWORDLONG * pdwlSpaceUsed,
IEmptyVolumeCacheCallBack * picb) {
return PyGEmptyVolumeCache::GetSpaceUsed(pdwlSpaceUsed, picb);
}
STDMETHOD(Purge)(
DWORDLONG dwlSpaceToFree,
IEmptyVolumeCacheCallBack * picb) {
return PyGEmptyVolumeCache::Purge(dwlSpaceToFree, picb);
}
STDMETHOD(ShowProperties)(
HWND hwnd) {
return PyGEmptyVolumeCache::ShowProperties(hwnd);
}
STDMETHOD(Deactivate)(
DWORD * pdwFlags) {
return PyGEmptyVolumeCache::Deactivate(pdwFlags);
}
// IEmptyVolumeCache2
STDMETHOD(InitializeEx)(
HKEY hkRegKey,
LPCWSTR pcwszVolume,
LPCWSTR pcwszKeyName,
LPWSTR * ppwszDisplayName,
LPWSTR * ppwszDescription,
LPWSTR * ppwszBtnText,
DWORD * pdwFlags);
};
--- NEW FILE: PyIEmptyVolumeCacheCallBack.cpp ---
// This file implements the IEmptyVolumeCacheCallBack Interface and Gateway for Python.
// Generated by makegw.py
#include "shell_pch.h"
#include "EmptyVC.h"
#include "PyIEmptyVolumeCacheCallBack.h"
// @doc - This file contains autoduck documentation
// @object PyIEmptyVolumeCacheCallBack|Callback used by <o PyIEmptyVolumeCacheCallBack>
// ---------------------------------------------------
//
// Interface Implementation
PyIEmptyVolumeCacheCallBack::PyIEmptyVolumeCacheCallBack(IUnknown *pdisp):
PyIUnknown(pdisp)
{
ob_type = &type;
}
PyIEmptyVolumeCacheCallBack::~PyIEmptyVolumeCacheCallBack()
{
}
/* static */ IEmptyVolumeCacheCallBack *PyIEmptyVolumeCacheCallBack::GetI(PyObject *self)
{
return (IEmptyVolumeCacheCallBack *)PyIUnknown::GetI(self);
}
// @pymethod |PyIEmptyVolumeCacheCallBack|ScanProgress|Description of ScanProgress.
PyObject *PyIEmptyVolumeCacheCallBack::ScanProgress(PyObject *self, PyObject *args)
{
IEmptyVolumeCacheCallBack *pIEVCCB = GetI(self);
if ( pIEVCCB == NULL )
return NULL;
DWORDLONG dwlSpaceUsed;
PyObject *obdwlSpaceUsed;
// @pyparm long|dwlSpaceUsed||Description for dwlSpaceUsed
// @pyparm int|dwFlags||Description for dwFlags
// @pyparm unicode|pcwszStatus||Description for pcwszStatus
PyObject *obpcwszStatus;
DWORD dwFlags;
LPWSTR pcwszStatus;
if ( !PyArg_ParseTuple(args, "OkO:ScanProgress", &obdwlSpaceUsed, &dwFlags, &obpcwszStatus) )
return NULL;
dwlSpaceUsed = PyLong_AsUnsignedLongLong(obdwlSpaceUsed);
if (dwlSpaceUsed == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())
return NULL;
if (!PyWinObject_AsWCHAR(obpcwszStatus, &pcwszStatus))
return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pIEVCCB->ScanProgress( dwlSpaceUsed, dwFlags, pcwszStatus );
SysFreeString(pcwszStatus);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pIEVCCB, IID_IEmptyVolumeCacheCallBack );
Py_INCREF(Py_None);
return Py_None;
}
// @pymethod |PyIEmptyVolumeCacheCallBack|PurgeProgress|Description of PurgeProgress.
PyObject *PyIEmptyVolumeCacheCallBack::PurgeProgress(PyObject *self, PyObject *args)
{
IEmptyVolumeCacheCallBack *pIEVCCB = GetI(self);
if ( pIEVCCB == NULL )
return NULL;
DWORDLONG dwlSpaceFreed;
PyObject *obdwlSpaceFreed;
// @pyparm <o PyDWORDLONG>|dwlSpaceFreed||Description for dwlSpaceFreed
DWORDLONG dwlSpaceToFree;
PyObject *obdwlSpaceToFree;
// @pyparm long|spaceFreed||
// @pyparm long|spaceToFree||
// @pyparm long|flags||
// @pyparm unicode|status||
PyObject *obpcwszStatus;
DWORD dwFlags;
LPWSTR pcwszStatus;
if ( !PyArg_ParseTuple(args, "OOlO:PurgeProgress", &obdwlSpaceFreed, &obdwlSpaceToFree, &dwFlags, &obpcwszStatus) )
return NULL;
dwlSpaceFreed = PyLong_AsUnsignedLongLong(obdwlSpaceFreed);
if (dwlSpaceFreed == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) return NULL;
dwlSpaceToFree = PyLong_AsUnsignedLongLong(obdwlSpaceToFree);
if (dwlSpaceToFree == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred()) return NULL;
if (!PyWinObject_AsWCHAR(obpcwszStatus, &pcwszStatus))
return NULL;
HRESULT hr;
PY_INTERFACE_PRECALL;
hr = pIEVCCB->PurgeProgress( dwlSpaceFreed, dwlSpaceToFree, dwFlags, pcwszStatus );
SysFreeString(pcwszStatus);
PY_INTERFACE_POSTCALL;
if ( FAILED(hr) )
return PyCom_BuildPyException(hr, pIEVCCB, IID_IEmptyVolumeCacheCallBack );
Py_INCREF(Py_None);
return Py_None;
}
// @object PyIEmptyVolumeCacheCallBack|Description of the interface
static struct PyMethodDef PyIEmptyVolumeCacheCallBack_methods[] =
{
{ "ScanProgress", PyIEmptyVolumeCacheCallBack::ScanProgress, 1 }, // @pymeth ScanProgress|Description of ScanProgress
{ "PurgeProgress", PyIEmptyVolumeCacheCallBack::PurgeProgress, 1 }, // @pymeth PurgeProgress|Description of PurgeProgress
{ NULL }
};
PyComTypeObject PyIEmptyVolumeCacheCallBack::type("PyIEmptyVolumeCacheCallBack",
&PyIUnknown::type,
sizeof(PyIEmptyVolumeCacheCallBack),
PyIEmptyVolumeCacheCallBack_methods,
GET_PYCOM_CTOR(PyIEmptyVolumeCacheCallBack));
--- NEW FILE: PyIEmptyVolumeCacheCallBack.h ---
// This file declares the IEmptyVolumeCacheCallBack Interface for Python.
// ---------------------------------------------------
//
// Interface Declaration
class PyIEmptyVolumeCacheCallBack : public PyIUnknown
{
public:
MAKE_PYCOM_CTOR(PyIEmptyVolumeCacheCallBack);
static IEmptyVolumeCacheCallBack *GetI(PyObject *self);
static PyComTypeObject type;
// The Python methods
static PyObject *ScanProgress(PyObject *self, PyObject *args);
static PyObject *PurgeProgress(PyObject *self, PyObject *args);
protected:
PyIEmptyVolumeCacheCallBack(IUnknown *pdisp);
~PyIEmptyVolumeCacheCallBack();
};
Index: shell.cpp
===================================================================
RCS file: /cvsroot/pywin32/pywin32/com/win32comext/shell/src/shell.cpp,v
retrieving revision 1.50
retrieving revision 1.51
diff -C2 -d -r1.50 -r1.51
*** shell.cpp 12 Feb 2007 07:38:57 -0000 1.50
--- shell.cpp 15 Feb 2007 13:11:02 -0000 1.51
***************
*** 14,17 ****
--- 14,18 ----
#include "shell_pch.h"
+ #include "EmptyVC.h"
#include "PyIShellLink.h"
#include "PyIContextMenu.h"
***************
*** 19,22 ****
--- 20,25 ----
#include "PyIShellExtInit.h"
#include "PyIShellFolder.h"
+ #include "PyIEmptyVolumeCache.h"
+ #include "PyIEmptyVolumeCacheCallBack.h"
#include "PyIEnumIDList.h"
#include "PyICopyHook.h"
***************
*** 2318,2324 ****
--- 2321,2330 ----
PYCOM_INTERFACE_FULL(ColumnProvider),
PYCOM_INTERFACE_FULL(DropTargetHelper),
+ PYCOM_INTERFACE_CLIENT_ONLY(EmptyVolumeCacheCallBack),
PYCOM_INTERFACE_CLIENT_ONLY(QueryAssociations),
PYCOM_INTERFACE_SERVER_ONLY(DeskBand),
PYCOM_INTERFACE_SERVER_ONLY(DockingWindow),
+ PYCOM_INTERFACE_SERVER_ONLY(EmptyVolumeCache),
+ PYCOM_INTERFACE_SERVER_ONLY(EmptyVolumeCache2),
// IID_ICopyHook doesn't exist - hack it up
{ &IID_IShellCopyHook, "IShellCopyHook", "IID_IShellCopyHook", &PyICopyHook::type, GET_PYGATEWAY_CTOR(PyGCopyHook) },
--- NEW FILE: PyIEmptyVolumeCache.cpp ---
// This file implements the IEmptyVolumeCache Gateway for Python.
#include "shell_pch.h"
#include "EmptyVC.h"
#include "PyIEmptyVolumeCache.h"
// @doc - This file contains autoduck documentation
// @object PyIEmptyVolumeCache|Used for cleaning up temporary file ("disk cleanup")
// @comm This is a "gateway" object only - you can only implement this
// interface - see the shell/demos/server/empty_volume_cache.py. The methods
// described here are the methods you must implement - you can't call them.
// <nl>Please contribute to these docs!
// @pymeth PyIEmptyVolumeCache|Initialize
// @pymeth PyIEmptyVolumeCache|GetSpaceUsed
// @pymeth PyIEmptyVolumeCache|Purge
// @pymeth PyIEmptyVolumeCache|ShowProperties
// @pymeth PyIEmptyVolumeCache2|InitializeEx
//
// ---------------------------------------------------
//
// Gateway Implementation
// @pymethod |PyIEmptyVolumeCache|Initialize|
STDMETHODIMP PyGEmptyVolumeCache::Initialize(
/* [in] */ HKEY hkRegKey,
/* [in] */ LPCWSTR pcwszVolume,
/* [out] */ LPWSTR * ppwszDisplayName,
/* [out] */ LPWSTR * ppwszDescription,
/* [out] */ DWORD * pdwFlags)
{
PY_GATEWAY_METHOD;
HRESULT hr;
BOOL bPythonIsHappy = TRUE;
ULONG dwFlags;
PyObject *result;
PyObject *obppwszDisplayName;
PyObject *obppwszDescription;
PyObject *obpcwszVolume = NULL;
PyObject *obhkRegKey = PyWinObject_FromHKEY(hkRegKey);
if (obhkRegKey==NULL) goto args_failed;
if (!(obpcwszVolume = MakeOLECHARToObj(pcwszVolume))) goto args_failed;
hr=InvokeViaPolicy("Initialize", &result, "NNk", obhkRegKey, obpcwszVolume, *pdwFlags);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
if (!PyTuple_Check(result)) {
PyErr_Format(PyExc_TypeError,
"Initialize must return a tuple of (unicode, unicode, long) - got '%s'",
result->ob_type->tp_name);
bPythonIsHappy = FALSE;
}
if (bPythonIsHappy && !PyArg_ParseTuple(result, "OOl" , &obppwszDisplayName, &obppwszDescription, &dwFlags))
bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsWCHAR(obppwszDisplayName, ppwszDisplayName)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsWCHAR(obppwszDescription, ppwszDescription)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_SetAndLogCOMErrorFromPyException("Initialize", IID_IEmptyVolumeCache);
if (pdwFlags) *pdwFlags = dwFlags;
Py_DECREF(result);
return hr;
args_failed:
// only hit on error convering input args, not normal exit.
Py_XDECREF(obhkRegKey);
Py_XDECREF(obpcwszVolume);
return MAKE_PYCOM_GATEWAY_FAILURE_CODE("Initialize");
}
// @pymethod |PyIEmptyVolumeCache|GetSpaceUsed|
STDMETHODIMP PyGEmptyVolumeCache::GetSpaceUsed(
/* [out] */ DWORDLONG * pdwlSpaceUsed,
/* [in] */ IEmptyVolumeCacheCallBack * picb)
{
PY_GATEWAY_METHOD;
PyObject *obpicb;
obpicb = PyCom_PyObjectFromIUnknown(picb, IID_IEmptyVolumeCacheCallBack, TRUE);
if (!obpicb)
return MAKE_PYCOM_GATEWAY_FAILURE_CODE("GetSpaceUsed");
PyObject *result;
HRESULT hr=InvokeViaPolicy("GetSpaceUsed", &result, "O", obpicb);
Py_XDECREF(obpicb);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
if (!PyWinObject_AsUPY_LONG_LONG(result, pdwlSpaceUsed)) {
PyErr_Format(PyExc_TypeError,
"GetSpaceUsed must return a long - got '%s'",
result->ob_type->tp_name);
hr = PyCom_SetAndLogCOMErrorFromPyException("GetSpaceUsed", IID_IEmptyVolumeCache);
}
Py_DECREF(result);
return hr;
}
// @pymethod |PyIEmptyVolumeCache|Purge|
STDMETHODIMP PyGEmptyVolumeCache::Purge(
/* [in] */ DWORDLONG dwlSpaceToFree,
/* [in] */ IEmptyVolumeCacheCallBack * picb)
{
PY_GATEWAY_METHOD;
PyObject *obdwlSpaceToFree = PyLong_FromUnsignedLongLong(dwlSpaceToFree);
if (obdwlSpaceToFree==NULL) return MAKE_PYCOM_GATEWAY_FAILURE_CODE("Purge");
PyObject *obpicb;
obpicb = PyCom_PyObjectFromIUnknown(picb, IID_IEmptyVolumeCacheCallBack, TRUE);
if (!obpicb) {
Py_DECREF(obdwlSpaceToFree);
return MAKE_PYCOM_GATEWAY_FAILURE_CODE("Purge");
}
return InvokeViaPolicy("Purge", NULL, "NN", obdwlSpaceToFree, obpicb);
}
// @pymethod |PyIEmptyVolumeCache|ShowProperties|
STDMETHODIMP PyGEmptyVolumeCache::ShowProperties(
/* [in] */ HWND hwnd)
{
PY_GATEWAY_METHOD;
return InvokeViaPolicy("ShowProperties", NULL, "N", PyWinLong_FromHANDLE(hwnd));
}
// @pymethod |PyIEmptyVolumeCache|Deactivate|
STDMETHODIMP PyGEmptyVolumeCache::Deactivate(
/* [out] */ DWORD * pdwFlags)
{
PY_GATEWAY_METHOD;
PyObject *result;
HRESULT hr=InvokeViaPolicy("Deactivate", &result);
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
BOOL bPythonIsHappy = TRUE;
if (!PyWinObject_AsUPY_LONG_LONG(result, pdwFlags)) {
PyErr_Format(PyExc_TypeError,
"Deactivate must return a long - got '%s'",
result->ob_type->tp_name);
hr = PyCom_SetAndLogCOMErrorFromPyException("Deactivate", IID_IEmptyVolumeCache);
}
Py_DECREF(result);
return hr;
}
// IEmptyVolumeCache2
// @object PyIEmptyVolumeCache2|See also <o PyIEmptyVolumeCache>
// @pymeth PyIEmptyVolumeCache|Deactivate
// @pymethod |PyIEmptyVolumeCache2|InitializeEx|
STDMETHODIMP PyGEmptyVolumeCache2::InitializeEx(
/* [in] */ HKEY hkRegKey,
/* [in] */ LPCWSTR pcwszVolume,
/* [in] */ LPCWSTR pcwszKeyName,
/* [out] */ LPWSTR * ppwszDisplayName,
/* [out] */ LPWSTR * ppwszDescription,
/* [out] */ LPWSTR * ppwszBtnText,
/* [out] */ DWORD * pdwFlags)
{
PY_GATEWAY_METHOD;
BOOL bPythonIsHappy = TRUE;
ULONG dwFlags;
HRESULT hr;
PyObject *result;
PyObject *obppwszDisplayName;
PyObject *obppwszDescription;
PyObject *obppwszBtnText;
PyObject *obpcwszVolume = NULL;
PyObject *obpcwszKeyName = NULL;
PyObject *obhkRegKey = PyWinObject_FromHKEY(hkRegKey);
if (!obhkRegKey) goto args_failed;
if (!(obpcwszVolume = MakeOLECHARToObj(pcwszVolume))) goto args_failed;
if (!(obpcwszKeyName = MakeOLECHARToObj(pcwszKeyName))) goto args_failed;
hr=InvokeViaPolicy("InitializeEx", &result, "NNNk", obhkRegKey, obpcwszVolume, obpcwszKeyName, *pdwFlags);
// NOTE: From here, do *not* exit via args_failed - the args have been cleaned up
if (FAILED(hr)) return hr;
// Process the Python results, and convert back to the real params
if (!PyTuple_Check(result)) {
PyErr_Format(PyExc_TypeError,
"Initialize must return a tuple of (unicode, unicode, unicode, long) - got '%s'",
result->ob_type->tp_name);
bPythonIsHappy = FALSE;
}
if (bPythonIsHappy && !PyArg_ParseTuple(result, "OOOl" , &obppwszDisplayName, &obppwszDescription, &obppwszBtnText, &dwFlags))
bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsWCHAR(obppwszDisplayName, ppwszDisplayName)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsWCHAR(obppwszDescription, ppwszDescription)) bPythonIsHappy = FALSE;
if (bPythonIsHappy && !PyWinObject_AsWCHAR(obppwszBtnText, ppwszBtnText)) bPythonIsHappy = FALSE;
if (!bPythonIsHappy) hr = PyCom_SetAndLogCOMErrorFromPyException("InitializeEx", IID_IEmptyVolumeCache);
if (pdwFlags) *pdwFlags = dwFlags;
Py_DECREF(result);
return hr;
args_failed:
// only hit on error convering input args, not normal exit.
Py_XDECREF(obhkRegKey);
Py_XDECREF(obpcwszVolume);
Py_XDECREF(obpcwszKeyName);
return MAKE_PYCOM_GATEWAY_FAILURE_CODE("InitializeEx");
}
|