From 4d808c7f57e7de856154c7d13b6d2dc6501bb6fc Mon Sep 17 00:00:00 2001 From: Denis Loh Date: Thu, 13 Sep 2012 20:01:49 +0200 Subject: Initial commit --- media/mediaManager.cpp | 212 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100644 media/mediaManager.cpp (limited to 'media/mediaManager.cpp') diff --git a/media/mediaManager.cpp b/media/mediaManager.cpp new file mode 100644 index 0000000..9740a0b --- /dev/null +++ b/media/mediaManager.cpp @@ -0,0 +1,212 @@ +/* + * mediaManager.cpp + * + * Created on: 01.09.2012 + * Author: savop + */ + +#include "../include/plugin.h" +#include "../include/media/mediaManager.h" +#include "../include/server.h" +#include +#include +#include + +namespace upnp { + +cMediaManager::cMediaManager() +: mSystemUpdateID(0) +, mDatabaseFile("metadata.db") +{ +} + +cMediaManager::~cMediaManager(){ +} + +uint32_t cMediaManager::GetSystemUpdateID() const { + return mSystemUpdateID; +} + +IdList cMediaManager::GetContainerUpdateIDs(bool unevented){ + IdList list = mEventedContainerUpdateIDs; + + if(!unevented) + mEventedContainerUpdateIDs.clear(); + + return list; +} + +void cMediaManager::OnContainerUpdate(string containerID, long updateID){ + ++mSystemUpdateID; + + mEventedContainerUpdateIDs[containerID] = updateID; +} + +StringList cMediaManager::GetSearchCapabilities() const { + // TODO: SearchCapabilities ermitteln und zurückgeben. + StringList list; + + return list; +} + +StringList cMediaManager::GetSortCapabilities() const { + // TODO: SortCapabilities ermitteln und zurückgeben. + StringList list; + + return list; +} + +StringList cMediaManager::GetSupportedProtocolInfos() const { + // TODO: ProtocolInfos ermitteln und zurückgeben. + StringList list; + + return list; +} + +int cMediaManager::Browse(BrowseRequest& request){ + request.numberReturned = 0; + request.totalMatches = 0; + request.updateID = 0; + + return UPNP_E_SUCCESS; +} + +int cMediaManager::Search(SearchRequest& request){ + request.numberReturned = 0; + request.totalMatches = 0; + request.updateID = 0; + + return UPNP_E_SUCCESS; +} + +cMediaManager::BrowseFlag cMediaManager::ToBrowseFlag(std::string browseFlag) { + if (browseFlag.compare("BrowseMetadata") == 0) + return CD_BROWSE_METADATA; + else if (browseFlag.compare("BrowseDirectChildren") == 0) + return CD_BROWSE_DIRECT_CHILDREN; + else + return NumBrowseFlags; +} + +bool cMediaManager::Initialise(){ + try { + stringstream ss; + ss << "sqlite:" << mDatabaseFile; + + mConnection = tntdb::connect(ss.str()); + + dsyslog("UPNP\tPreparing database structure..."); + + if(CheckIntegrity()) return true; + + mConnection.beginTransaction(); + + tntdb::Statement objectTable = mConnection.prepare( + "CREATE TABLE metadata" + "(" + " objectID TEXT PRIMARY KEY," + " parentID TEXT NOT NULL," + " title TEXT NOT NULL," + " class TEXT NOT NULL," + " restricted INTEGER NOT NULL," + " description TEXT," + " ldescription TEXT," + " date TEXT," + " language TEXT," + " channelNr INTEGER," + " channelName TEXT," + " scheduledStart TEXT," + " scheduledEnd TEXT" + ")"); + + objectTable.execute(); + + tntdb::Statement detailsTable = mConnection.prepare( + "CREATE TABLE details" + "(" + " propertyID INTEGER PRIMARY KEY," + " objectID TEXT REFERENCES metadata (objectID) ON DELETE CASCADE ON UPDATE CASCADE," + " property TEXT," + " value TEXT" + ")"); + + detailsTable.execute(); + + tntdb::Statement resourcesTable = mConnection.prepare( + "CREATE TABLE resources" + "(" + " resourceID INTEGER PRIMARY KEY," + " objectID TEXT REFERENCES metadata (objectID) ON DELETE CASCADE ON UPDATE CASCADE," + " resourceUri TEXT NOT NULL," + " protocolInfo TEXT NOT NULL," + " size INTEGER," + " duration TEXT," + " resolution TEXT," + " bitrate INTEGER," + " sampleFreq INTEGER," + " bitsPerSample INTEGER," + " nrAudioChannels INTEGER," + " colorDepth INTEGER" + ")"); + + resourcesTable.execute(); + + tntdb::Statement rootContainer = mConnection.prepare( + "INSERT INTO metadata (objectID, parentID, title, class, restricted, description)" + " VALUES (:objectID, :parentID, :title, :class, :restricted, :description)" + ); + + rootContainer.setString("objectID", "0") + .setString("parentID", "-1") + .setString("title", cMediaServer::GetInstance()->GetServerDescription().friendlyName) + .setString("class", "object.container") + .setBool("restricted", true) + .setString("description", cMediaServer::GetInstance()->GetServerDescription().modelDescription) + .execute(); + + mConnection.commitTransaction(); + + return true; + + } catch (const std::exception& e) { + esyslog("UPnP\tException occurred while initializing database: %s", e.what()); + + mConnection.rollbackTransaction(); + + return false; + } + + return false; +} + +bool cMediaManager::CheckIntegrity(){ + + tntdb::Statement checkTable = mConnection.prepare( + "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; + + tntdb::Statement checkObject = mConnection.prepare( + "SELECT objectID FROM metadata WHERE objectID='0' AND parentID='-1';" + ); + + if( checkObject.select().size() != 1 ) return false; + + return true; +} + +void cMediaManager::SetDatabaseFile(string file){ + if(file.empty()) mDatabaseFile = "metadata.db"; + else mDatabaseFile = file; +} + +void cMediaManager::Action(){ + +} + +} // namespace upnp + + -- cgit v1.2.3