summaryrefslogtreecommitdiff
path: root/p2pvr/daemon/maintenance/services.cpp
blob: 8a0ef526085c1f89f7f62a7793f802d3252f5b0f (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
#include "../maintenance.h"
#include <siParsers/service.h>
#include <tablepatch.h>
#include <Ice/Communicator.h>
#include <Ice/Initialize.h>
#include <temporaryIceAdapterObject.h>
#include <slicer/slicer.h>
#include <db/sqlTablePatchSerializer.h>
#include <tablepatch.h>
#include <sql/si/allDeliveriesTransportStreamId.sql.h>

using namespace IceTray::Logging;

namespace P2PVR {
class SiServicesMerger : public DVBSI::SiServicesParser {
	public:
		SiServicesMerger(IceTray::Logging::LoggerPtr l, DB::Connection * d) :
			DVBSI::SiServicesParser(getIds(d)),
			logger(l),
			dbc(d)
		{
		}

		bool HandleTable(const ::DVBSI::TransportStreamPtr & ts)
		{
			logger->messagebf(LogLevel::DEBUG, "Transport Stream Id: %d Original Network Id: %s", ts->TransportStreamId, ts->OriginalNetworkId);
			for (const auto & s : ts->Services) {
				logger->messagebf(LogLevel::DEBUG, "\tService Id: %d Name: %s Type: %d, Provider: %s, DefaultAuthority: %s, RunningStatus %d FreeCaMode %d",
						s->ServiceId, (s->Name ? *s->Name : "?"), (s->Type ? *s->Type : -1),
						(s->ProviderName ? *s->ProviderName : "?"), (s->DefaultAuthority ? *s->DefaultAuthority : "?"),
						s->RunningStatus, s->FreeCaMode);
			}

			DB::TablePatch mergeServices;
			mergeServices.dest = "services";
			mergeServices.doDeletes = false;
			mergeServices.doInserts = false;
			Slicer::SerializeAny<Slicer::SqlTablePatchSerializer>(ts->Services, dbc, mergeServices);
			return false;
		}

		static RequiredContentIds getIds(DB::Connection * db)
		{
			auto sel = sql::si::allDeliveriesTransportStreamId.select(db);
			auto ids = Slicer::DeserializeAny<Slicer::SqlSelectDeserializer, std::vector<Ice::Int>>(sel.get());
			return {ids.begin(), ids.end()};
		}

	private:
		IceTray::Logging::LoggerPtr logger;
		DB::Connection * dbc;
};

void
MaintenanceI::UpdateServices(const Ice::Current & ice)
{
	auto ic = ice.adapter->getCommunicator();
	auto devs = Ice::checkedCast<TunersPrx>(ice.adapter->createProxy(Ice::stringToIdentity("Devices")));
	auto si = Ice::checkedCast<SIPrx>(ice.adapter->createProxy(Ice::stringToIdentity("SI")));

	if (!devs || !si) {
		throw std::runtime_error("bad proxy(s)");
	}

	auto dbc = db->get();
	auto siparser = std::make_shared<SiServicesMerger>(logger, dbc.get());
	TemporaryIceAdapterObject<RawDataClient> parser(ice.adapter, siparser);

	auto delivery = si->GetDeliveryForSi();
	if (!delivery) {
		throw std::runtime_error("no delivery methods");
	}

	DB::TransactionScope tx(*dbc.get());
	logger->messagebf(LogLevel::DEBUG, "%s: Fetching service list", __PRETTY_FUNCTION__);
	devs->SendServiceDescriptions(delivery, parser);
	logger->messagebf(LogLevel::INFO, "%s: Updated service list", __PRETTY_FUNCTION__);
}
}