Parent: [15ec9e] (diff)

Download this file

cdplugin.hxx    159 lines (142 with data), 6.4 kB

  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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* Copyright (C) 2016 J.F.Dockes
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the
* Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef _CDPLUGIN_H_INCLUDED_
#define _CDPLUGIN_H_INCLUDED_
#include <string>
#include "upmpdutils.hxx"
#include "libupnpp/device/vdir.hxx"
class CDPluginServices;
/// Interface to Content Directory plugins
///
/// The main operations, Browse and Search, return content as UpSong
/// structures. At the very minimum, id, parentid, iscontainer and
/// title should be properly set for each entry. Id is very important for
/// directories (containers), because this is the main parameter to
/// the browse call. title is what gets displayed in lists by the
/// control point.
///
/// The rest of the UpSong fields are only meaningful for items
/// (tracks), and only one is mandatory: uri.
///
/// The item uri will be used by the renderer for fetching the data to
/// be played. All current implementations set URIs which point either
/// to themselves (uprcl, the implementation for local files, uses a
/// Python server to stream the files), or to a microhttpd instance
/// running inside upmpdcli, with code responsible for either
/// redirecting the client or proxying the data.
class CDPlugin {
public:
CDPlugin(const std::string& name, CDPluginServices *services)
: m_name(name), m_services(services) {
}
virtual ~CDPlugin() {
}
/// List children or return metadata for target object. You can
/// probably get by without implementing BFMeta in most cases.
enum BrowseFlag {BFChildren, BFMeta};
/// Browse object at objid, which should be a container, and
/// return its content.
///
/// This reflects an UPnP Browse action. Refer to UPnP documentation.
///
/// @param objid the object to browse. The top directory for a plugin will
// be '0$plugin_name$', e.g. '0$qobuz$'
/// @param stidx first entry to return.
/// @param cnt number of entries.
/// @param[output] entries output content.
/// @param sortcrits csv list of sort criteria.
/// @param flg browse flag
/// @return total number of matched entries in container
virtual int browse(
const std::string& objid, int stidx, int cnt,
std::vector<UpSong>& entries,
const std::vector<std::string>& sortcrits = std::vector<std::string>(),
BrowseFlag flg = BFChildren) = 0;
/// Search under object at objid.
///
/// This reflects an UPnP Search action, refer to UPnP
/// documentation. Most plugins won't be able to actually perform
/// the search under container operation. Plain search should be
/// good enough.
///
/// @param objid the object to search
/// @param stidx first entry to return.
/// @param cnt number of entries.
/// @param[output] entries output content.
/// @param sortcrits csv list of sort criteria.
/// @return total number of matched entries in container
virtual int search(
const std::string& ctid, int stidx, int cnt,
const std::string& searchstr,
std::vector<UpSong>& entries,
const std::vector<std::string>& sortcrits = std::vector<std::string>())
= 0;
const std::string& getname() {
return m_name;
}
virtual bool startInit() = 0;
std::string m_name;
CDPluginServices *m_services;
};
/// Service/Environment interface for media server modules. This is
/// implemented by the ContentDirectory class.
class CDPluginServices {
public:
/// Returns the plugin to which belongs the parameter path, based
/// on the path prefix above.
virtual CDPlugin *getpluginforpath(const std::string& path) = 0;
/// Retrieve the "friendly name" for the media server, for display purposes
virtual std::string getfname() = 0;
/// IP address and port used by the libupnp HTTP server.
///
/// This is the host address / network interface and port used by
/// libupnp, which can only support one. URLs intended to be
/// served this way (by adding a vdir) should should use this
/// address as this is the only one guaranteed to be accessible
/// from clients (in case this server has several interfaces).
/// The getupnpport() call is unused at present because no module
/// uses the internal server (all use the microhttpd started by
/// plgwithslave).
/// The getupnpaddr() call is used to determine the host for the
/// microhttp server (so it works on the same i/f as the upnp one,
/// always).
///
/// The microhttpd instance uses port 49149 by default. The value
/// can be changed with the "plgmicrohttpport" configuration
/// variable. The local mediaserver (uprcl) uses neither the
/// libupnp HTTP server nor microhttpd, but an internal Python
/// server instance, on port 9090 by default (can be changed with
/// the "uprclhostport" configuration variable).
virtual std::string getupnpaddr(CDPlugin *) = 0;
virtual int getupnpport(CDPlugin *) = 0;
/// Main configuration file access.
static bool config_get(const std::string& nm, std::string& val);
/// Port to start the microhttp server on
static int microhttpport();
/// For modules which use the common microhttpd server
/// (tidal/qobuz/gmusic). Returns something like "/tidal" (no end
/// slash), which must be inserted at the top of the track URLs
/// paths so that an HTTP request can be processed-for /
/// dispatched-to the right plugin.
static std::string getpathprefix(CDPlugin *plg) {
return getpathprefix(plg->getname());
}
static std::string getpathprefix(const std::string& name) {
return std::string("/") + name;
}
};
#endif /* _CDPLUGIN_H_INCLUDED_ */