1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/*
* mediaManager.h
*
* Created on: 31.08.2012
* Author: savop
*/
#ifndef MEDIAMANAGER_H_
#define MEDIAMANAGER_H_
#include "../../include/plugin.h"
#include "../../include/tools.h"
#include <vdr/thread.h>
#include <list>
#include <string>
#include <stdint.h>
#include <tntdb/connect.h>
#include <tntdb/connection.h>
namespace upnp {
class cResourceStreamer;
class cPluginManager;
class cMediaManager : public cThread {
friend void cUPnPResourceProvider::OnContainerUpdate(const string& uri, long updateID, const StringList& target = StringList());
private:
struct MediaRequest {
std::string objectID;
std::string filter;
uint32_t startIndex;
uint32_t requestCount;
std::string sortCriteria;
std::string result;
uint32_t numberReturned;
uint32_t totalMatches;
uint32_t updateID;
};
public:
enum BrowseFlag {
CD_BROWSE_METADATA,
CD_BROWSE_DIRECT_CHILDREN,
NumBrowseFlags
};
struct BrowseRequest : public MediaRequest {
BrowseFlag browseMetadata;
};
struct SearchRequest : public MediaRequest {
std::string searchCriteria;
};
cMediaManager();
virtual ~cMediaManager();
void SetDatabaseDir(const string& file);
bool Initialise();
void Housekeeping();
uint32_t GetSystemUpdateID() const;
IdList GetContainerUpdateIDs(bool unevented = false);
StringList GetSearchCapabilities() const;
StringList GetSortCapabilities() const;
StringList GetSupportedProtocolInfos() const;
int Browse(BrowseRequest& request);
int Search(SearchRequest& request);
static BrowseFlag ToBrowseFlag(const std::string& browseFlag);
cResourceStreamer* GetResourceStreamer(const std::string& objectID, int resourceID = 0);
private:
void Action();
bool CheckIntegrity();
int CreateResponse(MediaRequest&, const string&, const string&);
void OnContainerUpdate(const string& uri, long updateID, const StringList& target);
bool UpdateContainerUpdateId(const string& objectID, long updateID);
bool ScanURI(const string& uri, cUPnPResourceProvider* provider);
bool RefreshObject(cMetadata& metadata);
cUPnPResourceProvider* CreateResourceProvider(const std::string& uri);
uint32_t systemUpdateID;
IdList eventedContainerUpdateIDs;
StringList scanTargets;
string databaseFile;
tntdb::Connection connection;
upnp::cPluginManager* pluginManager;
};
class cResourceStreamer {
friend class cMediaManager;
private:
cUPnPResourceProvider* provider;
cMetadata::Resource* resource;
cMediaManager* manager;
StringVector protocolInfo;
cResourceStreamer(cMediaManager* manager, cUPnPResourceProvider* provider, cMetadata::Resource* resource);
public:
virtual ~cResourceStreamer();
std::string GetContentFeatures() const;
size_t GetContentLength() const;
std::string GetContentType() const;
std::string GetTransferMode(const std::string& requestedMode ) const;
bool Seekable() const;
bool Open();
size_t Read(char* buf, size_t bufLen);
bool Seek(size_t offset, int origin);
void Close();
};
} // namespace upnp
#endif /* MEDIAMANAGER_H_ */
|