changeset 977f4f21ae8b in /hgroot/pywin32/pywin32
details: http://pywin32.hg.sourceforge.net/hgweb/pywin32/pywin32/hgroot/pywin32/pywin32?cmd=changeset;node=977f4f21ae8b
summary: Add IKnownFolder and IKnownFolderManager
diffstat:
com/win32comext/shell/knownfolders.py | 98 -----
com/win32comext/shell/shellcon.py | 40 ++
com/win32comext/shell/src/PyIKnownFolder.cpp | 250 ++++++++++++++
com/win32comext/shell/src/PyIKnownFolder.h | 28 +
com/win32comext/shell/src/PyIKnownFolderManager.cpp | 343 ++++++++++++++++++++
com/win32comext/shell/src/PyIKnownFolderManager.h | 29 +
com/win32comext/shell/src/shell.cpp | 114 ++++++
setup.py | 2 +
8 files changed, 806 insertions(+), 98 deletions(-)
diffs (truncated from 964 to 300 lines):
diff -r bec283d926a5 -r 977f4f21ae8b com/win32comext/shell/knownfolders.py
--- a/com/win32comext/shell/knownfolders.py Tue Aug 28 01:12:51 2012 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-# from KnownFolders.h
-# legacy CSIDL value: CSIDL_NETWORK
-# display name: "Network"
-# legacy display name: "My Network Places"
-# default path:
-FOLDERID_NetworkFolder = "{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}"
-FOLDERID_ComputerFolder = "{0AC0837C-BBF8-452A-850D-79D08E667CA7}"
-FOLDERID_InternetFolder = "{4D9F7874-4E0C-4904-967B-40B0D20C3E4B}"
-FOLDERID_ControlPanelFolder = "{82A74AEB-AEB4-465C-A014-D097EE346D63}"
-FOLDERID_PrintersFolder = "{76FC4E2D-D6AD-4519-A663-37BD56068185}"
-FOLDERID_SyncManagerFolder = "{43668BF8-C14E-49B2-97C9-747784D784B7}"
-FOLDERID_SyncSetupFolder = "{0F214138-B1D3-4a90-BBA9-27CBC0C5389A}"
-FOLDERID_ConflictFolder = "{4bfefb45-347d-4006-a5be-ac0cb0567192}"
-FOLDERID_SyncResultsFolder = "{289a9a43-be44-4057-a41b-587a76d7e7f9}"
-FOLDERID_RecycleBinFolder = "{B7534046-3ECB-4C18-BE4E-64CD4CB7D6AC}"
-FOLDERID_ConnectionsFolder = "{6F0CD92B-2E97-45D1-88FF-B0D186B8DEDD}"
-FOLDERID_Fonts = "{FD228CB7-AE11-4AE3-864C-16F3910AB8FE}"
-
-# display name: "Desktop"
-# default path: "C:\Users\<UserName>\Desktop"
-# legacy default path: "C:\Documents and Settings\<userName>\Desktop"
-# legacy CSIDL value: CSIDL_DESKTOP
-FOLDERID_Desktop = "{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}"
-FOLDERID_Startup = "{B97D20BB-F46A-4C97-BA10-5E3608430854}"
-FOLDERID_Programs = "{A77F5D77-2E2B-44C3-A6A2-ABA601054A51}"
-FOLDERID_StartMenu = "{625B53C3-AB48-4EC1-BA1F-A1EF4146FC19}"
-FOLDERID_Recent = "{AE50C081-EBD2-438A-8655-8A092E34987A}"
-FOLDERID_SendTo = "{8983036C-27C0-404B-8F08-102D10DCFD74}"
-FOLDERID_Documents = "{FDD39AD0-238F-46AF-ADB4-6C85480369C7}"
-FOLDERID_Favorites = "{1777F761-68AD-4D8A-87BD-30B759FA33DD}"
-FOLDERID_NetHood = "{C5ABBF53-E17F-4121-8900-86626FC2C973}"
-FOLDERID_PrintHood = "{9274BD8D-CFD1-41C3-B35E-B13F55A758F4}"
-FOLDERID_Templates = "{A63293E8-664E-48DB-A079-DF759E0509F7}"
-FOLDERID_CommonStartup = "{82A5EA35-D9CD-47C5-9629-E15D2F714E6E}"
-FOLDERID_CommonPrograms = "{0139D44E-6AFE-49F2-8690-3DAFCAE6FFB8}"
-FOLDERID_CommonStartMenu = "{A4115719-D62E-491D-AA7C-E74B8BE3B067}"
-FOLDERID_PublicDesktop = "{C4AA340D-F20F-4863-AFEF-F87EF2E6BA25}"
-FOLDERID_ProgramData = "{62AB5D82-FDC1-4DC3-A9DD-070D1D495D97}"
-FOLDERID_CommonTemplates = "{B94237E7-57AC-4347-9151-B08C6C32D1F7}"
-FOLDERID_PublicDocuments = "{ED4824AF-DCE4-45A8-81E2-FC7965083634}"
-FOLDERID_RoamingAppData = "{3EB685DB-65F9-4CF6-A03A-E3EF65729F3D}"
-FOLDERID_LocalAppData = "{F1B32785-6FBA-4FCF-9D55-7B8E7F157091}"
-FOLDERID_LocalAppDataLow = "{A520A1A4-1780-4FF6-BD18-167343C5AF16}"
-FOLDERID_InternetCache = "{352481E8-33BE-4251-BA85-6007CAEDCF9D}"
-FOLDERID_Cookies = "{2B0F765D-C0E9-4171-908E-08A611B84FF6}"
-FOLDERID_History = "{D9DC8A3B-B784-432E-A781-5A1130A75963}"
-FOLDERID_System = "{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}"
-FOLDERID_SystemX86 = "{D65231B0-B2F1-4857-A4CE-A8E7C6EA7D27}"
-FOLDERID_Windows = "{F38BF404-1D43-42F2-9305-67DE0B28FC23}"
-FOLDERID_Profile = "{5E6C858F-0E22-4760-9AFE-EA3317B67173}"
-FOLDERID_Pictures = "{33E28130-4E1E-4676-835A-98395C3BC3BB}"
-FOLDERID_ProgramFilesX86 = "{7C5A40EF-A0FB-4BFC-874A-C0F2E0B9FA8E}"
-FOLDERID_ProgramFilesCommonX86 = "{DE974D24-D9C6-4D3E-BF91-F4455120B917}"
-FOLDERID_ProgramFilesX64 = "{6D809377-6AF0-444b-8957-A3773F02200E}"
-FOLDERID_ProgramFilesCommonX64 = "{6365D5A7-0F0D-45e5-87F6-0DA56B6A4F7D}"
-FOLDERID_ProgramFiles = "{905e63b6-c1bf-494e-b29c-65b732d3d21a}"
-FOLDERID_ProgramFilesCommon = "{F7F1ED05-9F6D-47A2-AAAE-29D317C6F066}"
-FOLDERID_AdminTools = "{724EF170-A42D-4FEF-9F26-B60E846FBA4F}"
-FOLDERID_CommonAdminTools = "{D0384E7D-BAC3-4797-8F14-CBA229B392B5}"
-FOLDERID_Music = "{4BD8D571-6D19-48D3-BE97-422220080E43}"
-FOLDERID_Videos = "{18989B1D-99B5-455B-841C-AB7C74E4DDFC}"
-FOLDERID_PublicPictures = "{B6EBFB86-6907-413C-9AF7-4FC2ABF07CC5}"
-FOLDERID_PublicMusic = "{3214FAB5-9757-4298-BB61-92A9DEAA44FF}"
-FOLDERID_PublicVideos = "{2400183A-6185-49FB-A2D8-4A392A602BA3}"
-FOLDERID_ResourceDir = "{8AD10C31-2ADB-4296-A8F7-E4701232C972}"
-FOLDERID_LocalizedResourcesDir = "{2A00375E-224C-49DE-B8D1-440DF7EF3DDC}"
-FOLDERID_CommonOEMLinks = "{C1BAE2D0-10DF-4334-BEDD-7AA20B227A9D}"
-FOLDERID_CDBurning = "{9E52AB10-F80D-49DF-ACB8-4330F5687855}"
-FOLDERID_UserProfiles = "{0762D272-C50A-4BB0-A382-697DCD729B80}"
-FOLDERID_Playlists = "{DE92C1C7-837F-4F69-A3BB-86E631204A23}"
-FOLDERID_SamplePlaylists = "{15CA69B3-30EE-49C1-ACE1-6B5EC372AFB5}"
-FOLDERID_SampleMusic = "{B250C668-F57D-4EE1-A63C-290EE7D1AA1F}"
-FOLDERID_SamplePictures = "{C4900540-2379-4C75-844B-64E6FAF8716B}"
-FOLDERID_SampleVideos = "{859EAD94-2E85-48AD-A71A-0969CB56A6CD}"
-FOLDERID_PhotoAlbums = "{69D2CF90-FC33-4FB7-9A0C-EBB0F0FCB43C}"
-FOLDERID_Public = "{DFDF76A2-C82A-4D63-906A-5644AC457385}"
-FOLDERID_ChangeRemovePrograms = "{df7266ac-9274-4867-8d55-3bd661de872d}"
-FOLDERID_AppUpdates = "{a305ce99-f527-492b-8b1a-7e76fa98d6e4}"
-FOLDERID_AddNewPrograms = "{de61d971-5ebc-4f02-a3a9-6c82895e5c04}"
-FOLDERID_Downloads = "{374DE290-123F-4565-9164-39C4925E467B}"
-FOLDERID_PublicDownloads = "{3D644C9B-1FB8-4f30-9B45-F670235F79C0}"
-FOLDERID_SavedSearches = "{7d1d3a04-debb-4115-95cf-2f29da2920da}"
-FOLDERID_QuickLaunch = "{52a4f021-7b75-48a9-9f6b-4b87a210bc8f}"
-FOLDERID_Contacts = "{56784854-C6CB-462b-8169-88E350ACB882}"
-FOLDERID_SidebarParts = "{A75D362E-50FC-4fb7-AC2C-A8BEAA314493}"
-FOLDERID_SidebarDefaultParts = "{7B396E54-9EC5-4300-BE0A-2482EBAE1A26}"
-FOLDERID_TreeProperties = "{5b3749ad-b49f-49c1-83eb-15370fbd4882}"
-FOLDERID_PublicGameTasks = "{DEBF2536-E1A8-4c59-B6A2-414586476AEA}"
-FOLDERID_GameTasks = "{054FAE61-4DD8-4787-80B6-090220C4B700}"
-FOLDERID_SavedGames = "{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}"
-FOLDERID_Games = "{CAC52C1A-B53D-4edc-92D7-6B2E8AC19434}"
-FOLDERID_RecordedTV = "{bd85e001-112e-431e-983b-7b15ac09fff1}"
-FOLDERID_SEARCH_MAPI = "{98ec0e18-2098-4d44-8644-66979315a281}"
-FOLDERID_SEARCH_CSC = "{ee32e446-31ca-4aba-814f-a5ebd2fd6d5e}"
-FOLDERID_Links = "{bfb9d5e0-c6a9-404c-b2b2-ae6db6af4968}"
-FOLDERID_UsersFiles = "{f3ce0f7c-4901-4acc-8648-d5d44b04ef8f}"
-FOLDERID_SearchHome = "{190337d1-b8ca-4121-a639-6d472d16972a}"
-FOLDERID_OriginalImages = "{2C36C0AA-5812-4b87-BFD0-4CD0DFB19B39}"
diff -r bec283d926a5 -r 977f4f21ae8b com/win32comext/shell/shellcon.py
--- a/com/win32comext/shell/shellcon.py Tue Aug 28 01:12:51 2012 -0400
+++ b/com/win32comext/shell/shellcon.py Mon Sep 10 17:23:43 2012 -0400
@@ -1286,3 +1286,43 @@
## STR_PROPERTYBAG_PARAM
STR_SKIP_BINDING_CLSID = "Skip Binding CLSID"
STR_TRACK_CLSID = "Track the CLSID"
+
+## KF_REDIRECTION_CAPABILITIES enum
+KF_REDIRECTION_CAPABILITIES_ALLOW_ALL = 0x000000FF
+KF_REDIRECTION_CAPABILITIES_REDIRECTABLE = 0x00000001
+KF_REDIRECTION_CAPABILITIES_DENY_ALL = 0x000FFF00
+KF_REDIRECTION_CAPABILITIES_DENY_POLICY_REDIRECTED = 0x00000100
+KF_REDIRECTION_CAPABILITIES_DENY_POLICY = 0x00000200
+KF_REDIRECTION_CAPABILITIES_DENY_PERMISSIONS = 0x00000400
+
+## KF_REDIRECT_FLAGS enum
+KF_REDIRECT_USER_EXCLUSIVE = 0x00000001
+KF_REDIRECT_COPY_SOURCE_DACL = 0x00000002
+KF_REDIRECT_OWNER_USER = 0x00000004
+KF_REDIRECT_SET_OWNER_EXPLICIT = 0x00000008
+KF_REDIRECT_CHECK_ONLY = 0x00000010
+KF_REDIRECT_WITH_UI = 0x00000020
+KF_REDIRECT_UNPIN = 0x00000040
+KF_REDIRECT_PIN = 0x00000080
+KF_REDIRECT_COPY_CONTENTS = 0x00000200
+KF_REDIRECT_DEL_SOURCE_CONTENTS = 0x00000400
+KF_REDIRECT_EXCLUDE_ALL_KNOWN_SUBFOLDERS = 0x00000800
+
+## KF_CATEGORY enum
+KF_CATEGORY_VIRTUAL = 0x00000001
+KF_CATEGORY_FIXED = 0x00000002
+KF_CATEGORY_COMMON = 0x00000003
+KF_CATEGORY_PERUSER = 0x00000004
+
+## FFFP_MODE enum
+FFFP_EXACTMATCH = 0
+FFFP_NEARESTPARENTMATCH = 1
+
+KF_FLAG_CREATE = 0x00008000
+KF_FLAG_DONT_VERIFY = 0x00004000
+KF_FLAG_DONT_UNEXPAND = 0x00002000
+KF_FLAG_NO_ALIAS = 0x00001000
+KF_FLAG_INIT = 0x00000800
+KF_FLAG_DEFAULT_PATH = 0x00000400
+KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200
+KF_FLAG_SIMPLE_IDLIST = 0x00000100
diff -r bec283d926a5 -r 977f4f21ae8b com/win32comext/shell/src/PyIKnownFolder.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/com/win32comext/shell/src/PyIKnownFolder.cpp Mon Sep 10 17:23:43 2012 -0400
@@ -0,0 +1,250 @@
+// This file implements the IKnownFolder Interface for Python.
+// Generated by makegw.py
+
+#include "shell_pch.h"
+#include "PyIKnownFolder.h"
+
+// @doc - This file contains autoduck documentation
+// ---------------------------------------------------
+//
+// Interface Implementation
+
+PyIKnownFolder::PyIKnownFolder(IUnknown *pdisp):
+ PyIUnknown(pdisp)
+{
+ ob_type = &type;
+}
+
+PyIKnownFolder::~PyIKnownFolder()
+{
+}
+
+/* static */ IKnownFolder *PyIKnownFolder::GetI(PyObject *self)
+{
+ return (IKnownFolder *)PyIUnknown::GetI(self);
+}
+
+// @pymethod <o PyIID>|PyIKnownFolder|GetId|Returns the id of the folder
+PyObject *PyIKnownFolder::GetId(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ KNOWNFOLDERID kfid;
+ if ( !PyArg_ParseTuple(args, ":GetId"))
+ return NULL;
+ HRESULT hr;
+ PY_INTERFACE_PRECALL;
+ hr = pIKF->GetId( &kfid );
+ PY_INTERFACE_POSTCALL;
+
+ if ( FAILED(hr) )
+ return PyCom_BuildPyException(hr, pIKF, IID_IKnownFolder );
+ return PyWinObject_FromIID(kfid);
+}
+
+// @pymethod int|PyIKnownFolder|GetCategory|Returns the category for a folder (shellcon.KF_CATEGORY_*)
+PyObject *PyIKnownFolder::GetCategory(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ KF_CATEGORY category;
+ if ( !PyArg_ParseTuple(args, ":GetCategory"))
+ return NULL;
+ HRESULT hr;
+ PY_INTERFACE_PRECALL;
+ hr = pIKF->GetCategory(&category );
+ PY_INTERFACE_POSTCALL;
+ if ( FAILED(hr) )
+ return PyCom_BuildPyException(hr, pIKF, IID_IKnownFolder );
+ return PyInt_FromLong(category);
+}
+
+// @pymethod <o PyIShellItem>|PyIKnownFolder|GetShellItem|Returns a shell interface for the folder
+PyObject *PyIKnownFolder::GetShellItem(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ // @pyparm int|Flags|0|Combination of shellcon.KF_FLAG_* values
+ // @pyparm <o PyIID>|riid|IID_IShellItem|The interface to return (IShellItem or IShellItem2)
+ DWORD flags = 0;
+ IID riid = IID_IShellItem;
+ void *ret;
+ if ( !PyArg_ParseTuple(args, "|kO&:GetShellItem", &flags, PyWinObject_AsIID, &riid))
+ return NULL;
+ HRESULT hr;
+ PY_INTERFACE_PRECALL;
+ hr = pIKF->GetShellItem(flags, riid, &ret);
+ PY_INTERFACE_POSTCALL;
+
+ if ( FAILED(hr) )
+ return PyCom_BuildPyException(hr, pIKF, IID_IKnownFolder );
+ return PyCom_PyObjectFromIUnknown((IUnknown *)ret, riid, FALSE);
+}
+
+// @pymethod str|PyIKnownFolder|GetPath|Returns the path to the folder
+PyObject *PyIKnownFolder::GetPath(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ // @pyparm int|Flags|0|Combination of shellcon.KF_FLAG_* flags controlling how the path is returned
+ DWORD flags=0;
+ WCHAR *path;
+ if ( !PyArg_ParseTuple(args, "|k:GetPath", &flags))
+ return NULL;
+ HRESULT hr;
+ PY_INTERFACE_PRECALL;
+ hr = pIKF->GetPath(flags, &path);
+ PY_INTERFACE_POSTCALL;
+
+ if ( FAILED(hr) )
+ return PyCom_BuildPyException(hr, pIKF, IID_IKnownFolder );
+ PyObject *ret = PyWinObject_FromWCHAR(path);
+ CoTaskMemFree(path);
+ return ret;
+}
+
+// @pymethod |PyIKnownFolder|SetPath|Changes the location of the folder
+PyObject *PyIKnownFolder::SetPath(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ // @pyparm int|Flags||KF_FLAG_DONT_UNEXPAND, or 0
+ // @pyparm str|Path||New path for known folder
+ TmpWCHAR Path;
+ PyObject *obPath;
+ DWORD Flags;
+ if ( !PyArg_ParseTuple(args, "kO:SetPath", &Flags, &obPath))
+ return NULL;
+ if (!PyWinObject_AsWCHAR(obPath, &Path))
+ return NULL;
+ HRESULT hr;
+ PY_INTERFACE_PRECALL;
+ hr = pIKF->SetPath(Flags, Path);
+ PY_INTERFACE_POSTCALL;
+
+ if ( FAILED(hr) )
+ return PyCom_BuildPyException(hr, pIKF, IID_IKnownFolder );
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+// @pymethod <o PyIDL>|PyIKnownFolder|GetIDList|Returns the folder's location as an item id list.
+PyObject *PyIKnownFolder::GetIDList(PyObject *self, PyObject *args)
+{
+ IKnownFolder *pIKF = GetI(self);
+ if ( pIKF == NULL )
+ return NULL;
+ // @pyparm int|Flags||Combination of shellcon.KF_FLAG_* values that affect how the operation is performed
+ PIDLIST_ABSOLUTE pidl;
+ DWORD Flags;
+ if ( !PyArg_ParseTuple(args, "k:GetIDList", &Flags))
+ return NULL;
+ HRESULT hr;
|