Parent: [c556d9] (diff)

Child: [c2b48d] (diff)

Download this file

service.hxx    145 lines (115 with data), 5.2 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
/* Copyright (C) 2014 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 _SERVICE_H_X_INCLUDED_
#define _SERVICE_H_X_INCLUDED_
#include "libupnpp/config.h"
#include <sys/types.h>
#include <upnp/upnp.h> // for UPNP_E_BAD_RESPONSE, etc
#include <iostream> // for basic_ostream, operator<<, etc
#include <string> // for string, operator<<, etc
#include <vector> // for vector
#include "libupnpp/control/cdircontent.hxx" // for UPnPDirObject
#include "libupnpp/log.hxx" // for LOGERR
#include "libupnpp/soaphelp.hxx" // for SoapIncoming, etc
namespace UPnPClient {
class UPnPDeviceDesc;
}
namespace UPnPClient {
class UPnPServiceDesc;
}
//using namespace UPnPP;
namespace UPnPClient {
class Service;
/** To be implemented by upper-level client code for event
* reporting. Runs in an event thread. This could for example be
* implemented by a Qt Object to generate events for the GUI.
*/
class VarEventReporter {
public:
virtual ~VarEventReporter() {}
// Using char * to avoid any issue with strings and concurrency
virtual void changed(const char *nm, int val) = 0;
virtual void changed(const char *nm, const char *val) = 0;
// Used for track metadata (parsed as content directory entry). Not always
// needed.
virtual void changed(const char * /*nm*/, UPnPDirObject /*meta*/) {}
// Used by ohplaylist. Not always needed
virtual void changed(const char * /*nm*/, std::vector<int> /*ids*/) {}
};
typedef
std::function<void (const std::unordered_map<std::string, std::string>&)>
evtCBFunc;
class Service {
public:
/** Construct by copying data from device and service objects.
*/
Service(const UPnPDeviceDesc& device, const UPnPServiceDesc& service);
/** An empty one */
Service();
virtual ~Service();
// This can be useful to restart the subscription and get all the
// State variable values, in case we get the events before we are
// ready (e.g. before the connections are set in a qt app
// we'll do this next abi change virtual void reSubscribe();
const std::string& getFriendlyName() const;
const std::string& getDeviceId() const;
const std::string& getServiceType() const;
const std::string& getActionURL() const;
const std::string& getModelName() const;
const std::string& getManufacturer() const;
virtual int runAction(const UPnPP::SoapOutgoing& args,
UPnPP::SoapIncoming& data);
/** Run trivial action where there are neither input parameters
nor return data (beyond the status) */
int runTrivialAction(const std::string& actionName);
/* Run action where there are no input parameters and a single
named value is to be retrieved from the result */
template <class T> int runSimpleGet(const std::string& actnm,
const std::string& valnm,
T *valuep);
/* Run action with a single input parameter and no return data */
template <class T> int runSimpleAction(const std::string& actnm,
const std::string& valnm,
T value);
virtual VarEventReporter *getReporter();
virtual void installReporter(VarEventReporter* reporter);
protected:
/** Used by a derived class to register its callback method. This
* creates an entry in the static map, using m_SID, which was
* obtained by subscribe() during construction
*/
void registerCallback(evtCBFunc c);
void unregisterCallback();
private:
// Can't copy these because this does not make sense for the
// member function callback.
Service(Service const&);
Service& operator=(Service const&);
class Internal;
Internal *m;
/* Only actually does something on the first call, to register our
* (static) library callback */
static bool initEvents();
/* The static event callback given to libupnp */
static int srvCB(Upnp_EventType et, void* vevp, void*);
/* Tell the UPnP device (through libupnp) that we want to receive
its events. This is called by registerCallback() and sets m_SID */
virtual bool subscribe();
virtual bool unSubscribe();
};
} // namespace UPnPClient
#endif /* _SERVICE_H_X_INCLUDED_ */