Compare commits

...

25 Commits

Author SHA1 Message Date
Kai Sommerfeld
203f800eaa Merge pull request #22 from ksooo/jenkinsfile
Add Jenkinsfile to allow Kodi CI to build this addon.
2018-10-16 13:50:33 +02:00
Kai Sommerfeld
153dfeb3d5 Add Jenkinsfile to allow Kodi CI to build this addon. 2018-10-16 13:44:19 +02:00
Kai Sommerfeld
1e44819300 PVR API 5.10.0 2018-06-09 11:07:51 +02:00
René Bühlmann
54680a38bd PVR API 5.9.0 2018-04-11 14:42:04 +02:00
Kai Sommerfeld
689afbf4cd PVR API 5.8.0 2018-01-15 07:27:07 +01:00
Rechi
c4af00a4fe [depends] bump jsoncpp to 1.8.3 2017-11-15 12:41:33 +01:00
Anton Fedchin
f1f8d44b78 win10: fix linkage to deprecated wsock32 api. 2017-11-02 09:06:58 +01:00
Kai Sommerfeld
e9b4c05de5 Update to PVR API version 5.7.0 2017-09-26 14:17:23 +02:00
Kai Sommerfeld
a77cf111bb Added minimalistic support for PVR Addon API 5.3.0 2017-07-10 08:55:26 +02:00
Julian Scheel
020dd98e7b OctonetData: Use hash for channel nativeId
We previously assumed that the channelId provided by the Octonet would
only contain numbers and colons, which unfortunately is not true. The
satellite names could contain arbitrary characters, which then caused
the conversion to a numeric value to fail, stopping channels from being
distinguishable. This caused all EPG events to be mapped to the first
channel.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-07-06 14:32:14 +02:00
Julian Scheel
d7bb865329 AppVeyor: Provide built addon as artifact
Allow users to fetch the builds generated by AppVeyor.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-07-06 14:32:04 +02:00
Julian Scheel
9bbd7cf3c4 README: Update build path
Reflect relocation of cmake script in Kodi master.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 11:04:27 +02:00
Julian Scheel
7b9ec7d884 Travis: Update build instructions for Kodi master
The cmake build files for addons have been moved inside the kodi tree.
Update the Travis build script to reflect this.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 10:59:36 +02:00
Julian Scheel
37abebb540 AppVeyor: Update build instructions for Kodi master
The cmake build files for addons have been moved inside the kodi tree.
Update the AppVeyor build script to reflect this.

Signed-off-by: Julian Scheel <julian@jusst.de>
2017-05-26 10:58:35 +02:00
Alwin Esch
3494c4c470 Update on kodi to addon interface 2017-05-23 12:23:33 +02:00
Alwin Esch
ff41fc9acc update debian control 2017-05-18 12:04:46 +02:00
Alwin Esch
1ced6b3fa4 remove no more needed version functions 2017-05-18 12:04:46 +02:00
Alwin Esch
cd774b6edc change to automatic depends set on addon.xml 2017-05-18 12:04:46 +02:00
Alwin Esch
2a63777b6d libXBMC_codec.h removed and changed to libXBMC_pvr.h also fix compile fault after last request 2017-05-03 09:48:00 +02:00
Alwin Esch
e9f0d6bf76 Remove not used part 2017-05-03 09:47:39 +02:00
Dennis Hamester
8549a31c8d Bump version to 0.3.6 2016-11-28 15:09:54 +01:00
Dennis Hamester
0a7fb087ac Bump pvr api version to 5.2.1 2016-11-28 15:09:25 +01:00
Dennis Hamester
5c0f000a91 Bump version to 0.3.5 2016-11-28 14:14:57 +01:00
Dennis Hamester
2b020cec9c README: Rewrite build instructions 2016-11-28 14:00:01 +01:00
Dennis Hamester
96a19310ca Change time parameter of SeekTime from int to double
See xbmc/xbmc#10985
2016-11-28 10:40:36 +01:00
15 changed files with 121 additions and 139 deletions

1
.gitignore vendored
View File

@@ -1 +1,2 @@
/build /build
pvr.octonet/addon.xml

View File

