mirror of
				https://github.com/DigitalDevices/pvr.octonet.git
				synced 2025-03-01 10:53:09 +00:00 
			
		
		
		
	Compare commits
	
		
			85 Commits
		
	
	
		
			0.1
			...
			1.2.6-Matr
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b01e24b0a2 | ||
| 
						 | 
					5f9342abdd | ||
| 
						 | 
					cc34e52369 | ||
| 
						 | 
					360fb03145 | ||
| 
						 | 
					ace4891f78 | ||
| 
						 | 
					3d47c712fd | ||
| 
						 | 
					3f04265d51 | ||
| 
						 | 
					d4d6628d57 | ||
| 
						 | 
					cbef814f8f | ||
| 
						 | 
					50386e13b2 | ||
| 
						 | 
					cd1c5d4171 | ||
| 
						 | 
					83fbcfb360 | ||
| 
						 | 
					bed39d0575 | ||
| 
						 | 
					0bdcb49d69 | ||
| 
						 | 
					5024fd99c1 | ||
| 
						 | 
					a19fef8af8 | ||
| 
						 | 
					38f8f54c9f | ||
| 
						 | 
					01c41d8ea1 | ||
| 
						 | 
					237362e65a | ||
| 
						 | 
					c3f4d61b38 | ||
| 
						 | 
					c37cede8dc | ||
| 
						 | 
					aa4f7c0b0d | ||
| 
						 | 
					8032f085fd | ||
| 
						 | 
					0f6cd141c4 | ||
| 
						 | 
					d5ec59e00e | ||
| 
						 | 
					e2a73af36e | ||
| 
						 | 
					a55552e768 | ||
| 
						 | 
					14d3e9d225 | ||
| 
						 | 
					cf9ee98727 | ||
| 
						 | 
					9d98f2bba4 | ||
| 
						 | 
					ca692f14be | ||
| 
						 | 
					69da8dbd0c | ||
| 
						 | 
					6d4f3847c7 | ||
| 
						 | 
					38e25e1f1c | ||
| 
						 | 
					472dc2beae | ||
| 
						 | 
					ec08c20540 | ||
| 
						 | 
					63ef363522 | ||
| 
						 | 
					c91061f84b | ||
| 
						 | 
					414e756912 | ||
| 
						 | 
					9de3166203 | ||
| 
						 | 
					df1b033f14 | ||
| 
						 | 
					0295717be2 | ||
| 
						 | 
					203f800eaa | ||
| 
						 | 
					153dfeb3d5 | ||
| 
						 | 
					1e44819300 | ||
| 
						 | 
					54680a38bd | ||
| 
						 | 
					689afbf4cd | ||
| 
						 | 
					c4af00a4fe | ||
| 
						 | 
					f1f8d44b78 | ||
| 
						 | 
					e9b4c05de5 | ||
| 
						 | 
					a77cf111bb | ||
| 
						 | 
					020dd98e7b | ||
| 
						 | 
					d7bb865329 | ||
| 
						 | 
					9bbd7cf3c4 | ||
| 
						 | 
					7b9ec7d884 | ||
| 
						 | 
					37abebb540 | ||
| 
						 | 
					3494c4c470 | ||
| 
						 | 
					ff41fc9acc | ||
| 
						 | 
					1ced6b3fa4 | ||
| 
						 | 
					cd774b6edc | ||
| 
						 | 
					2a63777b6d | ||
| 
						 | 
					e9f0d6bf76 | ||
| 
						 | 
					8549a31c8d | ||
| 
						 | 
					0a7fb087ac | ||
| 
						 | 
					5c0f000a91 | ||
| 
						 | 
					2b020cec9c | ||
| 
						 | 
					96a19310ca | ||
| 
						 | 
					3a6f4eb7b5 | ||
| 
						 | 
					2067aba378 | ||
| 
						 | 
					b52f50ef30 | ||
| 
						 | 
					d1f9af2225 | ||
| 
						 | 
					880d313bef | ||
| 
						 | 
					94eb166783 | ||
| 
						 | 
					ba7e50e79c | ||
| 
						 | 
					5fc6fc2ebc | ||
| 
						 | 
					8778ebe422 | ||
| 
						 | 
					0adb1ade91 | ||
| 
						 | 
					844a5c3cd4 | ||
| 
						 | 
					838c0094b7 | ||
| 
						 | 
					c5b90f130b | ||
| 
						 | 
					415d2c98ac | ||
| 
						 | 
					2aa320ee2d | ||
| 
						 | 
					de0bf9c847 | ||
| 
						 | 
					9abe9180b6 | ||
| 
						 | 
					4665b282a2 | 
							
								
								
									
										51
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							@@ -1 +1,50 @@
 | 
			
		||||
/build
 | 
			
		||||
# build artifacts
 | 
			
		||||
build/
 | 
			
		||||
pvr.*/addon.xml
 | 
			
		||||
 | 
			
		||||
# Debian build files
 | 
			
		||||
debian/changelog
 | 
			
		||||
debian/files
 | 
			
		||||
debian/*.log
 | 
			
		||||
debian/*.substvars
 | 
			
		||||
debian/.debhelper/
 | 
			
		||||
debian/tmp/
 | 
			
		||||
debian/kodi-pvr-*/
 | 
			
		||||
obj-x86_64-linux-gnu/
 | 
			
		||||
 | 
			
		||||
# commonly used editors
 | 
			
		||||
# vim
 | 
			
		||||
*.swp
 | 
			
		||||
 | 
			
		||||
# Eclipse
 | 
			
		||||
*.project
 | 
			
		||||
*.cproject
 | 
			
		||||
.classpath
 | 
			
		||||
*.sublime-*
 | 
			
		||||
.settings/
 | 
			
		||||
 | 
			
		||||
# KDevelop 4
 | 
			
		||||
*.kdev4
 | 
			
		||||
 | 
			
		||||
# gedit
 | 
			
		||||
*~
 | 
			
		||||
 | 
			
		||||
# CLion
 | 
			
		||||
/.idea
 | 
			
		||||
 | 
			
		||||
# clion
 | 
			
		||||
.idea/
 | 
			
		||||
 | 
			
		||||
# to prevent add after a "git format-patch VALUE" and "git add ." call
 | 
			
		||||
