diff options
-rw-r--r-- | httptnt/deviceDescription.ecpp | 2 | ||||
-rw-r--r-- | include/media/mediaManager.h | 2 | ||||
-rw-r--r-- | include/server.h | 2 | ||||
-rw-r--r-- | media/mediaManager.cpp | 67 | ||||
-rw-r--r-- | server/contentDirectory.cpp | 5 | ||||
-rw-r--r-- | server/server.cpp | 2 |
6 files changed, 53 insertions, 27 deletions
diff --git a/httptnt/deviceDescription.ecpp b/httptnt/deviceDescription.ecpp index b879145..dfbe853 100644 --- a/httptnt/deviceDescription.ecpp +++ b/httptnt/deviceDescription.ecpp @@ -48,7 +48,7 @@ using namespace upnp; <modelNumber><$ serverDescription.modelNumber $></modelNumber> <modelURL><$ serverDescription.modelURL $></modelURL> <serialNumber><$ serverDescription.serialNumber $></serialNumber> - <UDN>uuid:<$ deviceUUID $></UDN> + <UDN><$ deviceUUID $></UDN> <presentationURL><$ urlBase $><$ presentationUrl $></presentationURL> <dlna:X_DLNADOC>DMS-1.50</dlna:X_DLNADOC> <serviceList> diff --git a/include/media/mediaManager.h b/include/media/mediaManager.h index cccca71..8a8473f 100644 --- a/include/media/mediaManager.h +++ b/include/media/mediaManager.h @@ -22,7 +22,7 @@ class cMediaManager : public cThread { private: struct MediaRequest { - int64_t objectID; + std::string objectID; std::string filter; uint32_t startIndex; uint32_t requestCount; diff --git a/include/server.h b/include/server.h index cc04b40..349239c 100644 --- a/include/server.h +++ b/include/server.h @@ -66,7 +66,7 @@ public: const cWebserver& GetWebserver() const { return *mWebserver; } cMediaManager& GetManager() const { return *mMediaManager; } - const string GetDeviceUUID() const { return mCurrentConfiguration.deviceUUID; } + const string GetDeviceUUID() const { return string("uuid:") + mCurrentConfiguration.deviceUUID; } const Description& GetServerDescription() const { return mServerDescription; } const iconList& GetServerIcons() const { return mServerIcons; } diff --git a/media/mediaManager.cpp b/media/mediaManager.cpp index 388bcee..530dbe3 100644 --- a/media/mediaManager.cpp +++ b/media/mediaManager.cpp @@ -105,7 +105,23 @@ int cMediaManager::Browse(BrowseRequest& request){ stringstream sql; - sql << "SELECT * FROM metadata LEFT JOIN resources WHERE :where"; + sql << "SELECT * FROM metadata LEFT JOIN resources USING " + << "(`" << property::object::KEY_OBJECTID << "`)" + << " WHERE "; + + switch (request.browseMetadata){ + case CD_BROWSE_METADATA: + sql << "`" << property::object::KEY_OBJECTID << "`"; + break; + case CD_BROWSE_DIRECT_CHILDREN: + sql << "`" << property::object::KEY_PARENTID << "`"; + break; + default: + esyslog("UPnP\tInvalid arguments. Browse flag invalid"); + return UPNP_SOAP_E_INVALID_ARGS; + } + + sql << " = '" << request.objectID << "'"; cSortCriteria::SortCriteriaList list = cSortCriteria::parse(request.sortCriteria); if(!list.empty()){ @@ -118,23 +134,16 @@ int cMediaManager::Browse(BrowseRequest& request){ } if(request.requestCount){ - sql << " LIMIT " << request.requestCount << ", " << request.startIndex << ";"; + sql << " LIMIT " << request.startIndex << ", " << request.requestCount; } - tntdb::Statement select = mConnection.prepare(sql.str()); - - switch (request.browseMetadata){ - case CD_BROWSE_METADATA: - - - - case CD_BROWSE_DIRECT_CHILDREN: - + cout << sql.str() << endl; + tntdb::Statement select = mConnection.prepare(sql.str()); - default: - esyslog("UPnP\tInvalid arguments. Browse flag invalid"); - return UPNP_SOAP_E_INVALID_ARGS; + for(tntdb::Statement::const_iterator it = select.begin(); it != select.end(); ++it){ + tntdb::Row row = (*it); + cout << row.getString(property::object::KEY_TITLE) << endl; } return UPNP_E_SUCCESS; @@ -280,15 +289,31 @@ bool cMediaManager::CheckIntegrity(){ "SELECT name FROM sqlite_master WHERE type='table' AND name=:table;" ); - if( checkTable.setString("table", "metadata").select().empty() ) return false; - if( checkTable.setString("table", "details").select().empty() ) return false; - if( checkTable.setString("table", "resources").select().empty() ) return false; + if( checkTable.setString("table", "metadata").select().empty() ){ + isyslog("UPnP\tTable metadata does not exist"); + return false; + } + if( checkTable.setString("table", "details").select().empty() ){ + isyslog("UPnP\tTable details does not exist"); + return false; + } + if( checkTable.setString("table", "resources").select().empty() ){ + isyslog("UPnP\tTable resources does not exist"); + return false; + } - tntdb::Statement checkObject = mConnection.prepare( - "SELECT objectID FROM metadata WHERE objectID='0' AND parentID='-1';" - ); + stringstream ss; - if( checkObject.select().size() != 1 ) return false; + ss << "SELECT `" << property::object::KEY_OBJECTID << "` FROM metadata WHERE `" + << property::object::KEY_OBJECTID << "` = '0' AND `" + << property::object::KEY_PARENTID << "` = '-1';"; + + tntdb::Statement checkObject = mConnection.prepare(ss.str()); + + if( checkObject.select().size() != 1 ){ + isyslog("UPnP\tRoot item does not exist or more than one root item exist."); + return false; + } return true; } diff --git a/server/contentDirectory.cpp b/server/contentDirectory.cpp index 4855715..b7d11ce 100644 --- a/server/contentDirectory.cpp +++ b/server/contentDirectory.cpp @@ -86,6 +86,7 @@ void cContentDirectory::Action(){ /* The container update IDs as CSV list */ UpnpAddToPropertySet(&PropertySet, "ContainerUpdateIDs", tools::IdListToCSV(mMediaServer->GetManager().GetContainerUpdateIDs()).c_str()); + int ret = UpnpNotifyExt(this->mDeviceHandle, this->mMediaServer->GetDeviceUUID().c_str(), this->mServiceDescription.serviceID.c_str(), PropertySet); ixmlDocument_free(PropertySet); @@ -193,7 +194,7 @@ int cContentDirectory::CreateObject(Upnp_Action_Request* request){ int cContentDirectory::Search(Upnp_Action_Request* request){ cMediaManager::SearchRequest searchRequest; - if(this->ParseIntegerValue(request->ActionRequest, "ContainerID", searchRequest.objectID)){ + if(this->ParseStringValue(request->ActionRequest, "ContainerID", searchRequest.objectID)){ esyslog("UPnP\tInvalid arguments. ObjectID missing or wrong"); this->SetError(request, UPNP_SOAP_E_INVALID_ARGS); return request->ErrCode; @@ -260,7 +261,7 @@ int cContentDirectory::Search(Upnp_Action_Request* request){ int cContentDirectory::Browse(Upnp_Action_Request* request){ cMediaManager::BrowseRequest browseRequest; - if(this->ParseIntegerValue(request->ActionRequest, "ObjectID", browseRequest.objectID)){ + if(this->ParseStringValue(request->ActionRequest, "ObjectID", browseRequest.objectID)){ esyslog("UPnP\tInvalid arguments. ObjectID missing or wrong"); this->SetError(request, UPNP_SOAP_E_INVALID_ARGS); return request->ErrCode; diff --git a/server/server.cpp b/server/server.cpp index 9858029..32c584d 100644 --- a/server/server.cpp +++ b/server/server.cpp @@ -314,7 +314,7 @@ const char* cMediaServer::RuntimeException::what() const throw() { } bool cMediaServer::CheckDeviceUUID(string deviceUUID) const { - return deviceUUID.compare(mCurrentConfiguration.deviceUUID) == 0; + return deviceUUID.find(mCurrentConfiguration.deviceUUID) != string::npos; } cMediaServer::Description::Description( |