[Python-checkins] CVS: distutils/misc install.c,1.16,1.17
Thomas Heller
theller@users.sourceforge.net
Wed, 20 Mar 2002 06:37:27 -0800
Update of /cvsroot/python/distutils/misc
In directory usw-pr-cvs1:/tmp/cvs-serv30752
Modified Files:
install.c
Log Message:
Better error messages for the create_shortcut function.
Additional builtin function available to the installation script,
needed for creating shortcuts:
get_special_folder_path(csidl_string)
csidl_string must be something like "CSIDL_COMMON_STARTMENU" or
"CSIDL_DESKTOPDIRECTORY". The function will return the pathname of the
folder.
Not yet completely finished, but I have to get this out of the way.
Index: install.c
===================================================================
RCS file: /cvsroot/python/distutils/misc/install.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** install.c 19 Feb 2002 20:47:27 -0000 1.16
--- install.c 20 Mar 2002 14:37:25 -0000 1.17
***************
*** 317,320 ****
--- 317,381 ----
int (*g_PyArg_ParseTuple)(PyObject *, char *, ...);
+ PyObject *g_PyExc_ValueError;
+ PyObject *g_PyExc_OSError;
+
+ PyObject *(*g_PyErr_Format)(PyObject *, char *, ...);
+
+ #define DEF_CSIDL(name) { name, #name }
+
+ struct {
+ int nFolder;
+ char *name;
+ } csidl_names[] = {
+ DEF_CSIDL(CSIDL_COMMON_STARTMENU),
+ DEF_CSIDL(CSIDL_STARTMENU),
+
+ /* DEF_CSIDL(CSIDL_COMMON_APPDATA), */
+ /* DEF_CSIDL(CSIDL_LOCAL_APPDATA), */
+ DEF_CSIDL(CSIDL_APPDATA),
+
+ DEF_CSIDL(CSIDL_COMMON_DESKTOPDIRECTORY),
+ DEF_CSIDL(CSIDL_DESKTOPDIRECTORY),
+
+ DEF_CSIDL(CSIDL_COMMON_STARTUP),
+ DEF_CSIDL(CSIDL_STARTUP),
+
+ DEF_CSIDL(CSIDL_COMMON_PROGRAMS),
+ DEF_CSIDL(CSIDL_PROGRAMS),
+
+ /* DEF_CSIDL(CSIDL_PROGRAM_FILES_COMMON), */
+ /* DEF_CSIDL(CSIDL_PROGRAM_FILES), */
+
+ DEF_CSIDL(CSIDL_FONTS),
+ };
+
+ #define DIM(a) (sizeof(a) / sizeof((a)[0]))
+
+ static PyObject *GetSpecialFolderPath(PyObject *self, PyObject *args)
+ {
+ char *name;
+ char lpszPath[MAX_PATH];
+ int i;
+
+ if (!g_PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ for (i = 0; i < DIM(csidl_names); ++i) {
+ if (0 == strcmpi(csidl_names[i].name, name)) {
+ int nFolder;
+ nFolder = csidl_names[i].nFolder;
+ if (SHGetSpecialFolderPath(NULL, lpszPath, nFolder, 0))
+ return g_Py_BuildValue("s", lpszPath);
+ else {
+ g_PyErr_Format(g_PyExc_OSError, "no such folder (%s)", name);
+ return NULL;
+ }
+
+ }
+ };
+ g_PyErr_Format(g_PyExc_ValueError, "unknown CSIDL (%s)", name);
+ return NULL;
+ }
+
static PyObject *CreateShortcut(PyObject *self, PyObject *args)
{
***************
*** 336,341 ****
hr = CoInitialize(NULL);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "CoInitialize", hr);
if (!g_PyArg_ParseTuple(args, "sss|sssi",
--- 397,405 ----
hr = CoInitialize(NULL);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "CoInitialize failed, error 0x%x", hr);
! goto error;
! }
if (!g_PyArg_ParseTuple(args, "sss|sssi",
***************
*** 349,386 ****
&IID_IShellLink,
&ps1);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "CoCreateInstance", hr);
hr = ps1->lpVtbl->QueryInterface(ps1, &IID_IPersistFile, (void **)&pPf);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "QueryInterface(IPersistFile)", hr);
hr = ps1->lpVtbl->SetPath(ps1, path);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "SetPath", hr);
hr = ps1->lpVtbl->SetDescription(ps1, description);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "SetDescription", hr);
if (arguments) {
hr = ps1->lpVtbl->SetArguments(ps1, arguments);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "SetArguments", hr);
!
}
if (iconpath) {
hr = ps1->lpVtbl->SetIconLocation(ps1, iconpath, iconindex);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "SetIconLocation", hr);
}
if (workdir) {
hr = ps1->lpVtbl->SetWorkingDirectory(ps1, workdir);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "SetWorkingDirectory", hr);
!
}
--- 413,469 ----
&IID_IShellLink,
&ps1);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "CoCreateInstance failed, error 0x%x", hr);
! goto error;
! }
hr = ps1->lpVtbl->QueryInterface(ps1, &IID_IPersistFile, (void **)&pPf);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "QueryInterface(IPersistFile) failed, error 0x%x", hr);
! goto error;
! }
hr = ps1->lpVtbl->SetPath(ps1, path);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "SetPath() failed, error 0x%x", hr);
! goto error;
! }
hr = ps1->lpVtbl->SetDescription(ps1, description);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "SetDescription() failed, error 0x%x", hr);
! goto error;
! }
if (arguments) {
hr = ps1->lpVtbl->SetArguments(ps1, arguments);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "SetArguments() failed, error 0x%x", hr);
! goto error;
! }
}
if (iconpath) {
hr = ps1->lpVtbl->SetIconLocation(ps1, iconpath, iconindex);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "SetIconLocation() failed, error 0x%x", hr);
! goto error;
! }
}
if (workdir) {
hr = ps1->lpVtbl->SetWorkingDirectory(ps1, workdir);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "SetWorkingDirectory() failed, error 0x%x", hr);
! goto error;
! }
}
***************
*** 390,409 ****
hr = pPf->lpVtbl->Save(pPf, wszFilename, TRUE);
! if (FAILED(hr))
! return g_Py_BuildValue("si", "Save()", hr);
!
pPf->lpVtbl->Release(pPf);
-
ps1->lpVtbl->Release(ps1);
CoUninitialize();
! return g_Py_BuildValue("i", 0);
}
#define METH_VARARGS 0x0001
! PyMethodDef meth = {
! "create_shortcut", CreateShortcut, METH_VARARGS, NULL
};
--- 473,504 ----
hr = pPf->lpVtbl->Save(pPf, wszFilename, TRUE);
! if (FAILED(hr)) {
! g_PyErr_Format(g_PyExc_OSError,
! "Save() failed, error 0x%x", hr);
! goto error;
! }
!
pPf->lpVtbl->Release(pPf);
ps1->lpVtbl->Release(ps1);
+ CoUninitialize();
+ return g_Py_BuildValue("i", 0);
+
+ error:
+ if (pPf)
+ pPf->lpVtbl->Release(pPf);
+
+ if (ps1)
+ ps1->lpVtbl->Release(ps1);
CoUninitialize();
! return NULL;
}
#define METH_VARARGS 0x0001
! PyMethodDef meth[] = {
! {"create_shortcut", CreateShortcut, METH_VARARGS, NULL},
! {"get_special_folder_path", GetSpecialFolderPath, METH_VARARGS, NULL},
};
***************
*** 416,422 ****
--- 511,519 ----
DECLPROC(hPython, PyObject *, PyImport_ImportModule, (char *));
DECLPROC(hPython, int, PyObject_SetAttrString, (PyObject *, char *, PyObject *));
+ DECLPROC(hPython, PyObject *, PyObject_GetAttrString, (PyObject *, char *));
DECLPROC(hPython, PyObject *, Py_BuildValue, (char *, ...));
DECLPROC(hPython, PyObject *, PyCFunction_New, (PyMethodDef *, PyObject *));
DECLPROC(hPython, int, PyArg_ParseTuple, (PyObject *, char *, ...));
+ DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *));
PyObject *mod;
***************
*** 426,447 ****
if (!Py_Initialize || !PySys_SetArgv || !PyRun_SimpleFile || !Py_Finalize)
! return -1;
if (!PyImport_ImportModule || !PyObject_SetAttrString || !Py_BuildValue)
! return -1;
! if (!PyCFunction_New || !PyArg_ParseTuple)
! return -1;
g_Py_BuildValue = Py_BuildValue;
g_PyArg_ParseTuple = PyArg_ParseTuple;
!
if (pathname == NULL || pathname[0] == '\0')
! return -1;
fp = fopen(pathname, "r");
if (!fp) {
! return -1;
}
--- 523,548 ----
if (!Py_Initialize || !PySys_SetArgv || !PyRun_SimpleFile || !Py_Finalize)
! return 0x80000000;
if (!PyImport_ImportModule || !PyObject_SetAttrString || !Py_BuildValue)
! return 0x80000000;
! if (!PyCFunction_New || !PyArg_ParseTuple || !PyErr_Format)
! return 0x80000000;
!
! if (!PyObject_GetAttrString)
! return 0x80000000;
!
g_Py_BuildValue = Py_BuildValue;
g_PyArg_ParseTuple = PyArg_ParseTuple;
! g_PyErr_Format = PyErr_Format;
if (pathname == NULL || pathname[0] == '\0')
! return 0x80000000;
fp = fopen(pathname, "r");
if (!fp) {
! return 0x80000000;
}
***************
*** 451,456 ****
mod = PyImport_ImportModule("__builtin__");
! if (mod)
! PyObject_SetAttrString(mod, "create_shortcut", PyCFunction_New(&meth, NULL));
PySys_SetArgv(argc, argv);
--- 552,561 ----
mod = PyImport_ImportModule("__builtin__");
! if (mod) {
! g_PyExc_ValueError = PyObject_GetAttrString(mod, "ValueError");
! g_PyExc_OSError = PyObject_GetAttrString(mod, "OSError");
! PyObject_SetAttrString(mod, "create_shortcut", PyCFunction_New(&meth[0], NULL));
! PyObject_SetAttrString(mod, "get_special_folder_path", PyCFunction_New(&meth[1], NULL));
! }
PySys_SetArgv(argc, argv);
***************
*** 1157,1162 ****
--- 1262,1272 ----
&py_major, &py_minor);
if (result == 2)
+ #ifdef _DEBUG
+ wsprintf (pythondll, "c:\\python22\\PCBuild\\python%d%d_d.dll",
+ py_major, py_minor);
+ #else
wsprintf (pythondll, "python%d%d.dll",
py_major, py_minor);
+ #endif
free (pbuf);
} else
***************
*** 1496,1500 ****
hPython = LoadLibrary(pythondll);
if (hPython) {
! run_installscript(hPython, fname, 2, argv);
FreeLibrary(hPython);
}
--- 1606,1611 ----
hPython = LoadLibrary(pythondll);
if (hPython) {
! if (0x80000000 == run_installscript(hPython, fname, 2, argv))
! fprintf(stderr, "*** Could not load Python ***");
FreeLibrary(hPython);
}
***************
*** 1819,1823 ****
hPython = LoadLibrary(dllname);
if (hPython) {
! run_installscript(hPython, scriptname, 2, argv);
FreeLibrary(hPython);
}
--- 1930,1935 ----
hPython = LoadLibrary(dllname);
if (hPython) {
! if (0x80000000 == run_installscript(hPython, scriptname, 2, argv))
! fprintf(stderr, "*** Could not load Python ***");
FreeLibrary(hPython);
}