/*.patch
 | 
			
		||||
 | 
			
		||||
# Visual Studio Code
 | 
			
		||||
.vscode
 | 
			
		||||
 | 
			
		||||
# to prevent add if project code opened by Visual Studio over CMake file
 | 
			
		||||
.vs/
 | 
			
		||||
 | 
			
		||||
# General MacOS
 | 
			
		||||
.DS_Store
 | 
			
		||||
.AppleDouble
 | 
			
		||||
.LSOverride
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										30
									
								
								.travis.yml
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								.travis.yml
									
									
									
									
									
								
							@@ -7,28 +7,22 @@ language: cpp
 | 
			
		||||
# Linux. We need Trusty in order to get up to date versions of
 | 
			
		||||
# cmake and g++.
 | 
			
		||||
#
 | 
			
		||||
env:
 | 
			
		||||
  global:
 | 
			
		||||
    - app_id=pvr.octonet
 | 
			
		||||
 | 
			
		||||
matrix:
 | 
			
		||||
  include:
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      dist: xenial
 | 
			
		||||
      sudo: required
 | 
			
		||||
      compiler: gcc
 | 
			
		||||
    - os: linux
 | 
			
		||||
      dist: trusty
 | 
			
		||||
      dist: xenial
 | 
			
		||||
      sudo: required
 | 
			
		||||
      compiler: clang
 | 
			
		||||
    - os: osx
 | 
			
		||||
      osx_image: xcode7.3
 | 
			
		||||
    - os: osx
 | 
			
		||||
      osx_image: xcode6.1
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# Some of the OS X images don't have cmake, contrary to what people
 | 
			
		||||
# on the Internet say
 | 
			
		||||
#
 | 
			
		||||
before_install:
 | 
			
		||||
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew update        ; fi
 | 
			
		||||
  - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then which cmake || brew install cmake ; fi
 | 
			
		||||
      osx_image: xcode10.2
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
# The addon source is automatically checked out in $TRAVIS_BUILD_DIR,
 | 
			
		||||
@@ -36,10 +30,10 @@ before_install:
 | 
			
		||||
#
 | 
			
		||||
before_script:
 | 
			
		||||
  - cd $TRAVIS_BUILD_DIR/..
 | 
			
		||||
  - git clone --depth=1 https://github.com/xbmc/xbmc.git
 | 
			
		||||
  - mkdir -p xbmc/project/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
 | 
			
		||||
  - 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
 | 
			
		||||
  - git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
 | 
			
		||||
  - cd ${app_id} && mkdir build && cd build
 | 
			
		||||
  - mkdir -p definition/${app_id}
 | 
			
		||||
  - echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt
 | 
			
		||||
  - cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons
 | 
			
		||||
 | 
			
		||||
script: make
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,15 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.5)
 | 
			
		||||
project(pvr.octonet)
 | 
			
		||||
 | 
			
		||||
cmake_minimum_required(VERSION 2.6)
 | 
			
		||||
 | 
			
		||||
list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR})
 | 
			
		||||
enable_language(CXX)
 | 
			
		||||
 | 
			
		||||
find_package(Kodi REQUIRED)
 | 
			
		||||
find_package(kodiplatform REQUIRED)
 | 
			
		||||
find_package(p8-platform REQUIRED)
 | 
			
		||||
find_package(JsonCpp REQUIRED)
 | 
			
		||||
 | 
			
		||||
include_directories(
 | 
			
		||||
	${kodiplatform_INCLUDE_DIRS}
 | 
			
		||||
	${p8-platform_INCLUDE_DIRS}
 | 
			
		||||
	${KODI_INCLUDE_DIR}
 | 
			
		||||
	${KODI_INCLUDE_DIR}/.. # Hack way with "/..", need bigger Kodi cmake rework to match right include ways
 | 
			
		||||
	${JSONCPP_INCLUDE_DIRS})
 | 
			
		||||
 | 
			
		||||
set(DEPLIBS
 | 
			
		||||
@@ -26,10 +22,19 @@ set(OCTONET_SOURCES
 | 
			
		||||
	src/Socket.cpp
 | 
			
		||||
	src/rtsp_client.cpp)
 | 
			
		||||
 | 
			
		||||
set(OCTONET_HEADERS
 | 
			
		||||
	src/client.h
 | 
			
		||||
	src/OctonetData.h
 | 
			
		||||
	src/Socket.h)
 | 
			
		||||
 | 
			
		||||
build_addon(pvr.octonet OCTONET DEPLIBS)
 | 
			
		||||
 | 
			
		||||
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()
 | 
			
		||||
 | 
			
		||||
include(CPack)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								Jenkinsfile
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
buildPlugin(version: "Matrix")
 | 
			
		||||
							
								
								
									
										264
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										264
									
								
								LICENSE.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,264 @@
 | 
			
		||||
The GNU General Public License, Version 2, June 1991 (GPLv2)
 | 
			
		||||
============================================================
 | 
			
		||||
 | 
			
		||||
> Copyright (C) 1989, 1991 Free Software Foundation, Inc.
 | 
			
		||||
> 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 | 
			
		||||
 | 
			
		||||
Everyone is permitted to copy and distribute verbatim copies of this license
 | 
			
		||||
document, but changing it is not allowed.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Preamble
 | 
			
		||||
--------
 | 
			
		||||
 | 
			
		||||
The licenses for most software are designed to take away your freedom to share
 | 
			
		||||
and change it. By contrast, the GNU General Public License is intended to
 | 
			
		||||
guarantee your freedom to share and change free software--to make sure the
 | 
			
		||||
software is free for all its users. This General Public License applies to most
 | 
			
		||||
of the Free Software Foundation's software and to any other program whose
 | 
			
		||||
authors commit to using it. (Some other Free Software Foundation software is
 | 
			
		||||
covered by the GNU Lesser General Public License instead.) You can apply it to
 | 
			
		||||
your programs, too.
 | 
			
		||||
 | 
			
		||||
When we speak of free software, we are referring to freedom, not price. Our
 | 
			
		||||
General Public Licenses are designed to make sure that you have the freedom to
 | 
			
		||||
distribute copies of free software (and charge for this service if you wish),
 | 
			
		||||
that you receive source code or can get it if you want it, that you can change
 | 
			
		||||
the software or use pieces of it in new free programs; and that you know you can
 | 
			
		||||
do these things.
 | 
			
		||||
 | 
			
		||||
To protect your rights, we need to make restrictions that forbid anyone to deny
 | 
			
		||||
you these rights or to ask you to surrender the rights. These restrictions
 | 
			
		||||
translate to certain responsibilities for you if you distribute copies of the
 | 
			
		||||
software, or if you modify it.
 | 
			
		||||
 | 
			
		||||
For example, if you distribute copies of such a program, whether gratis or for a
 | 
			
		||||
fee, you must give the recipients all the rights that you have. You must make
 | 
			
		||||
sure that they, too, receive or can get the source code. And you must show them
 | 
			
		||||
these terms so they know their rights.
 | 
			
		||||
 | 
			
		||||
We protect your rights with two steps: (1) copyright the software, and (2) offer
 | 
			
		||||
you this license which gives you legal permission to copy, distribute and/or
 | 
			
		||||
modify the software.
 | 
			
		||||
 | 
			
		||||
Also, for each author's protection and ours, we want to make certain that
 | 
			
		||||
everyone understands that there is no warranty for this free software. If the
 | 
			
		||||
software is modified by someone else and passed on, we want its recipients to
 | 
			
		||||
know that what they have is not the original, so that any problems introduced by
 | 
			
		||||
others will not reflect on the original authors' reputations.
 | 
			
		||||
 | 
			
		||||
Finally, any free program is threatened constantly by software patents. We wish
 | 
			
		||||
to avoid the danger that redistributors of a free program will individually
 | 
			
		||||
obtain patent licenses, in effect making the program proprietary. To prevent
 | 
			
		||||
this, we have made it clear that any patent must be licensed for everyone's free
 | 
			
		||||
use or not licensed at all.
 | 
			
		||||
 | 
			
		||||
The precise terms and conditions for copying, distribution and modification
 | 
			
		||||
follow.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Terms And Conditions For Copying, Distribution And Modification
 | 
			
		||||
---------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
**0.** This License applies to any program or other work which contains a notice
 | 
			
		||||
placed by the copyright holder saying it may be distributed under the terms of
 | 
			
		||||
this General Public License. The "Program", below, refers to any such program or
 | 
			
		||||
work, and a "work based on the Program" means either the Program or any
 | 
			
		||||
derivative work under copyright law: that is to say, a work containing the
 | 
			
		||||
Program or a portion of it, either verbatim or with modifications and/or
 | 
			
		||||
translated into another language. (Hereinafter, translation is included without
 | 
			
		||||
limitation in the term "modification".) Each licensee is addressed as "you".
 | 
			
		||||
 | 
			
		||||
Activities other than copying, distribution and modification are not covered by
 | 
			
		||||
this License; they are outside its scope. The act of running the Program is not
 | 
			
		||||
restricted, and the output from the Program is covered only if its contents
 | 
			
		||||
constitute a work based on the Program (independent of having been made by
 | 
			
		||||
running the Program). Whether that is true depends on what the Program does.
 | 
			
		||||
 | 
			
		||||
**1.** You may copy and distribute verbatim copies of the Program's source code
 | 
			
		||||
as you receive it, in any medium, provided that you conspicuously and
 | 
			
		||||
appropriately publish on each copy an appropriate copyright notice and
 | 
			
		||||
disclaimer of warranty; keep intact all the notices that refer to this License
 | 
			
		||||
and to the absence of any warranty; and give any other recipients of the Program
 | 
			
		||||
a copy of this License along with the Program.
 | 
			
		||||
 | 
			
		||||
You may charge a fee for the physical act of transferring a copy, and you may at
 | 
			
		||||
your option offer warranty protection in exchange for a fee.
 | 
			
		||||
 | 
			
		||||
**2.** You may modify your copy or copies of the Program or any portion of it,
 | 
			
		||||
thus forming a work based on the Program, and copy and distribute such
 | 
			
		||||
modifications or work under the terms of Section 1 above, provided that you also
 | 
			
		||||
meet all of these conditions:
 | 
			
		||||
 | 
			
		||||
*   **a)** You must cause the modified files to carry prominent notices stating
 | 
			
		||||
    that you changed the files and the date of any change.
 | 
			
		||||
 | 
			
		||||
*   **b)** You must cause any work that you distribute or publish, that in whole
 | 
			
		||||
    or in part contains or is derived from the Program or any part thereof, to
 | 
			
		||||
    be licensed as a whole at no charge to all third parties under the terms of
 | 
			
		||||
    this License.
 | 
			
		||||
 | 
			
		||||
*   **c)** If the modified program normally reads commands interactively when
 | 
			
		||||
    run, you must cause it, when started running for such interactive use in the
 | 
			
		||||
    most ordinary way, to print or display an announcement including an
 | 
			
		||||
    appropriate copyright notice and a notice that there is no warranty (or
 | 
			
		||||
    else, saying that you provide a warranty) and that users may redistribute
 | 
			
		||||
    the program under these conditions, and telling the user how to view a copy
 | 
			
		||||
    of this License. (Exception: if the Program itself is interactive but does
 | 
			
		||||
    not normally print such an announcement, your work based on the Program is
 | 
			
		||||
    not required to print an announcement.)
 | 
			
		||||
 | 
			
		||||
These requirements apply to the modified work as a whole. If identifiable
 | 
			
		||||
sections of that work are not derived from the Program, and can be reasonably
 | 
			
		||||
considered independent and separate works in themselves, then this License, and
 | 
			
		||||
its terms, do not apply to those sections when you distribute them as separate
 | 
			
		||||
works. But when you distribute the same sections as part of a whole which is a
 | 
			
		||||
work based on the Program, the distribution of the whole must be on the terms of
 | 
			
		||||
this License, whose permissions for other licensees extend to the entire whole,
 | 
			
		||||
and thus to each and every part regardless of who wrote it.
 | 
			
		||||
 | 
			
		||||
Thus, it is not the intent of this section to claim rights or contest your
 | 
			
		||||
rights to work written entirely by you; rather, the intent is to exercise the
 | 
			
		||||
right to control the distribution of derivative or collective works based on the
 | 
			
		||||
Program.
 | 
			
		||||
 | 
			
		||||
In addition, mere aggregation of another work not based on the Program with the
 | 
			
		||||
Program (or with a work based on the Program) on a volume of a storage or
 | 
			
		||||
distribution medium does not bring the other work under the scope of this
 | 
			
		||||
License.
 | 
			
		||||
 | 
			
		||||
**3.** You may copy and distribute the Program (or a work based on it, under
 | 
			
		||||
Section 2) in object code or executable form under the terms of Sections 1 and 2
 | 
			
		||||
above provided that you also do one of the following:
 | 
			
		||||
 | 
			
		||||
*   **a)** Accompany it with the complete corresponding machine-readable source
 | 
			
		||||
    code, which must be distributed under the terms of Sections 1 and 2 above on
 | 
			
		||||
    a medium customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
*   **b)** Accompany it with a written offer, valid for at least three years, to
 | 
			
		||||
    give any third party, for a charge no more than your cost of physically
 | 
			
		||||
    performing source distribution, a complete machine-readable copy of the
 | 
			
		||||
    corresponding source code, to be distributed under the terms of Sections 1
 | 
			
		||||
    and 2 above on a medium customarily used for software interchange; or,
 | 
			
		||||
 | 
			
		||||
*   **c)** Accompany it with the information you received as to the offer to
 | 
			
		||||
    distribute corresponding source code. (This alternative is allowed only for
 | 
			
		||||
    noncommercial distribution and only if you received the program in object
 | 
			
		||||
    code or executable form with such an offer, in accord with Subsection b
 | 
			
		||||
    above.)
 | 
			
		||||
 | 
			
		||||
The source code for a work means the preferred form of the work for making
 | 
			
		||||
modifications to it. For an executable work, complete source code means all the
 | 
			
		||||
source code for all modules it contains, plus any associated interface
 | 
			
		||||
definition files, plus the scripts used to control compilation and installation
 | 
			
		||||
of the executable. However, as a special exception, the source code distributed
 | 
			
		||||
need not include anything that is normally distributed (in either source or
 | 
			
		||||
binary form) with the major components (compiler, kernel, and so on) of the
 | 
			
		||||
operating system on which the executable runs, unless that component itself
 | 
			
		||||
accompanies the executable.
 | 
			
		||||
 | 
			
		||||
If distribution of executable or object code is made by offering access to copy
 | 
			
		||||
from a designated place, then offering equivalent access to copy the source code
 | 
			
		||||
from the same place counts as distribution of the source code, even though third
 | 
			
		||||
parties are not compelled to copy the source along with the object code.
 | 
			
		||||
 | 
			
		||||
**4.** You may not copy, modify, sublicense, or distribute the Program except as
 | 
			
		||||
expressly provided under this License. Any attempt otherwise to copy, modify,
 | 
			
		||||
sublicense or distribute the Program is void, and will automatically terminate
 | 
			
		||||
your rights under this License. However, parties who have received copies, or
 | 
			
		||||
rights, from you under this License will not have their licenses terminated so
 | 
			
		||||
long as such parties remain in full compliance.
 | 
			
		||||
 | 
			
		||||
**5.** You are not required to accept this License, since you have not signed
 | 
			
		||||
it. However, nothing else grants you permission to modify or distribute the
 | 
			
		||||
Program or its derivative works. These actions are prohibited by law if you do
 | 
			
		||||
not accept this License. Therefore, by modifying or distributing the Program (or
 | 
			
		||||
any work based on the Program), you indicate your acceptance of this License to
 | 
			
		||||
do so, and all its terms and conditions for copying, distributing or modifying
 | 
			
		||||
the Program or works based on it.
 | 
			
		||||
 | 
			
		||||
**6.** Each time you redistribute the Program (or any work based on the
 | 
			
		||||
Program), the recipient automatically receives a license from the original
 | 
			
		||||
licensor to copy, distribute or modify the Program subject to these terms and
 | 
			
		||||
conditions. You may not impose any further restrictions on the recipients'
 | 
			
		||||
exercise of the rights granted herein. You are not responsible for enforcing
 | 
			
		||||
compliance by third parties to this License.
 | 
			
		||||
 | 
			
		||||
**7.** If, as a consequence of a court judgment or allegation of patent
 | 
			
		||||
infringement or for any other reason (not limited to patent issues), conditions
 | 
			
		||||
are imposed on you (whether by court order, agreement or otherwise) that
 | 
			
		||||
contradict the conditions of this License, they do not excuse you from the
 | 
			
		||||
conditions of this License. If you cannot distribute so as to satisfy
 | 
			
		||||
simultaneously your obligations under this License and any other pertinent
 | 
			
		||||
obligations, then as a consequence you may not distribute the Program at all.
 | 
			
		||||
For example, if a patent license would not permit royalty-free redistribution of
 | 
			
		||||
the Program by all those who receive copies directly or indirectly through you,
 | 
			
		||||
then the only way you could satisfy both it and this License would be to refrain
 | 
			
		||||
entirely from distribution of the Program.
 | 
			
		||||
 | 
			
		||||
If any portion of this section is held invalid or unenforceable under any
 | 
			
		||||
particular circumstance, the balance of the section is intended to apply and the
 | 
			
		||||
section as a whole is intended to apply in other circumstances.
 | 
			
		||||
 | 
			
		||||
It is not the purpose of this section to induce you to infringe any patents or
 | 
			
		||||
other property right claims or to contest validity of any such claims; this
 | 
			
		||||
section has the sole purpose of protecting the integrity of the free software
 | 
			
		||||
distribution system, which is implemented by public license practices. Many
 | 
			
		||||
people have made generous contributions to the wide range of software
 | 
			
		||||
distributed through that system in reliance on consistent application of that
 | 
			
		||||
system; it is up to the author/donor to decide if he or she is willing to
 | 
			
		||||
distribute software through any other system and a licensee cannot impose that
 | 
			
		||||
choice.
 | 
			
		||||
 | 
			
		||||
This section is intended to make thoroughly clear what is believed to be a
 | 
			
		||||
consequence of the rest of this License.
 | 
			
		||||
 | 
			
		||||
**8.** If the distribution and/or use of the Program is restricted in certain
 | 
			
		||||
countries either by patents or by copyrighted interfaces, the original copyright
 | 
			
		||||
holder who places the Program under this License may add an explicit
 | 
			
		||||
geographical distribution limitation excluding those countries, so that
 | 
			
		||||
distribution is permitted only in or among countries not thus excluded. In such
 | 
			
		||||
case, this License incorporates the limitation as if written in the body of this
 | 
			
		||||
License.
 | 
			
		||||
 | 
			
		||||
**9.** The Free Software Foundation may publish revised and/or new versions of
 | 
			
		||||
the General Public License from time to time. Such new versions will be similar
 | 
			
		||||
in spirit to the present version, but may differ in detail to address new
 | 
			
		||||
problems or concerns.
 | 
			
		||||
 | 
			
		||||
Each version is given a distinguishing version number. If the Program specifies
 | 
			
		||||
a version number of this License which applies to it and "any later version",
 | 
			
		||||
you have the option of following the terms and conditions either of that version
 | 
			
		||||
or of any later version published by the Free Software Foundation. If the
 | 
			
		||||
Program does not specify a version number of this License, you may choose any
 | 
			
		||||
version ever published by the Free Software Foundation.
 | 
			
		||||
 | 
			
		||||
**10.** If you wish to incorporate parts of the Program into other free programs
 | 
			
		||||
whose distribution conditions are different, write to the author to ask for
 | 
			
		||||
permission. For software which is copyrighted by the Free Software Foundation,
 | 
			
		||||
write to the Free Software Foundation; we sometimes make exceptions for this.
 | 
			
		||||
Our decision will be guided by the two goals of preserving the free status of
 | 
			
		||||
all derivatives of our free software and of promoting the sharing and reuse of
 | 
			
		||||
software generally.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
No Warranty
 | 
			
		||||
-----------
 | 
			
		||||
 | 
			
		||||
**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR
 | 
			
		||||
THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE
 | 
			
		||||
STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM
 | 
			
		||||
"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
 | 
			
		||||
BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 | 
			
		||||
PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
 | 
			
		||||
PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
 | 
			
		||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
 | 
			
		||||
 | 
			
		||||
**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 | 
			
		||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE
 | 
			
		||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
 | 
			
		||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR
 | 
			
		||||
INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA
 | 
			
		||||
BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
 | 
			
		||||
FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER
 | 
			
		||||
OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
 | 
			
		||||
							
								
								
									
										44
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								README.md
									
									
									
									
									
								
							@@ -1,27 +1,37 @@
 | 
			
		||||
# Octonet PVR
 | 
			
		||||
DigitalDevices [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 |
 | 
			
		||||
|----------|--------|
 | 
			
		||||
| Linux + OS X (Travis) | [](https://travis-ci.org/julianscheel/pvr.octonet) |
 | 
			
		||||
| Windows (AppVeyor) | [](https://ci.appveyor.com/project/julianscheel/pvr-octonet) |
 | 
			
		||||
 | 
			
		||||
# Building
 | 
			
		||||
 | 
			
		||||
## Windows
 | 
			
		||||
1. Create a file `project/cmake/addons/addons/kodi.pvr.octonet/kodi.pvr.octonet.txt` containing a
 | 
			
		||||
   single line `kodi.pvr.octonet file://C:\some\path`. The path doesn't matter and doesn't need to
 | 
			
		||||
   actually exist.
 | 
			
		||||
These instructions work on all supported platforms for the most part. Obviously, paths need to be
 | 
			
		||||
adjusted according to your OS (`/` vs `\`). We use Linux paths here as an example.
 | 
			
		||||
 | 
			
		||||
2. Use a shell that has environment variables setup by Visual Studio for the native x86 toolchain.
 | 
			
		||||
   Run the following in a new build directory and adjust paths accordingly:
 | 
			
		||||
Clone the `pvr.octonet` repository:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
cmake -G "NMake Makefiles" ^
 | 
			
		||||
    -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"
 | 
			
		||||
$ git clone https://github.com/DigitalDevices/pvr.octonet.git
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
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 --branch master https://github.com/xbmc/xbmc.git
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
$ 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.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										13
									
								
								appveyor.yml
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								appveyor.yml
									
									
									
									
									
								
							@@ -21,15 +21,20 @@ environment:
 | 
			
		||||
    - GENERATOR: "Visual Studio 14"
 | 
			
		||||
      CONFIG: Release
 | 
			
		||||
 | 
			
		||||
artifacts:
 | 
			
		||||
  - path: build/install/
 | 
			
		||||
    name: pvr.octonet
 | 
			
		||||
    type: zip
 | 
			
		||||
 | 
			
		||||
build_script:
 | 
			
		||||
  - cd ..
 | 
			
		||||
  - set ROOT=%cd%
 | 
			
		||||
  - git clone --depth=1 https://github.com/xbmc/xbmc.git
 | 
			
		||||
  - mkdir xbmc\project\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
 | 
			
		||||
  - git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
 | 
			
		||||
  - mkdir xbmc\cmake\addons\addons\pvr.octonet
 | 
			
		||||
  - echo pvr.octonet https://github.com/DigitalDevices/pvr.octonet master > xbmc\cmake\addons\addons\pvr.octonet\pvr.octonet.txt
 | 
			
		||||
  - cd %ADDON%
 | 
			
		||||
  - mkdir build
 | 
			
		||||
  - cd build
 | 
			
		||||
  # 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%
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								debian/changelog.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								debian/changelog.in
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
kodi-pvr-octonet (#PACKAGEVERSION#-#TAGREV#~#DIST#) #DIST#; urgency=low
 | 
			
		||||
 | 
			
		||||
  [ kodi ]
 | 
			
		||||
  * autogenerated dummy changelog
 | 
			
		||||
 | 
			
		||||
 -- Nobody <nobody@kodi.tv>  Sat, 01 Jun 2013 00:59:22 +0200
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/compat
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
9
 | 
			
		||||
							
								
								
									
										22
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								debian/control
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
Source: kodi-pvr-octonet
 | 
			
		||||
Priority: extra
 | 
			
		||||
Maintainer: Julian Scheel <julian@jusst.de>
 | 
			
		||||
Build-Depends: debhelper (>= 9.0.0), cmake, libjsoncpp-dev,
 | 
			
		||||
               libp8-platform-dev, kodi-addon-dev
 | 
			
		||||
Standards-Version: 4.1.2
 | 
			
		||||
Section: libs
 | 
			
		||||
Homepage: https://github.com/DigitalDevices/pvr.octonet
 | 
			
		||||
 | 
			
		||||
Package: kodi-pvr-octonet
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
			
		||||
Description: Digital Devices Octopus NET PVR for Kodi
 | 
			
		||||
 Digital Devices Octopus NET PVR for Kodi
 | 
			
		||||
 | 
			
		||||
Package: kodi-pvr-octonet-dbg
 | 
			
		||||
Section: libs
 | 
			
		||||
Architecture: any
 | 
			
		||||
Depends: ${shlibs:Depends}, ${misc:Depends}
 | 
			
		||||
Description: debug symbols for Digital Devices Octopus NET PVR for Kodi
 | 
			
		||||
 debug symbols for Digital Devices Octopus NET PVR for Kodi
 | 
			
		||||
							
								
								
									
										47
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								debian/copyright
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,47 @@
 | 
			
		||||
Format: http://dep.debian.net/deps/dep5
 | 
			
		||||
Upstream-Name: pvr.octonet
 | 
			
		||||
Source: https://github.com/DigitalDevices/pvr.octonet
 | 
			
		||||
 | 
			
		||||
Files: *
 | 
			
		||||
Copyright: 2015-2016 Julian Scheel
 | 
			
		||||
           2015-2016 jusst technologies GmbH
 | 
			
		||||
           2005-2020 Team Kodi
 | 
			
		||||
License: GPL-2+
 | 
			
		||||
 This package 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 package 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, see <http://www.gnu.org/licenses/>
 | 
			
		||||
 .
 | 
			
		||||
 On Debian systems, the complete text of the GNU General
 | 
			
		||||
 Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
 | 
			
		||||
 | 
			
		||||
Files: debian/*
 | 
			
		||||
Copyright: 2020 Team Kodi
 | 
			
		||||
           2016 Julian Scheel <julian@jusst.de>
 | 
			
		||||
           2015 Jean-Luc Barriere
 | 
			
		||||
           2015 wsnipex <wsnipex@a1.net>
 | 
			
		||||
License: GPL-2+
 | 
			
		||||
 This package 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 package 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, see <http://www.gnu.org/licenses/>
 | 
			
		||||
 .
 | 
			
		||||
 On Debian systems, the complete text of the GNU General
 | 
			
		||||
 Public License version 2 can be found in "/usr/share/common-licenses/GPL-2".
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								debian/kodi-pvr-octonet.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								debian/kodi-pvr-octonet.install
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
usr/lib/
 | 
			
		||||
usr/share/
 | 
			
		||||
							
								
								
									
										24
									
								
								debian/rules
									
									
									
									
										vendored
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								debian/rules
									
									
									
									
										vendored
									
									
										Executable file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#!/usr/bin/make -f
 | 
			
		||||
# -*- makefile -*-
 | 
			
		||||
# Sample debian/rules that uses debhelper.
 | 
			
		||||
# This file was originally written by Joey Hess and Craig Small.
 | 
			
		||||
# As a special exception, when this file is copied by dh-make into a
 | 
			
		||||
# dh-make output file, you may use that output file without restriction.
 | 
			
		||||
# This special exception was added by Craig Small in version 0.37 of dh-make.
 | 
			
		||||
 | 
			
		||||
# Uncomment this to turn on verbose mode.
 | 
			
		||||
#export DH_VERBOSE=1
 | 
			
		||||
 | 
			
		||||
%:
 | 
			
		||||
	dh $@ 
 | 
			
		||||
 | 
			
		||||
override_dh_auto_configure:
 | 
			
		||||
# USE_LTO breaks build
 | 
			
		||||
	dh_auto_configure -- -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=1
 | 
			
		||||
 | 
			
		||||
override_dh_strip:
 | 
			
		||||
	dh_strip -pkodi-pvr-octonet --dbg-package=kodi-pvr-octonet-dbg
 | 
			
		||||
 | 
			
		||||
override_dh_installdocs:
 | 
			
		||||
	dh_installdocs --link-doc=kodi-pvr-octonet
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								debian/source/format
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
3.0 (quilt)
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
cmake_minimum_required(VERSION 3.5)
 | 
			
		||||
project(jsoncpp)
 | 
			
		||||
 | 
			
		||||
cmake_minimum_required(VERSION 2.6)
 | 
			
		||||
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
 | 
			
		||||
            src/lib_json/json_value.cpp
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								depends/common/jsoncpp/jsoncpp.sha256
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								depends/common/jsoncpp/jsoncpp.sha256
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
3671ba6051e0f30849942cc66d1798fdf0362d089343a83f704c09ee7156604f
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								depends/common/p8-platform/p8-platform.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								depends/common/p8-platform/p8-platform.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
p8-platform https://github.com/xbmc/platform.git cee64e9dc0b69e8d286dc170a78effaabfa09c44
 | 
			
		||||
							
								
								
									
										1
									
								
								depends/windowsstore/p8-platform/p8-platform.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								depends/windowsstore/p8-platform/p8-platform.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
p8-platform https://github.com/afedchin/platform.git win10
 | 
			
		||||
@@ -1,23 +0,0 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<addon
 | 
			
		||||
	id="pvr.octonet"
 | 
			
		||||
	version="0.3"
 | 
			
		||||
	name="PVR DigitalDevices Octonet Client"
 | 
			
		||||
	provider-name="digitaldevices">
 | 
			
		||||
	<requires>
 | 
			
		||||
		<c-pluff version="0.1" />
 | 
			
		||||
		<import addon="xbmc.pvr" version="5.2.0" />
 | 
			
		||||
	</requires>
 | 
			
		||||
	<extension
 | 
			
		||||
		point="xbmc.pvrclient"
 | 
			
		||||
		library_linux="pvr.octonet.so"
 | 
			
		||||
		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">
 | 
			
		||||
		<summary lang="de_DE">Kodi PVR Addon für DigitalDevices Octonet Streams</summary>
 | 
			
		||||
		<summary lang="en_US">Kodi PVR Addon for DigitalDevices Octonet Streams</summary>
 | 
			
		||||
		<platform>all</platform>
 | 
			
		||||
	</extension>
 | 
			
		||||
</addon>
 | 
			
		||||
							
								
								
									
										18
									
								
								pvr.octonet/addon.xml.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								pvr.octonet/addon.xml.in
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<addon
 | 
			
		||||
	id="pvr.octonet"
 | 
			
		||||
	version="1.2.6"
 | 
			
		||||
	name="Digital Devices Octopus NET Client"
 | 
			
		||||
	provider-name="digitaldevices">
 | 
			
		||||
	<requires>@ADDON_DEPENDS@</requires>
 | 
			
		||||
	<extension
 | 
			
		||||
		point="xbmc.pvrclient"
 | 
			
		||||
		library_@PLATFORM@="@LIBRARY_FILENAME@"/>
 | 
			
		||||
	<extension point="xbmc.addon.metadata">
 | 
			
		||||
		<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>
 | 
			
		||||
		<platform>@PLATFORM@</platform>
 | 
			
		||||
		<license>GPL-2.0-or-later</license>
 | 
			
		||||
		<source>https://github.com/DigitalDevices/pvr.octonet</source>
 | 
			
		||||
	</extension>
 | 
			
		||||
</addon>
 | 
			
		||||
@@ -19,3 +19,7 @@ msgstr ""
 | 
			
		||||
msgctxt "#30000"
 | 
			
		||||
msgid "Octonet Server Address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgctxt "#30001"
 | 
			
		||||
msgid "Could not load chanellist"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -19,3 +19,7 @@ msgstr ""
 | 
			
		||||
msgctxt "#30000"
 | 
			
		||||
msgid "Octonet Server Address"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
msgctxt "#30001"
 | 
			
		||||
msgid "Could not load chanellist"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,10 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 * Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 * Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 *  Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 | 
			
		||||
 * USA.
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
@@ -26,7 +14,6 @@
 | 
			
		||||
#include <json/json.h>
 | 
			
		||||
 | 
			
		||||
#include "OctonetData.h"
 | 
			
		||||
#include "p8-platform/util/StringUtils.h"
 | 
			
		||||
 | 
			
		||||
#ifdef __WINDOWS__
 | 
			
		||||
#define timegm _mkgmtime
 | 
			
		||||
@@ -41,8 +28,8 @@ OctonetData::OctonetData()
 | 
			
		||||
	groups.clear();
 | 
			
		||||
	lastEpgLoad = 0;
 | 
			
		||||
 | 
			
		||||
	if (loadChannelList())
 | 
			
		||||
		kodi->QueueNotification(QUEUE_INFO, "%d channels loaded.", channels.size());
 | 
			
		||||
	if (!loadChannelList())
 | 
			
		||||
		libKodi->QueueNotification(QUEUE_ERROR, libKodi->GetLocalizedString(30001), channels.size());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
OctonetData::~OctonetData(void)
 | 
			
		||||
@@ -53,14 +40,8 @@ OctonetData::~OctonetData(void)
 | 
			
		||||
 | 
			
		||||
int64_t OctonetData::parseID(std::string id)
 | 
			
		||||
{
 | 
			
		||||
	int64_t nativeId;
 | 
			
		||||
	size_t strip;
 | 
			
		||||
	/* Strip colons from id */
 | 
			
		||||
	while ((strip = id.find(":")) != std::string::npos)
 | 
			
		||||
		id.erase(strip, 1);
 | 
			
		||||
 | 
			
		||||
	std::stringstream ids(id);
 | 
			
		||||
	ids >> nativeId;
 | 
			
		||||
	std::hash<std::string> hash_fn;
 | 
			
		||||
	int64_t nativeId = hash_fn(id);
 | 
			
		||||
 | 
			
		||||
	return nativeId;
 | 
			
		||||
}
 | 
			
		||||
