mirror of
https://github.com/UberGames/GtkRadiant.git
synced 2024-12-13 05:40:55 +00:00
12b372f89c
git-svn-id: svn://svn.icculus.org/gtkradiant/GtkRadiant@1 8a3a26a2-13c4-0310-b231-cf6edde360e5
474 lines
13 KiB
C
474 lines
13 KiB
C
/*
|
|
Copyright (C) 2001-2006 William Joseph.
|
|
For a list of contributors, see the accompanying CONTRIBUTORS file.
|
|
|
|
This file is part of GtkRadiant.
|
|
|
|
GtkRadiant is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
GtkRadiant is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GtkRadiant; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#include "Python.h"
|
|
#include "structmember.h"
|
|
|
|
#include <windows.h>
|
|
#include <msi.h>
|
|
#include <msiquery.h>
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
MSIHANDLE handle;
|
|
} MsiRecord;
|
|
|
|
static void
|
|
MsiRecord_dealloc(MsiRecord* self)
|
|
{
|
|
if(self->handle != 0)
|
|
{
|
|
unsigned int result = MsiCloseHandle(self->handle);
|
|
}
|
|
self->ob_type->tp_free((PyObject*)self);
|
|
}
|
|
|
|
static PyObject *
|
|
MsiRecord_new(PyTypeObject *type, PyObject *args)
|
|
{
|
|
MsiRecord *self;
|
|
|
|
self = (MsiRecord *)type->tp_alloc(type, 0);
|
|
if (self != NULL)
|
|
{
|
|
self->handle = 0;
|
|
}
|
|
|
|
return (PyObject *)self;
|
|
}
|
|
|
|
static int
|
|
MsiRecord_init(MsiRecord *self, PyObject *args)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static PyMemberDef MsiRecord_members[] = {
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyObject *
|
|
MsiRecord_getstring(MsiRecord* self, PyObject *args)
|
|
{
|
|
char string[16384];
|
|
DWORD size = 16384;
|
|
int index;
|
|
unsigned int result = 1;
|
|
if (!PyArg_ParseTuple(args, "i", &index))
|
|
{
|
|
return NULL;
|
|
}
|
|
if(self->handle != 0)
|
|
{
|
|
if(MsiRecordIsNull(self->handle, index))
|
|
{
|
|
puts("null record index");
|
|
}
|
|
result = MsiRecordGetString(self->handle, index, string, &size);
|
|
printf("string: %s, index: %i\n", string, index);
|
|
if(result != 0)
|
|
{
|
|
strcpy(string, "bleh");
|
|
}
|
|
}
|
|
return PyString_FromString(string);
|
|
}
|
|
|
|
static PyObject *
|
|
MsiRecord_setstring(MsiRecord* self, PyObject *args)
|
|
{
|
|
char* string;
|
|
int index;
|
|
unsigned int result = 1;
|
|
if (!PyArg_ParseTuple(args, "is", &index, &string))
|
|
{
|
|
return NULL;
|
|
}
|
|
if(self->handle != 0)
|
|
{
|
|
result = MsiRecordSetString(self->handle, index, string);
|
|
}
|
|
return Py_BuildValue("i", result);
|
|
}
|
|
|
|
static PyMethodDef MsiRecord_methods[] = {
|
|
{"getstring", (PyCFunction)MsiRecord_getstring, METH_VARARGS,
|
|
"MsiRecordGetString"
|
|
},
|
|
{"setstring", (PyCFunction)MsiRecord_setstring, METH_VARARGS,
|
|
"MsiRecordSetString"
|
|
},
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyTypeObject MsiRecordType = {
|
|
PyObject_HEAD_INIT(NULL)
|
|
0, /*ob_size*/
|
|
"msiquery.MsiRecord", /*tp_name*/
|
|
sizeof(MsiRecord), /*tp_basicsize*/
|
|
0, /*tp_itemsize*/
|
|
(destructor)MsiRecord_dealloc, /*tp_dealloc*/
|
|
0, /*tp_print*/
|
|
0, /*tp_getattr*/
|
|
0, /*tp_setattr*/
|
|
0, /*tp_compare*/
|
|
0, /*tp_repr*/
|
|
0, /*tp_as_number*/
|
|
0, /*tp_as_sequence*/
|
|
0, /*tp_as_mapping*/
|
|
0, /*tp_hash */
|
|
0, /*tp_call*/
|
|
0, /*tp_str*/
|
|
0, /*tp_getattro*/
|
|
0, /*tp_setattro*/
|
|
0, /*tp_as_buffer*/
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
|
"MsiRecord objects", /* tp_doc */
|
|
0, /* tp_traverse */
|
|
0, /* tp_clear */
|
|
0, /* tp_richcompare */
|
|
0, /* tp_weaklistoffset */
|
|
0, /* tp_iter */
|
|
0, /* tp_iternext */
|
|
MsiRecord_methods, /* tp_methods */
|
|
MsiRecord_members, /* tp_members */
|
|
0, /* tp_getset */
|
|
0, /* tp_base */
|
|
0, /* tp_dict */
|
|
0, /* tp_descr_get */
|
|
0, /* tp_descr_set */
|
|
0, /* tp_dictoffset */
|
|
(initproc)MsiRecord_init, /* tp_init */
|
|
0, /* tp_alloc */
|
|
(newfunc)MsiRecord_new, /* tp_new */
|
|
};
|
|
|
|
PyObject*
|
|
MsiRecord_FromHandle(MSIHANDLE handle)
|
|
{
|
|
MsiRecord *record = (MsiRecord *)MsiRecordType.tp_new(&MsiRecordType, NULL, NULL);
|
|
record->handle = handle;
|
|
return (PyObject*)record;
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
MSIHANDLE handle;
|
|
} MsiView;
|
|
|
|
static void
|
|
MsiView_dealloc(MsiView* self)
|
|
{
|
|
if(self->handle != 0)
|
|
{
|
|
unsigned int result;
|
|
result = MsiViewClose(self->handle);
|
|
result = MsiCloseHandle(self->handle);
|
|
}
|
|
self->ob_type->tp_free((PyObject*)self);
|
|
}
|
|
|
|
static PyObject *
|
|
MsiView_new(PyTypeObject *type, PyObject *args)
|
|
{
|
|
MsiView *self;
|
|
|
|
self = (MsiView *)type->tp_alloc(type, 0);
|
|
if (self != NULL)
|
|
{
|
|
self->handle = 0;
|
|
}
|
|
|
|
return (PyObject *)self;
|
|
}
|
|
|
|
static int
|
|
MsiView_init(MsiView *self)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static PyMemberDef MsiView_members[] = {
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyObject *
|
|
MsiView_fetch(MsiView* self)
|
|
{
|
|
unsigned int result = 1;
|
|
MSIHANDLE record;
|
|
result = MsiViewFetch(self->handle, &record);
|
|
if(result == 0)
|
|
{
|
|
return MsiRecord_FromHandle(record);
|
|
}
|
|
else
|
|
{
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
}
|
|
|
|
static PyObject *
|
|
MsiView_update(MsiView* self, PyObject *args)
|
|
{
|
|
unsigned int result = 1;
|
|
MsiRecord *record;
|
|
if(!PyArg_ParseTuple(args, "O!", &MsiRecordType, &record))
|
|
{
|
|
return NULL;
|
|
}
|
|
result = MsiViewModify(self->handle, MSIMODIFY_UPDATE, record->handle);
|
|
return Py_BuildValue("i", result);
|
|
}
|
|
|
|
static PyMethodDef MsiView_methods[] = {
|
|
{"fetch", (PyCFunction)MsiView_fetch, METH_NOARGS,
|
|
"MsiViewFetch"
|
|
},
|
|
{"update", (PyCFunction)MsiView_update, METH_VARARGS,
|
|
"MsiViewModify(UPDATE)"
|
|
},
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyTypeObject MsiViewType = {
|
|
PyObject_HEAD_INIT(NULL)
|
|
0, /*ob_size*/
|
|
"msiquery.MsiView", /*tp_name*/
|
|
sizeof(MsiView), /*tp_basicsize*/
|
|
0, /*tp_itemsize*/
|
|
(destructor)MsiView_dealloc, /*tp_dealloc*/
|
|
0, /*tp_print*/
|
|
0, /*tp_getattr*/
|
|
0, /*tp_setattr*/
|
|
0, /*tp_compare*/
|
|
0, /*tp_repr*/
|
|
0, /*tp_as_number*/
|
|
0, /*tp_as_sequence*/
|
|
0, /*tp_as_mapping*/
|
|
0, /*tp_hash */
|
|
0, /*tp_call*/
|
|
0, /*tp_str*/
|
|
0, /*tp_getattro*/
|
|
0, /*tp_setattro*/
|
|
0, /*tp_as_buffer*/
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
|
"MsiView objects", /* tp_doc */
|
|
0, /* tp_traverse */
|
|
0, /* tp_clear */
|
|
0, /* tp_richcompare */
|
|
0, /* tp_weaklistoffset */
|
|
0, /* tp_iter */
|
|
0, /* tp_iternext */
|
|
MsiView_methods, /* tp_methods */
|
|
MsiView_members, /* tp_members */
|
|
0, /* tp_getset */
|
|
0, /* tp_base */
|
|
0, /* tp_dict */
|
|
0, /* tp_descr_get */
|
|
0, /* tp_descr_set */
|
|
0, /* tp_dictoffset */
|
|
(initproc)MsiView_init, /* tp_init */
|
|
0, /* tp_alloc */
|
|
(newfunc)MsiView_new, /* tp_new */
|
|
};
|
|
|
|
PyObject*
|
|
MsiView_FromHandle(MSIHANDLE handle)
|
|
{
|
|
MsiView *view = (MsiView *)MsiViewType.tp_new(&MsiViewType, NULL, NULL);
|
|
view->handle = handle;
|
|
MsiViewExecute(handle, 0);
|
|
return (PyObject*)view;
|
|
}
|
|
|
|
|
|
typedef struct {
|
|
PyObject_HEAD
|
|
MSIHANDLE handle;
|
|
} MsiDB;
|
|
|
|
static void
|
|
MsiDB_dealloc(MsiDB* self)
|
|
{
|
|
if(self->handle != 0)
|
|
{
|
|
unsigned int result = MsiCloseHandle(self->handle);
|
|
}
|
|
self->ob_type->tp_free((PyObject*)self);
|
|
}
|
|
|
|
static PyObject *
|
|
MsiDB_new(PyTypeObject *type, PyObject *args)
|
|
{
|
|
MsiDB *self;
|
|
|
|
self = (MsiDB *)type->tp_alloc(type, 0);
|
|
if (self != NULL)
|
|
{
|
|
self->handle = 0;
|
|
}
|
|
|
|
return (PyObject *)self;
|
|
}
|
|
|
|
static int
|
|
MsiDB_init(MsiDB *self, PyObject *args)
|
|
{
|
|
char* filename;
|
|
if(!PyArg_ParseTuple(args, "s", &filename))
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
MsiOpenDatabase(filename, MSIDBOPEN_TRANSACT, &self->handle);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static PyMemberDef MsiDB_members[] = {
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyObject *
|
|
MsiDB_openview(MsiDB* self, PyObject *args)
|
|
{
|
|
char* query;
|
|
unsigned int result = 1;
|
|
if (!PyArg_ParseTuple(args, "s", &query))
|
|
{
|
|
return NULL;
|
|
}
|
|
if(self->handle != 0)
|
|
{
|
|
MSIHANDLE view;
|
|
result = MsiDatabaseOpenView(self->handle, query, &view);
|
|
if(result == ERROR_SUCCESS)
|
|
{
|
|
return MsiView_FromHandle(view);
|
|
}
|
|
}
|
|
Py_INCREF(Py_None);
|
|
return Py_None;
|
|
}
|
|
|
|
static PyObject *
|
|
MsiDB_commit(MsiDB* self)
|
|
{
|
|
unsigned int result = 1;
|
|
if(self->handle != 0)
|
|
{
|
|
result = MsiDatabaseCommit(self->handle);
|
|
if(result == ERROR_INVALID_HANDLE)
|
|
{
|
|
printf("invalid??\n");
|
|
}
|
|
}
|
|
return Py_BuildValue("i", result);
|
|
}
|
|
|
|
static PyMethodDef MsiDB_methods[] = {
|
|
{"openview", (PyCFunction)MsiDB_openview, METH_VARARGS,
|
|
"MsiViewExecute SQL query"
|
|
},
|
|
{"commit", (PyCFunction)MsiDB_commit, METH_NOARGS,
|
|
"MsiDatabaseCommit"
|
|
},
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
static PyTypeObject MsiDBType = {
|
|
PyObject_HEAD_INIT(NULL)
|
|
0, /*ob_size*/
|
|
"msiquery.MsiDB", /*tp_name*/
|
|
sizeof(MsiDB), /*tp_basicsize*/
|
|
0, /*tp_itemsize*/
|
|
(destructor)MsiDB_dealloc, /*tp_dealloc*/
|
|
0, /*tp_print*/
|
|
0, /*tp_getattr*/
|
|
0, /*tp_setattr*/
|
|
0, /*tp_compare*/
|
|
0, /*tp_repr*/
|
|
0, /*tp_as_number*/
|
|
0, /*tp_as_sequence*/
|
|
0, /*tp_as_mapping*/
|
|
0, /*tp_hash */
|
|
0, /*tp_call*/
|
|
0, /*tp_str*/
|
|
0, /*tp_getattro*/
|
|
0, /*tp_setattro*/
|
|
0, /*tp_as_buffer*/
|
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
|
"MsiDB objects", /* tp_doc */
|
|
0, /* tp_traverse */
|
|
0, /* tp_clear */
|
|
0, /* tp_richcompare */
|
|
0, /* tp_weaklistoffset */
|
|
0, /* tp_iter */
|
|
0, /* tp_iternext */
|
|
MsiDB_methods, /* tp_methods */
|
|
MsiDB_members, /* tp_members */
|
|
0, /* tp_getset */
|
|
0, /* tp_base */
|
|
0, /* tp_dict */
|
|
0, /* tp_descr_get */
|
|
0, /* tp_descr_set */
|
|
0, /* tp_dictoffset */
|
|
(initproc)MsiDB_init, /* tp_init */
|
|
0, /* tp_alloc */
|
|
(newfunc)MsiDB_new, /* tp_new */
|
|
};
|
|
|
|
static PyMethodDef msiquery_methods[] = {
|
|
{NULL} /* Sentinel */
|
|
};
|
|
|
|
PyMODINIT_FUNC
|
|
initmsiquery(void)
|
|
{
|
|
PyObject* m;
|
|
|
|
if (PyType_Ready(&MsiRecordType) < 0)
|
|
return;
|
|
|
|
if (PyType_Ready(&MsiViewType) < 0)
|
|
return;
|
|
|
|
if (PyType_Ready(&MsiDBType) < 0)
|
|
return;
|
|
|
|
m = Py_InitModule3("msiquery", msiquery_methods, "Msi API module.");
|
|
|
|
if (m == NULL)
|
|
return;
|
|
|
|
Py_INCREF(&MsiRecordType);
|
|
PyModule_AddObject(m, "MsiRecord", (PyObject *)&MsiRecordType);
|
|
|
|
Py_INCREF(&MsiViewType);
|
|
PyModule_AddObject(m, "MsiView", (PyObject *)&MsiViewType);
|
|
|
|
Py_INCREF(&MsiDBType);
|
|
PyModule_AddObject(m, "MsiDB", (PyObject *)&MsiDBType);
|
|
}
|
|
|