summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--httptnt/deviceDescription.ecpp2
-rw-r--r--include/media/mediaManager.h2
-rw-r--r--include/server.h2
-rw-r--r--media/mediaManager.cpp67
-rw-r--r--server/contentDirectory.cpp5
-rw-r--r--server/server.cpp2
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(