/*
* Copyright (C) 2001, Shilad Sen, Sourcelight Technologies, Inc.
* See xmlrpc.h or the README for more copyright information.
*/
#include <assert.h>
#include "xmlrpc.h"
#include "rpcInternal.h"
static void xmlrpcDateDealloc(rpcDate *dp);
static PyObject *xmlrpcDateRepr(rpcDate *dp);
static PyObject *xmlrpcDateStr(rpcDate *dp);
PyObject *xmlrpcDateGetAttr(rpcDate *dp, char *name);
static int xmlrpcDateSetAttr(rpcDate *dp, char *name, PyObject *value);
static PyObject *xmlrpcDateGet(PyObject *self, PyObject *args);
/*
* map characteristics of the date edb object
*/
PyTypeObject rpcDateType = {
PyObject_HEAD_INIT(0)
0,
"xmlrpcdateTime",
sizeof(rpcDate),
0,
(destructor)xmlrpcDateDealloc,
0,
(getattrfunc)xmlrpcDateGetAttr,
(setattrfunc)xmlrpcDateSetAttr,
0,
(reprfunc)xmlrpcDateRepr,
0,
0,
0,
0,
0,
(reprfunc)xmlrpcDateStr,
0,
0,
0,
0,
0,
};
/*
* create a new edb date object
* error checking should already be done.
*/
PyObject *
rpcDateNew(PyObject *tuple)
{
rpcDate *dp;
assert(PyTuple_Check(tuple));
assert(PyObject_Length(tuple) == 6);
dp = PyObject_NEW(rpcDate, &rpcDateType);
unless (dp)
return (NULL);
dp->value = PyTuple_GetSlice(tuple, 0, 6);
return (PyObject *)dp;
}
/*
* free resources associated with a date object
*/
static void
xmlrpcDateDealloc(rpcDate *dp)
{
if (dp->value) {
Py_DECREF(dp->value);
}
PyMem_DEL(dp);
}
/*
* convert a date object to a string
*/
static PyObject *
xmlrpcDateStr(rpcDate *dp)
{
return PyString_FromString("<dateTime.iso8601 object>");
}
/*
* represent a date object
*/
static PyObject *
xmlrpcDateRepr(rpcDate *dp)
{
char buff[256];
assert(PyTuple_Check(dp->value));
assert(PyTuple_GET_SIZE(dp->value) == 6);
snprintf(buff, sizeof(buff)-1, "dateTime(%ld,%ld,%ld,%ld,%ld,%ld)",
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 0)),
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 1)),
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 2)),
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 3)),
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 4)),
PyInt_AS_LONG(PyTuple_GET_ITEM(dp->value, 5)));
buff[sizeof(buff)-1] = EOS; /* just to be safe */
return (PyString_FromString(buff));
}
static PyMethodDef xmlrpcDateMethods[] = {
{ "date", (PyCFunction)xmlrpcDateGet, 1, 0 },
{ NULL, NULL },
};
static PyObject *
xmlrpcDateGet(PyObject *self, PyObject *args)
{
PyObject *dp;
dp = ((rpcDate *)self)->value;
return PyTuple_GetSlice(dp, 0, PyTuple_Size(dp));
}
PyObject *
xmlrpcDateGetAttr(rpcDate *dp, char *name)
{
assert(dp != NULL);
assert(name != NULL);
if (strcmp("value", name) == 0) {
Py_INCREF(dp->value);
return dp->value;
}
return (Py_FindMethod(xmlrpcDateMethods, (PyObject *)dp, name));
}
static int
xmlrpcDateSetAttr(rpcDate *dp, char *name, PyObject *value)
{
assert(dp != NULL);
assert(name != NULL);
PyErr_SetString(PyExc_AttributeError, "unknown attribute");
return -1;
}
syntax highlighted by Code2HTML, v. 0.9.1