From 0fa5f5b5981d9ea0170ecd110e657f6b46211eee Mon Sep 17 00:00:00 2001 From: Justin Maggard Date: Sat, 2 May 2009 20:53:24 +0000 Subject: [PATCH] * Fix a couple bugs in client detection code. * Fix incremental UPnPBrowse bug that was recently introduced. --- upnphttp.c | 23 ++++++++++++++++++++++- upnpsoap.c | 12 +++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/upnphttp.c b/upnphttp.c index 7835290..0f18949 100644 --- a/upnphttp.c +++ b/upnphttp.c @@ -100,7 +100,7 @@ SearchClientCache(struct in_addr addr) memset(&clients[i], 0, sizeof(struct client_cache_s)); return -1; } - DPRINTF(E_DEBUG, L_HTTP, "Client [%d] found in cache.\n", clients[i].type); + DPRINTF(E_DEBUG, L_HTTP, "Client found in cache. [type %d/entry %d]\n", clients[i].type, i); return i; } } @@ -205,6 +205,9 @@ intervening space) by either an integer or the keyword "infinite". */ } else if(strncasecmp(line, "User-Agent", 10)==0) { + /* Skip client detection if we already detected it. */ + if( h->req_client ) + continue; p = colon + 1; while(isspace(*p)) p++; @@ -228,6 +231,17 @@ intervening space) by either an integer or the keyword "infinite". */ h->reqflags |= FLAG_DLNA; } } + else if(strncasecmp(line, "X-AV-Client-Info", 16)==0) + { + p = colon + 1; + while(isspace(*p)) + p++; + if(strstr(p, "PLAYSTATION 3")) + { + h->req_client = EPS3; + h->reqflags |= FLAG_DLNA; + } + } else if(strncasecmp(line, "Transfer-Encoding", 17)==0) { p = colon + 1; @@ -317,6 +331,13 @@ intervening space) by either an integer or the keyword "infinite". */ break; } } + else if( (n < EUnknownClient) && (h->req_client == EUnknownClient) ) + { + /* If we know the client, but our new detection is generic, use our cached info */ + h->reqflags |= clients[n].flags; + h->req_client = clients[n].type; + return; + } clients[n].type = h->req_client; clients[n].flags = h->reqflags & 0xFFF00000; clients[n].age = time(NULL); diff --git a/upnpsoap.c b/upnpsoap.c index e0b2799..ac343b1 100644 --- a/upnpsoap.c +++ b/upnpsoap.c @@ -452,11 +452,14 @@ callback(void *args, int argc, char **argv, char **azColName) switch( passed_args->client ) { case EPS3: - if( creator && (strcmp(mime, "video/x-msvideo") == 0) ) + if( strcmp(mime, "video/x-msvideo") == 0 ) { - strcpy(mime+6, "divx"); - break; + if( creator ) + strcpy(mime+6, "divx"); + else + strcpy(mime+6, "avi"); } + break; case EXbox: if( strcmp(mime, "video/x-msvideo") == 0 ) { @@ -751,7 +754,7 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) ObjectId, RequestedCount, StartingIndex, BrowseFlag, Filter, SortCriteria); - if( strcmp(BrowseFlag, "BrowseMetadata") == 0 ) + if( BrowseFlag && (strcmp(BrowseFlag, "BrowseMetadata") == 0) ) { args.requested = 1; sql = sqlite3_mprintf( SELECT_COLUMNS @@ -780,7 +783,6 @@ BrowseContentDirectory(struct upnphttp * h, const char * action) ObjectId, orderBy, StartingIndex, RequestedCount); DPRINTF(E_DEBUG, L_HTTP, "Browse SQL: %s\n", sql); ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg); - totalMatches = args.returned; } sqlite3_free(sql); if( ret != SQLITE_OK )