@@ -68,15 +49,15 @@ int64_t OctonetData::parseID(std::string id)
 | 
			
		||||
bool OctonetData::loadChannelList()
 | 
			
		||||
{
 | 
			
		||||
	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)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	char buf[1024];
 | 
			
		||||
	while (int read = kodi->ReadFile(f, buf, 1024))
 | 
			
		||||
	while (int read = libKodi->ReadFile(f, buf, 1024))
 | 
			
		||||
		jsonContent.append(buf, read);
 | 
			
		||||
 | 
			
		||||
	kodi->CloseFile(f);
 | 
			
		||||
	libKodi->CloseFile(f);
 | 
			
		||||
 | 
			
		||||
	Json::Value root;
 | 
			
		||||
	Json::Reader reader;
 | 
			
		||||
@@ -125,7 +106,6 @@ OctonetChannel* OctonetData::findChannel(int64_t nativeId)
 | 
			
		||||
time_t OctonetData::parseDateTime(std::string date)
 | 
			
		||||
{
 | 
			
		||||
	struct tm timeinfo;
 | 
			
		||||
	time_t time;
 | 
			
		||||
 | 
			
		||||
	memset(&timeinfo, 0, sizeof(timeinfo));
 | 
			
		||||
 | 
			
		||||
@@ -154,15 +134,15 @@ bool OctonetData::loadEPG(void)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	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)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	char buf[1024];
 | 
			
		||||
	while (int read = kodi->ReadFile(f, buf, 1024))
 | 
			
		||||
	while (int read = libKodi->ReadFile(f, buf, 1024))
 | 
			
		||||
		jsonContent.append(buf, read);
 | 
			
		||||
 | 
			
		||||
	kodi->CloseFile(f);
 | 
			
		||||
	libKodi->CloseFile(f);
 | 
			
		||||
 | 
			
		||||
	Json::Value root;
 | 
			
		||||
	Json::Reader reader;
 | 
			
		||||
