summaryrefslogtreecommitdiff
path: root/include/media/mediaManager.h
blob: 10cb9e97f091309af1ce651ef11365e3e4299a97 (plain)
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_ */