diff --git a/minidlnatypes.h b/minidlnatypes.h index a352bb6..6560ca8 100644 --- a/minidlnatypes.h +++ b/minidlnatypes.h @@ -41,6 +41,7 @@ enum client_types { ESamsungTV, EDenonReceiver, EFreeBox, + EPopcornHour, EStandardDLNA150 = 100 }; diff --git a/upnpglobalvars.h b/upnpglobalvars.h index 0f4980f..ba4cf53 100644 --- a/upnpglobalvars.h +++ b/upnpglobalvars.h @@ -78,7 +78,7 @@ "http-get:*:video/x-ms-wmv:*," \ "http-get:*:video/x-msvideo:*," \ "http-get:*:audio/mp4:*," \ - "http-get:*:audio/wav:*," \ + "http-get:*:audio/x-wav:*," \ "http-get:*:audio/x-flac:*," \ "http-get:*:application/ogg:*" diff --git a/upnphttp.c b/upnphttp.c index 426d463..4486c04 100644 --- a/upnphttp.c +++ b/upnphttp.c @@ -256,6 +256,11 @@ intervening space) by either an integer or the keyword "infinite". */ { h->req_client = EFreeBox; } + else if(strncmp(p, "SMP8634", 7)==0) + { + h->req_client = EPopcornHour; + h->reqflags |= FLAG_MIME_FLAC_FLAC; + } } else if(strncasecmp(line, "X-AV-Client-Info", 16)==0) { @@ -338,6 +343,7 @@ next_header: h->req_contentoff++; } h->req_contentoff += 2; + h->req_contentlen = h->req_buflen - h->req_contentoff; } else { @@ -817,6 +823,7 @@ Process_upnphttp(struct upnphttp * h) if(endheaders) { h->req_contentoff = endheaders - h->req_buf + 4; + h->req_contentlen = h->req_buflen - h->req_contentoff; ProcessHttpQuery_upnphttp(h); } } diff --git a/upnphttp.h b/upnphttp.h index c26a3c3..5d9d1d9 100644 --- a/upnphttp.h +++ b/upnphttp.h @@ -85,7 +85,8 @@ struct upnphttp { #define FLAG_MIME_AVI_DIVX 0x00200000 #define FLAG_MIME_AVI_AVI 0x00400000 #define FLAG_MIME_WAV_WAV 0x00800000 -#define FLAG_WAV_NO_DLNA 0x01000000 +#define FLAG_MIME_FLAC_FLAC 0x01000000 +#define FLAG_WAV_NO_DLNA 0x02000000 /* New_upnphttp() */ struct upnphttp * diff --git a/upnpsoap.c b/upnpsoap.c index b0c79d7..9b78d0c 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -222,9 +222,9 @@ mime_to_ext(const char * mime, char * buf) strcpy(buf, "wma"); else if( strcmp(mime+6, "x-flac") == 0 ) strcpy(buf, "flac"); - else if( strncmp(mime+6, "", 3) == 0 ) - strcpy(buf, "wav"); - else if( strncmp(mime+6, "x-wav", 3) == 0 ) + else if( strcmp(mime+6, "flac") == 0 ) + strcpy(buf, "flac"); + else if( strcmp(mime+6, "x-wav") == 0 ) strcpy(buf, "wav"); else strcpy(buf, "dat"); @@ -559,15 +559,25 @@ callback(void *args, int argc, char **argv, char **azColName) } } } - else if( strncmp(mime+6, "L16", 3) == 0 ) + else if( *mime == 'a' ) { - if( !(passed_args->flags & FLAG_DLNA) || (passed_args->flags & FLAG_MIME_WAV_WAV) ) + if( strcmp(mime+6, "x-flac") == 0 ) { - strcpy(mime+6, "x-wav"); + if( passed_args->flags & FLAG_MIME_FLAC_FLAC ) + { + strcpy(mime+6, "flac"); + } } - if( !(passed_args->flags & FLAG_DLNA) || (passed_args->flags & FLAG_WAV_NO_DLNA) ) + else if( strncmp(mime+6, "L16", 3) == 0 ) { - strcpy(dlna_buf, "*"); + if( !(passed_args->flags & FLAG_DLNA) || (passed_args->flags & FLAG_MIME_WAV_WAV) ) + { + strcpy(mime+6, "x-wav"); + } + if( !(passed_args->flags & FLAG_DLNA) || (passed_args->flags & FLAG_WAV_NO_DLNA) ) + { + strcpy(dlna_buf, "*"); + } } } @@ -809,7 +819,7 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) char *resp = malloc(1048576); char str_buf[512]; char *zErrMsg = 0; - char *sql; + char *sql, *ptr; char **result; int ret; struct Response args; @@ -818,13 +828,19 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) *resp = '\0'; ParseNameValue(h->req_buf + h->req_contentoff, h->req_contentlen, &data); - int RequestedCount = atoi( GetValueFromNameValueList(&data, "RequestedCount") ); - int StartingIndex = atoi( GetValueFromNameValueList(&data, "StartingIndex") ); char * ObjectId = GetValueFromNameValueList(&data, "ObjectID"); char * Filter = GetValueFromNameValueList(&data, "Filter"); char * BrowseFlag = GetValueFromNameValueList(&data, "BrowseFlag"); char * SortCriteria = GetValueFromNameValueList(&data, "SortCriteria"); char * orderBy = NULL; + int RequestedCount = 0; + int StartingIndex = 0; + if( (ptr = GetValueFromNameValueList(&data, "RequestedCount")) ) + RequestedCount = atoi(ptr); + if( !RequestedCount ) + RequestedCount = -1; + if( (ptr = GetValueFromNameValueList(&data, "StartingIndex")) ) + StartingIndex = atoi(ptr); if( !BrowseFlag || (strcmp(BrowseFlag, "BrowseDirectChildren") && strcmp(BrowseFlag, "BrowseMetadata")) ) { SoapError(h, 402, "Invalid Args"); @@ -844,9 +860,6 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) } memset(&args, 0, sizeof(args)); - if( !RequestedCount ) - RequestedCount = -1; - args.resp = resp; args.size = sprintf(resp, "%s", resp0); /* See if we need to include DLNA namespace reference */ @@ -976,7 +989,7 @@ SearchContentDirectory(struct upnphttp * h, const char * action) char *resp = malloc(1048576); char *zErrMsg = 0; - char *sql; + char *sql, *ptr; char **result; char str_buf[4096]; int ret; @@ -986,8 +999,6 @@ SearchContentDirectory(struct upnphttp * h, const char * action) struct NameValueParserData data; ParseNameValue(h->req_buf + h->req_contentoff, h->req_contentlen, &data); - int RequestedCount = atoi( GetValueFromNameValueList(&data, "RequestedCount") ); - int StartingIndex = atoi( GetValueFromNameValueList(&data, "StartingIndex") ); char * ContainerID = GetValueFromNameValueList(&data, "ContainerID"); char * Filter = GetValueFromNameValueList(&data, "Filter"); char * SearchCriteria = GetValueFromNameValueList(&data, "SearchCriteria"); @@ -995,6 +1006,14 @@ SearchContentDirectory(struct upnphttp * h, const char * action) char * newSearchCriteria = NULL; char * orderBy = NULL; char groupBy[] = "group by DETAIL_ID"; + int RequestedCount = 0; + int StartingIndex = 0; + if( (ptr = GetValueFromNameValueList(&data, "RequestedCount")) ) + RequestedCount = atoi(ptr); + if( !RequestedCount ) + RequestedCount = -1; + if( (ptr = GetValueFromNameValueList(&data, "StartingIndex")) ) + StartingIndex = atoi(ptr); if( !ContainerID ) { SoapError(h, 701, "No such object error"); @@ -1004,9 +1023,6 @@ SearchContentDirectory(struct upnphttp * h, const char * action) } memset(&args, 0, sizeof(args)); - if( !RequestedCount ) - RequestedCount = -1; - args.resp = resp; args.size = sprintf(resp, "%s", resp0); /* See if we need to include DLNA namespace reference */