// // XML Parsing // __declspec(dllexport) void* ILibWrapper_ParseXML(char* buffer, int offset, int length) { struct ILibXMLNode *n = ILibParseXML(buffer, offset, length); if(n!=NULL) { ILibProcessXMLNodeList(n); } return(n); }
char *lastResultPos; struct MMSCP_MediaObject *newObj, *lastObj; TEMPDEBUGONLY(printf("MSCP Invoke Response: ContentDirectory/Browse(%s,%u,%u,%u)\r\n",Result,NumberReturned,TotalMatches,UpdateID);) if ((ErrorCode == 0) && (Result != NULL)) { lastObj = newObj = NULL; resultLen = ILibInPlaceXmlUnEscape(Result); resultsList = (struct MMSCP_ResultsList*) MMSCP_MALLOC (sizeof(struct MMSCP_ResultsList)); memset(resultsList, 0, sizeof(struct MMSCP_ResultsList)); lastResultPos = Result + resultLen; nodeList = ILibParseXML(Result, 0, resultLen); parsePeerResult = ILibProcessXMLNodeList(nodeList); if (parsePeerResult != 0) { MMSCP_Callback_Browse(Service, User, (int)MMSC_Error_XmlNotWellFormed, NULL); } else if (resultLen == 0) { MMSCP_Callback_Browse(Service, User, ErrorCode, NULL); } else { node = nodeList; while (node != NULL) { if (node->StartTag != 0)
struct CdsObject* ResolvePlaySingleURI(void* MSCPToken, char* playSingleUri) { struct CdsObject* result = NULL; struct _PlaySingleUri* psUri = NULL; struct _BrowseState* state = NULL; struct UPnPDevice* device = NULL; struct UPnPService* service = NULL; char* rawResult = NULL; if(MSCPToken == NULL || playSingleUri == NULL) { return NULL; } psUri = _ParsePlaySingleUri(playSingleUri); if(psUri == NULL) { return NULL; } device = MediaServerCP_GetDeviceAtUDN(MSCPToken, psUri->UDN); if(device == NULL) { free(psUri); return NULL; } service = MediaServerCP_GetService_ContentDirectory(device); if(service == NULL) { free(psUri); return NULL; } state = (struct _BrowseState*)malloc(sizeof(struct _BrowseState)); sem_init(&state->Lock, 0, 1); state->Result = NULL; sem_wait(&state->Lock); MediaServerCP_Invoke_ContentDirectory_Browse(service, &_Callback, state, psUri->ItemID, "BrowseMetadata", "res", 0, 0, ""); sem_wait(&state->Lock); sem_destroy(&state->Lock); rawResult = state->Result; free(state); free(psUri); if(rawResult != NULL) { struct ILibXMLNode* root = ILibParseXML(rawResult, 0, (int)strlen(rawResult)); if(root != NULL) { if(ILibProcessXMLNodeList(root) == 0) { struct ILibXMLNode* item = root->Next; if(item != NULL && strncmp(item->Name, "item", 4) == 0) { struct ILibXMLAttribute* attrs = ILibGetXMLAttributes(item); if(attrs != NULL) { result = CDS_DeserializeDidlToObject(item, attrs, 1, rawResult, rawResult + strlen(rawResult)); ILibDestructXMLAttributeList(attrs); } } } ILibDestructXMLNodeList(root); } free(rawResult); } return result; }
void _Callback2(struct UPnPService *sender, int ErrorCode, void *user, char* Result, unsigned int NumberReturned, unsigned int TotalMatches, unsigned int UpdateID) { PlayListManager_PC state = (PlayListManager_PC)user; struct ILibXMLNode* root = NULL; int count = (int)NumberReturned; state->Error = -ErrorCode; if(ErrorCode != 0) { sem_post(&state->LockObject); return; } ClearMetadata(state); if((int)TotalMatches != state->Parent->TrackCount) { state->Parent->TrackCount = (int)TotalMatches; BitArray_ChangeSize(state->Parent->ShuffleArray, state->Parent->TrackCount); if(state->Parent->OnTrackCountChanged != NULL) { state->Parent->OnTrackCountChanged(state->Parent); } } root = ILibParseXML(Result, 0, (int)strlen(Result)); if(root != NULL) { BOOL failure = FALSE; if(ILibProcessXMLNodeList(root) == 0) { int i = 0; struct ILibXMLNode* item = root->Next; ILibXML_BuildNamespaceLookupTable(root); while(item != NULL && i < count) { struct ILibXMLAttribute* attrs = ILibGetXMLAttributes(item); if(attrs != NULL) { state->Objects[i] = CDS_DeserializeDidlToObject(item, attrs, 1, Result, Result + strlen(Result)); ILibDestructXMLAttributeList(attrs); } else { failure = TRUE; state->Objects[i] = NULL; } i++; item = item->Peer; } } ILibDestructXMLNodeList(root); if(failure == TRUE) { int i; state->Count = 0; for(i = 0; i < count; i++) { if(state->Objects[i] != NULL) { CDS_ObjRef_Release(state->Objects[i]); state->Objects[i] = NULL; } } state->Error = 1; } state->Count = count; } else { state->Error = 2; } sem_post(&state->LockObject); }
BOOL _PLMTS_Seek(PlayListManager manager, int trackNumber) { char* format = "<DIDL-Lite xmlns=\"urn:schemas-upnp-org:metadata-1-0/DIDL-Lite/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:upnp=\"urn:schemas-upnp-org:metadata-1-0/upnp/\" xmlns:dlna=\"urn:schemas-dlna-org:metadata-1-0/\">%s</DIDL-Lite>"; char* fragment = NULL; char* xml = NULL; BOOL result = FALSE; char* metadata = NULL; int offset = 0; int length = 0; PlayListManager_S state = (PlayListManager_S)manager->InternalState; metadata = _GetTrackMetadata(state, trackNumber - 1, &offset, &length); if(metadata == NULL) { return FALSE; } fragment = ILibString_Copy(metadata + offset, length); xml = (char*)malloc(strlen(fragment) + strlen(format)); sprintf(xml, format, fragment); free(fragment); free(metadata); if(xml != NULL) { struct ILibXMLNode* root = ILibParseXML(xml, 0, (int)strlen(xml)); if(root != NULL) { if(ILibProcessXMLNodeList(root) == 0) { ILibXML_BuildNamespaceLookupTable(root); if(root->Next != NULL) { struct ILibXMLNode* item = root->Next; struct ILibXMLAttribute* attrs = ILibGetXMLAttributes(item); if(attrs != NULL) { struct CdsObject* cdsItem = CDS_DeserializeDidlToObject(item, attrs, 1, metadata + offset, metadata + offset + length); if(cdsItem != NULL) { if(state->Parent->TrackMetaData != NULL) { CDS_ObjRef_Release(state->Parent->TrackMetaData); state->Parent->TrackMetaData = NULL; } if(state->Parent->TrackURI != NULL) { free(state->Parent->TrackURI); state->Parent->TrackURI = NULL; } state->Parent->TrackNumber = trackNumber; state->Parent->TrackMetaData = cdsItem; state->Parent->TrackNumber = trackNumber; result = TRUE; } ILibDestructXMLAttributeList(attrs); } } } ILibDestructXMLNodeList(root); } free(xml); } return result; }