[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);
  	}