@@ -191,7 +171,7 @@ bool OctonetData::loadEPG(void)
 | 
			
		||||
			channel = findChannel(entry.channelId);
 | 
			
		||||
 | 
			
		||||
		if (channel == NULL) {
 | 
			
		||||
			kodi->Log(LOG_ERROR, "EPG for unknown channel.");
 | 
			
		||||
			libKodi->Log(LOG_ERROR, "EPG for unknown channel.");
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -235,22 +215,25 @@ PVR_ERROR OctonetData::getChannels(ADDON_HANDLE handle, bool bRadio)
 | 
			
		||||
	return PVR_ERROR_NO_ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t start, time_t end)
 | 
			
		||||
PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, int iChannelUid, time_t start, time_t end)
 | 
			
		||||
{
 | 
			
		||||
	bool needs_reload = false;
 | 
			
		||||
	for (unsigned int i = 0; i < channels.size(); i++)
 | 
			
		||||
	{
 | 
			
		||||
		OctonetChannel &chan = channels.at(i);
 | 
			
		||||
		if (channel.iUniqueId != chan.id)
 | 
			
		||||
		if (iChannelUid != chan.id)
 | 
			
		||||
			continue;
 | 
			
		||||
 | 
			
		||||
		if(chan.epg.empty()) {
 | 
			
		||||
			loadEPG();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// FIXME: Check if reload is needed!?
 | 
			
		||||
 | 
			
		||||
		std::vector<OctonetEpgEntry>::iterator it;
 | 
			
		||||
		time_t last_end = 0;
 | 
			
		||||
		for (it = chan.epg.begin(); it < chan.epg.end(); ++it) {
 | 
			
		||||
			if (end > last_end)
 | 
			
		||||
				last_end = end;
 | 
			
		||||
		for (it = chan.epg.begin(); it != chan.epg.end(); ++it) {
 | 
			
		||||
			if (it->end > last_end)
 | 
			
		||||
				last_end = it->end;
 | 
			
		||||
 | 
			
		||||
			if (it->end < start || it->start > end) {
 | 
			
		||||
				continue;
 | 
			
		||||
@@ -258,8 +241,11 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
 | 
			
		||||
 | 
			
		||||
			EPG_TAG entry;
 | 
			
		||||
			memset(&entry, 0, sizeof(EPG_TAG));
 | 
			
		||||
			entry.iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
			entry.iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
			entry.iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
 | 
			
		||||
			entry.iChannelNumber = i;
 | 
			
		||||
			entry.iUniqueChannelId = chan.id;
 | 
			
		||||
			entry.iUniqueBroadcastId = it->id;
 | 
			
		||||
			entry.strTitle = it->title.c_str();
 | 
			
		||||
			entry.strPlotOutline = it->subtitle.c_str();
 | 
			
		||||
@@ -271,6 +257,27 @@ PVR_ERROR OctonetData::getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, t
 | 
			
		||||
 | 
			
		||||
		if (last_end < end)
 | 
			
		||||
			loadEPG();
 | 
			
		||||
 | 
			
		||||
		for (it = chan.epg.begin(); it != chan.epg.end(); ++it) {
 | 
			
		||||
			if (it->end < start || it->start > end) {
 | 
			
		||||
				continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			EPG_TAG entry;
 | 
			
		||||
			memset(&entry, 0, sizeof(EPG_TAG));
 | 
			
		||||
			entry.iSeriesNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
			entry.iEpisodeNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
			entry.iEpisodePartNumber = EPG_TAG_INVALID_SERIES_EPISODE;
 | 
			
		||||
 | 
			
		||||
			entry.iUniqueChannelId = chan.id;
 | 
			
		||||
			entry.iUniqueBroadcastId = it->id;
 | 
			
		||||
			entry.strTitle = it->title.c_str();
 | 
			
		||||
			entry.strPlotOutline = it->subtitle.c_str();
 | 
			
		||||
			entry.startTime = it->start;
 | 
			
		||||
			entry.endTime = it->end;
 | 
			
		||||
 | 
			
		||||
			pvr->TransferEpgEntry(handle, &entry);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return PVR_ERROR_NO_ERROR;
 | 
			
		||||
@@ -286,6 +293,16 @@ const std::string& OctonetData::getUrl(int id) const {
 | 
			
		||||
	return channels[0].url;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const std::string& OctonetData::getName(int id) const {
 | 
			
		||||
	for(std::vector<OctonetChannel>::const_iterator iter = channels.begin(); iter != channels.end(); ++iter) {
 | 
			
		||||
		if(iter->id == id) {
 | 
			
		||||
			return iter->name;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return channels[0].name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int OctonetData::getGroupCount(void)
 | 
			
		||||
{
 | 
			
		||||
	return groups.size();
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,18 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 * Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 * Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 *  Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 | 
			
		||||
 * USA.
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
#include "p8-platform/threads/threads.h"
 | 
			
		||||
#include "p8-platform/util/StdString.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
 | 
			
		||||
struct OctonetEpgEntry
 | 
			
		||||
@@ -69,8 +56,9 @@ class OctonetData : public P8PLATFORM::CThread
 | 
			
		||||
		virtual PVR_ERROR getGroups(ADDON_HANDLE handle, bool bRadio);
 | 
			
		||||
		virtual PVR_ERROR getGroupMembers(ADDON_HANDLE handle, const PVR_CHANNEL_GROUP &group);
 | 
			
		||||
 | 
			
		||||
		virtual PVR_ERROR getEPG(ADDON_HANDLE handle, const PVR_CHANNEL &channel, time_t start, time_t end);
 | 
			
		||||
		virtual PVR_ERROR getEPG(ADDON_HANDLE handle, int iChannelUid, time_t start, time_t end);
 | 
			
		||||
		const std::string& getUrl(int id) const;
 | 
			
		||||
		const std::string& getName(int id) const;
 | 
			
		||||
 | 
			
		||||
	protected:
 | 
			
		||||
		virtual bool loadChannelList(void);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,12 @@
 | 
			
		||||
/*
 | 
			
		||||
 *      Copyright (C) 2005-2011 Team XBMC
 | 
			
		||||
 *      http://www.xbmc.org
 | 
			
		||||
 *
 | 
			
		||||
 *  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, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *  Copyright (C) 2005-2020 Team Kodi
 | 
			
		||||
 *  https://kodi.tv
 | 
			
		||||
 *
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 */
 | 
			
		||||
#include "libXBMC_addon.h"
 | 
			
		||||
 | 
			
		||||
#include "kodi/libXBMC_addon.h"
 | 
			
		||||
#include <string>
 | 
			
		||||
#include "p8-platform/os.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
@@ -196,13 +186,13 @@ int Socket::send ( const char* data, const unsigned int len )
 | 
			
		||||
 | 
			
		||||
  if (result < 0)
 | 
			
		||||
  {
 | 
			
		||||
    kodi->Log(LOG_ERROR, "Socket::send  - select failed");
 | 
			
		||||
    libKodi->Log(LOG_ERROR, "Socket::send  - select failed");
 | 
			
		||||
    close();
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
  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();
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
@@ -212,7 +202,7 @@ int Socket::send ( const char* data, const unsigned int len )
 | 
			
		||||
  if (status == -1)
 | 
			
		||||
  {
 | 
			
		||||
    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();
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
@@ -296,7 +286,7 @@ bool Socket::ReadLine (string& line)
 | 
			
		||||
 | 
			
		||||
    if (result < 0)
 | 
			
		||||
    {
 | 
			
		||||
      kodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
 | 
			
		||||
      libKodi->Log(LOG_DEBUG, "%s: select failed", __FUNCTION__);
 | 
			
		||||
      errormessage(getLastError(), __FUNCTION__);
 | 
			
		||||
      close();
 | 
			
		||||
      return false;
 | 
			
		||||
@@ -306,11 +296,11 @@ bool Socket::ReadLine (string& line)
 | 
			
		||||
    {
 | 
			
		||||
      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--;
 | 
			
		||||
        continue;
 | 
			
		||||
      } 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;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
@@ -318,7 +308,7 @@ bool Socket::ReadLine (string& line)
 | 
			
		||||
    result = recv(_sd, buffer, sizeof(buffer) - 1, 0);
 | 
			
		||||
    if (result < 0)
 | 
			
		||||
    {
 | 
			
		||||
      kodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
 | 
			
		||||
      libKodi->Log(LOG_DEBUG, "%s: recv failed", __FUNCTION__);
 | 
			
		||||
      errormessage(getLastError(), __FUNCTION__);
 | 
			
		||||
      close();
 | 
			
		||||
      return false;
 | 
			
		||||
@@ -389,7 +379,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  }
 | 
			
		||||
  _port = port;
 | 
			
		||||
@@ -438,7 +428,7 @@ bool Socket::connect ( const std::string& host, const unsigned short port )
 | 
			
		||||
 | 
			
		||||
  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");
 | 
			
		||||
    close();
 | 
			
		||||
    return false;
 | 
			
		||||
@@ -474,7 +464,7 @@ bool Socket::set_non_blocking ( const bool b )
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -565,7 +555,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
 | 
			
		||||
  default:
 | 
			
		||||
    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
 | 
			
		||||
@@ -623,7 +613,7 @@ bool Socket::set_non_blocking ( const bool b )
 | 
			
		||||
 | 
			
		||||
  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 true;
 | 
			
		||||
@@ -699,7 +689,7 @@ void Socket::errormessage( int errnum, const char* functionname) const
 | 
			
		||||
      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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								src/Socket.h
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								src/Socket.h
									
									
									
									
									
								
							@@ -1,21 +1,11 @@
 | 
			
		||||
/*
 | 
			
		||||
 *      Copyright (C) 2005-2011 Team XBMC
 | 
			
		||||
 *      http://www.xbmc.org
 | 
			
		||||
 *
 | 
			
		||||
 *  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, 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, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 *  Copyright (C) 2005-2020 Team Kodi
 | 
			
		||||
 *  https://kodi.tv
 | 
			
		||||
 *
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
//Include platform specific datatypes, header files, defines and constants:
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										139
									
								
								src/client.cpp
									
									
									
									
									
								
							
							
						
						
									
										139
									
								
								src/client.cpp
									
									
									
									
									
								
							@@ -1,30 +1,17 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 * Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 * Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 *  Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 | 
			
		||||
 * USA.
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include <xbmc_pvr_dll.h>
 | 
			
		||||
#include <libXBMC_addon.h>
 | 
			
		||||
#include <kodi/xbmc_pvr_dll.h>
 | 
			
		||||
#include <kodi/libXBMC_addon.h>
 | 
			
		||||
#include <p8-platform/util/util.h>
 | 
			
		||||
#include <libKODI_guilib.h>
 | 
			
		||||
 | 
			
		||||
#include "OctonetData.h"
 | 
			
		||||
#include "rtsp_client.hpp"
 | 
			
		||||
@@ -36,7 +23,7 @@ std::string octonetAddress = "";
 | 
			
		||||
 | 
			
		||||
/* internal state variables */
 | 
			
		||||
ADDON_STATUS addonStatus = ADDON_STATUS_UNKNOWN;
 | 
			
		||||
CHelper_libXBMC_addon *kodi = NULL;
 | 
			
		||||
CHelper_libXBMC_addon *libKodi = NULL;
 | 
			
		||||
CHelper_libXBMC_pvr *pvr = NULL;
 | 
			
		||||
 | 
			
		||||
OctonetData *data = NULL;
 | 
			
		||||
@@ -49,7 +36,7 @@ extern "C" {
 | 
			
		||||
void ADDON_ReadSettings(void)
 | 
			
		||||
{
 | 
			
		||||
	char buffer[2048];
 | 
			
		||||
	if (kodi->GetSetting("octonetAddress", &buffer))
 | 
			
		||||
	if (libKodi->GetSetting("octonetAddress", &buffer))
 | 
			
		||||
		octonetAddress = buffer;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -58,23 +45,23 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
 | 
			
		||||
	if (callbacks == NULL || props == NULL)
 | 
			
		||||
		return ADDON_STATUS_UNKNOWN;
 | 
			
		||||
 | 
			
		||||
	PVR_PROPERTIES *pvrprops = (PVR_PROPERTIES*)props;
 | 
			
		||||
	kodi = new CHelper_libXBMC_addon;
 | 
			
		||||
	if (!kodi->RegisterMe(callbacks)) {
 | 
			
		||||
		kodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
 | 
			
		||||
		SAFE_DELETE(kodi);
 | 
			
		||||
	AddonProperties_PVR *pvrprops = (AddonProperties_PVR*)props;
 | 
			
		||||
	libKodi = new CHelper_libXBMC_addon;
 | 
			
		||||
	if (!libKodi->RegisterMe(callbacks)) {
 | 
			
		||||
		libKodi->Log(LOG_ERROR, "%s: Failed to register octonet addon", __func__);
 | 
			
		||||
		SAFE_DELETE(libKodi);
 | 
			
		||||
		return ADDON_STATUS_PERMANENT_FAILURE;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pvr = new CHelper_libXBMC_pvr;
 | 
			
		||||
	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(kodi);
 | 
			
		||||
		SAFE_DELETE(libKodi);
 | 
			
		||||
		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();
 | 
			
		||||
 | 
			
		||||
	data = new OctonetData;
 | 
			
		||||
@@ -83,12 +70,10 @@ ADDON_STATUS ADDON_Create(void *callbacks, void* props)
 | 
			
		||||
	return addonStatus;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ADDON_Stop() {} /* no-op */
 | 
			
		||||
 | 
			
		||||
void ADDON_Destroy()
 | 
			
		||||
{
 | 
			
		||||
	delete pvr;
 | 
			
		||||
	delete kodi;
 | 
			
		||||
	delete libKodi;
 | 
			
		||||
	addonStatus = ADDON_STATUS_UNKNOWN;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -97,16 +82,6 @@ ADDON_STATUS ADDON_GetStatus()
 | 
			
		||||
	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)
 | 
			
		||||
{
 | 
			
		||||
	/* For simplicity do a full addon restart whenever settings are
 | 
			
		||||
@@ -114,9 +89,6 @@ ADDON_STATUS ADDON_SetSetting(const char *settingName, const void *settingValue)
 | 
			
		||||
	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,44 +97,28 @@ void ADDON_Announce(const char *flag, const char *sender, const char *message, 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 GetCapabilities(PVR_ADDON_CAPABILITIES *pCapabilities)
 | 
			
		||||
{
 | 
			
		||||
	pCapabilities->bSupportsTV = true;
 | 
			
		||||
	pCapabilities->bSupportsRadio = true;
 | 
			
		||||
	pCapabilities->bSupportsChannelGroups = true;
 | 
			
		||||
	pCapabilities->bSupportsEPG = true;
 | 
			
		||||
	pCapabilities->bSupportsRecordings = false;
 | 
			
		||||
	pCapabilities->bSupportsRecordingsRename = false;
 | 
			
		||||
	pCapabilities->bSupportsRecordingsLifetimeChange = false;
 | 
			
		||||
	pCapabilities->bSupportsDescrambleInfo = false;
 | 
			
		||||
 | 
			
		||||
	return PVR_ERROR_NO_ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* GetBackendName(void)
 | 
			
		||||
{
 | 
			
		||||
	return "DigitalDevice Octonet PVR Addon";
 | 
			
		||||
	return "Digital Devices Octopus NET Client";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* GetBackendVersion(void)
 | 
			
		||||
{
 | 
			
		||||
	return XBMC_PVR_API_VERSION;
 | 
			
		||||
	return STR(OCTONET_VERSION);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const char* GetConnectionString(void)
 | 
			
		||||
@@ -174,12 +130,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; }
 | 
			
		||||
 | 
			
		||||
void OnSystemSleep() {
 | 
			
		||||
	kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
 | 
			
		||||
	libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
 | 
			
		||||
	// FIXME: Disconnect?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void OnSystemWake() {
 | 
			
		||||
	kodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
 | 
			
		||||
	libKodi->Log(LOG_INFO, "Received event: %s", __FUNCTION__);
 | 
			
		||||
	// FIXME:Reconnect?
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -187,11 +143,14 @@ void OnPowerSavingActivated() {}
 | 
			
		||||
void OnPowerSavingDeactivated() {}
 | 
			
		||||
 | 
			
		||||
/* EPG */
 | 
			
		||||
PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, const PVR_CHANNEL& channel, time_t iStart, time_t iEnd)
 | 
			
		||||
PVR_ERROR GetEPGForChannel(ADDON_HANDLE handle, int iChannelUid, time_t iStart, time_t iEnd)
 | 
			
		||||
{
 | 
			
		||||
	return data->getEPG(handle, channel, iStart, iEnd);
 | 
			
		||||
	return data->getEPG(handle, iChannelUid, 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 */
 | 
			
		||||
int GetChannelGroupsAmount(void)
 | 
			
		||||
{
 | 
			
		||||
@@ -223,7 +182,6 @@ PVR_ERROR GetChannels(ADDON_HANDLE handle, bool bRadio)
 | 
			
		||||
 | 
			
		||||
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 MoveChannel(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; }
 | 
			
		||||
 | 
			
		||||
@@ -234,10 +192,12 @@ 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 DeleteAllRecordingsFromTrash() { 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 SetRecordingLastPlayedPosition(const PVR_RECORDING& recording, int lastplayedposition) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
int GetRecordingLastPlayedPosition(const PVR_RECORDING& recording) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
PVR_ERROR GetRecordingEdl(const PVR_RECORDING&, PVR_EDL_ENTRY edl[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
PVR_ERROR GetRecordingSize(const PVR_RECORDING* recording, int64_t* sizeInBytes) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
PVR_ERROR GetTimerTypes(PVR_TIMER_TYPE types[], int *size) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
int GetTimersAmount(void) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
PVR_ERROR GetTimers(ADDON_HANDLE handle) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
@@ -245,11 +205,18 @@ 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 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 */
 | 
			
		||||
/* entirely unused, as we use standard RTSP+TS mux, which can be handlded by
 | 
			
		||||
 * Kodi core */
 | 
			
		||||
bool OpenLiveStream(const PVR_CHANNEL& channel) {
 | 
			
		||||
	return rtsp_open(data->getUrl(channel.iUniqueId));
 | 
			
		||||
	return rtsp_open(data->getName(channel.iUniqueId), data->getUrl(channel.iUniqueId));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ReadLiveStream(unsigned char* pBuffer, unsigned int iBufferSize) {
 | 
			
		||||
@@ -261,25 +228,24 @@ void CloseLiveStream(void) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long long SeekLiveStream(long long iPosition, int iWhence) { return -1; }
 | 
			
		||||
long long PositionLiveStream(void) { return -1; }
 | 
			
		||||
long long LengthLiveStream(void) { return -1; }
 | 
			
		||||
bool IsRealTimeStream(void) { return true; }
 | 
			
		||||
 | 
			
		||||
bool SwitchChannel(const PVR_CHANNEL& channel) {
 | 
			
		||||
	CloseLiveStream();
 | 
			
		||||
	return OpenLiveStream(channel);
 | 
			
		||||
PVR_ERROR GetSignalStatus(int channelUid, PVR_SIGNAL_STATUS* signalStatus) {
 | 
			
		||||
	memset(signalStatus, 0, sizeof(PVR_SIGNAL_STATUS));
 | 
			
		||||
	rtsp_fill_signal_status(signalStatus);
 | 
			
		||||
	return PVR_ERROR_NO_ERROR;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
PVR_ERROR SignalStatus(PVR_SIGNAL_STATUS& signalStatus) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
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 GetDescrambleInfo(int, PVR_DESCRAMBLE_INFO*) { return PVR_ERROR_NOT_IMPLEMENTED; }
 | 
			
		||||
 | 
			
		||||
/* Recording stream handling */
 | 
			
		||||
bool OpenRecordedStream(const PVR_RECORDING& recording) { return false; }
 | 
			
		||||
void CloseRecordedStream(void) {}
 | 
			
		||||
int ReadRecordedStream(unsigned char* pBuffer, unsigned int iBufferSize) { return -1; }
 | 
			
		||||
long long SeekRecordedStream(long long iPosition, int iWhence) { return -1; }
 | 
			
		||||
long long PositionRecordedStream(void) { return -1; }
 | 
			
		||||
long long LengthRecordedStream(void) { return -1; }
 | 
			
		||||
 | 
			
		||||
/* PVR demuxer */
 | 
			
		||||
@@ -288,23 +254,18 @@ void DemuxReset(void) {}
 | 
			
		||||
void DemuxAbort(void) {}
 | 
			
		||||
void DemuxFlush(void) {}
 | 
			
		||||
DemuxPacket* DemuxRead(void) { return NULL; }
 | 
			
		||||
void FillBuffer(bool mode) {}
 | 
			
		||||
 | 
			
		||||
/* Various helper functions */
 | 
			
		||||
unsigned int GetChannelSwitchDelay(void) { return 0; }
 | 
			
		||||
bool IsTimeshifting(void) { return false; }
 | 
			
		||||
bool CanPauseStream() { return false; }
 | 
			
		||||
bool CanSeekStream() { return false; }
 | 
			
		||||
 | 
			
		||||
/* Callbacks */
 | 
			
		||||
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) {}
 | 
			
		||||
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()
 | 
			
		||||
{
 | 
			
		||||
	return octonetAddress.c_str();
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										31
									
								
								src/client.h
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								src/client.h
									
									
									
									
									
								
							@@ -1,34 +1,23 @@
 | 
			
		||||
#pragma once
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 * Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 * Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Julian Scheel <julian@jusst.de>
 | 
			
		||||
 *  Copyright (C) 2015 jusst technologies GmbH
 | 
			
		||||
 *  Copyright (C) 2015 Digital Devices GmbH
 | 
			
		||||
 *
 | 
			
		||||
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301,
 | 
			
		||||
 * USA.
 | 
			
		||||
 *  SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 *  See LICENSE.md for more information.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libXBMC_addon.h"
 | 
			
		||||
#include "libXBMC_pvr.h"
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "kodi/libXBMC_addon.h"
 | 
			
		||||
#include "kodi/libXBMC_pvr.h"
 | 
			
		||||
 | 
			
		||||
#ifndef __func__
 | 
			
		||||
#define __func__ __FUNCTION__
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
extern ADDON::CHelper_libXBMC_addon *kodi;
 | 
			
		||||
extern ADDON::CHelper_libXBMC_addon *libKodi;
 | 
			
		||||
extern CHelper_libXBMC_pvr *pvr;
 | 
			
		||||
 | 
			
		||||
/* IP or hostname of the octonet to be connected to */
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
#include "Socket.h"
 | 
			
		||||
#include "client.h"
 | 
			
		||||
#include <p8-platform/util/util.h>
 | 
			
		||||
#include <libXBMC_addon.h>
 | 
			
		||||
#include <kodi/libXBMC_addon.h>
 | 
			
		||||
#include <cstring>
 | 
			
		||||
#include <sstream>
 | 
			
		||||
 | 
			
		||||
@@ -37,6 +37,7 @@ int asprintf(char **sptr, char *fmt, ...) {
 | 
			
		||||
#define KEEPALIVE_INTERVAL 60
 | 
			
		||||
#define KEEPALIVE_MARGIN 5
 | 
			
		||||
#define UDP_ADDRESS_LEN 16
 | 
			
		||||
#define RTCP_BUFFER_SIZE 1024
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
using namespace ADDON;
 | 
			
		||||
@@ -66,12 +67,17 @@ struct rtsp_client {
 | 
			
		||||
 | 
			
		||||
	Socket tcp_sock;
 | 
			
		||||
	Socket udp_sock;
 | 
			
		||||
	Socket rtcp_sock;
 | 
			
		||||
 | 
			
		||||
	enum rtsp_state state;
 | 
			
		||||
	int cseq;
 | 
			
		||||
 | 
			
		||||
	size_t fifo_size;
 | 
			
		||||
	uint16_t last_seq_nr;
 | 
			
		||||
 | 
			
		||||
	string name;
 | 
			
		||||
	int level;
 | 
			
		||||
	int quality;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct url {
 | 
			
		||||
@@ -81,6 +87,16 @@ struct url {
 | 
			
		||||
	string path;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct rtcp_app {
 | 
			
		||||
	uint8_t subtype;
 | 
			
		||||
	uint8_t pt;
 | 
			
		||||
	uint16_t len;
 | 
			
		||||
	uint32_t ssrc;
 | 
			
		||||
	char name[4];
 | 
			
		||||
	uint16_t identifier;
 | 
			
		||||
	uint16_t string_len;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static rtsp_client *rtsp = NULL;
 | 
			
		||||
 | 
			
		||||
static url parse_url(const std::string& str) {
 | 
			
		||||
@@ -109,6 +125,16 @@ static url parse_url(const std::string& str) {
 | 
			
		||||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void split_string(const string& s, char delim, vector<string>& elems) {
 | 
			
		||||
	stringstream ss;
 | 
			
		||||
	ss.str(s);
 | 
			
		||||
 | 
			
		||||
	string item;
 | 
			
		||||
	while(getline(ss, item, delim)) {
 | 
			
		||||
		elems.push_back(item);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int tcp_sock_read_line(string &line) {
 | 
			
		||||
	static string buf;
 | 
			
		||||
 | 
			
		||||
@@ -266,7 +292,7 @@ static enum rtsp_result rtsp_handle() {
 | 
			
		||||
	return (enum rtsp_result)rtsp_result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool rtsp_open(const string& url_str)
 | 
			
		||||
bool rtsp_open(const string& name, const string& url_str)
 | 
			
		||||
{
 | 
			
		||||
	string setup_url_str;
 | 
			
		||||
	const char *psz_setup_url;
 | 
			
		||||
@@ -279,13 +305,17 @@ bool rtsp_open(const string& url_str)
 | 
			
		||||
	if (rtsp == NULL)
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	kodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_str());
 | 
			
		||||
	rtsp->name = name;
 | 
			
		||||
	rtsp->level = 0;
 | 
			
		||||
	rtsp->quality = 0;
 | 
			
		||||
 | 
			
		||||
	libKodi->Log(LOG_DEBUG, "try to open '%s'", url_str.c_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)) {
 | 
			
		||||
		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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -323,7 +353,7 @@ bool rtsp_open(const string& url_str)
 | 
			
		||||
	rtsp->tcp_sock.send(setup_ss.str());
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -338,7 +368,15 @@ bool rtsp_open(const string& url_str)
 | 
			
		||||
	rtsp->tcp_sock.send(play_ss.str());
 | 
			
		||||
 | 
			
		||||
	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;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rtsp->rtcp_sock = Socket(af_inet, pf_inet, sock_dgram, udp);
 | 
			
		||||
	if(!rtsp->rtcp_sock.bind(rtsp->udp_port + 1)) {
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
	if(!rtsp->rtcp_sock.set_non_blocking(true)) {
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
@@ -349,11 +387,49 @@ error:
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void parse_rtcp(const char *buf, int size) {
 | 
			
		||||
	int offset = 0;
 | 
			
		||||
	while(size > 4) {
 | 
			
		||||
		const rtcp_app *app = reinterpret_cast<const rtcp_app *>(buf + offset);
 | 
			
		||||
		uint16_t len = 4 * (ntohs(app->len) + 1);
 | 
			
		||||
 | 
			
		||||
		if((app->pt != 204) || (memcmp(app->name, "SES1", 4) != 0)) {
 | 
			
		||||
			size -= len;
 | 
			
		||||
			offset += len;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint16_t string_len = ntohs(app->string_len);
 | 
			
		||||
		string app_data(&buf[offset + sizeof(rtcp_app)], string_len);
 | 
			
		||||
 | 
			
		||||
		vector<string> elems;
 | 
			
		||||
		split_string(app_data, ';', elems);
 | 
			
		||||
		if(elems.size() != 4) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		vector<string> tuner;
 | 
			
		||||
		split_string(elems[2], ',', tuner);
 | 
			
		||||
		if(tuner.size() < 4) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		rtsp->level = atoi(tuner[1].c_str());
 | 
			
		||||
		rtsp->quality = atoi(tuner[3].c_str());
 | 
			
		||||
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int rtsp_read(void *buf, unsigned buf_size) {
 | 
			
		||||
	sockaddr addr;
 | 
			
		||||
	socklen_t addr_len = sizeof(addr);
 | 
			
		||||
	int ret = rtsp->udp_sock.recvfrom((char *)buf, buf_size, (sockaddr *)&addr, &addr_len);
 | 
			
		||||
 | 
			
		||||
	char rtcp_buf[RTCP_BUFFER_SIZE];
 | 
			
		||||
	int rtcp_len = rtsp->rtcp_sock.recvfrom(rtcp_buf, RTCP_BUFFER_SIZE, (sockaddr *)&addr, &addr_len);
 | 
			
		||||
	parse_rtcp(rtcp_buf, rtcp_len);
 | 
			
		||||
 | 
			
		||||
	// TODO: check ip
 | 
			
		||||
 | 
			
		||||
	return ret;
 | 
			
		||||
@@ -377,7 +453,7 @@ static void rtsp_teardown() {
 | 
			
		||||
		rtsp->tcp_sock.send(ss.str());
 | 
			
		||||
 | 
			
		||||
		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;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -389,7 +465,16 @@ void rtsp_close()
 | 
			
		||||
		rtsp_teardown();
 | 
			
		||||
		rtsp->tcp_sock.close();
 | 
			
		||||
		rtsp->udp_sock.close();
 | 
			
		||||
		rtsp->rtcp_sock.close();
 | 
			
		||||
		delete rtsp;
 | 
			
		||||
		rtsp = NULL;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rtsp_fill_signal_status(PVR_SIGNAL_STATUS* signal_status) {
 | 
			
		||||
	if(rtsp) {
 | 
			
		||||
		strncpy(signal_status->strServiceName, rtsp->name.c_str(), PVR_ADDON_NAME_STRING_LENGTH - 1);
 | 
			
		||||
		signal_status->iSNR = 0x1111 * rtsp->quality;
 | 
			
		||||
		signal_status->iSignal = 0x101 * rtsp->level;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,11 @@
 | 
			
		||||
#define _RTSP_CLIENT_HPP_
 | 
			
		||||
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <kodi/xbmc_pvr_types.h>
 | 
			
		||||
 | 
			
		||||
bool rtsp_open(const std::string& url_str);
 | 
			
		||||
bool rtsp_open(const std::string& name, const std::string& url_str);
 | 
			
		||||
void rtsp_close();
 | 
			
		||||
int rtsp_read(void *buf, unsigned buf_size);
 | 
			
		||||
void rtsp_fill_signal_status(PVR_SIGNAL_STATUS* signal_status);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user