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; } }
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); } } }