Example #1
0
	//
	// 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);			
	}
Example #2
0
	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)
Example #3
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);
}
Example #5
0
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;
}