summaryrefslogtreecommitdiff
path: root/database/resources.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'database/resources.cpp')
-rw-r--r--database/resources.cpp355
1 files changed, 0 insertions, 355 deletions
diff --git a/database/resources.cpp b/database/resources.cpp
deleted file mode 100644
index 23403d5..0000000
--- a/database/resources.cpp
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * File: resources.cpp
- * Author: savop
- *
- * Created on 30. September 2009, 15:17
- */
-
-#include <string.h>
-#include <vdr/channels.h>
-#include "upnp/dlna.h"
-#include <vdr/tools.h>
-#include "resources.h"
-#include "avdetector.h"
-
-cUPnPResource::cUPnPResource(){
- this->mBitrate = 0;
- this->mBitsPerSample = 0;
- this->mColorDepth = 0;
- this->mDuration = NULL;
- this->mImportURI = NULL;
- this->mNrAudioChannels = 0;
- this->mProtocolInfo = NULL;
- this->mResolution = NULL;
- this->mResource = NULL;
- this->mResourceID = 0;
- this->mSampleFrequency = 0;
- this->mSize = 0;
- this->mContentType = NULL;
-}
-
-time_t cUPnPResource::getLastModification() const {
- time_t Time;
- const cRecording* Recording;
- const cEvent* Event;
- switch(this->mResourceType){
- case UPNP_RESOURCE_CHANNEL:
- case UPNP_RESOURCE_URL:
- Time = time(NULL);
- break;
- case UPNP_RESOURCE_RECORDING:
- Recording = Recordings.GetByName(this->mResource);
- Event = (Recording)?Recording->Info()->GetEvent():NULL;
- Time = (Event)?Event->EndTime():time(NULL);
- break;
- case UPNP_RESOURCE_FILE:
- //break;
- default:
- ERROR("Invalid resource type. This resource might be broken");
- Time = -1;
- }
- return Time;
-}
-
-cUPnPResources* cUPnPResources::mInstance = NULL;
-
-cUPnPResources::cUPnPResources(){
- this->mResources = new cHash<cUPnPResource>;
- this->mMediator = new cUPnPResourceMediator;
- this->mDatabase = cSQLiteDatabase::getInstance();
-}
-
-cUPnPResources::~cUPnPResources(){
- delete this->mResources;
- delete this->mMediator;
-}
-
-cUPnPResources* cUPnPResources::getInstance(){
- if(!cUPnPResources::mInstance)
- cUPnPResources::mInstance = new cUPnPResources();
- if(cUPnPResources::mInstance) return cUPnPResources::mInstance;
- else return NULL;
-}
-
-int cUPnPResources::loadResources(){
- if(this->mDatabase->execStatement("SELECT %s FROM %s",SQLITE_COL_RESOURCEID,SQLITE_TABLE_RESOURCES)){
- ERROR("Error while executing statement");
- return -1;
- }
- cRows* Rows = this->mDatabase->getResultRows(); cRow* Row;
- cString Column = NULL, Value = NULL;
- while(Rows->fetchRow(&Row)){
- while(Row->fetchColumn(&Column, &Value)){
- if(!strcasecmp(Column, SQLITE_COL_RESOURCEID)){
- unsigned int ResourceID = (unsigned int)atoi(Value);
- this->getResource(ResourceID);
- }
- }
- }
- return 0;
-}
-
-int cUPnPResources::getResourcesOfObject(cUPnPClassObject* Object){
- if(this->mDatabase->execStatement("SELECT %s FROM %s WHERE %s=%Q",
- SQLITE_COL_RESOURCEID,
- SQLITE_TABLE_RESOURCES,
- SQLITE_COL_OBJECTID,
- *Object->getID())){
- ERROR("Error while executing statement");
- return -1;
- }
- cRows* Rows = this->mDatabase->getResultRows(); cRow* Row;
- cString Column = NULL, Value = NULL;
- while(Rows->fetchRow(&Row)){
- while(Row->fetchColumn(&Column, &Value)){
- if(!strcasecmp(Column, SQLITE_COL_RESOURCEID)){
- unsigned int ResourceID = (unsigned int)atoi(Value);
- Object->addResource(this->getResource(ResourceID));
- }
- }
- }
- return 0;
-}
-
-cUPnPResource* cUPnPResources::getResource(unsigned int ResourceID){
- cUPnPResource* Resource;
- if((Resource = this->mResources->Get(ResourceID))){
- MESSAGE(VERBOSE_METADATA, "Found cached resource");
- return Resource;
- }
- else if((Resource = this->mMediator->getResource(ResourceID))){
- MESSAGE(VERBOSE_METADATA, "Found resource in database");
- this->mResources->Add(Resource, ResourceID);
- return Resource;
- }
- else {
- ERROR("No such resource with ID '%d'", ResourceID);
- return NULL;
- }
-}
-
-int cUPnPResources::createFromRecording(cUPnPClassVideoItem* Object, cRecording* Recording){
- if(!Object || !Recording){
- ERROR("Invalid input arguments");
- return -1;
- }
-
- cAudioVideoDetector* Detector = new cAudioVideoDetector(Recording);
-
- if(Detector->detectProperties()){
- ERROR("Error while detecting video properties");
- delete Detector;
- return -1;
- }
-
- if(!Detector->getDLNAProfile()){
- ERROR("No DLNA profile found for Recording %s", Recording->Name());
- delete Detector;
- return -1;
- }
-
- const char* ProtocolInfo = cDlna::getInstance()->getProtocolInfo(Detector->getDLNAProfile());
-
- MESSAGE(VERBOSE_METADATA, "Protocol info: %s", ProtocolInfo);
-
- cString ResourceFile = Recording->FileName();
- cUPnPResource* Resource = this->mMediator->newResource(Object, UPNP_RESOURCE_RECORDING,ResourceFile, Detector->getDLNAProfile()->mime, ProtocolInfo);
- Resource->mBitrate = Detector->getBitrate();
- Resource->mBitsPerSample = Detector->getBitsPerSample();
- Resource->mDuration = duration(Detector->getDuration(), AVDETECTOR_TIME_BASE);
- Resource->mResolution = (Detector->getWidth() && Detector->getHeight()) ? *cString::sprintf("%dx%d",Detector->getWidth(), Detector->getHeight()) : NULL;
- Resource->mSampleFrequency = Detector->getSampleFrequency();
- Resource->mSize = Detector->getFileSize();
- Resource->mNrAudioChannels = Detector->getNumberOfAudioChannels();
- Resource->mImportURI = NULL;
- Resource->mColorDepth = 0;
- Object->addResource(Resource);
- this->mMediator->saveResource(Object, Resource);
- this->mResources->Add(Resource, Resource->getID());
-
- delete Detector;
- return 0;
-}
-
-int cUPnPResources::createFromFile(cUPnPClassItem* , cString ){
- MESSAGE(VERBOSE_SDK, "To be done");
- return -1;
-}
-
-int cUPnPResources::createFromChannel(cUPnPClassVideoBroadcast* Object, cChannel* Channel){
- if(!Object || !Channel){
- ERROR("Invalid input arguments");
- return -1;
- }
-
- cAudioVideoDetector* Detector = new cAudioVideoDetector(Channel);
-
- if(Detector->detectProperties()){
- ERROR("Cannot detect channel properties");
- delete Detector;
- return -1;
- }
-
- if(!Detector->getDLNAProfile()){
- ERROR("No DLNA profile found for Channel %s", *Channel->GetChannelID().ToString());
- delete Detector;
- return -1;
- }
-
- const char* ProtocolInfo = cDlna::getInstance()->getProtocolInfo(Detector->getDLNAProfile());
-
- MESSAGE(VERBOSE_METADATA, "Protocol info: %s", ProtocolInfo);
-
- // Index which may be used to indicate different resources with same channel ID
- // For instance a different DVB card
- // Not used yet.
- int index = 0;
-
- cString ResourceFile = cString::sprintf("%s:%d", *Channel->GetChannelID().ToString(), index);
- cUPnPResource* Resource = this->mMediator->newResource(Object, UPNP_RESOURCE_CHANNEL,ResourceFile, Detector->getDLNAProfile()->mime, ProtocolInfo);
- Resource->mBitrate = Detector->getBitrate();
- Resource->mBitsPerSample = Detector->getBitsPerSample();
- Resource->mDuration = duration(Detector->getDuration());
- Resource->mResolution = (Detector->getWidth() && Detector->getHeight()) ? *cString::sprintf("%dx%d",Detector->getWidth(), Detector->getHeight()) : NULL;
- Resource->mSampleFrequency = Detector->getSampleFrequency();
- Resource->mSize = Detector->getFileSize();
- Resource->mNrAudioChannels = Detector->getNumberOfAudioChannels();
- Resource->mImportURI = NULL;
- Resource->mColorDepth = 0;
- Object->addResource(Resource);
- this->mMediator->saveResource(Object, Resource);
- this->mResources->Add(Resource, Resource->getID());
-
- delete Detector;
- return 0;
-}
-
-cUPnPResourceMediator::cUPnPResourceMediator(){
- this->mDatabase = cSQLiteDatabase::getInstance();
-}
-
-cUPnPResourceMediator::~cUPnPResourceMediator(){}
-
-cUPnPResource* cUPnPResourceMediator::getResource(unsigned int ResourceID){
- cUPnPResource* Resource = new cUPnPResource;
- Resource->mResourceID = ResourceID;
- if(this->mDatabase->execStatement("SELECT * FROM %s WHERE %s=%d",
- SQLITE_TABLE_RESOURCES,
- SQLITE_COL_RESOURCEID,
- ResourceID)){
- ERROR("Error while executing statement");
- return NULL;
- }
- cRows* Rows = this->mDatabase->getResultRows(); cRow* Row;
- if(!Rows->fetchRow(&Row)){
- ERROR("No such resource found");
- return NULL;
- }
- cString Column = NULL, Value = NULL;
- while(Row->fetchColumn(&Column, &Value)){
- if(!strcasecmp(SQLITE_COL_PROTOCOLINFO, Column)){
- Resource->mProtocolInfo = Value;
- }
- else if(!strcasecmp(SQLITE_COL_RESOURCE, Column)){
- Resource->mResource = Value;
- }
- else if(!strcasecmp(SQLITE_COL_SIZE, Column)){
- Resource->mSize = (off64_t)(*Value?atol(Value):0);
- }
- else if(!strcasecmp(SQLITE_COL_DURATION, Column)){
- Resource->mDuration = Value;
- }
- else if(!strcasecmp(SQLITE_COL_BITRATE, Column)){
- Resource->mBitrate = *Value?atoi(Value):0;
- }
- else if(!strcasecmp(SQLITE_COL_SAMPLEFREQUENCE, Column)){
- Resource->mSampleFrequency = *Value?atoi(Value):0;
- }
- else if(!strcasecmp(SQLITE_COL_BITSPERSAMPLE, Column)){
- Resource->mBitsPerSample = *Value?atoi(Value):0;
- }
- else if(!strcasecmp(SQLITE_COL_NOAUDIOCHANNELS, Column)){
- Resource->mNrAudioChannels = *Value?atoi(Value):0;
- }
- else if(!strcasecmp(SQLITE_COL_COLORDEPTH, Column)){
- Resource->mColorDepth = *Value?atoi(Value):0;
- }
- else if(!strcasecmp(SQLITE_COL_RESOLUTION, Column)){
- Resource->mResolution = Value;
- }
- else if(!strcasecmp(SQLITE_COL_CONTENTTYPE, Column)){
- Resource->mContentType = Value;
- }
- else if(!strcasecmp(SQLITE_COL_RESOURCETYPE, Column)){
- Resource->mResourceType = *Value?atoi(Value):0;
- }
- }
- return Resource;
-}
-
-int cUPnPResourceMediator::saveResource(cUPnPClassObject* Object, cUPnPResource* Resource){
-
- cString Format = "UPDATE %s SET %s=%Q,"
- "%s=%Q,"
- "%s=%Q,"
- "%s=%lld,"
- "%s=%Q,"
- "%s=%d,"
- "%s=%d,"
- "%s=%d,"
- "%s=%d,"
- "%s=%d,"
- "%s=%Q,"
- "%s=%Q,"
- "%s=%d"
- " WHERE %s=%d";
-
- if(this->mDatabase->execStatement(Format,
- SQLITE_TABLE_RESOURCES,
- SQLITE_COL_OBJECTID, *Object->getID(),
- SQLITE_COL_PROTOCOLINFO, *Resource->mProtocolInfo,
- SQLITE_COL_RESOURCE, *Resource->mResource,
- SQLITE_COL_SIZE, Resource->mSize,
- SQLITE_COL_DURATION, *Resource->mDuration,
- SQLITE_COL_BITRATE, Resource->mBitrate,
- SQLITE_COL_SAMPLEFREQUENCE, Resource->mSampleFrequency,
- SQLITE_COL_BITSPERSAMPLE, Resource->mBitsPerSample,
- SQLITE_COL_NOAUDIOCHANNELS, Resource->mNrAudioChannels,
- SQLITE_COL_COLORDEPTH, Resource->mColorDepth,
- SQLITE_COL_RESOLUTION, *Resource->mResolution,
- SQLITE_COL_CONTENTTYPE, *Resource->mContentType,
- SQLITE_COL_RESOURCETYPE, Resource->mResourceType,
- SQLITE_COL_RESOURCEID, Resource->mResourceID)){
- ERROR("Error while executing statement");
- return -1;
- }
-
- return 0;
-}
-
-cUPnPResource* cUPnPResourceMediator::newResource(cUPnPClassObject* Object, int ResourceType, cString ResourceFile, cString ContentType, cString ProtocolInfo){
- cUPnPResource* Resource = new cUPnPResource;
-
- if(this->mDatabase->execStatement("INSERT INTO %s (%s,%s,%s,%s,%s) VALUES (%Q,%Q,%Q,%Q,%d)",
- SQLITE_TABLE_RESOURCES,
- SQLITE_COL_OBJECTID,
- SQLITE_COL_RESOURCE,
- SQLITE_COL_PROTOCOLINFO,
- SQLITE_COL_CONTENTTYPE,
- SQLITE_COL_RESOURCETYPE,
- *Object->getID(),
- *ResourceFile,
- *ProtocolInfo,
- *ContentType,
- ResourceType)){
- ERROR("Error while executing statement");
- return NULL;
- }
- Resource->mResourceID = (unsigned int)this->mDatabase->getLastInsertRowID();
- Resource->mResource = ResourceFile;
- Resource->mProtocolInfo = ProtocolInfo;
- Resource->mContentType = ContentType;
- Resource->mResourceType = ResourceType;
-
- return Resource;
-} \ No newline at end of file