@@ -37,9 +37,9 @@ before_install:
before_script: before_script:
- cd $TRAVIS_BUILD_DIR/.. - cd $TRAVIS_BUILD_DIR/..
- git clone --depth=1 https://github.com/xbmc/xbmc.git - git clone --depth=1 https://github.com/xbmc/xbmc.git
- mkdir -p xbmc/project/cmake/addons/addons/pvr.octonet - mkdir -p xbmc/cmake/addons/addons/pvr.octonet
- echo "pvr.octonet https://github.com/DigitalDevices/pvr.octonet master" > xbmc/project/cmake/addons/addons/pvr.octonet/pvr.octonet.txt - echo "pvr.octonet https://github.com/DigitalDevices/pvr.octonet master" > xbmc/cmake/addons/addons/pvr.octonet/pvr.octonet.txt
- cd $TRAVIS_BUILD_DIR && mkdir build && cd build - cd $TRAVIS_BUILD_DIR && mkdir build && cd build
- cmake -DADDONS_TO_BUILD=pvr.octonet -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/project/cmake/addons - cmake -DADDONS_TO_BUILD=pvr.octonet -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons
script: make script: make

View File

@@ -26,10 +26,19 @@ set(OCTONET_SOURCES
src/Socket.cpp src/Socket.cpp
src/rtsp_client.cpp) src/rtsp_client.cpp)
set(OCTONET_HEADERS
src/client.h
src/OctonetData.h
src/Socket.h)
build_addon(pvr.octonet OCTONET DEPLIBS) build_addon(pvr.octonet OCTONET DEPLIBS)
if(WIN32) if(WIN32)
target_link_libraries(pvr.octonet wsock32 ws2_32) if(NOT CMAKE_SYSTEM_NAME STREQUAL WindowsStore)
target_link_libraries(pvr.octonet wsock32 ws2_32)
else()
target_link_libraries(pvr.octonet ws2_32)
endif()
endif() endif()
include(CPack) include(CPack)

1
Jenkinsfile vendored Normal file
View File

@@ -0,0 +1 @@
buildPlugin()

View File

