Mercurial > pt1.oyama
diff src/services.c @ 125:e413158cae13
Add ushare project files.
author | naoyan@johnstown.minaminoshima.org |
---|---|
date | Sun, 03 Oct 2010 11:35:19 +0900 |
parents | |
children | 2a9ac5ce2c7e |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/services.c Sun Oct 03 11:35:19 2010 +0900 @@ -0,0 +1,177 @@ +/* + * services.c : GeeXboX uShare UPnP services handler. + * Originally developped for the GeeXboX project. + * Parts of the code are originated from GMediaServer from Oskar Liljeblad. + * Copyright (C) 2005-2007 Benjamin Zores <ben@geexbox.org> + * + * This program 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. + * + * This program 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 Library General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include <stdlib.h> +#include <upnp/upnp.h> +#include <upnp/upnptools.h> + +#include "ushare.h" +#include "services.h" +#include "cms.h" +#include "cds.h" +#include "msr.h" +#include "trace.h" + +/* Represent the ObjectID argument. */ +#define ARG_OBJECT_ID "ObjectID" + +/* Represent the ContainerID argument. */ +#define ARG_CONTAINER_ID "ContainerID" + +extern struct service_action_t cds_service_actions[]; +extern struct service_action_t cms_service_actions[]; +extern struct service_action_t msr_service_actions[]; + +static struct service_t services[] = { + { + CDS_SERVICE_ID, + CDS_SERVICE_TYPE, + cds_service_actions + }, + { + CMS_SERVICE_ID, + CMS_SERVICE_TYPE, + cms_service_actions + }, + { + MSR_SERVICE_ID, + MSR_SERVICE_TYPE, + msr_service_actions + }, + { NULL, NULL, NULL } +}; + +bool +find_service_action (struct Upnp_Action_Request *request, + struct service_t **service, + struct service_action_t **action) +{ + int c, d; + + *service = NULL; + *action = NULL; + + if (!request || !request->ActionName) + return false; + + for (c = 0; services[c].id != NULL; c++) + if (!strcmp (services[c].id, request->ServiceID)) + { + *service = &services[c]; + for (d = 0; services[c].actions[d].name; d++) + { + if (!strcmp (services[c].actions[d].name, request->ActionName)) + { + *action = &services[c].actions[d]; + return true; + } + } + return false; + } + + return false; +} + +bool +upnp_add_response (struct action_event_t *event, char *key, const char *value) +{ + char *val; + int res; + + if (!event || !event->status || !key || !value) + return false; + + val = strdup (value); + if (!val) + return false; + + res = UpnpAddToActionResponse (&event->request->ActionResult, + event->request->ActionName, + event->service->type, key, val); + + if (res != UPNP_E_SUCCESS) + { + free (val); + return false; + } + + free (val); + return true; +} + +char * +upnp_get_string (struct Upnp_Action_Request *request, const char *key) +{ + IXML_Node *node = NULL; + + if (!request || !request->ActionRequest || !key) + return NULL; + + node = (IXML_Node *) request->ActionRequest; + if (!node) + { + log_verbose ("Invalid action request document\n"); + return NULL; + } + + node = ixmlNode_getFirstChild (node); + if (!node) + { + log_verbose ("Invalid action request document\n"); + return NULL; + } + + node = ixmlNode_getFirstChild (node); + for (; node; node = ixmlNode_getNextSibling (node)) + if (!strcmp (ixmlNode_getNodeName (node), key)) + { + node = ixmlNode_getFirstChild (node); + if (!node) + return strdup (""); + return strdup (ixmlNode_getNodeValue (node)); + } + + log_verbose ("Missing action request argument (%s)\n", key); + + return NULL; +} + +int +upnp_get_ui4 (struct Upnp_Action_Request *request, const char *key) +{ + char *value; + int val; + + if (!request || !key) + return 0; + + value = upnp_get_string (request, key); + if (!value && !strcmp (key, ARG_OBJECT_ID)) + value = upnp_get_string (request, ARG_CONTAINER_ID); + + if (!value) + return 0; + + val = atoi (value); + free (value); + + return val; +}