__declspec(dllexport) void ILibWrapper_DestructXMLNodeList(struct ILibXMLNode *node) { ILibDestructXMLNodeList(node); }
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); }
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; }
int main(void) { struct ISTAR_SERIES_INFO series_info; //struct ISTAR_IPTV_INFO iptv_info; char lpBuffer[1000000];//= NULL; int i; int nRet = RSP_FAIL; int buf_size = 0; struct ILibXMLNode *rootXML = NULL, *xml = NULL; struct ISTAR_SERIES_XML_ITEM *lpEntry = NULL; FILE *fp_r, *fp_w; unsigned long file_length; lpEntry = series_info.list; //lpEntry = iptv_info.list; fp_r = fopen("Seriese_content.xml", "r"); //fp_r = fopen("movie_content.xml", "r"); //fp_r = fopen("Online-Tv .xml", "r"); // The test result will be saved here fp_w = fopen("output.txt", "a+"); fseek(fp_r, 0, SEEK_END); file_length = ftell(fp_r); fseek(fp_r, 0, SEEK_SET); if((buf_size = fread(lpBuffer, 1, file_length, fp_r)) <= 0){ ERR("No data!!!"); return -1; } if(lpBuffer && buf_size > 0 && lpEntry) { //Get the xml_name list rootXML = xml = ILibParseXML(lpBuffer, 0, buf_size); nRet = RSP_FAIL; while(xml != NULL) { if(xml->NameLength == 8 && memcmp(xml->Name, "catagory", 8) == 0 || xml->NameLength == 8 && memcmp(xml->Name, "language", 8) == 0) { nRet = istar_sub_type_parser(&xml); if(nRet) continue; xml = xml->Next; while(xml!=NULL && *(xml->Name-1)!='/' && i<ISTAR_ITEM_NUMBER) { nRet = RSP_FAIL; if(xml->EmptyTag){ if(xml->Next == NULL) break; else xml = xml->Next; } if(xml->NameLength==7 && memcmp(xml->Name, "channel", 7)==0 || xml->NameLength==6 && memcmp(xml->Name, "series", 6)==0 || xml->NameLength==5 && memcmp(xml->Name, "movie", 5)==0) { memcpy(lpEntry[i].category, xml_type, ISTAR_CATEGORY_LEN_MAX); nRet = istar_series_attr_parser(&xml, &lpEntry[i]); } if(nRet == RSP_OK) i++; xml = xml->Next; } if(xml == NULL || i >= ISTAR_ITEM_NUMBER) break; } xml = xml->Next; } // Destruct XML node list ILibDestructXMLNodeList(rootXML); } for(i=0; i<ISTAR_ITEM_NUMBER; i++){ fwrite(lpEntry[i].category, 1, ISTAR_CATEGORY_LEN_MAX, fp_w); fwrite("\r\n", 1, 2, fp_w); fwrite(lpEntry[i].thumbnail, 1, ISTAR_THUMB_URL_MAX, fp_w); fwrite("\r\n", 1, 2, fp_w); fwrite(lpEntry[i].videourl, 1, ISTAR_VIDEO_URL_MAX, fp_w); fwrite("\r\n", 1, 2, fp_w); fwrite(lpEntry[i].title, 1, ISTAR_TITLE_LEN_MAX, fp_w); fwrite("\r\n", 1, 2, fp_w); fwrite(lpEntry[i].type, 1, ISTAR_TYPE_LEN_MAX, fp_w); fwrite("\r\n\r\n", 1, 4, fp_w); } fclose(fp_r); fclose(fp_w); return nRet; }
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; }