@@ -1,5 +1,5 @@
# Octonet PVR # Octonet PVR
Digital Devices [Octonet] (http://www.digital-devices.eu/shop/de/netzwerk-tv/) PVR client addon for [Kodi] (http://kodi.tv) Digital Devices [Octonet](http://www.digital-devices.eu/shop/de/netzwerk-tv/) PVR client addon for [Kodi](http://kodi.tv)
| Platform | Status | | Platform | Status |
|----------|--------| |----------|--------|
@@ -8,25 +8,33 @@ Digital Devices [Octonet] (http://www.digital-devices.eu/shop/de/netzwerk-tv/) P
# Building # Building
## Windows These instructions work on all supported platforms for the most part. Obviously, paths need to be
1. Create a file `project/cmake/addons/addons/kodi.pvr.octonet/kodi.pvr.octonet.txt` containing a adjusted according to your OS (`/` vs `\`). We use Linux paths here as an example.
single line `kodi.pvr.octonet file://C:\some\path`. The path doesn't matter and doesn't need to
actually exist.
2. Use a shell that has environment variables setup by Visual Studio for the native x86 toolchain. Clone the `pvr.octonet` repository:
Run the following in a new build directory and adjust paths accordingly:
``` ```
cmake -G "NMake Makefiles" ^ $ git clone https://github.com/DigitalDevices/pvr.octonet.git
-DCMAKE_BUILD_TYPE=Release ^
-DADDONS_TO_BUILD="kodi.pvr.octonet" ^
-DADDON_SRC_PREFIX="path_to_where_kodi.pvr.octonet_is" ^
-DCMAKE_INSTALL_PREFIX="some_subdirectory" ^
-DPACKAGE_ZIP=ON ^
"path_to_kodi\project\cmake\addons"
``` ```
Make sure `ADDON_SRC_PREFIX` points to the parent directory of `kodi.pvr.octonet`. Clone the Kodi repository:
4. Build the addon by running `nmake`. Run `nmake package-addons` to package a zip file of the ```
addon. $ git clone https://github.com/xbmc/xbmc.git
```
If you already have a local Kodi checkout, you can use that one. Just make sure it is recent enough
(Kodi 17 Beta 5 or later should work).
```
$ cd pvr.octonet
$ mkdir build
$ cd build
$ cmake -DCMAKE_BUILD_TYPE=Release -DADDONS_TO_BUILD="pvr.octonet" -DADDON_SRC_PREFIX="path to parent of pvr.octonet" -DCMAKE_INSTALL_PREFIX="install" -DPACKAGE_ZIP=ON "path to kodi/cmake/addons"
```
On Windows, you should add `-G "NMake Makefiles"` to the CMake invocation. Make sure that
`ADDON_SRC_PREFIX` does _not_ point directly to `pvr.octonet` but instead to its parent directory.
Finally, build the plugin with `make` (or `nmake` on Windows). The plugin should be in an `install`
subdirectory.

View File

@@ -21,15 +21,20 @@ environment:
- GENERATOR: "Visual Studio 14" - GENERATOR: "Visual Studio 14"
CONFIG: Release CONFIG: Release
artifacts:
- path: build/install/
name: pvr.octonet
type: zip
build_script: build_script:
- cd .. - cd ..
- set ROOT=%cd% - set ROOT=%cd%
- git clone --depth=1 https://github.com/xbmc/xbmc.git - git clone --depth=1 https://github.com/xbmc/xbmc.git
- mkdir xbmc\project\cmake\addons\addons\pvr.octonet - mkdir xbmc\cmake\addons\addons\pvr.octonet
- echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\project\cmake\addons\addons\pvr.octonet\pvr.octonet.txt - echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\cmake\addons\addons\pvr.octonet\pvr.octonet.txt
- cd %ADDON% - cd %ADDON%
- mkdir build - mkdir build
- cd build - cd build
# Must use absolute path for cmake to build depends correctly # Must use absolute path for cmake to build depends correctly
- cmake -G "%GENERATOR%" -DADDONS_TO_BUILD=%ADDON% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDON_SRC_PREFIX=%ROOT% -DCMAKE_INSTALL_PREFIX=%ROOT%\xbmc\addons -DPACKAGE_ZIP=1 %ROOT%\xbmc\project\cmake\addons - cmake -G "%GENERATOR%" -DADDONS_TO_BUILD=%ADDON% -DCMAKE_BUILD_TYPE=%CONFIG% -DADDON_SRC_PREFIX=%ROOT% -DCMAKE_INSTALL_PREFIX=install -DPACKAGE_ZIP=1 %ROOT%\xbmc\cmake\addons
- cmake --build . --config %CONFIG% - cmake --build . --config %CONFIG%

2
debian/control vendored
View File

@@ -1,7 +1,7 @@
Source: kodi-pvr-octonet Source: kodi-pvr-octonet
Priority: extra Priority: extra
Maintainer: Julian Scheel <julian@jusst.de> Maintainer: Julian Scheel <julian@jusst.de>
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev, kodi-pvr-dev, Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev,
libkodiplatform-dev (>= 16.0.0), kodi-addon-dev libkodiplatform-dev (>= 16.0.0), kodi-addon-dev
Standards-Version: 3.9.4 Standards-Version: 3.9.4
Section: libs Section: libs

View File

@@ -1,7 +1,10 @@
project(jsoncpp) project(jsoncpp)
cmake_minimum_required(VERSION 2.6) cmake_minimum_required(VERSION 3.1)
enable_language(CXX) enable_language(CXX)
SET(CMAKE_CXX_STANDARD 11)
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
SET(CMAKE_CXX_EXTENSIONS OFF)
set(SOURCES src/lib_json/json_reader.cpp set(SOURCES src/lib_json/json_reader.cpp
src/lib_json/json_value.cpp src/lib_json/json_value.cpp

View File

@@ -1 +1 @@
jsoncpp http://mirrors.kodi.tv/build-deps/sources/jsoncpp-src-0.5.0.tar.gz jsoncpp http://mirrors.kodi.tv/build-deps/sources/jsoncpp-1.8.3.tar.gz

View File

@@ -1,23 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<addon <addon
id="pvr.octonet" id="pvr.octonet"
version="0.3.4" version="0.7.0"
name="Digital Devices Octopus NET Client" name="Digital Devices Octopus NET Client"
provider-name="digitaldevices"> provider-name="digitaldevices">
<requires> <requires>@ADDON_DEPENDS@</requires>
<c-pluff version="0.1" />
<import addon="xbmc.pvr" version="5.2.0" />
</requires>
<extension <extension
point="xbmc.pvrclient" point="xbmc.pvrclient"
library_linux="pvr.octonet.so" library_@PLATFORM@="@LIBRARY_FILENAME@"/>
library_osx="pvr.octonet.dylib"
library_freebsd="pvr.octonet.so"
library_windx="pvr.octonet.dll"
library_android="libpvr.octonet.so" />
<extension point="xbmc.addon.metadata"> <extension point="xbmc.addon.metadata">
<summary lang="de_DE">Kodi PVR Addon für Digital Devices Octopus NET Streams</summary> <summary lang="de_DE">Kodi PVR Addon für Digital Devices Octopus NET Streams</summary>
<summary lang="en_US">Kodi PVR Addon for Digital Devices Octopus NET Streams</summary> <summary lang="en_US">Kodi PVR Addon for Digital Devices Octopus NET Streams</summary>
<platform>all</platform> <platform>@PLATFORM@</platform>
</extension> </extension>
</addon> </addon>

View File

@@ -42,7 +42,7 @@ OctonetData::OctonetData()
lastEpgLoad = 0; lastEpgLoad = 0;
if (!loadChannelList()) if (!loadChannelList())
kodi->QueueNotification(QUEUE_ERROR, kodi->GetLocalizedString(30001), channels.size()); libKodi->QueueNotification(QUEUE_ERROR, libKodi->GetLocalizedString(30001), channels.size());
} }
OctonetData::~OctonetData(void) OctonetData::~OctonetData(void)
@@ -53,14 +53,8 @@ OctonetData::~OctonetData(void)
int64_t OctonetData::parseID(std::string id) int64_t OctonetData::parseID(std::string id)
{ {
int64_t nativeId; std::hash<std::string> hash_fn;
size_t strip; int64_t nativeId = hash_fn(id);
/* Strip colons from id */
while ((strip = id.find(":")) != std::string::npos)
id.erase(strip, 1);
std::stringstream ids(id);
ids >> nativeId;
return nativeId; return nativeId;
} }
@@ -68,15 +62,15 @@ int64_t OctonetData::parseID(std::string id)
bool OctonetData::loadChannelList() bool OctonetData::loadChannelList()
{ {
std::string jsonContent; std::string jsonContent;
void *f = kodi->OpenFile(("http://" + serverAddress + "/channellist.lua?select=json").c_str(), 0); void *f = libKodi->OpenFile(("http://" + serverAddress + "/channellist.lua?select=json").c_str(), 0);
if (!f) if (!f)
return false; return false;
char buf[1024]; char buf[1024];
while (int read = kodi->ReadFile(f, buf, 1024)) while (int read = libKodi->ReadFile(f, buf, 1024))
jsonContent.append(buf, read); jsonContent.append(buf, read);
kodi->CloseFile(f); libKodi->CloseFile(f);
Json::Value root; Json::Value root;
Json::Reader reader; Json::Reader reader;
@@ -153,15 +147,15 @@ bool OctonetData::loadEPG(void)
return false; return false;
std::string jsonContent; std::string jsonContent;
void *f = kodi->OpenFile(("http://" + serverAddress + "/epg.lua?;#|encoding=gzip").c_str(), 0); void *f = libKodi->OpenFile(("http://" + serverAddress + "/epg.lua?;#|encoding=gzip").c_str(), 0);
if (!f) if (!f)
return false; return false;
char buf[1024]; char buf[1024];
while (int read = kodi->ReadFile(f, buf, 1024)) while (int read = libKodi->ReadFile(f, buf, 1024))
jsonContent.append(buf, read); jsonContent.append(buf, read);
kodi->CloseFile(f); libKodi->CloseFile(f);
Json::Value root; Json::Value root;
Json::Reader reader; Json::Reader reader;
@@ -190,7 +184,7 @@ bool OctonetData::loadEPG(void)
channel = findChannel(entry.channelId); channel = findChannel(entry.channelId);
if (channel == NULL) { if (channel == NULL) {
kodi->Log(LOG_ERROR, "EPG for unknown channel."); libKodi->Log(LOG_ERROR, "EPG for unknown channel.");
continue; continue;
} }
@@ -261,7 +255,7 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
EPG_TAG entry; EPG_TAG entry;
memset(&entry, 0, sizeof(EPG_TAG)); memset(&entry, 0, sizeof(EPG_TAG));
entry.iChannelNumber = i; entry.iUniqueChannelId = chan.id;
entry.iUniqueBroadcastId = it->id; entry.iUniqueBroadcastId = it->id;
entry.strTitle = it->title.c_str(); entry.strTitle = it->title.c_str();
entry.strPlotOutline = it->subtitle.c_str(); entry.strPlotOutline = it->subtitle.c_str();
@@ -282,7 +276,7 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
EPG_TAG entry; EPG_TAG entry;
memset(&entry, 0, sizeof(EPG_TAG)); memset(&entry, 0, sizeof(EPG_TAG));
entry.iChannelNumber = i; entry.iUniqueChannelId = chan.id;
entry.iUniqueBroadcastId = it->id; entry.iUniqueBroadcastId = it->id;
entry.strTitle = it->title.c_str(); entry.strTitle = it->title.c_str();
entry.strPlotOutline = it->subtitle.c_str(); entry.strPlotOutline = it->subtitle.c_str();

View File

@@ -196,13 +196,13 @@ int Socket::send ( const char* data, const unsigned int len )
if (result < 0) if (result < 0)
{ {
kodi->Log(LOG_ERROR, "Socket::send - select failed"); libKodi->Log(LOG_ERROR, "Socket::send - select failed");
close(); close();
return 0; return 0;
} }
if (FD_ISSET(_sd, &set_w)) if (FD_ISSET(_sd, &set_w))
{ {
kodi->Log(LOG_ERROR, "Socket::send - failed to send data"); libKodi->Log(LOG_ERROR, "Socket::send - failed to send data");
close(); close();
return 0; return 0;
} }
@@ -212,7 +212,7 @@ int Socket::send ( const char* data, const unsigned int len )
if (status == -1) if (status == -1)
{ {
errormessage( getLastError(), "Socket::send"); errormessage( getLastError(), "Socket::send");
kodi->Log(LOG_ERROR, "Socket::send - failed to send data"); libKodi->Log(LOG_ERROR, "Socket::send - failed to send data");
close(); close();
return 0; return 0;
} }
@@ -296,7 +296,7 @@ bool Socket::ReadLine (string& line)
if (result < 0) if (result < 0)
{ {
kodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__); libKodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
errormessage(getLastError(), __FUNCTION__); errormessage(getLastError(), __FUNCTION__);
close(); close();
return false; return false;
@@ -306,11 +306,11 @@ bool Socket::ReadLine (string& line)
{ {
if (retries != 0) if (retries != 0)
{ {
kodi->Log(LOG_DEBUG, "%s: timeout waiting for response, retrying... (%i)", __FUNCTION__, retries); libKodi->Log(LOG_DEBUG, "%s: timeout waiting for response, retrying... (%i)", __FUNCTION__, retries);
retries--; retries--;
continue; continue;
} else { } else {
kodi->Log(LOG_DEBUG, "%s: timeout waiting for response. Aborting after 10 retries.", __FUNCTION__); libKodi->Log(LOG_DEBUG, "%s: timeout waiting for response. Aborting after 10 retries.", __FUNCTION__);
return false; return false;
} }
} }
@@ -318,7 +318,7 @@ bool Socket::ReadLine (string& line)
result = recv(_sd, buffer, sizeof(buffer) - 1, 0); result = recv(_sd, buffer, sizeof(buffer) - 1, 0);
if (result < 0) if (result < 0)
{ {
kodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__); libKodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
errormessage(getLastError(), __FUNCTION__); errormessage(getLastError(), __FUNCTION__);
close(); close();
return false; return false;
@@ -389,7 +389,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
if ( !setHostname( host ) ) if ( !setHostname( host ) )
{ {
kodi->Log(LOG_ERROR, "Socket::setHostname(%s) failed.\n", host.c_str()); libKodi->Log(LOG_ERROR, "Socket::setHostname(%s) failed.\n", host.c_str());
return false; return false;
} }
_port = port; _port = port;
@@ -438,7 +438,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
if (address == NULL) if (address == NULL)
{ {
kodi->Log(LOG_ERROR, "Socket::connect %s:%u\n", host.c_str(), port); libKodi->Log(LOG_ERROR, "Socket::connect %s:%u\n", host.c_str(), port);
errormessage(getLastError(), "Socket::connect"); errormessage(getLastError(), "Socket::connect");
close(); close();
return false; return false;
@@ -474,7 +474,7 @@ bool Socket::set_non_blocking ( const bool b )
if (ioctlsocket(_sd, FIONBIO, &iMode) == -1) if (ioctlsocket(_sd, FIONBIO, &iMode) == -1)
{ {
kodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket condition to: %i", iMode); libKodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket condition to: %i", iMode);
return false; return false;
} }
@@ -565,7 +565,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
default: default:
errmsg = "WSA Error"; errmsg = "WSA Error";
} }
kodi->Log(LOG_ERROR, "%s: (Winsock error=%i) %s\n", functionname, errnum, errmsg); libKodi->Log(LOG_ERROR, "%s: (Winsock error=%i) %s\n", functionname, errnum, errmsg);
} }
int Socket::getLastError() const int Socket::getLastError() const
@@ -623,7 +623,7 @@ bool Socket::set_non_blocking ( const bool b )
if(fcntl (_sd , F_SETFL, opts) == -1) if(fcntl (_sd , F_SETFL, opts) == -1)
{ {
kodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket flags to: %i", opts); libKodi->Log(LOG_ERROR, "Socket::set_non_blocking - Can't set socket flags to: %i", opts);
return false; return false;
} }
return true; return true;
@@ -699,7 +699,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
break; break;
} }
kodi->Log(LOG_ERROR, "%s: (errno=%i) %s\n", functionname, errnum, errmsg); libKodi->Log(LOG_ERROR, "%s: (errno=%i) %s\n", functionname, errnum, errmsg);
} }
int Socket::getLastError() const int Socket::getLastError() const

