pst-handler-config.c

来自「linux下网络收音机的源码」· C语言 代码 · 共 418 行

C
418
字号
/* * Copyright (c) 2004 Jean-Yves Lefort * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. Neither the name of Jean-Yves Lefort nor the names of its contributors *    may be used to endorse or promote products derived from this software *    without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include <Python.h>#define NO_IMPORT_PYGOBJECT#include <pygobject.h>#include <glib/gi18n.h>#include "streamtuner.h"#include "pst-handler-config.h"#include "pst-helpers.h"/*** type methods ************************************************************/static int pst_handler_config_length (PSTHandlerConfig *self);static PyObject *pst_handler_config_subscript (PSTHandlerConfig *self, PyObject *key);static int pst_handler_config_ass_subscript (PSTHandlerConfig *self,					     PyObject *key,					     PyObject *value);static PyMappingMethods mapping_methods = {  (inquiry) pst_handler_config_length,  (binaryfunc) pst_handler_config_subscript,  (objobjargproc) pst_handler_config_ass_subscript};/*** methods *****************************************************************/static PyObject *pst_handler_config_has_key (PSTHandlerConfig *self, PyObject *args);static PyObject *pst_handler_config_keys (PSTHandlerConfig *self, PyObject *args);static PyObject *pst_handler_config_items (PSTHandlerConfig *self, PyObject *args);static PyObject *pst_handler_config_register_method (PSTHandlerConfig *self, PyObject *args);static PyObject *pst_handler_config_lookup (PSTHandlerConfig *self, PyObject *args);static PyMethodDef methods[] = {  /* standard dictionary methods */  { "has_key", (PyCFunction) pst_handler_config_has_key, METH_VARARGS },  { "keys", (PyCFunction) pst_handler_config_keys, METH_NOARGS },  { "items", (PyCFunction) pst_handler_config_items, METH_NOARGS },  /* specific ST.HandlerConfig methods */  { "register", (PyCFunction) pst_handler_config_register_method, METH_VARARGS },  { "lookup", (PyCFunction) pst_handler_config_lookup, METH_VARARGS },    { NULL }};/*** type object *************************************************************/PyTypeObject PSTHandlerConfig_Type = {  PyObject_HEAD_INIT(NULL)  0,				/* ob_size */  "ST.HandlerConfig",		/* tp_name */  sizeof(PSTHandlerConfig),	/* tp_basicsize */  0,				/* tp_itemsize */  NULL,				/* tp_dealloc */  NULL,				/* tp_print */  NULL,				/* tp_getattr */  NULL,				/* tp_setattr */  NULL,				/* tp_compare */  NULL,				/* tp_repr */  NULL,				/* tp_as_number */  NULL,				/* tp_as_sequence */  &mapping_methods,		/* tp_as_mapping */  NULL,				/* tp_hash */  NULL,				/* tp_call */  NULL,				/* tp_str */  NULL,				/* tp_getattro */  NULL,				/* tp_setattro */  NULL,				/* tp_as_buffer */  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */  NULL,				/* tp_doc */  NULL,				/* tp_traverse */  NULL,				/* tp_clear */  NULL,				/* tp_richcompare */  0,				/* tp_weaklistoffset */  NULL,				/* tp_iter */  NULL,				/* tp_iternext */  methods,			/* tp_methods */  NULL,				/* tp_members */  NULL,				/* tp_getset */  NULL,				/* tp_base */  NULL,				/* tp_dict */  NULL,				/* tp_descr_get */  NULL,				/* tp_descr_set */  0,				/* tp_dictoffset */  NULL,				/* tp_init */  NULL,				/* tp_alloc */  NULL				/* tp_new */};/*** type definitions ********************************************************/typedef struct{  gboolean	status;  int		len;  PyObject	**tuple;} TupleInfo;/*** function declarations ***************************************************/static void pst_handler_config_length_cb (GParamSpec *pspec,					  const GValue *value,					  gpointer data);static void pst_handler_config_keys_cb (GParamSpec *pspec,					const GValue *value,					gpointer data);static void pst_handler_config_items_cb (GParamSpec *pspec,					 const GValue *value,					 gpointer data);/*** type methods ************************************************************/static intpst_handler_config_length (PSTHandlerConfig *self){  int len = 0;  st_handler_config_foreach(self->handler, pst_handler_config_length_cb, &len);  return len;}static voidpst_handler_config_length_cb (GParamSpec *pspec,			      const GValue *value,			      gpointer data){  int *len = data;    *len++;}static PyObject *pst_handler_config_subscript (PSTHandlerConfig *self, PyObject *key){  const char *ckey;  GValue value = { 0, };  PyObject *result;  ckey = PyString_AsString(key);  if (! ckey)    return NULL;  if (! st_handler_config_lookup(self->handler, ckey))    {      PyErr_SetObject(PyExc_KeyError, key);      return NULL;    }  st_handler_config_get_value(self->handler, ckey, &value);  result = pyg_value_as_pyobject(&value, TRUE);  g_value_unset(&value);  return result;}static intpst_handler_config_ass_subscript (PSTHandlerConfig *self,				  PyObject *key,				  PyObject *value){  const char *ckey;  GParamSpec *pspec;  GValue gvalue = { 0, };  int result;  if (! value)    {      PyErr_SetString(PyExc_TypeError, _("configuration keys cannot be removed"));      return -1;    }  ckey = PyString_AsString(key);  if (! ckey)    return -1;  pspec = st_handler_config_lookup(self->handler, ckey);  if (! pspec)    {      PyErr_SetObject(PyExc_KeyError, key);      return -1;    }  g_value_init(&gvalue, G_PARAM_SPEC_VALUE_TYPE(pspec));  if (pst_value_from_pyobject(&gvalue, value) == 0)    {      st_handler_config_set_value(self->handler, ckey, &gvalue);      result = 0;		/* success */    }  else    {      PyErr_SetString(PyExc_TypeError, _("invalid value type for this configuration key"));      result = -1;    }  g_value_unset(&gvalue);  return result;}/*** object methods **********************************************************/static PyObject *pst_handler_config_has_key (PSTHandlerConfig *self, PyObject *args){  const char *key;  if (! PyArg_ParseTuple(args, "s", &key))    return NULL;  return PyBool_FromLong(st_handler_config_lookup(self->handler, key) != NULL);}static PyObject *pst_handler_config_keys (PSTHandlerConfig *self, PyObject *args){  PyObject *tuple;  TupleInfo info;  tuple = PyTuple_New(0);  if (! tuple)    return NULL;  info.status = TRUE;  info.len = 0;  info.tuple = &tuple;  st_handler_config_foreach(self->handler, pst_handler_config_keys_cb, &info);    if (! info.status)    {      if (tuple)	{	  Py_DECREF(tuple);	  tuple = NULL;	}    }  return tuple;}static voidpst_handler_config_keys_cb (GParamSpec *pspec,			    const GValue *value,			    gpointer data){  TupleInfo *info = data;  PyObject *pkey;  if (! info->status)    return;  pkey = PyString_FromString(g_param_spec_get_name(pspec));  if (! pkey)    goto exception;    if (_PyTuple_Resize(info->tuple, ++info->len) != 0)    goto exception;    if (PyTuple_SetItem(*info->tuple, info->len - 1, pkey) == 0)    return;			/* success */ exception:  info->status = FALSE;  Py_XDECREF(pkey);}static PyObject *pst_handler_config_items (PSTHandlerConfig *self, PyObject *args){  PyObject *tuple;  TupleInfo info;  tuple = PyTuple_New(0);  if (! tuple)    return NULL;  info.status = TRUE;  info.len = 0;  info.tuple = &tuple;  st_handler_config_foreach(self->handler, pst_handler_config_items_cb, &info);    if (! info.status)    {      if (tuple)	{	  Py_DECREF(tuple);	  tuple = NULL;	}    }  return tuple;}static voidpst_handler_config_items_cb (GParamSpec *pspec,			     const GValue *value,			     gpointer data){  TupleInfo *info = data;  PyObject *pair;  if (! info->status)    return;  pair = Py_BuildValue("(sN)",		       g_param_spec_get_name(pspec),		       pyg_value_as_pyobject(value, TRUE));  if (! pair)    goto exception;  if (_PyTuple_Resize(info->tuple, ++info->len) != 0)    goto exception;    if (PyTuple_SetItem(*info->tuple, info->len - 1, pair) == 0)    return;			/* success */ exception:  info->status = FALSE;  Py_XDECREF(pair);}static PyObject *pst_handler_config_register_method (PSTHandlerConfig *self, PyObject *args){  PyObject *ptuple;  GParamSpec *pspec;  if (! PyArg_ParseTuple(args, "O!", &PyTuple_Type, &ptuple))    return NULL;  pspec = pyg_param_spec_from_object(ptuple);  if (! pspec)    return NULL;  st_handler_config_register(self->handler, pspec);  return pst_none();}static PyObject *pst_handler_config_lookup (PSTHandlerConfig *self, PyObject *args){  const char *key;  GParamSpec *pspec;  if (! PyArg_ParseTuple(args, "s", &key))    return NULL;  pspec = st_handler_config_lookup(self->handler, key);  return pspec ? pyg_param_spec_new(pspec) : pst_none();}/*** C API *******************************************************************/gbooleanpst_handler_config_register (PyObject *module){  PyTypeObject *ptr = &PSTHandlerConfig_Type;  g_return_val_if_fail(module != NULL, FALSE);  if (PyType_Ready(&PSTHandlerConfig_Type) < 0)    return FALSE;  Py_INCREF(&PSTHandlerConfig_Type);  PyModule_AddObject(module, "HandlerConfig", (PyObject *) ptr);    return TRUE;}PyObject *pst_handler_config_new (STHandler *handler){  PSTHandlerConfig *self;  self = PyObject_New(PSTHandlerConfig, &PSTHandlerConfig_Type);  if (! self)    return NULL;  self->handler = handler;  return (PyObject *) self;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?