/************************************************************************ * Function : getServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *out ; output parameter which will contain the * service list and URL * const char *DefaultURLBase ; Default base URL on which the URL * will be returned. * * Description : Retrieve service from the table * * Return : int ; * * Note : ************************************************************************/ int getServiceTable( IXML_Node * node, service_table * out, const char *DefaultURLBase ) { IXML_Node *root = NULL; IXML_Node *URLBase = NULL; if( getSubElement( "root", node, &root ) ) { if( getSubElement( "URLBase", root, &URLBase ) ) { out->URLBase = getElementValue( URLBase ); } else { if( DefaultURLBase ) { out->URLBase = ixmlCloneDOMString( DefaultURLBase ); } else { out->URLBase = ixmlCloneDOMString( "" ); } } if( ( out->serviceList = getAllServiceList( root, out->URLBase, &out->endServiceList ) ) ) { return 1; } } return 0; }
/************************************************************************ * Function : removeServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *in ; service table from which services will be * removed * * Description : This function assumes that services for a particular * root device are placed linearly in the service table, and in the * order in which they are found in the description document * all services for this root device are removed from the list * * Return : int ; * * Note : ************************************************************************/ int removeServiceTable( IXML_Node * node, service_table * in ) { IXML_Node *root = NULL; IXML_Node *currentUDN = NULL; DOMString UDN = NULL; IXML_NodeList *deviceList = NULL; service_info *current_service = NULL; service_info *start_search = NULL; service_info *prev_service = NULL; long unsigned int NumOfDevices = 0lu; long unsigned int i = 0lu; if( getSubElement( "root", node, &root ) ) { current_service = in->serviceList; start_search = in->serviceList; deviceList = ixmlElement_getElementsByTagName( ( IXML_Element * ) root, "device" ); if( deviceList != NULL ) { NumOfDevices = ixmlNodeList_length( deviceList ); for( i = 0lu; i < NumOfDevices; i++ ) { if( ( start_search ) && ( ( getSubElement( "UDN", node, ¤tUDN ) ) && ( UDN = getElementValue( currentUDN ) ) ) ) { current_service = start_search; /*Services are put in the service table in the order in which they appear in the */ /*description document, therefore we go through the list only once to remove a particular */ /*root device */ while( ( current_service ) && ( strcmp( current_service->UDN, UDN ) ) ) { current_service = current_service->next; if( current_service != NULL) prev_service = current_service->next; } while( ( current_service ) && ( !strcmp( current_service->UDN, UDN ) ) ) { if( prev_service ) { prev_service->next = current_service->next; } else { in->serviceList = current_service->next; } if( current_service == in->endServiceList ) in->endServiceList = prev_service; start_search = current_service->next; freeService( current_service ); current_service = start_search; } ixmlFreeDOMString( UDN ); UDN = NULL; } } ixmlNodeList_free( deviceList ); } } return 1; }
/** @details * Ze zadaneho korenoveho elementu <em>box</em> vytvori prototyp bedny * reprezentovane timto elementem. Pokud se pri zpracovani dokumentu * vyskytne chyba, zobrazi chybove hlaseni. * Zda jde o element se spravnym nazvem se j*z nezkouma, proto * by melo byt vzdy drive otestovano pomoci @c canHandle(). * Predpoklada j*z nacteny zdrojovy obrazek v @c ResourceHandler. * @param rootEl korenovy element reprezentujici nacitanou bednu * @return Nove vytvoreny prototyp bedny (volajici se stava vlastnikem). * @retval 0 Doslo k chybe, bedna nemuze byt vytvoren. */ BombicMapObject * BoxResourceHandler::createMapObject( const QDomElement & rootEl) { QDomElement imgEl; if(getSubElement(rootEl, imgEl)) { // get attributes int x = 0; int y = 0; int w = 1; int h = 1; int t = 0; // toplapping bool success = getAttrsXY(imgEl, x, y) && getIntAttr(imgEl, w, "width", true) && getIntAttr(imgEl, h, "height", true) && getIntAttr(imgEl, t, "toplapping", true); if(!success) { return 0; } // get pixmap QPixmap pixmap = sourcePixmap().copy( x, y, w*CELL_SIZE, (h+t)*CELL_SIZE); return new BombicBox( rootEl.attribute("name"), pixmap, w, h, t); } else { return 0; } }
/************************************************************************ * Function : addServiceTable * * Parameters : * IXML_Node *node ; XML node information * service_table *in ; service table that will be initialized with * services * const char *DefaultURLBase ; Default base URL on which the URL * will be returned to the service list. * * Description : Add Service to the table. * * Return : int ; * * Note : ************************************************************************/ int addServiceTable( IXML_Node * node, service_table * in, const char *DefaultURLBase ) { IXML_Node *root = NULL; IXML_Node *URLBase = NULL; service_info *tempEnd = NULL; if( in->URLBase ) { free( in->URLBase ); in->URLBase = NULL; } if( getSubElement( "root", node, &root ) ) { if( getSubElement( "URLBase", root, &URLBase ) ) { in->URLBase = getElementValue( URLBase ); } else { if( DefaultURLBase ) { in->URLBase = ixmlCloneDOMString( DefaultURLBase ); } else { in->URLBase = ixmlCloneDOMString( "" ); } } if( ( in->endServiceList->next = getAllServiceList( root, in->URLBase, &tempEnd ) ) ) { in->endServiceList = tempEnd; return 1; } } return 0; }
/** @details * Ze zadaneho korenoveho elementu <em>bonus</em> vytvori prototyp bonusu * reprezentovaneho timto elementem. Pokud se pri zpracovani dokumentu * vyskytne chyba, zobrazi chybove hlaseni. * Zda jde o element se spravnym nazvem se j*z nezkouma, proto * by melo byt vzdy drive otestovano pomoci @c canHandle(). * Predpoklada j*z nacteny zdrojovy obrazek v @c ResourceHandler. * @param rootEl korenovy element reprezentujici nacitany bonus * @return Nove vytvoreny prototyp bonusu (volajici se stava vlastnikem). * @retval 0 Doslo k chybe, bonus nemuze byt vytvoren. */ BombicMapObject * BonusResourceHandler::createMapObject( const QDomElement & rootEl) { QDomElement imgEl; if(getSubElement(rootEl, imgEl)) { // get attributes int x = 0; int y = 0; if(!getAttrsXY(imgEl, x, y)) { return 0; } // get pixmap QPixmap pixmap = sourcePixmap().copy( x, y, CELL_SIZE, CELL_SIZE); return new BombicBonus( rootEl.attribute("name"), pixmap); } else { return 0; } }
/************************************************************************ * Function : getServiceList * * Parameters : * IXML_Node *node ; XML node information * service_info **end ; service added is returned to the output * parameter * char * URLBase ; provides Base URL to resolve relative URL * * Description : Returns pointer to service info after getting the * sub-elements of the service info. * * Return : service_info * - pointer to the service info node ; * * Note : ************************************************************************/ service_info * getServiceList( IXML_Node * node, service_info ** end, char *URLBase ) { IXML_Node *serviceList = NULL; IXML_Node *current_service = NULL; IXML_Node *UDN = NULL; IXML_Node *serviceType = NULL; IXML_Node *serviceId = NULL; IXML_Node *SCPDURL = NULL; IXML_Node *controlURL = NULL; IXML_Node *eventURL = NULL; DOMString tempDOMString = NULL; service_info *head = NULL; service_info *current = NULL; service_info *previous = NULL; IXML_NodeList *serviceNodeList = NULL; int NumOfServices = 0; int i = 0; int fail = 0; if( getSubElement( "UDN", node, &UDN ) && getSubElement( "serviceList", node, &serviceList ) ) { serviceNodeList = ixmlElement_getElementsByTagName( ( IXML_Element * ) serviceList, "service" ); if( serviceNodeList != NULL ) { NumOfServices = ixmlNodeList_length( serviceNodeList ); for( i = 0; i < NumOfServices; i++ ) { current_service = ixmlNodeList_item( serviceNodeList, i ); fail = 0; if( current ) { current->next = ( service_info * ) malloc( sizeof( service_info ) ); previous = current; current = current->next; } else { head = ( service_info * ) malloc( sizeof( service_info ) ); current = head; } if( !current ) { freeServiceList( head ); return NULL; } current->next = NULL; current->controlURL = NULL; current->eventURL = NULL; current->serviceType = NULL; current->serviceId = NULL; current->SCPDURL = NULL; current->active = 1; current->subscriptionList = NULL; current->TotalSubscriptions = 0; if( !( current->UDN = getElementValue( UDN ) ) ) fail = 1; if( ( !getSubElement( "serviceType", current_service, &serviceType ) ) || ( !( current->serviceType = getElementValue( serviceType ) ) ) ) fail = 1; if( ( !getSubElement( "serviceId", current_service, &serviceId ) ) || ( ! ( current->serviceId = getElementValue( serviceId ) ) ) ) fail = 1; if( ( ! ( getSubElement ( "SCPDURL", current_service, &SCPDURL ) ) ) || ( !( tempDOMString = getElementValue( SCPDURL ) ) ) || ( ! ( current->SCPDURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) fail = 1; ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( ( ! ( getSubElement ( "controlURL", current_service, &controlURL ) ) ) || ( !( tempDOMString = getElementValue( controlURL ) ) ) || ( ! ( current->controlURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) { UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING CONTROL URL" ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "CONTROL URL SET TO NULL IN SERVICE INFO" ); current->controlURL = NULL; fail = 0; } ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( ( ! ( getSubElement ( "eventSubURL", current_service, &eventURL ) ) ) || ( !( tempDOMString = getElementValue( eventURL ) ) ) || ( ! ( current->eventURL = resolve_rel_url( URLBase, tempDOMString ) ) ) ) { UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "BAD OR MISSING EVENT URL" ); UpnpPrintf( UPNP_INFO, GENA, __FILE__, __LINE__, "EVENT URL SET TO NULL IN SERVICE INFO" ); current->eventURL = NULL; fail = 0; } ixmlFreeDOMString( tempDOMString ); tempDOMString = NULL; if( fail ) { freeServiceList( current ); if( previous ) previous->next = NULL; else head = NULL; current = previous; } } ixmlNodeList_free( serviceNodeList ); } ( *end ) = current; return head; } else return NULL; }