mUpnpXmlNode *mupnp_control_action_request_createactionnode(mUpnpAction *action) { mUpnpService *service; mUpnpXmlNode *actionNode; mUpnpArgument *arg; mUpnpXmlNode *argNode; mUpnpString *nameWithNamespace; mupnp_log_debug_l4("Entering...\n"); service = mupnp_action_getservice(action); actionNode = mupnp_xml_node_new(); /**** Thanks for Visa Smolander (10/31/2005) ****/ nameWithNamespace = mupnp_string_new(); mupnp_string_addvalue( nameWithNamespace, MUPNP_CONTROL_NS ":" ); mupnp_string_addvalue( nameWithNamespace, mupnp_action_getname(action) ); mupnp_xml_node_setname(actionNode, mupnp_string_getvalue( nameWithNamespace ) ); mupnp_string_delete( nameWithNamespace ); mupnp_xml_node_setnamespace(actionNode, MUPNP_CONTROL_NS, mupnp_service_getservicetype(service)); for (arg = mupnp_action_getarguments(action); arg; arg = mupnp_argument_next(arg)) { if (mupnp_argument_isindirection(arg) == false) continue; argNode = mupnp_xml_node_new(); mupnp_xml_node_setname(argNode, mupnp_argument_getname(arg)); mupnp_xml_node_setvalue(argNode, mupnp_argument_getvalue(arg)); mupnp_xml_node_addchildnode(actionNode, argNode); } mupnp_log_debug_l4("Leaving...\n"); return actionNode; }
void mupnp_control_action_request_setaction(mUpnpActionRequest *actionReq, mUpnpAction *action) { mUpnpService *service; mUpnpSoapRequest *soapReq; mUpnpString *soapAction; mUpnpXmlNode *bodyNode; mUpnpXmlNode *contentNode; mupnp_log_debug_l4("Entering...\n"); service = mupnp_action_getservice(action); soapReq = mupnp_control_action_request_getsoaprequest(actionReq); soapAction = mupnp_string_new(); mupnp_string_addvalue(soapAction, "\""); mupnp_string_addvalue(soapAction, mupnp_service_getservicetype(service)); mupnp_string_addvalue(soapAction, "#"); mupnp_string_addvalue(soapAction, mupnp_action_getname(action)); mupnp_string_addvalue(soapAction, "\""); mupnp_soap_request_setsoapaction(soapReq, mupnp_string_getvalue(soapAction)); mupnp_string_delete(soapAction); mupnp_control_request_sethostfromservice(soapReq, service); mupnp_control_soap_request_initializeenvelopenode(soapReq); bodyNode = mupnp_soap_request_getbodynode(soapReq); contentNode = mupnp_control_action_request_createactionnode(action); mupnp_xml_node_addchildnode(bodyNode, contentNode); mupnp_soap_request_createcontent(soapReq); mupnp_log_debug_l4("Leaving...\n"); }
BOOL upnp_clock_actionreceived(mUpnpAction *action) { mUpnpTime currTime; const char *actionName; mUpnpArgument *currTimeArg; char sysTimeStr[SYSTEM_TIME_BUF_LEN]; mUpnpArgument *newTimeArg, *resultArg; currTime = mupnp_getcurrentsystemtime(); actionName = mupnp_action_getname(action); if (strcmp("GetTime", actionName) == 0) { GetSystemTimeString(currTime, sysTimeStr); currTimeArg = mupnp_action_getargumentbyname(action, "CurrentTime"); mupnp_argument_setvalue(currTimeArg, sysTimeStr); return TRUE; } if (strcmp(actionName, "SetTime") == 0) { newTimeArg = mupnp_action_getargumentbyname(action, "NewTime"); resultArg = mupnp_action_getargumentbyname(action, "Result"); mupnp_argument_setvalue(resultArg, "Not implemented"); return TRUE; } return FALSE; }
mUpnpAction *SelectAction(mUpnpService *service) { mUpnpAction *action; int n; char key; int actionNum; n = 0; for (action = mupnp_service_getactions(service); action != NULL; action = mupnp_action_next(action)) { key = 'a' + n; if ('z' < key) break; printf(" [%c] = %s\n", key, mupnp_action_getname(action)); n++; } printf("Select Action : "); key = kbgetkey(); key = tolower(key); printf("%c\n", key); if (!isalpha(key)) return NULL; actionNum = key - 'a'; action = mupnp_service_getactions(service); for (n=0; n<actionNum; n++) action = mupnp_action_next(action); return action; }
static mUpnpXmlNode *mupnp_control_action_response_createresponsenode(mUpnpAction *action) { mUpnpXmlNode *actionNameResNode; char nodeName[MUPNP_ACTOINNAME_LEN_MAX + sizeof(MUPNP_SOAP_METHODNS) + sizeof(MUPNP_SOAP_DELIM) + sizeof(MUPNP_SOAP_RESPONSE) + 1]; char attrName[sizeof(MUPNP_SOAP_ATTRIBUTE_XMLNS) + sizeof(MUPNP_SOAP_DELIM) + sizeof(MUPNP_SOAP_METHODNS) + 1]; const char *actionName; mUpnpXmlNode *serviceNode; mUpnpService *service; mUpnpArgumentList *argList; mUpnpArgument *arg; mUpnpXmlNode *argNode; mupnp_log_debug_l4("Entering...\n"); actionNameResNode = mupnp_xml_node_new(); /* action name */ actionName = mupnp_action_getname(action); mupnp_strcpy(nodeName, MUPNP_SOAP_METHODNS); mupnp_strcat(nodeName, MUPNP_SOAP_DELIM); mupnp_strncat(nodeName, actionName, MUPNP_ACTOINNAME_LEN_MAX); mupnp_strcat(nodeName, MUPNP_SOAP_RESPONSE); mupnp_xml_node_setname(actionNameResNode, nodeName); /* service attribute */ serviceNode = mupnp_service_getservicenode(mupnp_action_getservice(action)); if (serviceNode != NULL) { service = mupnp_service_new(); mupnp_service_setservicenode(service, serviceNode); mupnp_strcpy(attrName, MUPNP_SOAP_ATTRIBUTE_XMLNS); mupnp_strcat(attrName, MUPNP_SOAP_DELIM); mupnp_strcat(attrName, MUPNP_SOAP_METHODNS); mupnp_xml_node_setattribute(actionNameResNode, attrName, mupnp_service_getservicetype(service)); mupnp_service_delete(service); } /* arguments */ argList = mupnp_action_getargumentlist(action); for (arg = mupnp_argumentlist_gets(argList); arg != NULL; arg = mupnp_argument_next(arg)) { if (mupnp_argument_isoutdirection(arg) == false) continue; argNode = mupnp_xml_node_new(); mupnp_xml_node_setname(argNode, mupnp_argument_getname(arg)); mupnp_xml_node_setvalue(argNode, mupnp_argument_getvalue(arg)); mupnp_xml_node_addchildnode(actionNameResNode, argNode); } return actionNameResNode; mupnp_log_debug_l4("Leaving...\n"); }
// Used for xbox360 support, see README.360 bool mupnp_upnpav_dms_medrec_actionreceived(mUpnpAction *action) { char *actionName; mUpnpArgument *arg; actionName = (char*)mupnp_action_getname(action); if (mupnp_strlen(actionName) <= 0) return false; if (mupnp_streq(actionName, CG_UPNPAV_DMS_MEDIARECEIVER_IS_AUTHORIZED )) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_MEDIARECEIVER_RESULT); if (!arg) return false; mupnp_argument_setvalue(arg, "1"); return true; } if (mupnp_streq(actionName, CG_UPNPAV_DMS_MEDIARECEIVER_IS_VALIDATED)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_MEDIARECEIVER_RESULT); if (!arg) return false; mupnp_argument_setvalue(arg, "1"); return true; } if (mupnp_streq(actionName, CG_UPNPAV_DMS_MEDIARECEIVER_REGISTER_DEVICE)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_MEDIARECEIVER_REGISTRATION_RESP_MSG); if (!arg) return false; // Specifications say to return base64 message. mupnp_argument_setvalue(arg, "1"); return true; } return true; }
void PrintDeviceInfo(mUpnpDevice *dev, int indent) { char indentStr[128]; int n; mUpnpService *service; int serviceCnt; mUpnpAction *action; int actionCnt; mUpnpArgumentList *arg; int argCnt; mUpnpStateVariable *stateVar; int stateVarCnt; for (n=0; n<indent && n<(sizeof(indentStr)-1); n++) indentStr[n] = ' '; indentStr[n] = '\0'; serviceCnt = 0; for (service = mupnp_device_getservices(dev); service != NULL; service = mupnp_service_next(service)) { printf("%s service[%d] = %s\n", indentStr, ++serviceCnt, mupnp_service_getservicetype(service)); actionCnt = 0; for (action = mupnp_service_getactions(service); action != NULL; action = mupnp_action_next(action)) { printf("%s action[%d] = %s\n", indentStr, ++actionCnt, mupnp_action_getname(action)); argCnt = 0; for (arg = mupnp_action_getarguments(action); arg != NULL; arg = mupnp_argument_next(arg)) { printf("%s arg[%d] = %s\n", indentStr, ++argCnt, mupnp_argument_getname(arg)); } } stateVarCnt = 0; for (stateVar = mupnp_service_getstatevariables(service); stateVar != NULL; stateVar = mupnp_statevariable_next(stateVar)) { printf("%s stateVar[%d] = %s = %s\n", indentStr, ++stateVarCnt, mupnp_statevariable_getname(stateVar), mupnp_statevariable_getvalue(stateVar)); } } }
bool mupnp_upnpav_dms_condir_actionreceived(mUpnpAction *action) { mUpnpAvServer *dms; mUpnpDevice *dev; char *actionName; mUpnpArgument *arg; char *argValue; char intBuf[MUPNP_STRING_INTEGER_BUFLEN]; actionName = (char*)mupnp_action_getname(action); if (mupnp_strlen(actionName) <= 0) return false; dev = (mUpnpDevice *)mupnp_service_getdevice(mupnp_action_getservice(action)); if (!dev) return false; dms = (mUpnpAvServer *)mupnp_device_getuserdata(dev); if (!dms) return false; /* Browse */ if (mupnp_streq(actionName, CG_UPNPAV_DMS_CONTENTDIRECTORY_BROWSE)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_CONTENTDIRECTORY_BROWSE_BROWSE_FLAG); if (!arg) return false; argValue = mupnp_argument_getvalue(arg); if (mupnp_streq(argValue, CG_UPNPAV_DMS_CONTENTDIRECTORY_BROWSE_BROWSE_METADATA)) return mupnp_upnpav_dms_condir_browsemetadata(dms, action); if (mupnp_streq(argValue, CG_UPNPAV_DMS_CONTENTDIRECTORY_BROWSE_BROWSE_DIRECT_CHILDREN)) return mupnp_upnpav_dms_condir_browsedirectchildren(dms, action); return false; } /* Search */ if (mupnp_streq(actionName, CG_UPNPAV_DMS_CONTENTDIRECTORY_SEARCH)) { /* Not Implemented */ return false; } /* Sort Capabilities */ if (mupnp_streq(actionName, CG_UPNPAV_DMS_CONTENTDIRECTORY_GET_SORT_CAPABILITIES)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_CONTENTDIRECTORY_SORT_CAPS); if (!arg) return false; mupnp_argument_setvalue(arg, ""); return true; } /* Search Capabilities */ if (mupnp_streq(actionName, CG_UPNPAV_DMS_CONTENTDIRECTORY_GET_SEARCH_CAPABILITIES)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_CONTENTDIRECTORY_SEARCH_CAPS); if (!arg) return false; mupnp_argument_setvalue(arg, ""); return true; } /* System Update ID */ if (mupnp_streq(actionName, CG_UPNPAV_DMS_CONTENTDIRECTORY_GET_SYSTEM_UPDATE_ID)) { arg = mupnp_action_getargumentbyname(action, CG_UPNPAV_DMS_CONTENTDIRECTORY_ID); if (!arg) return false; mupnp_argument_setvalue(arg, mupnp_int2str(mupnp_upnpav_dms_condir_getsystemupdateid(dms), intBuf, MUPNP_STRING_INTEGER_BUFLEN)); return true; } return false; }