GPAC_ServiceItem *GPAC_DeviceItem::FindService(const char *type) { u32 i, count; GPAC_ServiceItem *serv; count = gf_list_count(m_Services); for (i=0; i<count; i++) { serv = (GPAC_ServiceItem*)gf_list_get(m_Services, i); if (serv->m_service->GetServiceType() == type) return serv; } PLT_Service *service; if (m_device->FindServiceByType(type, service) != NPT_SUCCESS) return NULL; serv = new GPAC_ServiceItem(this, service); #ifdef GPAC_HAS_SPIDERMONKEY serv->js_ctx = js_ctx; serv->obj = JS_NewObject(serv->js_ctx, &m_pUPnP->upnpServiceClass._class, 0, obj); gf_js_add_root(serv->js_ctx, &serv->obj, GF_JSGC_OBJECT); SMJS_SET_PRIVATE(serv->js_ctx, serv->obj, serv); JS_DefineProperty(serv->js_ctx, serv->obj, "Name", STRING_TO_JSVAL( JS_NewStringCopyZ(serv->js_ctx, service->GetServiceID()) ), 0, 0, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineProperty(serv->js_ctx, serv->obj, "Type", STRING_TO_JSVAL( JS_NewStringCopyZ(serv->js_ctx, service->GetServiceType()) ), 0, 0, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineProperty(serv->js_ctx, serv->obj, "Hostname", STRING_TO_JSVAL( JS_NewStringCopyZ(serv->js_ctx, m_device->GetURLBase().GetHost() ) ), 0, 0, JSPROP_READONLY | JSPROP_PERMANENT); JS_DefineFunction(serv->js_ctx, serv->obj, "SetStateVariableListener", upnp_service_set_listener, 1, 0); JS_DefineFunction(serv->js_ctx, serv->obj, "HasStateVariable", upnp_service_has_var, 1, 0); JS_DefineFunction(serv->js_ctx, serv->obj, "HasAction", upnp_service_has_action, 2, 0); JS_DefineFunction(serv->js_ctx, serv->obj, "CallAction", upnp_service_call_action, 2, 0); JS_DefineFunction(serv->js_ctx, serv->obj, "SetActionListener", upnp_service_set_action_listener, 2, 0); JS_DefineFunction(serv->js_ctx, serv->obj, "GetSCPD", upnp_service_get_scpd, 1, 0); #endif gf_list_add(m_Services, serv); return serv; }