Exemple #1
0
void MMSCP_StringFixup(char **fixThis, char** di, char *emptyStr, const char *data, const char *rangeStart, const char *rangeEnd)
{
	int len;

	if (data != NULL)
	{
		if ((rangeStart <= data) && (data <= rangeEnd))
		{
			/* store an XML-unescaped representation */

			*fixThis = *di;
			len = (int) strlen(data);
			memcpy(*di, data, len);

			ILibInPlaceXmlUnEscape(*di);

			*di = *di + len + 1;
		}
		else
		{
			*fixThis = (char*)data;
		}
	}
	else
	{
		*fixThis = emptyStr;
	}
}
Exemple #2
0
	struct ILibXMLNode* node;
	struct MMSCP_ResultsList *resultsList;
	struct ILibXMLAttribute *attribs;
	
	int resultLen;
	int parsePeerResult = 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);
		}
void UpnpContentDirectory_Browse(void* upnptoken,char* ObjectID,char* BrowseFlag,char* Filter,unsigned int StartingIndex,unsigned int RequestedCount,char* SortCriteria)
{
	struct MSL_CdsQuery *browseArgs;
	int errorCode;
	const char *errorMsg;
	enum MSL_Enum_QueryTypes browseChildren;
	int size;

	#ifdef _DEBUG
	printf("UPnP Invoke: UpnpContentDirectory_Browse();\r\n");
	#endif

	/*
	 *	Validate arguments.
	 */

	errorCode = 0;
	errorMsg = NULL;
	if (stricmp(BrowseFlag, CDS_STRING_BROWSE_DIRECT_CHILDREN) == 0)
	{
		browseChildren = MSL_Query_BrowseDirectChildren;
	}
	else if (stricmp(BrowseFlag, CDS_STRING_BROWSE_METADATA) == 0)
	{
		browseChildren = MSL_Query_BrowseMetadata;
	}
	else
	{
		fprintf(stderr, "WARNING: UpnpContentDirectory_Browse(): Possible error with generated microstack. Encountered BrowseFlag='%s'\r\n", BrowseFlag);
		errorCode = MSL_ERROR_CODE_INVALID_BROWSEFLAG;
		errorMsg = MSL_ERROR_MSG_INVALID_BROWSEFLAG;
	}

	if ((errorCode != 0) || (errorMsg != NULL))
	{
		/* ensure that the error code and message map to something */
		if (errorCode == 0) { errorCode = MSL_ERROR_CODE_INTERNAL; }
		if (errorMsg == NULL) {	errorMsg = MSL_ERROR_MSG_INTERNAL; }

		UpnpResponse_Error(upnptoken, errorCode, errorMsg);
	}
	else
	{
		/*
		 *	Input arguments valid at UPnP layer.
		 *	Create an MSL_CdsQuery object and execute
		 *	the browse callback so that application can return results.
		 */

		browseArgs = (struct MSL_CdsQuery*) MSL_MALLOC (sizeof(struct MSL_CdsQuery));
		memset(browseArgs, 0, sizeof(struct MSL_CdsQuery));

		browseArgs->QueryType = browseChildren;
		
		size = (int) strlen(Filter)+1;
		browseArgs->Filter = (char*) MSL_MALLOC(size);
		memcpy(browseArgs->Filter, Filter, size);

		browseArgs->MediaServerObject = MSL_TheMslObj;
		
		size = (int) strlen(ObjectID)+1;
		browseArgs->ObjectID = (char*) MSL_MALLOC(size);
		memcpy(browseArgs->ObjectID, ObjectID, size);
		/* Be sure to unescape it first. */
		ILibInPlaceXmlUnEscape(browseArgs->ObjectID);

		browseArgs->RequestedCount = RequestedCount;

		size = (int) strlen(SortCriteria)+1;
		browseArgs->SortCriteria = (char*) MSL_MALLOC(size);
		memcpy(browseArgs->SortCriteria, SortCriteria, size);

		browseArgs->StartingIndex = StartingIndex;

		browseArgs->UpnpToken = upnptoken;
		browseArgs->UserObject = NULL;

		browseArgs->IpAddrList = NULL;
		MSL_Helper_PopulateIpInfo(MSL_TheMslObj, browseArgs);

		if (MSL_Callback_OnQuery != NULL)
		{
			MSL_Callback_OnQuery(browseArgs);
		}
	}
}