View File

@@ -36,7 +36,7 @@ std::string octonetAddress = "";
/* internal state variables */ /* internal state variables */
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN; ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
CHelper_libXBMC_addon *kodi = NULL; CHelper_libXBMC_addon *libKodi = NULL;
CHelper_libXBMC_pvr *pvr = NULL; CHelper_libXBMC_pvr *pvr = NULL;
OctonetData *data = NULL; OctonetData *data = NULL;
@@ -49,7 +49,7 @@ extern "C" {
void ADDON_ReadSettings(void) void ADDON_ReadSettings(void)
{ {
char buffer[2048]; char buffer[2048];
if (kodi->GetSetting("octonetAddress", &buffer)) if (libKodi->GetSetting("octonetAddress", &buffer))
octonetAddress = buffer; octonetAddress = buffer;
} }
@@ -59,22 +59,22 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
return ADDON_STATUS_UNKNOWN; return ADDON_STATUS_UNKNOWN;
PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props; PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props;
kodi = new CHelper_libXBMC_addon; libKodi = new CHelper_libXBMC_addon;
if (!kodi->RegisterMe(callbacks)) { if (!libKodi->RegisterMe(callbacks)) {
kodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__); libKodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
SAFE_DELETE(kodi); SAFE_DELETE(libKodi);
return ADDON_STATUS_PERMANENT_FAILURE; return ADDON_STATUS_PERMANENT_FAILURE;
} }
pvr = new CHelper_libXBMC_pvr; pvr = new CHelper_libXBMC_pvr;
if (!pvr->RegisterMe(callbacks)) { if (!pvr->RegisterMe(callbacks)) {
kodi->Log(LOG_ERROR, "%s: Failed to register octonet pvr addon", __func__); libKodi->Log(LOG_ERROR, "%s: Failed to register octonet pvr addon", __func__);
SAFE_DELETE(pvr); SAFE_DELETE(pvr);
SAFE_DELETE(kodi); SAFE_DELETE(libKodi);
return ADDON_STATUS_PERMANENT_FAILURE; return ADDON_STATUS_PERMANENT_FAILURE;
} }
kodi->Log(LOG_DEBUG, "%s: Creating octonet pvr addon", __func__); libKodi->Log(LOG_DEBUG, "%s: Creating octonet pvr addon", __func__);
ADDON_ReadSettings(); ADDON_ReadSettings();
data = new OctonetData; data = new OctonetData;
@@ -83,12 +83,10 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
return addonStatus; return addonStatus;
} }
void ADDON_Stop() {} /* no-op */
void ADDON_Destroy() void ADDON_Destroy()
{ {
delete pvr; delete pvr;
delete kodi; delete libKodi;
addonStatus = ADDON_STATUS_UNKNOWN; addonStatus = ADDON_STATUS_UNKNOWN;
} }
@@ -97,16 +95,6 @@ ADDON_STATUS ADDON_GetStatus()
return addonStatus; return addonStatus;
} }
bool ADDON_HasSettings()
{
return true;
}
unsigned int ADDON_GetSettings(ADDON_StructSetting ***sSet)
{
return 0;
}
ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue) ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
{ {
/* For simplicity do a full addon restart whenever settings are /* For simplicity do a full addon restart whenever settings are
@@ -114,9 +102,6 @@ ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
return ADDON_STATUS_NEED_RESTART; return ADDON_STATUS_NEED_RESTART;
} }
void ADDON_FreeSettings() {} /* no-op */
void ADDON_Announce(const char *flag, const char *sender, const char *message, const void *data) {} /* no-op */
} }
@@ -125,32 +110,16 @@ void ADDON_Announce(const char *flag, const char *sender, const char *message, c
extern "C" extern "C"
{ {
const char* GetPVRAPIVersion(void)
{
return XBMC_PVR_API_VERSION;
}
const char* GetMininumPVRAPIVersion(void)
{
return XBMC_PVR_MIN_API_VERSION;
}
const char* GetGUIAPIVersion(void)
{
return KODI_GUILIB_API_VERSION;
}
const char* GetMininumGUIAPIVersion(void)
{
return KODI_GUILIB_MIN_API_VERSION;
}
PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities) PVR_ERROR GetAddonCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities)
{ {
pCapabilities->bSupportsTV = true; pCapabilities->bSupportsTV = true;
pCapabilities->bSupportsRadio = true; pCapabilities->bSupportsRadio = true;
pCapabilities->bSupportsChannelGroups = true; pCapabilities->bSupportsChannelGroups = true;
pCapabilities->bSupportsEPG = true; pCapabilities->bSupportsEPG = true;
pCapabilities->bSupportsRecordings = false;
pCapabilities->bSupportsRecordingsRename = false;
pCapabilities->bSupportsRecordingsLifetimeChange = false;
pCapabilities->bSupportsDescrambleInfo = false;
return PVR_ERROR_NO_ERROR; return PVR_ERROR_NO_ERROR;
} }
@@ -162,7 +131,7 @@ const char* GetBackendName(void)
const char* GetBackendVersion(void) const char* GetBackendVersion(void)
{ {
return XBMC_PVR_API_VERSION; return STR(OCTONET_VERSION);
} }
const char* GetConnectionString(void) const char* GetConnectionString(void)
@@ -174,12 +143,12 @@ PVR_ERROR GetDriveSpace(long long* iTotal, long long* iUsed) { return PVR_ERROR_
PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR CallMenuHook(const PVR_MENUHOOK& menuhook, const PVR_MENUHOOK_DATA &item) { return PVR_ERROR_NOT_IMPLEMENTED; }
void OnSystemSleep() { void OnSystemSleep() {
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__); libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
// FIXME: Disconnect? // FIXME: Disconnect?
} }
void OnSystemWake() { void OnSystemWake() {
kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__); libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
// FIXME:Reconnect? // FIXME:Reconnect?
} }
@@ -192,6 +161,9 @@ PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time
return data->getEPG(handle, channel, iStart, iEnd); return data->getEPG(handle, channel, iStart, iEnd);
} }
PVR_ERROR IsEPGTagRecordable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR IsEPGTagPlayable(const EPG_TAG*, bool*) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Channel groups */ /* Channel groups */
int GetChannelGroupsAmount(void) int GetChannelGroupsAmount(void)
{ {
@@ -223,7 +195,6 @@ PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio)
PVR_ERROR DeleteChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR RenameChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR MoveChannel(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR OpenDialogChannelSettings(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR OpenDialogChannelSettings(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR OpenDialogChannelAdd(const PVR_CHANNEL& channel) { return PVR_ERROR_NOT_IMPLEMENTED; }
@@ -234,6 +205,7 @@ PVR_ERROR DeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT
PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR UndeleteRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteAllRecordingsFromTrash() { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR RenameRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR RenameRecording(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR SetRecordingLifetime(const PVR_RECORDING*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING& recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingPlayCount(const PVR_RECORDING& recording, int count) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING& recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetRecordingLastPlayedPosition(const PVR_RECORDING& recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; }
int GetRecordingLastPlayedPosition(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; } int GetRecordingLastPlayedPosition(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
@@ -245,6 +217,13 @@ PVR_ERROR AddTimer(const PVR_TIMER& timer) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR DeleteTimer(const PVR_TIMER& timer, bool bForceDelete) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR DeleteTimer(const PVR_TIMER& timer, bool bForceDelete) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR UpdateTimer(const PVR_TIMER& timer) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR UpdateTimer(const PVR_TIMER& timer) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* PVR stream properties handling */
PVR_ERROR GetStreamReadChunkSize(int* chunksize) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetChannelStreamProperties(const PVR_CHANNEL*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetRecordingStreamProperties(const PVR_RECORDING*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetEPGTagStreamProperties(const EPG_TAG*, PVR_NAMED_VALUE*, unsigned int*) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetEPGTagEdl(const EPG_TAG* epgTag, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* PVR stream handling */ /* PVR stream handling */
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by /* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
* Kodi core */ * Kodi core */
@@ -261,30 +240,24 @@ void CloseLiveStream(void) {
} }
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; } long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
long long PositionLiveStream(void) { return -1; }
long long LengthLiveStream(void) { return -1; } long long LengthLiveStream(void) { return -1; }
bool IsRealTimeStream(void) { return true; } bool IsRealTimeStream(void) { return true; }
bool SwitchChannel(const PVR_CHANNEL& channel) {
CloseLiveStream();
return OpenLiveStream(channel);
}
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) { PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) {
memset(&signalStatus, 0, sizeof(PVR_SIGNAL_STATUS)); memset(&signalStatus, 0, sizeof(PVR_SIGNAL_STATUS));
rtsp_fill_signal_status(signalStatus); rtsp_fill_signal_status(signalStatus);
return PVR_ERROR_NO_ERROR; return PVR_ERROR_NO_ERROR;
} }
const char* GetLiveStreamURL(const PVR_CHANNEL& channel) { return NULL; } PVR_ERROR GetStreamTimes(PVR_STREAM_TIMES *times) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR GetStreamProperties(PVR_STREAM_PROPERTIES* pProperties) { return PVR_ERROR_NOT_IMPLEMENTED; }
PVR_ERROR GetDescrambleInfo(PVR_DESCRAMBLE_INFO*) { return PVR_ERROR_NOT_IMPLEMENTED; }
/* Recording stream handling */ /* Recording stream handling */
bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; } bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; }
void CloseRecordedStream(void) {} void CloseRecordedStream(void) {}
int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; } int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; } long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; }
long long PositionRecordedStream(void) { return -1; }
long long LengthRecordedStream(void) { return -1; } long long LengthRecordedStream(void) { return -1; }
/* PVR demuxer */ /* PVR demuxer */
@@ -295,21 +268,16 @@ void DemuxFlush(void) {}
DemuxPacket* DemuxRead(void) { return NULL; } DemuxPacket* DemuxRead(void) { return NULL; }
/* Various helper functions */ /* Various helper functions */
unsigned int GetChannelSwitchDelay(void) { return 0; }
bool IsTimeshifting(void) { return false; } bool IsTimeshifting(void) { return false; }
bool CanPauseStream() { return false; } bool CanPauseStream() { return false; }
bool CanSeekStream() { return false; } bool CanSeekStream() { return false; }
/* Callbacks */ /* Callbacks */
void PauseStream(bool bPaused) {} void PauseStream(bool bPaused) {}
bool SeekTime(int time, bool backwards, double *startpts) { return false; } bool SeekTime(double time, bool backwards, double *startpts) { return false; }
void SetSpeed(int speed) {} void SetSpeed(int speed) {}
PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; } PVR_ERROR SetEPGTimeFrame(int) { return PVR_ERROR_NOT_IMPLEMENTED; }
time_t GetPlayingTime() { return 0; }
time_t GetBufferTimeStart() { return 0; }
time_t GetBufferTimeEnd() { return 0; }
const char* GetBackendHostname() const char* GetBackendHostname()
{ {
return octonetAddress.c_str(); return octonetAddress.c_str();

View File

@@ -28,7 +28,7 @@
#define __func__ __FUNCTION__ #define __func__ __FUNCTION__
#endif #endif
extern ADDON::CHelper_libXBMC_addon *kodi; extern ADDON::CHelper_libXBMC_addon *libKodi;
extern CHelper_libXBMC_pvr *pvr; extern CHelper_libXBMC_pvr *pvr;
/* IP or hostname of the octonet to be connected to */ /* IP or hostname of the octonet to be connected to */

View File

@@ -309,13 +309,13 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->level = 0; rtsp->level = 0;
rtsp->quality = 0; rtsp->quality = 0;
kodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_str()); libKodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_str());
url dst = parse_url(url_str); url dst = parse_url(url_str);
kodi->Log(LOG_DEBUG, "connect to host '%s'", dst.host.c_str()); libKodi->Log(LOG_DEBUG, "connect to host '%s'", dst.host.c_str());
if(!rtsp->tcp_sock.connect(dst.host, dst.port)) { if(!rtsp->tcp_sock.connect(dst.host, dst.port)) {
kodi->Log(LOG_ERROR, "Failed to connect to RTSP server %s:%d", dst.host.c_str(), dst.port); libKodi->Log(LOG_ERROR, "Failed to connect to RTSP server %s:%d", dst.host.c_str(), dst.port);
goto error; goto error;
} }
@@ -353,7 +353,7 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->tcp_sock.send(setup_ss.str()); rtsp->tcp_sock.send(setup_ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) { if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to setup RTSP session"); libKodi->Log(LOG_ERROR, "Failed to setup RTSP session");
goto error; goto error;
} }
@@ -368,7 +368,7 @@ bool rtsp_open(const string& name, const string& url_str)
rtsp->tcp_sock.send(play_ss.str()); rtsp->tcp_sock.send(play_ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) { if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to play RTSP session"); libKodi->Log(LOG_ERROR, "Failed to play RTSP session");
goto error; goto error;
} }
@@ -453,7 +453,7 @@ static void rtsp_teardown() {
rtsp->tcp_sock.send(ss.str()); rtsp->tcp_sock.send(ss.str());
if (rtsp_handle() != RTSP_RESULT_OK) { if (rtsp_handle() != RTSP_RESULT_OK) {
kodi->Log(LOG_ERROR, "Failed to teardown RTSP session"); libKodi->Log(LOG_ERROR, "Failed to teardown RTSP session");
return; return;
} }
} }