aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRainer Hochecker <fernetmenta@online.de>2015-09-12 12:27:34 +0200
committerRainer Hochecker <fernetmenta@online.de>2015-09-12 12:27:34 +0200
commita00a747b6c1ba633e8d83adcf50f93ce888f65dd (patch)
treec09af6cf8d4e6883fe821a13489809e644f088cf
parent5f9ea4c60dbbc6f34b26ec70b55669aaad149b69 (diff)
parent28ca16a057d7867aff7b88d8cd14c7602771ff8b (diff)
Merge pull request #8018 from FernetMenta/builtins
refactor builtins
-rw-r--r--Kodi.xcodeproj/project.pbxproj188
-rw-r--r--Makefile.in1
-rw-r--r--configure.ac1
-rw-r--r--project/VS2010Express/XBMC.vcxproj38
-rw-r--r--project/VS2010Express/XBMC.vcxproj.filters113
-rw-r--r--xbmc/Application.cpp14
-rw-r--r--xbmc/addons/GUIDialogAddonInfo.cpp4
-rw-r--r--xbmc/input/ButtonTranslator.cpp4
-rw-r--r--xbmc/interfaces/Builtins.cpp1922
-rw-r--r--xbmc/interfaces/Makefile.in1
-rw-r--r--xbmc/interfaces/builtins/AddonBuiltins.cpp310
-rw-r--r--xbmc/interfaces/builtins/AddonBuiltins.h (renamed from xbmc/interfaces/Builtins.h)19
-rw-r--r--xbmc/interfaces/builtins/AndroidBuiltins.cpp45
-rw-r--r--xbmc/interfaces/builtins/AndroidBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/ApplicationBuiltins.cpp163
-rw-r--r--xbmc/interfaces/builtins/ApplicationBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/Builtins.cpp169
-rw-r--r--xbmc/interfaces/builtins/Builtins.h67
-rw-r--r--xbmc/interfaces/builtins/CECBuiltins.cpp65
-rw-r--r--xbmc/interfaces/builtins/CECBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/GUIBuiltins.cpp435
-rw-r--r--xbmc/interfaces/builtins/GUIBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/GUIContainerBuiltins.cpp135
-rw-r--r--xbmc/interfaces/builtins/GUIContainerBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/GUIControlBuiltins.cpp129
-rw-r--r--xbmc/interfaces/builtins/GUIControlBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/LibraryBuiltins.cpp222
-rw-r--r--xbmc/interfaces/builtins/LibraryBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/Makefile.in25
-rw-r--r--xbmc/interfaces/builtins/OpticalBuiltins.cpp63
-rw-r--r--xbmc/interfaces/builtins/OpticalBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/PVRBuiltins.cpp65
-rw-r--r--xbmc/interfaces/builtins/PVRBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/PictureBuiltins.cpp101
-rw-r--r--xbmc/interfaces/builtins/PictureBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/PlayerBuiltins.cpp499
-rw-r--r--xbmc/interfaces/builtins/PlayerBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/ProfileBuiltins.cpp125
-rw-r--r--xbmc/interfaces/builtins/ProfileBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/SkinBuiltins.cpp416
-rw-r--r--xbmc/interfaces/builtins/SkinBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/SystemBuiltins.cpp163
-rw-r--r--xbmc/interfaces/builtins/SystemBuiltins.h30
-rw-r--r--xbmc/interfaces/builtins/WeatherBuiltins.cpp61
-rw-r--r--xbmc/interfaces/builtins/WeatherBuiltins.h30
-rw-r--r--xbmc/interfaces/json-rpc/GUIOperations.cpp4
-rw-r--r--xbmc/interfaces/json-rpc/PlayerOperations.cpp16
-rw-r--r--xbmc/interfaces/json-rpc/SystemOperations.cpp4
-rw-r--r--xbmc/network/EventServer.cpp11
-rw-r--r--xbmc/powermanagement/PowerManager.cpp6
-rw-r--r--xbmc/settings/MediaSettings.cpp6
-rw-r--r--xbmc/settings/dialogs/GUIDialogContentSettings.cpp4
-rw-r--r--xbmc/storage/AutorunMediaJob.cpp4
-rw-r--r--xbmc/utils/RssManager.cpp4
-rw-r--r--xbmc/windows/GUIMediaWindow.cpp4
-rw-r--r--xbmc/windows/GUIWindowLoginScreen.cpp4
56 files changed, 4081 insertions, 1999 deletions
diff --git a/Kodi.xcodeproj/project.pbxproj b/Kodi.xcodeproj/project.pbxproj
index 7c35fc1425..f099fec1b7 100644
--- a/Kodi.xcodeproj/project.pbxproj
+++ b/Kodi.xcodeproj/project.pbxproj
@@ -373,6 +373,57 @@
7C8AE850189DE3CD00C33786 /* CoreAudioHardware.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE84B189DE3CD00C33786 /* CoreAudioHardware.cpp */; };
7C8AE851189DE3CD00C33786 /* CoreAudioStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE84C189DE3CD00C33786 /* CoreAudioStream.cpp */; };
7C8AE854189DE47F00C33786 /* CoreAudioHelpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */; };
+ 7C8E02191BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */; };
+ 7C8E021A1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */; };
+ 7C8E021B1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */; };
+ 7C8E021C1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */; };
+ 7C8E021D1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */; };
+ 7C8E021E1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */; };
+ 7C8E021F1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */; };
+ 7C8E02201BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */; };
+ 7C8E02211BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */; };
+ 7C8E02221BA35D0B0072E8B2 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */; };
+ 7C8E02231BA35D0B0072E8B2 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */; };
+ 7C8E02241BA35D0B0072E8B2 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */; };
+ 7C8E02251BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */; };
+ 7C8E02261BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */; };
+ 7C8E02271BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */; };
+ 7C8E02281BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */; };
+ 7C8E02291BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */; };
+ 7C8E022A1BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */; };
+ 7C8E022B1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */; };
+ 7C8E022C1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */; };
+ 7C8E022D1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */; };
+ 7C8E022E1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */; };
+ 7C8E022F1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */; };
+ 7C8E02301BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */; };
+ 7C8E02311BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */; };
+ 7C8E02321BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */; };
+ 7C8E02331BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */; };
+ 7C8E02341BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */; };
+ 7C8E02351BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */; };
+ 7C8E02361BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */; };
+ 7C8E02371BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */; };
+ 7C8E02381BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */; };
+ 7C8E02391BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */; };
+ 7C8E023A1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */; };
+ 7C8E023B1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */; };
+ 7C8E023C1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */; };
+ 7C8E023D1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */; };
+ 7C8E023E1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */; };
+ 7C8E023F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */; };
+ 7C8E02401BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */; };
+ 7C8E02411BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */; };
+ 7C8E02421BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */; };
+ 7C8E02431BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */; };
+ 7C8E02441BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */; };
+ 7C8E02451BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */; };
+ 7C8E02461BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */; };
+ 7C8E02471BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */; };
+ 7C8E02481BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */; };
+ 7C8E02491BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */; };
+ 7C8E024A1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */; };
+ 7C8E024B1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */; };
7C8FC6EE1829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; };
7C8FC6EF1829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; };
7C8FC6F01829A4580045153D /* DirectoryProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */; };
@@ -710,7 +761,6 @@
7CCDACCA19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; settings = {COMPILER_FLAGS = "-I$SRCROOT/lib/libUPnP/Neptune/Source/System/Posix -I$SRCROOT/lib/libUPnP/Neptune/Source/Core"; }; };
7CCDACCB19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; };
7CCDACCC19275D790074CF51 /* NptAppleLogConfig.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */; };
- 7CCF7F1D1069F3AE00992676 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; };
7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */; };
7CDAE9050FFCA3520040B25F /* DVDTSCorrection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */; };
7CDAEA7D1001CD6E0040B25F /* karaokelyricstextustar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CDAEA7B1001CD6E0040B25F /* karaokelyricstextustar.cpp */; };
@@ -1574,7 +1624,6 @@
DFF0F2E517528350002DA3A4 /* swig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFF0160F36AD00C96C76 /* swig.cpp */; };
DFF0F2E617528350002DA3A4 /* XBPython.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFE6160F34FE00C96C76 /* XBPython.cpp */; };
DFF0F2E817528350002DA3A4 /* AnnouncementManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */; };
- DFF0F2E917528350002DA3A4 /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; };
DFF0F2EA17528350002DA3A4 /* ConvUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D6A0D25F9FD00618676 /* ConvUtils.cpp */; };
DFF0F2EB17528350002DA3A4 /* LinuxResourceCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D700D25F9FD00618676 /* LinuxResourceCounter.cpp */; };
DFF0F2EC17528350002DA3A4 /* LinuxTimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D720D25F9FD00618676 /* LinuxTimezone.cpp */; };
@@ -2739,7 +2788,6 @@
E4991366174E5EEF00741B6D /* swig.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFF0160F36AD00C96C76 /* swig.cpp */; };
E4991367174E5EEF00741B6D /* XBPython.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F502BFE6160F34FE00C96C76 /* XBPython.cpp */; };
E4991369174E5EEF00741B6D /* AnnouncementManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */; };
- E499136A174E5EEF00741B6D /* Builtins.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */; };
E499136B174E5EF700741B6D /* ConvUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D6A0D25F9FD00618676 /* ConvUtils.cpp */; };
E499136C174E5EF700741B6D /* LinuxResourceCounter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D700D25F9FD00618676 /* LinuxResourceCounter.cpp */; };
E499136D174E5EF700741B6D /* LinuxTimezone.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1D720D25F9FD00618676 /* LinuxTimezone.cpp */; };
@@ -3832,6 +3880,40 @@
7C8AE84C189DE3CD00C33786 /* CoreAudioStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CoreAudioStream.cpp; path = Sinks/osx/CoreAudioStream.cpp; sourceTree = "<group>"; };
7C8AE852189DE47400C33786 /* CoreAudioHelpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CoreAudioHelpers.cpp; path = Sinks/osx/CoreAudioHelpers.cpp; sourceTree = "<group>"; };
7C8AE853189DE47700C33786 /* CoreAudioHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CoreAudioHelpers.h; path = Sinks/osx/CoreAudioHelpers.h; sourceTree = "<group>"; };
+ 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AddonBuiltins.cpp; path = builtins/AddonBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E01F81BA35D0B0072E8B2 /* AddonBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AddonBuiltins.h; path = builtins/AddonBuiltins.h; sourceTree = "<group>"; };
+ 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = AndroidBuiltins.cpp; path = builtins/AndroidBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E01FA1BA35D0B0072E8B2 /* AndroidBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AndroidBuiltins.h; path = builtins/AndroidBuiltins.h; sourceTree = "<group>"; };
+ 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ApplicationBuiltins.cpp; path = builtins/ApplicationBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E01FC1BA35D0B0072E8B2 /* ApplicationBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ApplicationBuiltins.h; path = builtins/ApplicationBuiltins.h; sourceTree = "<group>"; };
+ 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = Builtins.cpp; path = builtins/Builtins.cpp; sourceTree = "<group>"; };
+ 7C8E01FE1BA35D0B0072E8B2 /* Builtins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Builtins.h; path = builtins/Builtins.h; sourceTree = "<group>"; };
+ 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CECBuiltins.cpp; path = builtins/CECBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02001BA35D0B0072E8B2 /* CECBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CECBuiltins.h; path = builtins/CECBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIBuiltins.cpp; path = builtins/GUIBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02021BA35D0B0072E8B2 /* GUIBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIBuiltins.h; path = builtins/GUIBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIContainerBuiltins.cpp; path = builtins/GUIContainerBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02041BA35D0B0072E8B2 /* GUIContainerBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIContainerBuiltins.h; path = builtins/GUIContainerBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = GUIControlBuiltins.cpp; path = builtins/GUIControlBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02061BA35D0B0072E8B2 /* GUIControlBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = GUIControlBuiltins.h; path = builtins/GUIControlBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibraryBuiltins.cpp; path = builtins/LibraryBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02081BA35D0B0072E8B2 /* LibraryBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibraryBuiltins.h; path = builtins/LibraryBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = OpticalBuiltins.cpp; path = builtins/OpticalBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E020A1BA35D0B0072E8B2 /* OpticalBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = OpticalBuiltins.h; path = builtins/OpticalBuiltins.h; sourceTree = "<group>"; };
+ 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PictureBuiltins.cpp; path = builtins/PictureBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E020C1BA35D0B0072E8B2 /* PictureBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PictureBuiltins.h; path = builtins/PictureBuiltins.h; sourceTree = "<group>"; };
+ 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlayerBuiltins.cpp; path = builtins/PlayerBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E020E1BA35D0B0072E8B2 /* PlayerBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlayerBuiltins.h; path = builtins/PlayerBuiltins.h; sourceTree = "<group>"; };
+ 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ProfileBuiltins.cpp; path = builtins/ProfileBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02101BA35D0B0072E8B2 /* ProfileBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ProfileBuiltins.h; path = builtins/ProfileBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PVRBuiltins.cpp; path = builtins/PVRBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02121BA35D0B0072E8B2 /* PVRBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PVRBuiltins.h; path = builtins/PVRBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SkinBuiltins.cpp; path = builtins/SkinBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02141BA35D0B0072E8B2 /* SkinBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SkinBuiltins.h; path = builtins/SkinBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SystemBuiltins.cpp; path = builtins/SystemBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02161BA35D0B0072E8B2 /* SystemBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SystemBuiltins.h; path = builtins/SystemBuiltins.h; sourceTree = "<group>"; };
+ 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WeatherBuiltins.cpp; path = builtins/WeatherBuiltins.cpp; sourceTree = "<group>"; };
+ 7C8E02181BA35D0B0072E8B2 /* WeatherBuiltins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WeatherBuiltins.h; path = builtins/WeatherBuiltins.h; sourceTree = "<group>"; };
7C8FC6EC1829A4580045153D /* DirectoryProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DirectoryProvider.cpp; path = xbmc/listproviders/DirectoryProvider.cpp; sourceTree = SOURCE_ROOT; };
7C8FC6ED1829A4580045153D /* DirectoryProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DirectoryProvider.h; path = xbmc/listproviders/DirectoryProvider.h; sourceTree = SOURCE_ROOT; };
7C908892196358A8003D0619 /* auto_buffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = auto_buffer.cpp; sourceTree = "<group>"; };
@@ -4226,8 +4308,6 @@
7CCDACA019275D1E0074CF51 /* NptStdcEnvironment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NptStdcEnvironment.cpp; sourceTree = "<group>"; };
7CCDACBD19275D790074CF51 /* NptAppleAutoreleasePool.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleAutoreleasePool.mm; sourceTree = "<group>"; };
7CCDACC019275D790074CF51 /* NptAppleLogConfig.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NptAppleLogConfig.mm; sourceTree = "<group>"; };
- 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Builtins.cpp; sourceTree = "<group>"; };
- 7CCF7F1C1069F3AE00992676 /* Builtins.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Builtins.h; sourceTree = "<group>"; };
7CCF7FC7106A0DF500992676 /* TimeUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimeUtils.cpp; sourceTree = "<group>"; };
7CCF7FC8106A0DF500992676 /* TimeUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimeUtils.h; sourceTree = "<group>"; };
7CDAE9030FFCA3520040B25F /* DVDTSCorrection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DVDTSCorrection.cpp; sourceTree = "<group>"; };
@@ -6784,6 +6864,7 @@
4367217312D6640E002508E6 /* interfaces */ = {
isa = PBXGroup;
children = (
+ 7C8E01F61BA35CBA0072E8B2 /* builtins */,
DF40BC21178B4C07009DB567 /* generic */,
7C89674213C03B21003631FE /* info */,
F5AE407F13415D9E0004BD79 /* json-rpc */,
@@ -6791,8 +6872,6 @@
DF1ACFE815FCE53900E10810 /* python */,
F5A7A700112893E50059D6AA /* AnnouncementManager.cpp */,
F5A7A701112893E50059D6AA /* AnnouncementManager.h */,
- 7CCF7F1B1069F3AE00992676 /* Builtins.cpp */,
- 7CCF7F1C1069F3AE00992676 /* Builtins.h */,
42DAC16B1A6E780C0066B4C8 /* IActionListener.h */,
436721A612D66A09002508E6 /* IAnnouncer.h */,
);
@@ -7110,6 +7189,47 @@
name = osx;
sourceTree = "<group>";
};
+ 7C8E01F61BA35CBA0072E8B2 /* builtins */ = {
+ isa = PBXGroup;
+ children = (
+ 7C8E01F71BA35D0B0072E8B2 /* AddonBuiltins.cpp */,
+ 7C8E01F81BA35D0B0072E8B2 /* AddonBuiltins.h */,
+ 7C8E01F91BA35D0B0072E8B2 /* AndroidBuiltins.cpp */,
+ 7C8E01FA1BA35D0B0072E8B2 /* AndroidBuiltins.h */,
+ 7C8E01FB1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp */,
+ 7C8E01FC1BA35D0B0072E8B2 /* ApplicationBuiltins.h */,
+ 7C8E01FD1BA35D0B0072E8B2 /* Builtins.cpp */,
+ 7C8E01FE1BA35D0B0072E8B2 /* Builtins.h */,
+ 7C8E01FF1BA35D0B0072E8B2 /* CECBuiltins.cpp */,
+ 7C8E02001BA35D0B0072E8B2 /* CECBuiltins.h */,
+ 7C8E02011BA35D0B0072E8B2 /* GUIBuiltins.cpp */,
+ 7C8E02021BA35D0B0072E8B2 /* GUIBuiltins.h */,
+ 7C8E02031BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp */,
+ 7C8E02041BA35D0B0072E8B2 /* GUIContainerBuiltins.h */,
+ 7C8E02051BA35D0B0072E8B2 /* GUIControlBuiltins.cpp */,
+ 7C8E02061BA35D0B0072E8B2 /* GUIControlBuiltins.h */,
+ 7C8E02071BA35D0B0072E8B2 /* LibraryBuiltins.cpp */,
+ 7C8E02081BA35D0B0072E8B2 /* LibraryBuiltins.h */,
+ 7C8E02091BA35D0B0072E8B2 /* OpticalBuiltins.cpp */,
+ 7C8E020A1BA35D0B0072E8B2 /* OpticalBuiltins.h */,
+ 7C8E020B1BA35D0B0072E8B2 /* PictureBuiltins.cpp */,
+ 7C8E020C1BA35D0B0072E8B2 /* PictureBuiltins.h */,
+ 7C8E020D1BA35D0B0072E8B2 /* PlayerBuiltins.cpp */,
+ 7C8E020E1BA35D0B0072E8B2 /* PlayerBuiltins.h */,
+ 7C8E020F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp */,
+ 7C8E02101BA35D0B0072E8B2 /* ProfileBuiltins.h */,
+ 7C8E02111BA35D0B0072E8B2 /* PVRBuiltins.cpp */,
+ 7C8E02121BA35D0B0072E8B2 /* PVRBuiltins.h */,
+ 7C8E02131BA35D0B0072E8B2 /* SkinBuiltins.cpp */,
+ 7C8E02141BA35D0B0072E8B2 /* SkinBuiltins.h */,
+ 7C8E02151BA35D0B0072E8B2 /* SystemBuiltins.cpp */,
+ 7C8E02161BA35D0B0072E8B2 /* SystemBuiltins.h */,
+ 7C8E02171BA35D0B0072E8B2 /* WeatherBuiltins.cpp */,
+ 7C8E02181BA35D0B0072E8B2 /* WeatherBuiltins.h */,
+ );
+ name = builtins;
+ sourceTree = "<group>";
+ };
7C973CE61B5037B80002A874 /* DSPAddons */ = {
isa = PBXGroup;
children = (
@@ -10323,6 +10443,7 @@
files = (
E38E1F370D25F9FD00618676 /* Application.cpp in Sources */,
399442771A8DD920006C39E9 /* VideoLibraryProgressJob.cpp in Sources */,
+ 7C8E02431BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */,
E38E1F3C0D25F9FD00618676 /* Autorun.cpp in Sources */,
E38E1F3D0D25F9FD00618676 /* AutoSwitch.cpp in Sources */,
E38E1F3E0D25F9FD00618676 /* BackgroundInfoLoader.cpp in Sources */,
@@ -10359,6 +10480,7 @@
E38E1F8E0D25F9FD00618676 /* DVDVideoCodecLibMpeg2.cpp in Sources */,
E38E1F8F0D25F9FD00618676 /* DVDVideoPPFFmpeg.cpp in Sources */,
E38E1F910D25F9FD00618676 /* DVDDemux.cpp in Sources */,
+ 7C8E023A1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */,
E38E1F930D25F9FD00618676 /* DVDDemuxShoutcast.cpp in Sources */,
E38E1F940D25F9FD00618676 /* DVDDemuxUtils.cpp in Sources */,
E38E1F970D25F9FD00618676 /* DVDDemuxSPU.cpp in Sources */,
@@ -10456,6 +10578,7 @@
E38E20650D25F9FD00618676 /* DirectoryNodeOverview.cpp in Sources */,
E38E20660D25F9FD00618676 /* DirectoryNodeRecentlyAddedEpisodes.cpp in Sources */,
DF4BF01D1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */,
+ 7C8E02281BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */,
E38E20670D25F9FD00618676 /* DirectoryNodeRecentlyAddedMovies.cpp in Sources */,
E38E20680D25F9FD00618676 /* DirectoryNodeRecentlyAddedMusicVideos.cpp in Sources */,
E38E20690D25F9FD00618676 /* DirectoryNodeRoot.cpp in Sources */,
@@ -10517,6 +10640,7 @@
E38E20BB0D25F9FD00618676 /* GUIDialogVideoOSD.cpp in Sources */,
DFC6F4B91AFF7CB10039A7FA /* kiss_fftr.c in Sources */,
E38E20BC0D25F9FD00618676 /* GUIWindowPictures.cpp in Sources */,
+ 7C8E022E1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */,
E38E20BD0D25F9FD00618676 /* GUIWindowPointer.cpp in Sources */,
E38E20BE0D25F9FD00618676 /* GUIWindowPrograms.cpp in Sources */,
E38E20BF0D25F9FD00618676 /* GUIWindowScreensaver.cpp in Sources */,
@@ -10564,6 +10688,7 @@
E38E22520D25F9FE00618676 /* rawread.cpp in Sources */,
E38E22530D25F9FE00618676 /* rdwrfn.cpp in Sources */,
E38E22540D25F9FE00618676 /* recvol.cpp in Sources */,
+ 7C8E02191BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */,
E38E22550D25F9FE00618676 /* resource.cpp in Sources */,
E38E22560D25F9FE00618676 /* rijndael.cpp in Sources */,
E38E22570D25F9FE00618676 /* rs.cpp in Sources */,
@@ -10655,6 +10780,7 @@
E3E91FFF0D8C61DF002BF43D /* Socket.cpp in Sources */,
E3E920020D8C622A002BF43D /* EventClient.cpp in Sources */,
E38A06CE0D95AA5500FF8227 /* GUIDialogKaiToast.cpp in Sources */,
+ 7C8E023D1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */,
E3B53E7C0D97B08100021A96 /* DVDSubtitleParserMicroDVD.cpp in Sources */,
E36C29DF0DA72429001F0C9D /* Artist.cpp in Sources */,
E36C29E00DA72429001F0C9D /* Album.cpp in Sources */,
@@ -10685,6 +10811,7 @@
7C5608C70F1754930056433A /* ExternalPlayer.cpp in Sources */,
F584E12E0F257C5100DB26A5 /* HTTPDirectory.cpp in Sources */,
397877D51AAAF87700F98A45 /* Speed.cpp in Sources */,
+ 7C8E02341BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */,
F54C51D20F1E783200D46E3C /* GUIDialogKaraokeSongSelector.cpp in Sources */,
DF29BCF71B5D911800904347 /* MediaLibraryEvent.cpp in Sources */,
2F4564D51970129A00396109 /* GUIFontCache.cpp in Sources */,
@@ -10725,6 +10852,7 @@
DF6F52AE1AF6D03F001BC57D /* dacp.cpp in Sources */,
E49ACDD510074F9200A86ECD /* ZeroconfBrowser.cpp in Sources */,
F5D8EF5B103912A4004A11AB /* DVDSubtitleParserVplayer.cpp in Sources */,
+ 7C8E02491BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */,
7C779E3A104A57E500F444C4 /* RenderSystem.cpp in Sources */,
7C779E3B104A57E500F444C4 /* RenderSystemGL.cpp in Sources */,
7C779E3C104A57E500F444C4 /* WinEventsSDL.cpp in Sources */,
@@ -10735,10 +10863,10 @@
7C779E54104A58F900F444C4 /* GUIWindowTestPatternGL.cpp in Sources */,
7C62F24210505BC7002AD2C1 /* Bookmark.cpp in Sources */,
7C62F45E1057A62D002AD2C1 /* DirectoryNodeSingles.cpp in Sources */,
- 7CCF7F1D1069F3AE00992676 /* Builtins.cpp in Sources */,
7CCF7FC9106A0DF500992676 /* TimeUtils.cpp in Sources */,
F57B6F801071B8B500079ACB /* JobManager.cpp in Sources */,
F5E55B5D10741272006E788A /* DVDPlayerTeletext.cpp in Sources */,
+ 7C8E02371BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */,
F5E55B66107412DE006E788A /* GUIDialogTeletext.cpp in Sources */,
F5E55B7010741340006E788A /* Teletext.cpp in Sources */,
43348AA4107747CD00F859CF /* Edl.cpp in Sources */,
@@ -10942,6 +11070,7 @@
DF0DF15C13A3ADA7008ED511 /* NFSDirectory.cpp in Sources */,
7C89619213B6A16F003631FE /* GUIWindowScreensaverDim.cpp in Sources */,
18ECC96213CF178D00A9ED6C /* StreamUtils.cpp in Sources */,
+ 7C8E02401BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */,
F5CEE60913D3C89700225F72 /* DVDOverlayCodecTX3G.cpp in Sources */,
38F4E57013CCCB3B00664821 /* Implementation.cpp in Sources */,
3802709A13D5A653009493DD /* SystemClock.cpp in Sources */,
@@ -10970,6 +11099,7 @@
F5E1138014357F3800175026 /* PeripheralCecAdapter.cpp in Sources */,
F54BCC5F1439345300F86B0F /* HotKeyController.m in Sources */,
DF673AA51443819600A5A509 /* AddonManager.cpp in Sources */,
+ 7C8E022B1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */,
DFDE5D511AE5658200EE53AD /* PictureScalingAlgorithm.cpp in Sources */,
F5BD02F6148D3A7E001B5583 /* CryptThreading.cpp in Sources */,
DF5276E1151BAEDA00B5B63B /* Base64.cpp in Sources */,
@@ -11013,6 +11143,7 @@
EC720A8F155091BB00FFD782 /* ilog.cpp in Sources */,
EC720A9D1550927000FFD782 /* XbmcContext.cpp in Sources */,
F5ED8D6C1551F91400842059 /* BlurayDirectory.cpp in Sources */,
+ 7C8E02251BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */,
F5ED908815538DCE00842059 /* XBMCTinyXML.cpp in Sources */,
F5ED908E15538E2300842059 /* POUtils.cpp in Sources */,
DFB65FB515373AE7006B8FF1 /* AEFactory.cpp in Sources */,
@@ -11156,6 +11287,7 @@
DFB02DEA16629DBA00F37752 /* PyContext.cpp in Sources */,
DF07252E168734D7008DCAAD /* karaokevideobackground.cpp in Sources */,
DF072534168734ED008DCAAD /* FFmpegVideoDecoder.cpp in Sources */,
+ 7C8E02221BA35D0B0072E8B2 /* Builtins.cpp in Sources */,
395F6DE21A81FACF0088CC74 /* HTTPImageTransformationHandler.cpp in Sources */,
DF64FE3D16C07AAA00D028FB /* GUIViewControl.cpp in Sources */,
DF64FE3E16C07AAA00D028FB /* GUIViewState.cpp in Sources */,
@@ -11204,6 +11336,7 @@
DF529BAE1741697B00523FB4 /* Environment.cpp in Sources */,
DFE4095B17417FDF00473BD9 /* LegacyPathTranslation.cpp in Sources */,
0E3036EC1760F68A00D93596 /* FavouritesDirectory.cpp in Sources */,
+ 7C8E02461BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */,
551C3A45175A12010051AAAD /* VDA.cpp in Sources */,
DFBB431B178B5E6F006CC20A /* CompileInfo.cpp in Sources */,
DF40BC20178B4BEC009DB567 /* PythonInvoker.cpp in Sources */,
@@ -11286,6 +11419,7 @@
7CCDA150192753E30074CF51 /* PltIconsData.cpp in Sources */,
7CCDA159192753E30074CF51 /* PltMimeType.cpp in Sources */,
7C973CF51B5037EF0002A874 /* ActiveAEDSPProcess.cpp in Sources */,
+ 7C8E021F1BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */,
7CCDA162192753E30074CF51 /* PltProtocolInfo.cpp in Sources */,
7CCDA16B192753E30074CF51 /* PltService.cpp in Sources */,
7CCDA174192753E30074CF51 /* PltSsdp.cpp in Sources */,
@@ -11323,6 +11457,7 @@
7CCDA7A3192756250074CF51 /* NptCrypto.cpp in Sources */,
7CCDA7A6192756250074CF51 /* NptDataBuffer.cpp in Sources */,
DF4BF0161A4EF30F0053AC56 /* cc_decoder708.cpp in Sources */,
+ 7C8E021C1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */,
7CCDA7AF192756250074CF51 /* NptDebug.cpp in Sources */,
7CCDA7B8192756250074CF51 /* NptDigest.cpp in Sources */,
399442741A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */,
@@ -11361,6 +11496,7 @@
7CCDAA8E192756250074CF51 /* NptPosixQueue.cpp in Sources */,
7CCDAA97192756250074CF51 /* NptPosixSystem.cpp in Sources */,
7CCDAAA0192756250074CF51 /* NptPosixThreads.cpp in Sources */,
+ 7C8E02311BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */,
7CCDAAA9192756250074CF51 /* NptPosixTime.cpp in Sources */,
7CCDAAB2192756250074CF51 /* NptSelectableMessageQueue.cpp in Sources */,
7CCDAC8619275CA70074CF51 /* NptBsdNetwork.cpp in Sources */,
@@ -11424,6 +11560,7 @@
DFF0F10C17528350002DA3A4 /* rijndael.cpp in Sources */,
DFF0F10D17528350002DA3A4 /* rs.cpp in Sources */,
DFF0F10E17528350002DA3A4 /* savepos.cpp in Sources */,
+ 7C8E02391BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */,
DFF0F10F17528350002DA3A4 /* scantree.cpp in Sources */,
DFF0F11017528350002DA3A4 /* sha1.cpp in Sources */,
395C29FD1A9CD20C00EBC7AD /* ContextMenuManager.cpp in Sources */,
@@ -11451,6 +11588,7 @@
DFF0F12417528350002DA3A4 /* GUIDialogAddonSettings.cpp in Sources */,
DFF0F12517528350002DA3A4 /* GUIViewStateAddonBrowser.cpp in Sources */,
DFF0F12617528350002DA3A4 /* GUIWindowAddonBrowser.cpp in Sources */,
+ 7C8E02421BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */,
DFF0F12717528350002DA3A4 /* PluginSource.cpp in Sources */,
DFF0F12817528350002DA3A4 /* Repository.cpp in Sources */,
DFF0F12917528350002DA3A4 /* Scraper.cpp in Sources */,
@@ -11458,6 +11596,7 @@
395C2A261AA4C32100EBC7AD /* AudioDecoder.cpp in Sources */,
DFF0F12B17528350002DA3A4 /* Service.cpp in Sources */,
DFF0F12C17528350002DA3A4 /* Skin.cpp in Sources */,
+ 7C8E02241BA35D0B0072E8B2 /* Builtins.cpp in Sources */,
DFF0F12D17528350002DA3A4 /* Visualisation.cpp in Sources */,
DFF0F12E17528350002DA3A4 /* CDDARipJob.cpp in Sources */,
DFF0F12F17528350002DA3A4 /* CDDARipper.cpp in Sources */,
@@ -11620,10 +11759,12 @@
DFF0F1E317528350002DA3A4 /* GUIDialogTextViewer.cpp in Sources */,
DF1D2DEF1B6E85EE002BB9DB /* XbtDirectory.cpp in Sources */,
DFF0F1E417528350002DA3A4 /* GUIDialogVolumeBar.cpp in Sources */,
+ 7C8E02211BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */,
DFF0F1E517528350002DA3A4 /* GUIDialogYesNo.cpp in Sources */,
DFF0F1E617528350002DA3A4 /* AddonsDirectory.cpp in Sources */,
DFEA4B551B5271F300562321 /* ActiveAEDSPDatabase.cpp in Sources */,
DFF0F1EA17528350002DA3A4 /* BlurayDirectory.cpp in Sources */,
+ 7C8E022A1BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */,
DFF0F1EB17528350002DA3A4 /* CacheStrategy.cpp in Sources */,
DFF0F1EC17528350002DA3A4 /* CDDADirectory.cpp in Sources */,
DFF0F1ED17528350002DA3A4 /* CDDAFile.cpp in Sources */,
@@ -11830,6 +11971,7 @@
DF0E4AC71AD597ED00A75430 /* DVDPlayerRadioRDS.cpp in Sources */,
DFF0F2BD17528350002DA3A4 /* MatrixGLES.cpp in Sources */,
DFF0F2BE17528350002DA3A4 /* Shader.cpp in Sources */,
+ 7C8E02301BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */,
DFF0F2BF17528350002DA3A4 /* Texture.cpp in Sources */,
DFF0F2C017528350002DA3A4 /* TextureBundle.cpp in Sources */,
DF3E5EFA199D41300039675D /* kodiclientwrapper.mm in Sources */,
@@ -11840,6 +11982,7 @@
DFF0F2C517528350002DA3A4 /* TextureManager.cpp in Sources */,
DFF0F2C617528350002DA3A4 /* VisibleEffect.cpp in Sources */,
F597B05D18A804E0005AADAE /* DVDVideoCodec.cpp in Sources */,
+ 7C8E02481BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */,
DFF0F2C717528350002DA3A4 /* XBTF.cpp in Sources */,
DFF0F2C817528350002DA3A4 /* XBTFReader.cpp in Sources */,
DFF0F2C917528350002DA3A4 /* GenericTouchActionHandler.cpp in Sources */,
@@ -11859,6 +12002,7 @@
DFF0F2D717528350002DA3A4 /* PlayerOperations.cpp in Sources */,
DFF0F2D817528350002DA3A4 /* PlaylistOperations.cpp in Sources */,
DFF0F2D917528350002DA3A4 /* PVROperations.cpp in Sources */,
+ 7C8E024B1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */,
DFF0F2DA17528350002DA3A4 /* SystemOperations.cpp in Sources */,
DFF0F2DB17528350002DA3A4 /* VideoLibrary.cpp in Sources */,
DFF0F2DC17528350002DA3A4 /* XBMCOperations.cpp in Sources */,
@@ -11873,7 +12017,6 @@
DFF0F2E517528350002DA3A4 /* swig.cpp in Sources */,
DFF0F2E617528350002DA3A4 /* XBPython.cpp in Sources */,
DFF0F2E817528350002DA3A4 /* AnnouncementManager.cpp in Sources */,
- DFF0F2E917528350002DA3A4 /* Builtins.cpp in Sources */,
DFF0F2EA17528350002DA3A4 /* ConvUtils.cpp in Sources */,
DFF0F2EB17528350002DA3A4 /* LinuxResourceCounter.cpp in Sources */,
DFF0F2EC17528350002DA3A4 /* LinuxTimezone.cpp in Sources */,
@@ -11889,6 +12032,7 @@
7CEE587F1B5A3FFB007C2B5A /* AudioDSPSettings.cpp in Sources */,
DFF0F2F617528350002DA3A4 /* GUIDialogVisualisationPresetList.cpp in Sources */,
DFF0F2F717528350002DA3A4 /* MusicAlbumInfo.cpp in Sources */,
+ 7C8E02361BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */,
DFF0F2F817528350002DA3A4 /* MusicArtistInfo.cpp in Sources */,
DFF0F2F917528350002DA3A4 /* MusicInfoScanner.cpp in Sources */,
DFF0F2FA17528350002DA3A4 /* MusicInfoScraper.cpp in Sources */,
@@ -11919,6 +12063,7 @@
DFF0F31717528350002DA3A4 /* GUIWindowMusicPlaylistEditor.cpp in Sources */,
DFF0F31817528350002DA3A4 /* GUIWindowMusicSongs.cpp in Sources */,
DFF0F31917528350002DA3A4 /* GUIWindowVisualisation.cpp in Sources */,
+ 7C8E02331BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */,
DFF0F31A17528350002DA3A4 /* Album.cpp in Sources */,
DFF0F31B17528350002DA3A4 /* Artist.cpp in Sources */,
DFEA4B571B5271F600562321 /* ActiveAEDSPMode.cpp in Sources */,
@@ -11928,6 +12073,7 @@
DFF0F31F17528350002DA3A4 /* MusicInfoLoader.cpp in Sources */,
DFF0F32017528350002DA3A4 /* MusicThumbLoader.cpp in Sources */,
DFF0F32117528350002DA3A4 /* Song.cpp in Sources */,
+ 7C8E02451BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */,
DFF0F32217528350002DA3A4 /* HTTPImageHandler.cpp in Sources */,
DFF0F32317528350002DA3A4 /* HTTPJsonRpcHandler.cpp in Sources */,
DFF0F32417528350002DA3A4 /* HTTPVfsHandler.cpp in Sources */,
@@ -12010,6 +12156,7 @@
DFF0F36917528350002DA3A4 /* PowerManager.cpp in Sources */,
DFF0F36A17528350002DA3A4 /* GUIDialogLockSettings.cpp in Sources */,
DFF0F36B17528350002DA3A4 /* GUIDialogProfileSettings.cpp in Sources */,
+ 7C8E023F1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */,
DFF0F36C17528350002DA3A4 /* GUIWindowSettingsProfile.cpp in Sources */,
DFF0F36D17528350002DA3A4 /* Profile.cpp in Sources */,
DFF0F36E17528350002DA3A4 /* ProfilesManager.cpp in Sources */,
@@ -12089,6 +12236,7 @@
DFF0F3C117528350002DA3A4 /* BitstreamStats.cpp in Sources */,
DFF0F3C217528350002DA3A4 /* BooleanLogic.cpp in Sources */,
DFF0F3C317528350002DA3A4 /* CharsetConverter.cpp in Sources */,
+ 7C8E022D1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */,
DFF0F3C417528350002DA3A4 /* CPUInfo.cpp in Sources */,
DFF0F3C517528350002DA3A4 /* Crc32.cpp in Sources */,
DFF0F3C617528350002DA3A4 /* CryptThreading.cpp in Sources */,
@@ -12112,6 +12260,7 @@
DFF0F3DC17528350002DA3A4 /* LangCodeExpander.cpp in Sources */,
399442731A8DD920006C39E9 /* VideoLibraryJob.cpp in Sources */,
DFF0F3DD17528350002DA3A4 /* LegacyPathTranslation.cpp in Sources */,
+ 7C8E021E1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */,
DFF0F3DE17528350002DA3A4 /* log.cpp in Sources */,
DFF0F3DF17528350002DA3A4 /* md5.cpp in Sources */,
DFF0F3E017528350002DA3A4 /* Mime.cpp in Sources */,
@@ -12252,6 +12401,7 @@
DFF0F46717528350002DA3A4 /* Monitor.cpp in Sources */,
DFF0F46817528350002DA3A4 /* Player.cpp in Sources */,
DFF0F46917528350002DA3A4 /* PlayList.cpp in Sources */,
+ 7C8E023C1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */,
DFF0F46A17528350002DA3A4 /* String.cpp in Sources */,
DFF0F46B17528350002DA3A4 /* Window.cpp in Sources */,
DFF0F46C17528350002DA3A4 /* WindowDialog.cpp in Sources */,
@@ -12296,6 +12446,7 @@
7C920CFB181669FF00DA1477 /* TextureOperations.cpp in Sources */,
DFEF0BAE180ADE6400AEAED1 /* FileItemListModification.cpp in Sources */,
DFEF0BC3180ADEDA00AEAED1 /* SmartPlaylistFileItemListModifier.cpp in Sources */,
+ 7C8E02271BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */,
7CC82C9518284F9F0010DF30 /* CharsetDetection.cpp in Sources */,
DF6D1DFF18312525009DB64F /* OverlayRendererGUI.cpp in Sources */,
7C26126E182068660086E04D /* SettingsOperations.cpp in Sources */,
@@ -12320,6 +12471,7 @@
7C15DCBE1892481400FCE564 /* InfoBool.cpp in Sources */,
F5CC228F1814F7F7006B5E91 /* AESinkDARWINIOS.cpp in Sources */,
F5CC22E51814FF3B006B5E91 /* ActiveAE.cpp in Sources */,
+ 7C8E021B1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */,
F5CC22E61814FF3B006B5E91 /* ActiveAEBuffer.cpp in Sources */,
F5CC22E81814FF3B006B5E91 /* ActiveAESink.cpp in Sources */,
DF4A3BB41B4B0FC100F9CDC0 /* ApplicationMessenger.cpp in Sources */,
@@ -12566,6 +12718,7 @@
E49911C8174E5D2500741B6D /* DVDOverlayCodecFFmpeg.cpp in Sources */,
E49911C9174E5D2500741B6D /* DVDOverlayCodecSSA.cpp in Sources */,
E49911CA174E5D2500741B6D /* DVDOverlayCodecText.cpp in Sources */,
+ 7C8E02471BA35D0B0072E8B2 /* SystemBuiltins.cpp in Sources */,
E49911CB174E5D2500741B6D /* DVDOverlayCodecTX3G.cpp in Sources */,
E49911CE174E5D2500741B6D /* DVDVideoCodecFFmpeg.cpp in Sources */,
E49911CF174E5D2500741B6D /* DVDVideoCodecLibMpeg2.cpp in Sources */,
@@ -12758,6 +12911,7 @@
E499129D174E5D9900741B6D /* PipeFile.cpp in Sources */,
E499129E174E5D9900741B6D /* PipesManager.cpp in Sources */,
E499129F174E5D9900741B6D /* PlaylistDirectory.cpp in Sources */,
+ 7C8E02411BA35D0B0072E8B2 /* PVRBuiltins.cpp in Sources */,
E49912A0174E5D9900741B6D /* PlaylistFileDirectory.cpp in Sources */,
E49912A1174E5D9900741B6D /* PluginDirectory.cpp in Sources */,
E49912A2174E5D9900741B6D /* PVRDirectory.cpp in Sources */,
@@ -12769,6 +12923,7 @@
E49912A7174E5D9900741B6D /* RSSDirectory.cpp in Sources */,
E49912AA174E5D9900741B6D /* SAPDirectory.cpp in Sources */,
E49912AB174E5D9900741B6D /* SAPFile.cpp in Sources */,
+ 7C8E02231BA35D0B0072E8B2 /* Builtins.cpp in Sources */,
E49912AC174E5D9900741B6D /* SFTPDirectory.cpp in Sources */,
E49912AD174E5D9900741B6D /* SFTPFile.cpp in Sources */,
E49912AE174E5D9900741B6D /* ShoutcastFile.cpp in Sources */,
@@ -12857,6 +13012,7 @@
E4991301174E5DAD00741B6D /* GUIListItemLayout.cpp in Sources */,
E4991302174E5DAD00741B6D /* GUIListLabel.cpp in Sources */,
E4991303174E5DAD00741B6D /* GUIMessage.cpp in Sources */,
+ 7C8E023E1BA35D0B0072E8B2 /* ProfileBuiltins.cpp in Sources */,
E4991304174E5DAD00741B6D /* GUIMoverControl.cpp in Sources */,
399442751A8DD920006C39E9 /* VideoLibraryMarkWatchedJob.cpp in Sources */,
E4991305174E5DAD00741B6D /* GUIMultiImage.cpp in Sources */,
@@ -12897,6 +13053,7 @@
E4991322174E5DAD00741B6D /* IWindowManagerCallback.cpp in Sources */,
E4991323174E5DAD00741B6D /* JpegIO.cpp in Sources */,
E4991325174E5DAD00741B6D /* LocalizeStrings.cpp in Sources */,
+ 7C8E024A1BA35D0B0072E8B2 /* WeatherBuiltins.cpp in Sources */,
E4991326174E5DAD00741B6D /* MatrixGLES.cpp in Sources */,
E4991327174E5DAD00741B6D /* Shader.cpp in Sources */,
E4991328174E5DAD00741B6D /* Texture.cpp in Sources */,
@@ -12945,7 +13102,6 @@
E4991366174E5EEF00741B6D /* swig.cpp in Sources */,
E4991367174E5EEF00741B6D /* XBPython.cpp in Sources */,
E4991369174E5EEF00741B6D /* AnnouncementManager.cpp in Sources */,
- E499136A174E5EEF00741B6D /* Builtins.cpp in Sources */,
E499136B174E5EF700741B6D /* ConvUtils.cpp in Sources */,
E499136C174E5EF700741B6D /* LinuxResourceCounter.cpp in Sources */,
E499136D174E5EF700741B6D /* LinuxTimezone.cpp in Sources */,
@@ -12967,6 +13123,7 @@
E499137C174E5F0E00741B6D /* GUIDialogKaraokeSongSelector.cpp in Sources */,
E499137D174E5F0E00741B6D /* GUIWindowKaraokeLyrics.cpp in Sources */,
E499137E174E5F0E00741B6D /* karaokelyrics.cpp in Sources */,
+ 7C8E022C1BA35D0B0072E8B2 /* GUIContainerBuiltins.cpp in Sources */,
DF54F8041B6580C8000FCBA4 /* ContextMenuAddon.cpp in Sources */,
E499137F174E5F0E00741B6D /* karaokelyricscdg.cpp in Sources */,
E4991380174E5F0E00741B6D /* karaokelyricsfactory.cpp in Sources */,
@@ -13080,6 +13237,7 @@
E49913EE174E5FB000741B6D /* Profile.cpp in Sources */,
E49913EF174E5FB000741B6D /* ProfilesManager.cpp in Sources */,
E49913F0174E5FB000741B6D /* GUIViewStatePrograms.cpp in Sources */,
+ 7C8E023B1BA35D0B0072E8B2 /* PlayerBuiltins.cpp in Sources */,
E49913F1174E5FB000741B6D /* GUIWindowPrograms.cpp in Sources */,
E49913F2174E5FB000741B6D /* PVRClient.cpp in Sources */,
E49913F3174E5FB000741B6D /* PVRClients.cpp in Sources */,
@@ -13252,9 +13410,11 @@
E49914A6174E607200741B6D /* GUIWindowLoginScreen.cpp in Sources */,
E49914A7174E607200741B6D /* GUIWindowPointer.cpp in Sources */,
E49914A8174E607200741B6D /* GUIWindowScreensaver.cpp in Sources */,
+ 7C8E02441BA35D0B0072E8B2 /* SkinBuiltins.cpp in Sources */,
E49914A9174E607200741B6D /* GUIWindowScreensaverDim.cpp in Sources */,
E49914AA174E607200741B6D /* GUIWindowStartup.cpp in Sources */,
E49914AB174E607200741B6D /* GUIWindowSystemInfo.cpp in Sources */,
+ 7C8E022F1BA35D0B0072E8B2 /* GUIControlBuiltins.cpp in Sources */,
E49914AC174E607200741B6D /* GUIWindowWeather.cpp in Sources */,
E499152C174E640800741B6D /* Application.cpp in Sources */,
E499152E174E642900741B6D /* AppParamParser.cpp in Sources */,
@@ -13273,8 +13433,10 @@
E499153B174E642900741B6D /* LangInfo.cpp in Sources */,
E499153C174E642900741B6D /* MediaSource.cpp in Sources */,
E499153D174E642900741B6D /* NfoFile.cpp in Sources */,
+ 7C8E02261BA35D0B0072E8B2 /* CECBuiltins.cpp in Sources */,
E499153E174E642900741B6D /* PartyModeManager.cpp in Sources */,
E499153F174E642900741B6D /* PasswordManager.cpp in Sources */,
+ 7C8E021A1BA35D0B0072E8B2 /* AddonBuiltins.cpp in Sources */,
E4991540174E642900741B6D /* PlayListPlayer.cpp in Sources */,
E4991541174E642900741B6D /* SectionLoader.cpp in Sources */,
E4991542174E642900741B6D /* SystemGlobals.cpp in Sources */,
@@ -13310,6 +13472,7 @@
E499155F174E656E00741B6D /* ModuleXbmcgui.cpp in Sources */,
E4991560174E656E00741B6D /* ModuleXbmcplugin.cpp in Sources */,
E4991561174E656E00741B6D /* ModuleXbmcvfs.cpp in Sources */,
+ 7C8E021D1BA35D0B0072E8B2 /* AndroidBuiltins.cpp in Sources */,
E4991562174E656E00741B6D /* Monitor.cpp in Sources */,
E4991563174E656E00741B6D /* Player.cpp in Sources */,
E4991564174E656E00741B6D /* PlayList.cpp in Sources */,
@@ -13330,6 +13493,7 @@
E4991582174E682F00741B6D /* AutoPool.mm in Sources */,
E4991583174E684000741B6D /* CocoaInterface.mm in Sources */,
E4991584174E684000741B6D /* DarwinUtils.mm in Sources */,
+ 7C8E02321BA35D0B0072E8B2 /* LibraryBuiltins.cpp in Sources */,
E4991586174E684000741B6D /* OSXGNUReplacements.c in Sources */,
E499158A174E68D800741B6D /* LinuxRendererGLES.cpp in Sources */,
E499158B174E68EE00741B6D /* DVDCodecUtils.cpp in Sources */,
@@ -13422,6 +13586,7 @@
7CCDA17E192753E30074CF51 /* PltStateVariable.cpp in Sources */,
7CCDA187192753E30074CF51 /* PltTaskManager.cpp in Sources */,
7CCDA190192753E30074CF51 /* PltThreadTask.cpp in Sources */,
+ 7C8E02201BA35D0B0072E8B2 /* ApplicationBuiltins.cpp in Sources */,
7CCDA199192753E30074CF51 /* PltUPnP.cpp in Sources */,
DF54F7FF1B6580AD000FCBA4 /* ContextMenuItem.cpp in Sources */,
7CCDA1A2192753E30074CF51 /* PltMediaConnect.cpp in Sources */,
@@ -13432,6 +13597,7 @@
7CCDA1D1192753E30074CF51 /* PltMediaRenderer.cpp in Sources */,
7CCDA1DC192753E30074CF51 /* RdrConnectionManagerSCPD.cpp in Sources */,
7CCDA1E7192753E30074CF51 /* RenderingControlSCPD.cpp in Sources */,
+ 7C8E02381BA35D0B0072E8B2 /* PictureBuiltins.cpp in Sources */,
7CCDA1F4192753E30074CF51 /* ConnectionManagerSCPD.cpp in Sources */,
7CCDA1FF192753E30074CF51 /* ContentDirectorySCPD.cpp in Sources */,
7CCDA20A192753E30074CF51 /* ContentDirectorywSearchSCPD.cpp in Sources */,
@@ -13459,6 +13625,7 @@
7CCDA7D1192756250074CF51 /* NptHttp.cpp in Sources */,
7CCDA7DA192756250074CF51 /* NptJson.cpp in Sources */,
7CCDA7DD192756250074CF51 /* NptList.cpp in Sources */,
+ 7C8E02291BA35D0B0072E8B2 /* GUIBuiltins.cpp in Sources */,
7CCDA7E6192756250074CF51 /* NptLogging.cpp in Sources */,
7CCDA7E9192756250074CF51 /* NptMessaging.cpp in Sources */,
7CCDA7F2192756250074CF51 /* NptNetwork.cpp in Sources */,
@@ -13480,6 +13647,7 @@
7CCDA86D192756250074CF51 /* NptZip.cpp in Sources */,
B5011E4219AF3B56005ADF89 /* PosixFile.cpp in Sources */,
7CCDAA83192756250074CF51 /* NptPosixDynamicLibraries.cpp in Sources */,
+ 7C8E02351BA35D0B0072E8B2 /* OpticalBuiltins.cpp in Sources */,
7CCDAA86192756250074CF51 /* NptPosixEnvironment.cpp in Sources */,
7CCDAA8C192756250074CF51 /* NptPosixNetwork.cpp in Sources */,
7CCDAA8F192756250074CF51 /* NptPosixQueue.cpp in Sources */,
diff --git a/Makefile.in b/Makefile.in
index e0d355cbb7..1ef3862419 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -49,6 +49,7 @@ DIRECTORY_ARCHIVES=$(DVDPLAYER_ARCHIVES) \
xbmc/filesystem/filesystem.a \
xbmc/guilib/guilib.a \
xbmc/input/input.a \
+ xbmc/interfaces/builtins/builtins.a \
xbmc/interfaces/generic/interfaces-generic.a \
xbmc/interfaces/info/info.a \
xbmc/interfaces/interfaces.a \
diff --git a/configure.ac b/configure.ac
index 9aa736677d..a861ce9378 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2380,6 +2380,7 @@ OUTPUT_FILES="Makefile \
xbmc/guilib/Makefile \
xbmc/input/linux/Makefile \
xbmc/interfaces/Makefile \
+ xbmc/interfaces/builtins/Makefile \
xbmc/network/Makefile \
xbmc/network/upnp/Makefile \
lib/libexif/Makefile \
diff --git a/project/VS2010Express/XBMC.vcxproj b/project/VS2010Express/XBMC.vcxproj
index 1c16c3eded..b4093f1150 100644
--- a/project/VS2010Express/XBMC.vcxproj
+++ b/project/VS2010Express/XBMC.vcxproj
@@ -538,7 +538,23 @@
<ClCompile Include="..\..\xbmc\input\windows\WINJoystick.cpp" />
<ClCompile Include="..\..\xbmc\input\XBMC_keytable.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\AnnouncementManager.cpp" />
- <ClCompile Include="..\..\xbmc\interfaces\Builtins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\AddonBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\AndroidBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\ApplicationBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\Builtins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\CECBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIContainerBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIControlBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\LibraryBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\OpticalBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PictureBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PlayerBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\ProfileBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PVRBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\SkinBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\SystemBuiltins.cpp" />
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\WeatherBuiltins.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\generic\ILanguageInvoker.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\generic\LanguageInvokerThread.cpp" />
<ClCompile Include="..\..\xbmc\interfaces\generic\ScriptInvocationManager.cpp" />
@@ -990,6 +1006,23 @@
<ClInclude Include="..\..\xbmc\input\touch\ITouchInputHandling.h" />
<ClInclude Include="..\..\xbmc\input\touch\TouchTypes.h" />
<ClInclude Include="..\..\xbmc\input\windows\WINJoystick.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\AddonBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\AndroidBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\ApplicationBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\Builtins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\CECBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIContainerBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIControlBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\LibraryBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\OpticalBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PictureBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PlayerBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\ProfileBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PVRBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\SkinBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\SystemBuiltins.h" />
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\WeatherBuiltins.h" />
<ClInclude Include="..\..\xbmc\interfaces\generic\ILanguageInvocationHandler.h" />
<ClInclude Include="..\..\xbmc\interfaces\generic\ILanguageInvoker.h" />
<ClInclude Include="..\..\xbmc\interfaces\generic\LanguageInvokerThread.h" />
@@ -1926,7 +1959,6 @@
<ClInclude Include="..\..\xbmc\input\XBMC_mouse.h" />
<ClInclude Include="..\..\xbmc\input\XBMC_vkeys.h" />
<ClInclude Include="..\..\xbmc\interfaces\AnnouncementManager.h" />
- <ClInclude Include="..\..\xbmc\interfaces\Builtins.h" />
<ClInclude Include="..\..\xbmc\interfaces\IActionListener.h" />
<ClInclude Include="..\..\xbmc\interfaces\IAnnouncer.h" />
<ClInclude Include="..\..\xbmc\interfaces\info\InfoBool.h" />
@@ -2977,4 +3009,4 @@
</VisualStudio>
</ProjectExtensions>
<Import Project="$(SolutionDir)\$(ProjectFileName).targets.user" Condition="Exists('$(SolutionDir)\$(ProjectFileName).targets.user')" />
-</Project>
+</Project> \ No newline at end of file
diff --git a/project/VS2010Express/XBMC.vcxproj.filters b/project/VS2010Express/XBMC.vcxproj.filters
index 003ad474e1..5317aedb79 100644
--- a/project/VS2010Express/XBMC.vcxproj.filters
+++ b/project/VS2010Express/XBMC.vcxproj.filters
@@ -367,6 +367,9 @@
<Filter Include="messaging\helpers">
<UniqueIdentifier>{b0eadc46-feeb-4aca-9898-590e6b8d29b3}</UniqueIdentifier>
</Filter>
+ <Filter Include="interfaces\builtins">
+ <UniqueIdentifier>{248ffbc4-43f5-4aaf-b259-2dd4f840fcef}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\xbmc\win32\pch.cpp">
@@ -1582,9 +1585,6 @@
<ClCompile Include="..\..\xbmc\dialogs\GUIDialogCache.cpp">
<Filter>dialogs</Filter>
</ClCompile>
- <ClCompile Include="..\..\xbmc\interfaces\Builtins.cpp">
- <Filter>interfaces</Filter>
- </ClCompile>
<ClCompile Include="..\..\xbmc\interfaces\AnnouncementManager.cpp">
<Filter>interfaces</Filter>
</ClCompile>
@@ -3210,6 +3210,57 @@
<ClCompile Include="..\..\xbmc\messaging\helpers\DialogHelper.cpp">
<Filter>messaging\helpers</Filter>
</ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\AddonBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\AndroidBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\ApplicationBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\Builtins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\CECBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIContainerBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\GUIControlBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\LibraryBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\OpticalBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PictureBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PlayerBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\ProfileBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\PVRBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\SkinBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\SystemBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\xbmc\interfaces\builtins\WeatherBuiltins.cpp">
+ <Filter>interfaces\builtins</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\xbmc\win32\pch.h">
@@ -4606,9 +4657,6 @@
<ClInclude Include="..\..\xbmc\dialogs\GUIDialogCache.h">
<Filter>dialogs</Filter>
</ClInclude>
- <ClInclude Include="..\..\xbmc\interfaces\Builtins.h">
- <Filter>interfaces</Filter>
- </ClInclude>
<ClInclude Include="..\..\xbmc\interfaces\IActionListener.h">
<Filter>interfaces</Filter>
</ClInclude>
@@ -6223,6 +6271,57 @@
<ClInclude Include="..\..\xbmc\messaging\helpers\DialogHelper.h">
<Filter>messaging\helpers</Filter>
</ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\AddonBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\AndroidBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\ApplicationBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\Builtins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\CECBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIContainerBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\GUIControlBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\LibraryBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\OpticalBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PictureBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PlayerBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\ProfileBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\PVRBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\SkinBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\SystemBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\xbmc\interfaces\builtins\WeatherBuiltins.h">
+ <Filter>interfaces\builtins</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\xbmc\win32\XBMC_PC.rc">
@@ -6309,4 +6408,4 @@
<Filter>shaders</Filter>
</FxCompile>
</ItemGroup>
-</Project>
+</Project> \ No newline at end of file
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
index a6224c25b9..bcf6075a97 100644
--- a/xbmc/Application.cpp
+++ b/xbmc/Application.cpp
@@ -24,7 +24,7 @@
#include "Application.h"
#include "events/EventLog.h"
#include "events/NotificationEvent.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "utils/Variant.h"
#include "utils/Splash.h"
#include "LangInfo.h"
@@ -2186,10 +2186,10 @@ bool CApplication::OnAction(const CAction &action)
// built in functions : execute the built-in
if (action.GetID() == ACTION_BUILT_IN_FUNCTION)
{
- if (!CBuiltins::IsSystemPowerdownCommand(action.GetName()) ||
+ if (!CBuiltins::GetInstance().IsSystemPowerdownCommand(action.GetName()) ||
g_PVRManager.CanSystemPowerdown())
{
- CBuiltins::Execute(action.GetName());
+ CBuiltins::GetInstance().Execute(action.GetName());
m_navigationTimer.StartZero();
}
return true;
@@ -2677,7 +2677,7 @@ void CApplication::OnApplicationMessage(ThreadMessage* pMsg)
break;
case TMSG_EXECUTE_BUILT_IN:
- CBuiltins::Execute(pMsg->strParam.c_str());
+ CBuiltins::GetInstance().Execute(pMsg->strParam.c_str());
break;
case TMSG_PICTURE_SHOW:
@@ -4493,11 +4493,11 @@ bool CApplication::ExecuteXBMCAction(std::string actionStr)
actionStr = CGUIInfoLabel::GetLabel(actionStr);
// user has asked for something to be executed
- if (CBuiltins::HasCommand(actionStr))
+ if (CBuiltins::GetInstance().HasCommand(actionStr))
{
- if (!CBuiltins::IsSystemPowerdownCommand(actionStr) ||
+ if (!CBuiltins::GetInstance().IsSystemPowerdownCommand(actionStr) ||
g_PVRManager.CanSystemPowerdown())
- CBuiltins::Execute(actionStr);
+ CBuiltins::GetInstance().Execute(actionStr);
}
else
{
diff --git a/xbmc/addons/GUIDialogAddonInfo.cpp b/xbmc/addons/GUIDialogAddonInfo.cpp
index b16e85c3b2..4360324f80 100644
--- a/xbmc/addons/GUIDialogAddonInfo.cpp
+++ b/xbmc/addons/GUIDialogAddonInfo.cpp
@@ -40,7 +40,7 @@
#include "utils/Variant.h"
#include "addons/AddonInstaller.h"
#include "Util.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include <utility>
@@ -216,7 +216,7 @@ void CGUIDialogAddonInfo::OnLaunch()
return;
Close();
- CBuiltins::Execute("RunAddon(" + m_localAddon->ID() + ")");
+ CBuiltins::GetInstance().Execute("RunAddon(" + m_localAddon->ID() + ")");
}
bool CGUIDialogAddonInfo::PromptIfDependency(int heading, int line2)
diff --git a/xbmc/input/ButtonTranslator.cpp b/xbmc/input/ButtonTranslator.cpp
index 398fef7b0d..ca948be2aa 100644
--- a/xbmc/input/ButtonTranslator.cpp
+++ b/xbmc/input/ButtonTranslator.cpp
@@ -19,7 +19,7 @@
*/
#include "system.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "ButtonTranslator.h"
#include "profiles/ProfilesManager.h"
#include "utils/URIUtils.h"
@@ -1365,7 +1365,7 @@ bool CButtonTranslator::TranslateActionString(const char *szAction, int &action)
action = ACTION_NONE;
std::string strAction = szAction;
StringUtils::ToLower(strAction);
- if (CBuiltins::HasCommand(strAction))
+ if (CBuiltins::GetInstance().HasCommand(strAction))
action = ACTION_BUILT_IN_FUNCTION;
for (unsigned int index=0;index < ARRAY_SIZE(actions);++index)
diff --git a/xbmc/interfaces/Builtins.cpp b/xbmc/interfaces/Builtins.cpp
deleted file mode 100644
index cfe3ca6268..0000000000
--- a/xbmc/interfaces/Builtins.cpp
+++ /dev/null
@@ -1,1922 +0,0 @@
-/*
- * Copyright (C) 2005-2013 Team XBMC
- * http://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 XBMC; see the file COPYING. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "network/Network.h"
-#include "system.h"
-#include "utils/AlarmClock.h"
-#include "utils/Screenshot.h"
-#include "utils/SeekHandler.h"
-#include "Application.h"
-#include "messaging/ApplicationMessenger.h"
-#include "messaging/helpers/DialogHelper.h"
-#include "Autorun.h"
-#include "Builtins.h"
-#include "input/ButtonTranslator.h"
-#include "input/InputManager.h"
-#include "FileItem.h"
-#include "addons/GUIDialogAddonSettings.h"
-#include "dialogs/GUIDialogFileBrowser.h"
-#include "guilib/GUIKeyboardFactory.h"
-#include "input/Key.h"
-#include "guilib/StereoscopicsManager.h"
-#include "guilib/GUIAudioManager.h"
-#include "dialogs/GUIDialogKaiToast.h"
-#include "dialogs/GUIDialogNumeric.h"
-#include "dialogs/GUIDialogProgress.h"
-#include "GUIUserMessages.h"
-#include "windows/GUIWindowLoginScreen.h"
-#include "video/windows/GUIWindowVideoBase.h"
-#include "addons/GUIWindowAddonBrowser.h"
-#include "addons/Addon.h" // for TranslateType, TranslateContent
-#include "addons/AddonInstaller.h"
-#include "addons/AddonManager.h"
-#include "addons/PluginSource.h"
-#include "addons/RepositoryUpdater.h"
-#include "addons/Skin.h"
-#include "interfaces/generic/ScriptInvocationManager.h"
-#include "interfaces/AnnouncementManager.h"
-#include "network/NetworkServices.h"
-#include "utils/log.h"
-#include "storage/MediaManager.h"
-#include "utils/RssManager.h"
-#include "utils/JSONVariantParser.h"
-#include "PartyModeManager.h"
-#include "profiles/ProfilesManager.h"
-#include "settings/DisplaySettings.h"
-#include "settings/Settings.h"
-#include "settings/MediaSettings.h"
-#include "settings/MediaSourceSettings.h"
-#include "settings/SkinSettings.h"
-#include "utils/StringUtils.h"
-#include "utils/URIUtils.h"
-#include "utils/Variant.h"
-#include "video/VideoLibraryQueue.h"
-#include "Util.h"
-#include "URL.h"
-#include "music/MusicDatabase.h"
-#include "cores/IPlayer.h"
-#include "pvr/channels/PVRChannel.h"
-#include "pvr/recordings/PVRRecording.h"
-#include "pvr/PVRManager.h"
-
-#include "filesystem/PluginDirectory.h"
-#ifdef HAS_FILESYSTEM_RAR
-#include "filesystem/RarManager.h"
-#endif
-#include "filesystem/ZipManager.h"
-
-#include "guilib/GUIWindowManager.h"
-#include "guilib/LocalizeStrings.h"
-
-#ifdef HAS_LIRC
-#include "input/linux/LIRC.h"
-#endif
-#ifdef HAS_IRSERVERSUITE
-
- #include "input/windows/IRServerSuite.h"
-
-#endif
-
-#if defined(TARGET_DARWIN)
-#include "filesystem/SpecialProtocol.h"
-#include "osx/CocoaInterface.h"
-#endif
-
-#ifdef HAS_CDDA_RIPPER
-#include "cdrip/CDDARipper.h"
-#endif
-
-#include <vector>
-#include "settings/AdvancedSettings.h"
-#include "settings/DisplaySettings.h"
-#include "powermanagement/PowerManager.h"
-#include "filesystem/Directory.h"
-
-using namespace XFILE;
-using namespace ADDON;
-using namespace KODI::MESSAGING;
-
-#ifdef HAS_DVD_DRIVE
-using namespace MEDIA_DETECT;
-#endif
-
-using KODI::MESSAGING::HELPERS::DialogResponse;
-
-typedef struct
-{
- const char* command;
- bool needsParameters;
- const char* description;
-} BUILT_IN;
-
-const BUILT_IN commands[] = {
- { "Help", false, "This help message" },
- { "Reboot", false, "Reboot the system" },
- { "Restart", false, "Restart the system (same as reboot)" },
- { "ShutDown", false, "Shutdown the system" },
- { "Powerdown", false, "Powerdown system" },
- { "Quit", false, "Quit Kodi" },
- { "Hibernate", false, "Hibernates the system" },
- { "Suspend", false, "Suspends the system" },
- { "InhibitIdleShutdown", false, "Inhibit idle shutdown" },
- { "AllowIdleShutdown", false, "Allow idle shutdown" },
- { "ActivateScreensaver", false, "Activate Screensaver" },
- { "RestartApp", false, "Restart Kodi" },
- { "Minimize", false, "Minimize Kodi" },
- { "Reset", false, "Reset the system (same as reboot)" },
- { "Mastermode", false, "Control master mode" },
- { "SetGUILanguage", true, "Set GUI Language" },
- { "ActivateWindow", true, "Activate the specified window" },
- { "ActivateWindowAndFocus", true, "Activate the specified window and sets focus to the specified id" },
- { "ReplaceWindowAndFocus", true, "Replaces the current window with the new one and sets focus to the specified id" },
- { "ReplaceWindow", true, "Replaces the current window with the new one" },
- { "TakeScreenshot", false, "Takes a Screenshot" },
- { "RunScript", true, "Run the specified script" },
- { "StopScript", true, "Stop the script by ID or path, if running" },
-#if defined(TARGET_DARWIN)
- { "RunAppleScript", true, "Run the specified AppleScript command" },
-#endif
- { "RunPlugin", true, "Run the specified plugin" },
- { "RunAddon", true, "Run the specified plugin/script" },
- { "NotifyAll", true, "Notify all connected clients" },
- { "Extract", true, "Extracts the specified archive" },
- { "PlayMedia", true, "Play the specified media file (or playlist)" },
- { "Seek", true, "Performs a seek in seconds on the current playing media file" },
- { "ShowPicture", true, "Display a picture by file path" },
- { "SlideShow", true, "Run a slideshow from the specified directory" },
- { "RecursiveSlideShow", true, "Run a slideshow from the specified directory, including all subdirs" },
- { "ReloadSkin", false, "Reload Kodi's skin" },
- { "UnloadSkin", false, "Unload Kodi's skin" },
- { "RefreshRSS", false, "Reload RSS feeds from RSSFeeds.xml"},
- { "PlayerControl", true, "Control the music or video player" },
- { "Playlist.PlayOffset", true, "Start playing from a particular offset in the playlist" },
- { "Playlist.Clear", false, "Clear the current playlist" },
- { "EjectTray", false, "Close or open the DVD tray" },
- { "AlarmClock", true, "Prompt for a length of time and start an alarm clock" },
- { "CancelAlarm", true, "Cancels an alarm" },
- { "Action", true, "Executes an action for the active window (same as in keymap)" },
- { "Notification", true, "Shows a notification on screen, specify header, then message, and optionally time in milliseconds and a icon." },
- { "PlayDVD", false, "Plays the inserted CD or DVD media from the DVD-ROM Drive!" },
- { "RipCD", false, "Rip the currently inserted audio CD"},
- { "Skin.ToggleSetting", true, "Toggles a skin setting on or off" },
- { "Skin.ToggleDebug", false, "Toggles skin debug info on or off" },
- { "Skin.SetString", true, "Prompts and sets skin string" },
- { "Skin.SetNumeric", true, "Prompts and sets numeric input" },
- { "Skin.SetPath", true, "Prompts and sets a skin path" },
- { "Skin.Theme", true, "Control skin theme" },
- { "Skin.SetImage", true, "Prompts and sets a skin image" },
- { "Skin.SetLargeImage", true, "Prompts and sets a large skin images" },
- { "Skin.SetFile", true, "Prompts and sets a file" },
- { "Skin.SetAddon", true, "Prompts and set an addon" },
- { "Skin.SetBool", true, "Sets a skin setting on" },
- { "Skin.Reset", true, "Resets a skin setting to default" },
- { "Skin.ResetSettings", false, "Resets all skin settings" },
- { "Mute", false, "Mute the player" },
- { "SetVolume", true, "Set the current volume" },
- { "Dialog.Close", true, "Close a dialog" },
- { "System.LogOff", false, "Log off current user" },
- { "System.Exec", true, "Execute shell commands" },
- { "System.ExecWait", true, "Execute shell commands and freezes Kodi until shell is closed" },
- { "Resolution", true, "Change Kodi's Resolution" },
- { "SetFocus", true, "Change current focus to a different control id" },
- { "UpdateLibrary", true, "Update the selected library (music or video)" },
- { "CleanLibrary", true, "Clean the video/music library" },
- { "ExportLibrary", true, "Export the video/music library" },
- { "PageDown", true, "Send a page down event to the pagecontrol with given id" },
- { "PageUp", true, "Send a page up event to the pagecontrol with given id" },
- { "Container.Refresh", false, "Refresh current listing" },
- { "Container.Update", false, "Update current listing. Send Container.Update(path,replace) to reset the path history" },
- { "Container.NextViewMode", false, "Move to the next view type (and refresh the listing)" },
- { "Container.PreviousViewMode", false, "Move to the previous view type (and refresh the listing)" },
- { "Container.SetViewMode", true, "Move to the view with the given id" },
- { "Container.NextSortMethod", false, "Change to the next sort method" },
- { "Container.PreviousSortMethod",false, "Change to the previous sort method" },
- { "Container.SetSortMethod", true, "Change to the specified sort method" },
- { "Container.SortDirection", false, "Toggle the sort direction" },
- { "Control.Move", true, "Tells the specified control to 'move' to another entry specified by offset" },
- { "Control.SetFocus", true, "Change current focus to a different control id" },
- { "Control.Message", true, "Send a given message to a control within a given window" },
- { "SendClick", true, "Send a click message from the given control to the given window" },
- { "LoadProfile", true, "Load the specified profile (note; if locks are active it won't work)" },
- { "SetProperty", true, "Sets a window property for the current focused window/dialog (key,value)" },
- { "ClearProperty", true, "Clears a window property for the current focused window/dialog (key,value)" },
- { "PlayWith", true, "Play the selected item with the specified core" },
- { "WakeOnLan", true, "Sends the wake-up packet to the broadcast address for the specified MAC address" },
- { "Addon.Default.OpenSettings", true, "Open a settings dialog for the default addon of the given type" },
- { "Addon.Default.Set", true, "Open a select dialog to allow choosing the default addon of the given type" },
- { "Addon.OpenSettings", true, "Open a settings dialog for the addon of the given id" },
- { "UpdateAddonRepos", false, "Check add-on repositories for updates" },
- { "UpdateLocalAddons", false, "Check for local add-on changes" },
- { "ToggleDPMS", false, "Toggle DPMS mode manually"},
- { "CECToggleState", false, "Toggle state of playing device via a CEC peripheral"},
- { "CECActivateSource", false, "Wake up playing device via a CEC peripheral"},
- { "CECStandby", false, "Put playing device on standby via a CEC peripheral"},
- { "Weather.Refresh", false, "Force weather data refresh"},
- { "Weather.LocationNext", false, "Switch to next weather location"},
- { "Weather.LocationPrevious", false, "Switch to previous weather location"},
- { "Weather.LocationSet", true, "Switch to given weather location (parameter can be 1-3)"},
-#if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE)
- { "LIRC.Stop", false, "Removes Kodi as LIRC client" },
- { "LIRC.Start", false, "Adds Kodi as LIRC client" },
- { "LIRC.Send", true, "Sends a command to LIRC" },
-#endif
- { "VideoLibrary.Search", false, "Brings up a search dialog which will search the library" },
- { "ToggleDebug", false, "Enables/disables debug mode" },
- { "ToggleDirtyRegionVisualization", false, "Enables/disables dirty-region visualization" },
- { "StartPVRManager", false, "(Re)Starts the PVR manager (Deprecated)" },
- { "StopPVRManager", false, "Stops the PVR manager (Deprecated)" },
- { "PVR.StartManager", false, "(Re)Starts the PVR manager" },
- { "PVR.StopManager", false, "Stops the PVR manager" },
- { "PVR.SearchMissingChannelIcons", false, "Search for missing channel icons" },
-#if defined(TARGET_ANDROID)
- { "StartAndroidActivity", true, "Launch an Android native app with the given package name. Optional parms (in order): intent, dataType, dataURI." },
-#endif
- { "SetStereoMode", true, "Changes the stereo mode of the GUI. Params can be: toggle, next, previous, select, tomono or any of the supported stereomodes (off, split_vertical, split_horizontal, row_interleaved, hardware_based, anaglyph_cyan_red, anaglyph_green_magenta, anaglyph_yellow_blue, monoscopic)" }
-};
-
-bool CBuiltins::HasCommand(const std::string& execString)
-{
- std::string function;
- std::vector<std::string> parameters;
- CUtil::SplitExecFunction(execString, function, parameters);
- for (unsigned int i = 0; i < sizeof(commands)/sizeof(BUILT_IN); i++)
- {
- if (StringUtils::EqualsNoCase(function, commands[i].command) && (!commands[i].needsParameters || parameters.size()))
- return true;
- }
- return false;
-}
-
-bool CBuiltins::IsSystemPowerdownCommand(const std::string& execString)
-{
- std::string execute;
- std::vector<std::string> params;
- CUtil::SplitExecFunction(execString, execute, params);
- StringUtils::ToLower(execute);
-
- // Check if action is resulting in system powerdown.
- if (execute == "reboot" ||
- execute == "restart" ||
- execute == "reset" ||
- execute == "powerdown" ||
- execute == "hibernate" ||
- execute == "suspend" )
- {
- return true;
- }
- else if (execute == "shutdown")
- {
- switch (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE))
- {
- case POWERSTATE_SHUTDOWN:
- case POWERSTATE_SUSPEND:
- case POWERSTATE_HIBERNATE:
- return true;
-
- default:
- return false;
- }
- }
- return false;
-}
-
-void CBuiltins::GetHelp(std::string &help)
-{
- help.clear();
- for (unsigned int i = 0; i < sizeof(commands)/sizeof(BUILT_IN); i++)
- {
- help += commands[i].command;
- help += "\t";
- help += commands[i].description;
- help += "\n";
- }
-}
-
-bool CBuiltins::ActivateWindow(int iWindowID, const std::vector<std::string>& params /* = {} */, bool swappingWindows /* = false */)
-{
- // disable the screensaver
- g_application.WakeUpScreenSaverAndDPMS();
- g_windowManager.ActivateWindow(iWindowID, params, swappingWindows);
- return true;
-}
-
-int CBuiltins::Execute(const std::string& execString)
-{
- // Deprecated. Get the text after the "XBMC."
- std::string execute;
- std::vector<std::string> params;
- CUtil::SplitExecFunction(execString, execute, params);
- StringUtils::ToLower(execute);
- std::string parameter = params.size() ? params[0] : "";
- std::string paramlow(parameter);
- StringUtils::ToLower(paramlow);
-
- if (execute == "reboot" || execute == "restart" || execute == "reset") //Will reboot the system
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART);
- }
- else if (execute == "shutdown")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN);
- }
- else if (execute == "powerdown")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN);
- }
- else if (execute == "restartapp")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTARTAPP);
- }
- else if (execute == "hibernate")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE);
- }
- else if (execute == "suspend")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND);
- }
- else if (execute == "quit")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT);
- }
- else if (execute == "inhibitidleshutdown")
- {
- bool inhibit = (params.size() == 1 && StringUtils::EqualsNoCase(params[0], "true"));
- CApplicationMessenger::GetInstance().PostMsg(TMSG_INHIBITIDLESHUTDOWN, inhibit);
- }
- else if (execute == "activatescreensaver")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_ACTIVATESCREENSAVER);
- }
- else if (execute == "minimize")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE);
- }
- else if (execute == "loadprofile")
- {
- int index = CProfilesManager::GetInstance().GetProfileIndex(parameter);
- bool prompt = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "prompt"));
- bool bCanceled;
- if (index >= 0
- && (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE
- || g_passwordManager.IsProfileLockUnlocked(index,bCanceled,prompt)))
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_LOADPROFILE, index);
- }
- }
- else if (execute == "mastermode")
- {
- if (g_passwordManager.bMasterUser)
- {
- g_passwordManager.bMasterUser = false;
- g_passwordManager.LockSources(true);
- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20053));
- }
- else if (g_passwordManager.IsMasterLockUnlocked(true))
- {
- g_passwordManager.LockSources(false);
- g_passwordManager.bMasterUser = true;
- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20054));
- }
-
- CUtil::DeleteVideoDatabaseDirectoryCache();
- CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE);
- g_windowManager.SendMessage(msg);
- }
- else if (execute == "setguilanguage")
- {
- if (params.size())
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_SETLANGUAGE, -1, -1, nullptr, params[0]);
- }
- }
- else if (execute == "takescreenshot")
- {
- if (params.size())
- {
- // get the parameters
- std::string strSaveToPath = params[0];
- bool sync = false;
- if (params.size() >= 2)
- sync = StringUtils::EqualsNoCase(params[1], "sync");
-
- if (!strSaveToPath.empty())
- {
- if (CDirectory::Exists(strSaveToPath))
- {
- std::string file = CUtil::GetNextFilename(URIUtils::AddFileToFolder(strSaveToPath, "screenshot%03d.png"), 999);
-
- if (!file.empty())
- {
- CScreenShot::TakeScreenshot(file, sync);
- }
- else
- {
- CLog::Log(LOGWARNING, "Too many screen shots or invalid folder %s", strSaveToPath.c_str());
- }
- }
- else
- CScreenShot::TakeScreenshot(strSaveToPath, sync);
- }
- }
- else
- CScreenShot::TakeScreenshot();
- }
- else if (execute == "activatewindow" || execute == "replacewindow")
- {
- // get the parameters
- std::string strWindow;
- if (params.size())
- {
- strWindow = params[0];
- params.erase(params.begin());
- }
-
- // confirm the window destination is valid prior to switching
- int iWindow = CButtonTranslator::TranslateWindow(strWindow);
- if (iWindow != WINDOW_INVALID)
- {
- // compate the given directory param with the current active directory
- bool bIsSameStartFolder = true;
- if (!params.empty())
- {
- CGUIWindow *activeWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow());
- if (activeWindow && activeWindow->IsMediaWindow())
- bIsSameStartFolder = ((CGUIMediaWindow*) activeWindow)->IsSameStartFolder(params[0]);
- }
-
- // activate window only if window and path differ from the current active window
- if (iWindow != g_windowManager.GetActiveWindow() || !bIsSameStartFolder)
- {
- return ActivateWindow(iWindow, params, execute != "activatewindow");
- }
- }
- else
- {
- CLog::Log(LOGERROR, "Activate/ReplaceWindow called with invalid destination window: %s", strWindow.c_str());
- return false;
- }
- }
- else if ((execute == "setfocus" || execute == "control.setfocus") && params.size())
- {
- int controlID = atol(params[0].c_str());
- int subItem = (params.size() > 1) ? atol(params[1].c_str())+1 : 0;
- CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), controlID, subItem);
- g_windowManager.SendMessage(msg);
- }
- else if ((execute == "activatewindowandfocus" || execute == "replacewindowandfocus") && params.size())
- {
- std::string strWindow = params[0];
-
- // confirm the window destination is valid prior to switching
- int iWindow = CButtonTranslator::TranslateWindow(strWindow);
- if (iWindow != WINDOW_INVALID)
- {
- if (iWindow != g_windowManager.GetActiveWindow())
- {
- if (!ActivateWindow(iWindow, {}, execute != "activatewindowandfocus"))
- return false;
-
- unsigned int iPtr = 1;
- while (params.size() > iPtr + 1)
- {
- CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(),
- atol(params[iPtr].c_str()),
- (params.size() >= iPtr + 2) ? atol(params[iPtr + 1].c_str())+1 : 0);
- g_windowManager.SendMessage(msg);
- iPtr += 2;
- }
- }
- }
- else
- {
- CLog::Log(LOGERROR, "Replace/ActivateWindowAndFocus called with invalid destination window: %s", strWindow.c_str());
- return false;
- }
- }
- else if (execute == "runscript" && params.size())
- {
-#if defined(TARGET_DARWIN_OSX)
- if (URIUtils::HasExtension(parameter, ".applescript|.scpt"))
- {
- std::string osxPath = CSpecialProtocol::TranslatePath(parameter);
- Cocoa_DoAppleScriptFile(osxPath.c_str());
- }
- else
-#endif
- {
- AddonPtr addon;
- std::string scriptpath;
- // Test to see if the param is an addon ID
- if (CAddonMgr::GetInstance().GetAddon(params[0], addon))
- {
- //Get the correct extension point to run
- if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY))
- {
- scriptpath = addon->LibPath();
- }
- else
- {
- //Run a random extension point (old behaviour).
- CAddonMgr::GetInstance().GetAddon(params[0], addon);
- scriptpath = addon->LibPath();
- CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str());
- }
- }
- else
- scriptpath = params[0];
-
- // split the path up to find the filename
- std::vector<std::string> argv = params;
- std::string filename = URIUtils::GetFileName(scriptpath);
- if (!filename.empty())
- argv[0] = filename;
-
- CScriptInvocationManager::GetInstance().ExecuteAsync(scriptpath, addon, argv);
- }
- }
-#if defined(TARGET_DARWIN_OSX)
- else if (execute == "runapplescript")
- {
- Cocoa_DoAppleScript(parameter.c_str());
- }
-#endif
- else if (execute == "stopscript")
- {
- // FIXME: This does not work for addons with multiple extension points!
- // Are there any use for this? TODO: Fix hack in CScreenSaver::Destroy() and deprecate.
- if (!params.empty())
- {
- std::string scriptpath(params[0]);
- // Test to see if the param is an addon ID
- AddonPtr script;
- if (CAddonMgr::GetInstance().GetAddon(params[0], script))
- scriptpath = script->LibPath();
- CScriptInvocationManager::GetInstance().Stop(scriptpath);
- }
- }
- else if (execute == "system.exec")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE);
- CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_OS, 0, -1, nullptr, parameter);
- }
- else if (execute == "system.execwait")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE);
- CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_OS, 1, -1, nullptr, parameter);
- }
- else if (execute == "resolution")
- {
- RESOLUTION res = RES_PAL_4x3;
- if (paramlow == "pal") res = RES_PAL_4x3;
- else if (paramlow == "pal16x9") res = RES_PAL_16x9;
- else if (paramlow == "ntsc") res = RES_NTSC_4x3;
- else if (paramlow == "ntsc16x9") res = RES_NTSC_16x9;
- else if (paramlow == "720p") res = RES_HDTV_720p;
- else if (paramlow == "720psbs") res = RES_HDTV_720pSBS;
- else if (paramlow == "720ptb") res = RES_HDTV_720pTB;
- else if (paramlow == "1080psbs") res = RES_HDTV_1080pSBS;
- else if (paramlow == "1080ptb") res = RES_HDTV_1080pTB;
- else if (paramlow == "1080i") res = RES_HDTV_1080i;
- if (g_graphicsContext.IsValidResolution(res))
- {
- CDisplaySettings::GetInstance().SetCurrentResolution(res, true);
- g_application.ReloadSkin();
- }
- }
- else if (execute == "extract" && params.size())
- {
- // Detects if file is zip or rar then extracts
- std::string strDestDirect;
- if (params.size() < 2)
- strDestDirect = URIUtils::GetDirectory(params[0]);
- else
- strDestDirect = params[1];
-
- URIUtils::AddSlashAtEnd(strDestDirect);
-
- if (URIUtils::IsZIP(params[0]))
- g_ZipManager.ExtractArchive(params[0],strDestDirect);
-#ifdef HAS_FILESYSTEM_RAR
- else if (URIUtils::IsRAR(params[0]))
- g_RarManager.ExtractArchive(params[0],strDestDirect);
-#endif
- else
- CLog::Log(LOGERROR, "Extract, No archive given");
- }
- else if (execute == "runplugin")
- {
- if (params.size())
- {
- CFileItem item(params[0]);
- if (!item.m_bIsFolder)
- {
- item.SetPath(params[0]);
- CPluginDirectory::RunScriptWithParams(item.GetPath());
- }
- }
- else
- {
- CLog::Log(LOGERROR, "RunPlugin called with no arguments.");
- }
- }
- else if (execute == "runaddon")
- {
- if (params.size())
- {
- AddonPtr addon;
- if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_PLUGIN))
- {
- PluginPtr plugin = std::dynamic_pointer_cast<CPluginSource>(addon);
- std::string addonid = params[0];
- std::string urlParameters;
- std::vector<std::string> parameters;
- if (params.size() == 2 &&
- (StringUtils::StartsWith(params[1], "/") || StringUtils::StartsWith(params[1], "?")))
- urlParameters = params[1];
- else if (params.size() > 1)
- {
- parameters.insert(parameters.begin(), params.begin() + 1, params.end());
- urlParameters = "?" + StringUtils::Join(parameters, "&");
- }
- else
- {
- // Add '/' if addon is run without params (will be removed later so it's safe)
- // Otherwise there are 2 entries for the same plugin in ViewModesX.db
- urlParameters = "/";
- }
-
- std::string cmd;
- if (plugin->Provides(CPluginSource::VIDEO))
- cmd = StringUtils::Format("ActivateWindow(Videos,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
- else if (plugin->Provides(CPluginSource::AUDIO))
- cmd = StringUtils::Format("ActivateWindow(Music,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
- else if (plugin->Provides(CPluginSource::EXECUTABLE))
- cmd = StringUtils::Format("ActivateWindow(Programs,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
- else if (plugin->Provides(CPluginSource::IMAGE))
- cmd = StringUtils::Format("ActivateWindow(Pictures,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
- else
- // Pass the script name (params[0]) and all the parameters
- // (params[1] ... params[x]) separated by a comma to RunPlugin
- cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str());
- Execute(cmd);
- }
- else if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) ||
- CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY))
- {
- // Pass the script name (params[0]) and all the parameters
- // (params[1] ... params[x]) separated by a comma to RunScript
- Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str()));
- }
- else
- CLog::Log(LOGERROR, "RunAddon: unknown add-on id '%s', or unexpected add-on type (not a script or plugin).", params[0].c_str());
- }
- else
- {
- CLog::Log(LOGERROR, "RunAddon called with no arguments.");
- }
- }
- else if (execute == "notifyall")
- {
- if (params.size() > 1)
- {
- CVariant data;
- if (params.size() > 2)
- data = CJSONVariantParser::Parse((const unsigned char *)params[2].c_str(), params[2].size());
-
- ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Other, params[0].c_str(), params[1].c_str(), data);
- }
- else
- CLog::Log(LOGERROR, "NotifyAll needs two parameters");
- }
- else if (execute == "playmedia")
- {
- if (!params.size())
- {
- CLog::Log(LOGERROR, "PlayMedia called with empty parameter");
- return -3;
- }
-
- CFileItem item(params[0], false);
- if (URIUtils::HasSlashAtEnd(params[0]))
- item.m_bIsFolder = true;
-
- // restore to previous window if needed
- if( g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW ||
- g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO ||
- g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION )
- g_windowManager.PreviousWindow();
-
- // reset screensaver
- g_application.ResetScreenSaver();
- g_application.WakeUpScreenSaverAndDPMS();
-
- // ask if we need to check guisettings to resume
- bool askToResume = true;
- int playOffset = 0;
- for (unsigned int i = 1 ; i < params.size() ; i++)
- {
- if (StringUtils::EqualsNoCase(params[i], "isdir"))
- item.m_bIsFolder = true;
- else if (params[i] == "1") // set fullscreen or windowed
- CMediaSettings::GetInstance().SetVideoStartWindowed(true);
- else if (StringUtils::EqualsNoCase(params[i], "resume"))
- {
- // force the item to resume (if applicable) (see CApplication::PlayMedia)
- item.m_lStartOffset = STARTOFFSET_RESUME;
- askToResume = false;
- }
- else if (StringUtils::EqualsNoCase(params[i], "noresume"))
- {
- // force the item to start at the beginning (m_lStartOffset is initialized to 0)
- askToResume = false;
- }
- else if (StringUtils::StartsWithNoCase(params[i], "playoffset=")) {
- playOffset = atoi(params[i].substr(11).c_str()) - 1;
- item.SetProperty("playlist_starting_track", playOffset);
- }
- }
-
- if (!item.m_bIsFolder && item.IsPlugin())
- item.SetProperty("IsPlayable", true);
-
- if ( askToResume == true )
- {
- if ( CGUIWindowVideoBase::ShowResumeMenu(item) == false )
- return false;
- }
- if (item.m_bIsFolder)
- {
- CFileItemList items;
- std::string extensions = g_advancedSettings.m_videoExtensions + "|" + g_advancedSettings.GetMusicExtensions();
- CDirectory::GetDirectory(item.GetPath(),items,extensions);
-
- bool containsMusic = false, containsVideo = false;
- for (int i = 0; i < items.Size(); i++)
- {
- bool isVideo = items[i]->IsVideo();
- containsMusic |= !isVideo;
- containsVideo |= isVideo;
-
- if (containsMusic && containsVideo)
- break;
- }
-
- std::unique_ptr<CGUIViewState> state(CGUIViewState::GetViewState(containsVideo ? WINDOW_VIDEO_NAV : WINDOW_MUSIC, items));
- if (state.get())
- items.Sort(state->GetSortMethod());
- else
- items.Sort(SortByLabel, SortOrderAscending);
-
- int playlist = containsVideo? PLAYLIST_VIDEO : PLAYLIST_MUSIC;
- if (containsMusic && containsVideo) //mixed content found in the folder
- {
- for (int i = items.Size() - 1; i >= 0; i--) //remove music entries
- {
- if (!items[i]->IsVideo())
- items.Remove(i);
- }
- }
-
- g_playlistPlayer.ClearPlaylist(playlist);
- g_playlistPlayer.Add(playlist, items);
- g_playlistPlayer.SetCurrentPlaylist(playlist);
- g_playlistPlayer.Play(playOffset);
- }
- else
- {
- int playlist = item.IsAudio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO;
- g_playlistPlayer.ClearPlaylist(playlist);
- g_playlistPlayer.SetCurrentPlaylist(playlist);
-
- // play media
- if (!g_application.PlayMedia(item, playlist))
- {
- CLog::Log(LOGERROR, "PlayMedia could not play media: %s", params[0].c_str());
- return false;
- }
- }
- }
- else if (execute == "seek")
- {
- if (!params.size())
- {
- CLog::Log(LOGERROR, "Seek called with empty parameter");
- return -3;
- }
- if (g_application.m_pPlayer->IsPlaying())
- CSeekHandler::GetInstance().SeekSeconds(atoi(params[0].c_str()));
- }
- else if (execute == "showpicture")
- {
- if (!params.size())
- {
- CLog::Log(LOGERROR, "ShowPicture called with empty parameter");
- return -2;
- }
- CGUIMessage msg(GUI_MSG_SHOW_PICTURE, 0, 0);
- msg.SetStringParam(params[0]);
- CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW);
- if (pWindow) pWindow->OnMessage(msg);
- }
- else if (execute == "slideshow" || execute == "recursiveslideshow")
- {
- if (!params.size())
- {
- CLog::Log(LOGERROR, "SlideShow called with empty parameter");
- return -2;
- }
- std::string beginSlidePath;
- // leave RecursiveSlideShow command as-is
- unsigned int flags = 0;
- if (execute == "recursiveslideshow")
- flags |= 1;
-
- // SlideShow(dir[,recursive][,[not]random][,pause][,beginslide="/path/to/start/slide.jpg"])
- // the beginslide value need be escaped (for '"' or '\' in it, by backslash)
- // and then quoted, or not. See CUtil::SplitParams()
- else
- {
- for (unsigned int i = 1 ; i < params.size() ; i++)
- {
- if (StringUtils::EqualsNoCase(params[i], "recursive"))
- flags |= 1;
- else if (StringUtils::EqualsNoCase(params[i], "random")) // set fullscreen or windowed
- flags |= 2;
- else if (StringUtils::EqualsNoCase(params[i], "notrandom"))
- flags |= 4;
- else if (StringUtils::EqualsNoCase(params[i], "pause"))
- flags |= 8;
- else if (StringUtils::StartsWithNoCase(params[i], "beginslide="))
- beginSlidePath = params[i].substr(11);
- }
- }
-
- CGUIMessage msg(GUI_MSG_START_SLIDESHOW, 0, 0, flags);
- std::vector<std::string> strParams;
- strParams.push_back(params[0]);
- strParams.push_back(beginSlidePath);
- msg.SetStringParams(strParams);
- CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW);
- if (pWindow) pWindow->OnMessage(msg);
- }
- else if (execute == "reloadskin")
- {
- // Reload the skin
- g_application.ReloadSkin(!params.empty() && StringUtils::EqualsNoCase(params[0], "confirm"));
- }
- else if (execute == "unloadskin")
- {
- g_application.UnloadSkin(true); // we're reloading the skin after this
- }
- else if (execute == "refreshrss")
- {
- CRssManager::GetInstance().Reload();
- }
- else if (execute == "playercontrol")
- {
- g_application.ResetScreenSaver();
- g_application.WakeUpScreenSaverAndDPMS();
- if (!params.size())
- {
- CLog::Log(LOGERROR, "PlayerControl called with empty parameter");
- return -3;
- }
- if (paramlow == "play")
- { // play/pause
- // either resume playing, or pause
- if (g_application.m_pPlayer->IsPlaying())
- {
- if (g_application.m_pPlayer->GetPlaySpeed() != 1)
- g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal());
- else
- g_application.m_pPlayer->Pause();
- }
- }
- else if (paramlow == "stop")
- {
- g_application.StopPlaying();
- }
- else if (paramlow =="rewind" || paramlow == "forward")
- {
- if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused())
- {
- int iPlaySpeed = g_application.m_pPlayer->GetPlaySpeed();
- if (paramlow == "rewind" && iPlaySpeed == 1) // Enables Rewinding
- iPlaySpeed *= -2;
- else if (paramlow == "rewind" && iPlaySpeed > 1) //goes down a notch if you're FFing
- iPlaySpeed /= 2;
- else if (paramlow == "forward" && iPlaySpeed < 1) //goes up a notch if you're RWing
- {
- iPlaySpeed /= 2;
- if (iPlaySpeed == -1) iPlaySpeed = 1;
- }
- else
- iPlaySpeed *= 2;
-
- if (iPlaySpeed > 32 || iPlaySpeed < -32)
- iPlaySpeed = 1;
-
- g_application.m_pPlayer->SetPlaySpeed(iPlaySpeed, g_application.IsMutedInternal());
- }
- }
- else if (paramlow == "next")
- {
- g_application.OnAction(CAction(ACTION_NEXT_ITEM));
- }
- else if (paramlow == "previous")
- {
- g_application.OnAction(CAction(ACTION_PREV_ITEM));
- }
- else if (paramlow == "bigskipbackward")
- {
- if (g_application.m_pPlayer->IsPlaying())
- g_application.m_pPlayer->Seek(false, true);
- }
- else if (paramlow == "bigskipforward")
- {
- if (g_application.m_pPlayer->IsPlaying())
- g_application.m_pPlayer->Seek(true, true);
- }
- else if (paramlow == "smallskipbackward")
- {
- if (g_application.m_pPlayer->IsPlaying())
- g_application.m_pPlayer->Seek(false, false);
- }
- else if (paramlow == "smallskipforward")
- {
- if (g_application.m_pPlayer->IsPlaying())
- g_application.m_pPlayer->Seek(true, false);
- }
- else if (StringUtils::StartsWithNoCase(parameter, "seekpercentage"))
- {
- std::string offset;
- if (parameter.size() == 14)
- CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument");
- else if (parameter.size() < 17) // arg must be at least "(N)"
- CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", parameter.substr(14).c_str());
- else
- {
- // Don't bother checking the argument: an invalid arg will do seek(0)
- offset = parameter.substr(15);
- StringUtils::TrimRight(offset, ")");
- float offsetpercent = (float) atof(offset.c_str());
- if (offsetpercent < 0 || offsetpercent > 100)
- CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent);
- else if (g_application.m_pPlayer->IsPlaying())
- g_application.SeekPercentage(offsetpercent);
- }
- }
- else if (paramlow == "showvideomenu")
- {
- if( g_application.m_pPlayer->IsPlaying() )
- g_application.m_pPlayer->OnAction(CAction(ACTION_SHOW_VIDEOMENU));
- }
- else if (paramlow == "record")
- {
- if( g_application.m_pPlayer->IsPlaying() && g_application.m_pPlayer->CanRecord())
- g_application.m_pPlayer->Record(!g_application.m_pPlayer->IsRecording());
- }
- else if (StringUtils::StartsWithNoCase(parameter, "partymode"))
- {
- std::string strXspPath;
- //empty param=music, "music"=music, "video"=video, else xsp path
- PartyModeContext context = PARTYMODECONTEXT_MUSIC;
- if (parameter.size() > 9)
- {
- if (parameter.size() == 16 && StringUtils::EndsWithNoCase(parameter, "video)"))
- context = PARTYMODECONTEXT_VIDEO;
- else if (parameter.size() != 16 || !StringUtils::EndsWithNoCase(parameter, "music)"))
- {
- strXspPath = parameter.substr(10);
- StringUtils::TrimRight(strXspPath, ")");
- context = PARTYMODECONTEXT_UNKNOWN;
- }
- }
- if (g_partyModeManager.IsEnabled())
- g_partyModeManager.Disable();
- else
- g_partyModeManager.Enable(context, strXspPath);
- }
- else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon")
- {
- // get current playlist
- int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
-
- // reverse the current setting
- bool shuffled = g_playlistPlayer.IsShuffled(iPlaylist);
- if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff"))
- return 0;
-
- // check to see if we should notify the user
- bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify"));
- g_playlistPlayer.SetShuffle(iPlaylist, !shuffled, notify);
-
- // save settings for now playing windows
- switch (iPlaylist)
- {
- case PLAYLIST_MUSIC:
- CMediaSettings::GetInstance().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist));
- CSettings::GetInstance().Save();
- break;
- case PLAYLIST_VIDEO:
- CMediaSettings::GetInstance().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist));
- CSettings::GetInstance().Save();
- }
-
- // send message
- CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, g_playlistPlayer.IsShuffled(iPlaylist));
- g_windowManager.SendThreadMessage(msg);
-
- }
- else if (StringUtils::StartsWithNoCase(parameter, "repeat"))
- {
- // get current playlist
- int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
- PLAYLIST::REPEAT_STATE previous_state = g_playlistPlayer.GetRepeat(iPlaylist);
-
- PLAYLIST::REPEAT_STATE state;
- if (paramlow == "repeatall")
- state = PLAYLIST::REPEAT_ALL;
- else if (paramlow == "repeatone")
- state = PLAYLIST::REPEAT_ONE;
- else if (paramlow == "repeatoff")
- state = PLAYLIST::REPEAT_NONE;
- else if (previous_state == PLAYLIST::REPEAT_NONE)
- state = PLAYLIST::REPEAT_ALL;
- else if (previous_state == PLAYLIST::REPEAT_ALL)
- state = PLAYLIST::REPEAT_ONE;
- else
- state = PLAYLIST::REPEAT_NONE;
-
- if (state == previous_state)
- return 0;
-
- // check to see if we should notify the user
- bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify"));
- g_playlistPlayer.SetRepeat(iPlaylist, state, notify);
-
- // save settings for now playing windows
- switch (iPlaylist)
- {
- case PLAYLIST_MUSIC:
- CMediaSettings::GetInstance().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL);
- CSettings::GetInstance().Save();
- break;
- case PLAYLIST_VIDEO:
- CMediaSettings::GetInstance().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL);
- CSettings::GetInstance().Save();
- }
-
- // send messages so now playing window can get updated
- CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state);
- g_windowManager.SendThreadMessage(msg);
- }
- else if (StringUtils::StartsWithNoCase(parameter, "resumelivetv"))
- {
- CFileItem& fileItem(g_application.CurrentFileItem());
- PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr();
-
- if (channel)
- {
- CFileItem playItem(channel);
- if (!g_application.PlayMedia(playItem, channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO))
- {
- CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str());
- return false;
- }
- }
- }
- }
- else if (execute == "playwith")
- {
- g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().GetPlayerCore(parameter);
- g_application.OnAction(CAction(ACTION_PLAYER_PLAY));
- }
- else if (execute == "mute")
- {
- g_application.ToggleMute();
- }
- else if (execute == "setvolume")
- {
- float oldVolume = g_application.GetVolume();
- float volume = (float)strtod(parameter.c_str(), NULL);
-
- g_application.SetVolume(volume);
- if(oldVolume != volume)
- {
- if(params.size() > 1 && StringUtils::EqualsNoCase(params[1], "showVolumeBar"))
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_VOLUME_SHOW, oldVolume < volume ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN);
- }
- }
- }
- else if (execute == "playlist.playoffset")
- {
- // playlist.playoffset(offset)
- // playlist.playoffset(music|video,offset)
- std::string strPos = parameter;
- if (params.size() > 1)
- {
- // ignore any other parameters if present
- std::string strPlaylist = params[0];
- strPos = params[1];
-
- int iPlaylist = PLAYLIST_NONE;
- if (paramlow == "music")
- iPlaylist = PLAYLIST_MUSIC;
- else if (paramlow == "video")
- iPlaylist = PLAYLIST_VIDEO;
-
- // unknown playlist
- if (iPlaylist == PLAYLIST_NONE)
- {
- CLog::Log(LOGERROR,"Playlist.PlayOffset called with unknown playlist: %s", strPlaylist.c_str());
- return false;
- }
-
- // user wants to play the 'other' playlist
- if (iPlaylist != g_playlistPlayer.GetCurrentPlaylist())
- {
- g_application.StopPlaying();
- g_playlistPlayer.Reset();
- g_playlistPlayer.SetCurrentPlaylist(iPlaylist);
- }
- }
- // play the desired offset
- int pos = atol(strPos.c_str());
- // playlist is already playing
- if (g_application.m_pPlayer->IsPlaying())
- g_playlistPlayer.PlayNext(pos);
- // we start playing the 'other' playlist so we need to use play to initialize the player state
- else
- g_playlistPlayer.Play(pos);
- }
- else if (execute == "playlist.clear")
- {
- g_playlistPlayer.Clear();
- }
-#ifdef HAS_DVD_DRIVE
- else if (execute == "ejecttray")
- {
- g_mediaManager.ToggleTray();
- }
-#endif
- else if (execute == "alarmclock" && params.size() > 1)
- {
- // format is alarmclock(name,command[,seconds,true]);
- float seconds = 0;
- if (params.size() > 2)
- {
- if (params[2].find(':') == std::string::npos)
- seconds = static_cast<float>(atoi(params[2].c_str())*60);
- else
- seconds = (float)StringUtils::TimeStringToSeconds(params[2]);
- }
- else
- { // check if shutdown is specified in particular, and get the time for it
- std::string strHeading;
- if (StringUtils::EqualsNoCase(parameter, "shutdowntimer"))
- strHeading = g_localizeStrings.Get(20145);
- else
- strHeading = g_localizeStrings.Get(13209);
- std::string strTime;
- if( CGUIDialogNumeric::ShowAndGetNumber(strTime, strHeading) )
- seconds = static_cast<float>(atoi(strTime.c_str())*60);
- else
- return false;
- }
- bool silent = false;
- bool loop = false;
- for (unsigned int i = 3; i < params.size() ; i++)
- {
- // check "true" for backward comp
- if (StringUtils::EqualsNoCase(params[i], "true") || StringUtils::EqualsNoCase(params[i], "silent"))
- silent = true;
- else if (StringUtils::EqualsNoCase(params[i], "loop"))
- loop = true;
- }
-
- if( g_alarmClock.IsRunning() )
- g_alarmClock.Stop(params[0],silent);
- // no negative times not allowed, loop must have a positive time
- if (seconds < 0 || (seconds == 0 && loop))
- return false;
- g_alarmClock.Start(params[0], seconds, params[1], silent, loop);
- }
- else if (execute == "notification")
- {
- if (params.size() < 2)
- return -1;
- if (params.size() == 4)
- CGUIDialogKaiToast::QueueNotification(params[3],params[0],params[1],atoi(params[2].c_str()));
- else if (params.size() == 3)
- CGUIDialogKaiToast::QueueNotification("",params[0],params[1],atoi(params[2].c_str()));
- else
- CGUIDialogKaiToast::QueueNotification(params[0],params[1]);
- }
- else if (execute == "cancelalarm")
- {
- bool silent = (params.size() > 1 &&
- (StringUtils::EqualsNoCase(params[1], "true") ||
- StringUtils::EqualsNoCase(params[1], "silent")));
- g_alarmClock.Stop(params[0],silent);
- }
- else if (execute == "playdvd")
- {
-#ifdef HAS_DVD_DRIVE
- bool restart = false;
- if (params.size() > 0 && StringUtils::EqualsNoCase(params[0], "restart"))
- restart = true;
- CAutorun::PlayDisc(g_mediaManager.GetDiscPath(), true, restart);
-#endif
- }
- else if (execute == "ripcd")
- {
-#ifdef HAS_CDDA_RIPPER
- CCDDARipper::GetInstance().RipCD();
-#endif
- }
- else if (execute == "skin.togglesetting")
- {
- int setting = CSkinSettings::GetInstance().TranslateBool(parameter);
- CSkinSettings::GetInstance().SetBool(setting, !CSkinSettings::GetInstance().GetBool(setting));
- CSettings::GetInstance().Save();
- }
- else if (execute == "skin.setbool" && params.size())
- {
- if (params.size() > 1)
- {
- int string = CSkinSettings::GetInstance().TranslateBool(params[0]);
- CSkinSettings::GetInstance().SetBool(string, StringUtils::EqualsNoCase(params[1], "true"));
- CSettings::GetInstance().Save();
- return 0;
- }
- // default is to set it to true
- int setting = CSkinSettings::GetInstance().TranslateBool(params[0]);
- CSkinSettings::GetInstance().SetBool(setting, true);
- CSettings::GetInstance().Save();
- }
- else if (execute == "skin.reset")
- {
- CSkinSettings::GetInstance().Reset(parameter);
- CSettings::GetInstance().Save();
- }
- else if (execute == "skin.resetsettings")
- {
- CSkinSettings::GetInstance().Reset();
- CSettings::GetInstance().Save();
- }
- else if (execute == "skin.theme")
- {
- // enumerate themes
- std::vector<std::string> vecTheme;
- CUtil::GetSkinThemes(vecTheme);
-
- int iTheme = -1;
-
- // find current theme
- if (!StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME), "SKINDEFAULT"))
- {
- for (unsigned int i=0;i<vecTheme.size();++i)
- {
- std::string strTmpTheme(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME));
- URIUtils::RemoveExtension(strTmpTheme);
- if (StringUtils::EqualsNoCase(vecTheme[i], strTmpTheme))
- {
- iTheme=i;
- break;
- }
- }
- }
-
- int iParam = atoi(parameter.c_str());
- if (iParam == 0 || iParam == 1)
- iTheme++;
- else if (iParam == -1)
- iTheme--;
- if (iTheme > (int)vecTheme.size()-1)
- iTheme = -1;
- if (iTheme < -1)
- iTheme = vecTheme.size()-1;
-
- std::string strSkinTheme = "SKINDEFAULT";
- if (iTheme != -1 && iTheme < (int)vecTheme.size())
- strSkinTheme = vecTheme[iTheme];
-
- CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME, strSkinTheme);
- // also set the default color theme
- std::string colorTheme(URIUtils::ReplaceExtension(strSkinTheme, ".xml"));
- if (StringUtils::EqualsNoCase(colorTheme, "Textures.xml"))
- colorTheme = "defaults.xml";
- CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS, colorTheme);
- g_application.ReloadSkin();
- }
- else if (execute == "skin.setstring" || execute == "skin.setimage" ||
- execute == "skin.setfile" || execute == "skin.setpath" ||
- execute == "skin.setnumeric" || execute == "skin.setlargeimage")
- {
- // break the parameter up if necessary
- int string = 0;
- if (params.size() > 1)
- {
- string = CSkinSettings::GetInstance().TranslateString(params[0]);
- if (execute == "skin.setstring")
- {
- CSkinSettings::GetInstance().SetString(string, params[1]);
- CSettings::GetInstance().Save();
- return 0;
- }
- }
- else
- string = CSkinSettings::GetInstance().TranslateString(params[0]);
- std::string value = CSkinSettings::GetInstance().GetString(string);
- VECSOURCES localShares;
- g_mediaManager.GetLocalDrives(localShares);
- if (execute == "skin.setstring")
- {
- if (CGUIKeyboardFactory::ShowAndGetInput(value, CVariant{g_localizeStrings.Get(1029)}, true))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- else if (execute == "skin.setnumeric")
- {
- if (CGUIDialogNumeric::ShowAndGetNumber(value, g_localizeStrings.Get(611)))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- else if (execute == "skin.setimage")
- {
- if (params.size() > 2)
- {
- value = params[2];
- URIUtils::AddSlashAtEnd(value);
- bool bIsSource;
- if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
- {
- CMediaSource share;
- share.strName = g_localizeStrings.Get(13278);
- share.strPath = value;
- localShares.push_back(share);
- }
- }
- if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, g_localizeStrings.Get(1030), value))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- else if (execute == "skin.setlargeimage")
- {
- VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources("pictures");
- if (!shares) shares = &localShares;
- if (CGUIDialogFileBrowser::ShowAndGetImage(*shares, g_localizeStrings.Get(1030), value))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- else if (execute == "skin.setfile")
- {
- // Note. can only browse one addon type from here
- // if browsing for addons, required param[1] is addontype string, with optional param[2]
- // as contenttype string see IAddon.h & ADDON::TranslateXX
- std::string strMask = (params.size() > 1) ? params[1] : "";
- StringUtils::ToLower(strMask);
- ADDON::TYPE type;
- if ((type = TranslateType(strMask)) != ADDON_UNKNOWN)
- {
- CURL url;
- url.SetProtocol("addons");
- url.SetHostName("enabled");
- url.SetFileName(strMask+"/");
- localShares.clear();
- std::string content = (params.size() > 2) ? params[2] : "";
- StringUtils::ToLower(content);
- url.SetPassword(content);
- std::string strMask;
- if (type == ADDON_SCRIPT)
- strMask = ".py";
- std::string replace;
- if (CGUIDialogFileBrowser::ShowAndGetFile(url.Get(), strMask, TranslateType(type, true), replace, true, true, true))
- {
- if (StringUtils::StartsWithNoCase(replace, "addons://"))
- CSkinSettings::GetInstance().SetString(string, URIUtils::GetFileName(replace));
- else
- CSkinSettings::GetInstance().SetString(string, replace);
- }
- }
- else
- {
- if (params.size() > 2)
- {
- value = params[2];
- URIUtils::AddSlashAtEnd(value);
- bool bIsSource;
- if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
- {
- CMediaSource share;
- share.strName = g_localizeStrings.Get(13278);
- share.strPath = value;
- localShares.push_back(share);
- }
- }
- if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, g_localizeStrings.Get(1033), value))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- }
- else // execute == "skin.setpath"))
- {
- g_mediaManager.GetNetworkLocations(localShares);
- if (params.size() > 1)
- {
- value = params[1];
- URIUtils::AddSlashAtEnd(value);
- bool bIsSource;
- if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
- {
- CMediaSource share;
- share.strName = g_localizeStrings.Get(13278);
- share.strPath = value;
- localShares.push_back(share);
- }
- }
- if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, g_localizeStrings.Get(1031), value))
- CSkinSettings::GetInstance().SetString(string, value);
- }
- CSettings::GetInstance().Save();
- }
- else if (execute == "skin.setaddon" && params.size() > 1)
- {
- int string = CSkinSettings::GetInstance().TranslateString(params[0]);
- std::vector<ADDON::TYPE> types;
- for (unsigned int i = 1 ; i < params.size() ; i++)
- {
- ADDON::TYPE type = TranslateType(params[i]);
- if (type != ADDON_UNKNOWN)
- types.push_back(type);
- }
- std::string result;
- if (types.size() > 0 && CGUIWindowAddonBrowser::SelectAddonID(types, result, true) == 1)
- {
- CSkinSettings::GetInstance().SetString(string, result);
- CSettings::GetInstance().Save();
- }
- }
- else if (execute == "skin.toggledebug")
- {
- g_SkinInfo->ToggleDebug();
- }
- else if (execute == "dialog.close" && params.size())
- {
- bool bForce = false;
- if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "true"))
- bForce = true;
- if (StringUtils::EqualsNoCase(params[0], "all"))
- {
- g_windowManager.CloseDialogs(bForce);
- }
- else
- {
- int id = CButtonTranslator::TranslateWindow(params[0]);
- CGUIWindow *window = (CGUIWindow *)g_windowManager.GetWindow(id);
- if (window && window->IsDialog())
- ((CGUIDialog *)window)->Close(bForce);
- }
- }
- else if (execute == "system.logoff")
- {
- // there was a commit from cptspiff here which was reverted
- // for keeping the behaviour from Eden in Frodo - see
- // git rev 9ee5f0047b
- if (g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN)
- return -1;
-
- g_application.StopPlaying();
- if (g_application.IsMusicScanning())
- g_application.StopMusicScan();
-
- if (CVideoLibraryQueue::GetInstance().IsRunning())
- CVideoLibraryQueue::GetInstance().CancelAllJobs();
-
- ADDON::CAddonMgr::GetInstance().StopServices(true);
-
- g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1);
- CProfilesManager::GetInstance().LoadMasterProfileForLogin();
- g_passwordManager.bMasterUser = false;
-
- if (!ActivateWindow(WINDOW_LOGIN_SCREEN))
- return false;
-
- if (!CNetworkServices::GetInstance().StartEventServer()) // event server could be needed in some situations
- CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100));
- }
- else if (execute == "pagedown")
- {
- int id = atoi(parameter.c_str());
- CGUIMessage message(GUI_MSG_PAGE_DOWN, g_windowManager.GetFocusedWindow(), id);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "pageup")
- {
- int id = atoi(parameter.c_str());
- CGUIMessage message(GUI_MSG_PAGE_UP, g_windowManager.GetFocusedWindow(), id);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "updatelibrary" && !params.empty())
- {
- bool userInitiated = true;
- if (params.size() > 2)
- userInitiated = StringUtils::EqualsNoCase(params[2], "true");
- if (StringUtils::EqualsNoCase(params[0], "music"))
- {
- if (g_application.IsMusicScanning())
- g_application.StopMusicScan();
- else
- g_application.StartMusicScan(params.size() > 1 ? params[1] : "", userInitiated);
- }
- if (StringUtils::EqualsNoCase(params[0], "video"))
- {
- if (g_application.IsVideoScanning())
- g_application.StopVideoScan();
- else
- g_application.StartVideoScan(params.size() > 1 ? params[1] : "", userInitiated);
- }
- }
- else if (execute == "cleanlibrary")
- {
- bool userInitiated = true;
- if (params.size() > 1)
- userInitiated = StringUtils::EqualsNoCase(params[1], "true");
- if (!params.size() || StringUtils::EqualsNoCase(params[0], "video"))
- {
- if (!g_application.IsVideoScanning())
- g_application.StartVideoCleanup(userInitiated);
- else
- CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning or cleaning");
- }
- else if (StringUtils::EqualsNoCase(params[0], "music"))
- {
- if (!g_application.IsMusicScanning())
- g_application.StartMusicCleanup(userInitiated);
- else
- CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning for media info");
- }
- }
- else if (execute == "exportlibrary" && !params.empty())
- {
- int iHeading = 647;
- if (StringUtils::EqualsNoCase(params[0], "music"))
- iHeading = 20196;
- std::string path;
- VECSOURCES shares;
- g_mediaManager.GetLocalDrives(shares);
- g_mediaManager.GetNetworkLocations(shares);
- g_mediaManager.GetRemovableDrives(shares);
- bool singleFile;
- bool thumbs=false;
- bool actorThumbs=false;
- bool overwrite=false;
- bool cancelled=false;
-
- if (params.size() > 1)
- singleFile = StringUtils::EqualsNoCase(params[1], "true");
- else
- {
- DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20426}, CVariant{20428}, CVariant{20429});
- cancelled = result == DialogResponse::CANCELLED;
- singleFile = result != DialogResponse::YES;
- }
-
- if (cancelled)
- return -1;
-
- if (singleFile)
- {
- if (params.size() > 2)
- thumbs = StringUtils::EqualsNoCase(params[2], "true");
- else
- {
- DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20430}, CVariant{20428}, CVariant{20429});
- cancelled = result == DialogResponse::CANCELLED;
- thumbs = result == DialogResponse::YES;
- }
- }
-
- if (cancelled)
- return -1;
-
- if (thumbs && StringUtils::EqualsNoCase(params[0], "video"))
- {
- if (params.size() > 4)
- actorThumbs = StringUtils::EqualsNoCase(params[4], "true");
- else
- {
- DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20436});
- cancelled = result == DialogResponse::CANCELLED;
- actorThumbs = result == DialogResponse::YES;
- }
- }
-
- if (cancelled)
- return -1;
-
- if (singleFile)
- {
- if (params.size() > 3)
- overwrite = StringUtils::EqualsNoCase(params[3], "true");
- else
- {
- DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20431});
- cancelled = result == DialogResponse::CANCELLED;
- overwrite = result == DialogResponse::YES;
- }
- }
-
- if (cancelled)
- return -1;
-
- if (params.size() > 2)
- path=params[2];
- if (singleFile || !path.empty() ||
- CGUIDialogFileBrowser::ShowAndGetDirectory(shares,
- g_localizeStrings.Get(661), path, true))
- {
- if (StringUtils::EqualsNoCase(params[0], "video"))
- {
- CVideoDatabase videodatabase;
- videodatabase.Open();
- videodatabase.ExportToXML(path, singleFile, thumbs, actorThumbs, overwrite);
- videodatabase.Close();
- }
- else
- {
- if (URIUtils::HasSlashAtEnd(path))
- path = URIUtils::AddFileToFolder(path, "musicdb.xml");
- CMusicDatabase musicdatabase;
- musicdatabase.Open();
- musicdatabase.ExportToXML(path, singleFile, thumbs, overwrite);
- musicdatabase.Close();
- }
- }
- }
- else if (execute == "control.move" && params.size() > 1)
- {
- CGUIMessage message(GUI_MSG_MOVE_OFFSET, g_windowManager.GetFocusedWindow(), atoi(params[0].c_str()), atoi(params[1].c_str()));
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.refresh")
- { // NOTE: These messages require a media window, thus they're sent to the current activewindow.
- // This shouldn't stop a dialog intercepting it though.
- CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 1); // 1 to reset the history
- message.SetStringParam(parameter);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.update" && !params.empty())
- {
- CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 0);
- message.SetStringParam(params[0]);
- if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "replace"))
- message.SetParam2(1); // reset the history
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.nextviewmode")
- {
- CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, 1);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.previousviewmode")
- {
- CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, -1);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.setviewmode")
- {
- CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, atoi(parameter.c_str()));
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.nextsortmethod")
- {
- CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, 1);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.previoussortmethod")
- {
- CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, -1);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.setsortmethod")
- {
- CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, atoi(parameter.c_str()));
- g_windowManager.SendMessage(message);
- }
- else if (execute == "container.sortdirection")
- {
- CGUIMessage message(GUI_MSG_CHANGE_SORT_DIRECTION, g_windowManager.GetActiveWindow(), 0, 0);
- g_windowManager.SendMessage(message);
- }
- else if (execute == "control.message" && params.size() >= 2)
- {
- int controlID = atoi(params[0].c_str());
- int windowID = (params.size() == 3) ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetActiveWindow();
- if (params[1] == "moveup")
- g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, 1);
- else if (params[1] == "movedown")
- g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, -1);
- else if (params[1] == "pageup")
- g_windowManager.SendMessage(GUI_MSG_PAGE_UP, windowID, controlID);
- else if (params[1] == "pagedown")
- g_windowManager.SendMessage(GUI_MSG_PAGE_DOWN, windowID, controlID);
- else if (params[1] == "click")
- g_windowManager.SendMessage(GUI_MSG_CLICKED, controlID, windowID);
- }
- else if (execute == "sendclick" && !params.empty())
- {
- if (params.size() == 2)
- {
- // have a window - convert it
- int windowID = CButtonTranslator::TranslateWindow(params[0]);
- CGUIMessage message(GUI_MSG_CLICKED, atoi(params[1].c_str()), windowID);
- g_windowManager.SendMessage(message);
- }
- else
- { // single param - assume you meant the active window
- CGUIMessage message(GUI_MSG_CLICKED, atoi(params[0].c_str()), g_windowManager.GetActiveWindow());
- g_windowManager.SendMessage(message);
- }
- }
- else if (execute == "action" && !params.empty())
- {
- // try translating the action from our ButtonTranslator
- int actionID;
- if (CButtonTranslator::TranslateActionString(params[0].c_str(), actionID))
- {
- int windowID = params.size() == 2 ? CButtonTranslator::TranslateWindow(params[1]) : WINDOW_INVALID;
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, windowID, -1, static_cast<void*>(new CAction(actionID)));
- }
- }
- else if (execute == "setproperty" && params.size() >= 2)
- {
- CGUIWindow *window = g_windowManager.GetWindow(params.size() > 2 ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetFocusedWindow());
- if (window)
- window->SetProperty(params[0],params[1]);
- }
- else if (execute == "clearproperty" && !params.empty())
- {
- CGUIWindow *window = g_windowManager.GetWindow(params.size() > 1 ? CButtonTranslator::TranslateWindow(params[1]) : g_windowManager.GetFocusedWindow());
- if (window)
- window->SetProperty(params[0],"");
- }
- else if (execute == "wakeonlan")
- {
- g_application.getNetwork().WakeOnLan((char*)params[0].c_str());
- }
- else if (execute == "addon.default.opensettings" && params.size() == 1)
- {
- AddonPtr addon;
- ADDON::TYPE type = TranslateType(params[0]);
- if (CAddonMgr::GetInstance().GetDefault(type, addon))
- {
- bool changed = CGUIDialogAddonSettings::ShowAndGetInput(addon);
- if (type == ADDON_VIZ && changed)
- g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0);
- }
- }
- else if (execute == "addon.default.set" && params.size() == 1)
- {
- std::string addonID;
- TYPE type = TranslateType(params[0]);
- bool allowNone = false;
- if (type == ADDON_VIZ)
- allowNone = true;
-
- if (type != ADDON_UNKNOWN &&
- CGUIWindowAddonBrowser::SelectAddonID(type,addonID,allowNone))
- {
- CAddonMgr::GetInstance().SetDefault(type,addonID);
- if (type == ADDON_VIZ)
- g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0);
- }
- }
- else if (execute == "addon.opensettings" && params.size() == 1)
- {
- AddonPtr addon;
- if (CAddonMgr::GetInstance().GetAddon(params[0], addon))
- CGUIDialogAddonSettings::ShowAndGetInput(addon);
- }
- else if (execute == "updateaddonrepos")
- {
- CRepositoryUpdater::GetInstance().CheckForUpdates();
- }
- else if (execute == "updatelocaladdons")
- {
- CAddonMgr::GetInstance().FindAddons();
- }
- else if (execute == "toggledpms")
- {
- g_application.ToggleDPMS(true);
- }
- else if (execute == "cectogglestate")
- {
- bool result;
- CApplicationMessenger::GetInstance().SendMsg(TMSG_CECTOGGLESTATE, 0, 0, static_cast<void*>(&result));
- }
- else if (execute == "cecactivatesource")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_CECACTIVATESOURCE);
- }
- else if (execute == "cecstandby")
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_CECSTANDBY);
- }
- else if (execute == "weather.locationset" && !params.empty())
- {
- int loc = atoi(params[0].c_str());
- CGUIMessage msg(GUI_MSG_ITEM_SELECT, 0, 0, loc);
- g_windowManager.SendMessage(msg, WINDOW_WEATHER);
- }
- else if (execute == "weather.locationnext")
- {
- CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, 1);
- g_windowManager.SendMessage(msg, WINDOW_WEATHER);
- }
- else if (execute == "weather.locationprevious")
- {
- CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, -1);
- g_windowManager.SendMessage(msg, WINDOW_WEATHER);
- }
- else if (execute == "weather.refresh")
- {
- CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, 0);
- g_windowManager.SendMessage(msg, WINDOW_WEATHER);
- }
- else if (execute == "videolibrary.search")
- {
- CGUIMessage msg(GUI_MSG_SEARCH, 0, 0, 0);
- g_windowManager.SendMessage(msg, WINDOW_VIDEO_NAV);
- }
- else if (execute == "toggledebug")
- {
- bool debug = CSettings::GetInstance().GetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO);
- CSettings::GetInstance().SetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO, !debug);
- g_advancedSettings.SetDebugMode(!debug);
- }
- else if (execute == "toggledirtyregionvisualization")
- {
- g_advancedSettings.ToggleDirtyRegionVisualization();
- }
- //TODO deprecated. To be replaced by pvr.startmanager
- else if (execute == "startpvrmanager")
- {
- g_application.StartPVRManager();
- }
- else if (execute == "pvr.startmanager")
- {
- g_application.StartPVRManager();
- }
- //TODO deprecated. To be replaced by pvr.stopmanager
- else if (execute == "stoppvrmanager")
- {
- g_application.StopPVRManager();
- }
- else if (execute == "pvr.stopmanager")
- {
- g_application.StopPVRManager();
- }
- else if (execute == "pvr.searchmissingchannelicons")
- {
- PVR::CPVRManager::GetInstance().TriggerSearchMissingChannelIcons();
- }
- else if (execute == "startandroidactivity" && !params.empty())
- {
- CApplicationMessenger::GetInstance().PostMsg(TMSG_START_ANDROID_ACTIVITY, -1, -1, static_cast<void*>(&params));
- }
- else if (execute == "setstereomode" && !parameter.empty())
- {
- CAction action = CStereoscopicsManager::GetInstance().ConvertActionCommandToAction(execute, parameter);
- if (action.GetID() != ACTION_NONE)
- CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(action)));
- else
- {
- CLog::Log(LOGERROR,"Builtin 'SetStereoMode' called with unknown parameter: %s", parameter.c_str());
- return -2;
- }
- }
- else
- return CInputManager::GetInstance().ExecuteBuiltin(execute, params);
- return 0;
-}
diff --git a/xbmc/interfaces/Makefile.in b/xbmc/interfaces/Makefile.in
index f375e65823..bde01b14b9 100644
--- a/xbmc/interfaces/Makefile.in
+++ b/xbmc/interfaces/Makefile.in
@@ -1,5 +1,4 @@
SRCS = AnnouncementManager.cpp
-SRCS += Builtins.cpp
LIB = interfaces.a
diff --git a/xbmc/interfaces/builtins/AddonBuiltins.cpp b/xbmc/interfaces/builtins/AddonBuiltins.cpp
new file mode 100644
index 0000000000..77f1fad8fe
--- /dev/null
+++ b/xbmc/interfaces/builtins/AddonBuiltins.cpp
@@ -0,0 +1,310 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "AddonBuiltins.h"
+
+#include <memory>
+
+#include "addons/AddonManager.h"
+#include "addons/GUIDialogAddonSettings.h"
+#include "addons/GUIWindowAddonBrowser.h"
+#include "addons/PluginSource.h"
+#include "addons/RepositoryUpdater.h"
+#include "FileItem.h"
+#include "filesystem/PluginDirectory.h"
+#include "guilib/GUIWindowManager.h"
+#include "GUIUserMessages.h"
+#include "interfaces/generic/ScriptInvocationManager.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+
+#if defined(TARGET_DARWIN)
+#include "filesystem/SpecialProtocol.h"
+#include "osx/CocoaInterface.h"
+#endif
+
+using namespace ADDON;
+
+/*! \brief Run a plugin.
+ * \param params The parameters.
+ * \details params[0] = plugin:// URL to script.
+ */
+static int RunPlugin(const std::vector<std::string>& params)
+{
+ if (params.size())
+ {
+ CFileItem item(params[0]);
+ if (!item.m_bIsFolder)
+ {
+ item.SetPath(params[0]);
+ XFILE::CPluginDirectory::RunScriptWithParams(item.GetPath());
+ }
+ }
+ else
+ CLog::Log(LOGERROR, "RunPlugin called with no arguments.");
+
+ return 0;
+}
+
+/*! \brief Run a script or plugin add-on.
+ * \param params The parameters.
+ * \details params[0] = add-on id.
+ * params[1] is blank for no add-on parameters
+ * or
+ * params[1] = add-on parameters in url format
+ * or
+ * params[1,...] = additional parameters in format param=value.
+ */
+static int RunAddon(const std::vector<std::string>& params)
+{
+ if (params.size())
+ {
+ AddonPtr addon;
+ if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_PLUGIN))
+ {
+ PluginPtr plugin = std::dynamic_pointer_cast<CPluginSource>(addon);
+ std::string addonid = params[0];
+ std::string urlParameters;
+ std::vector<std::string> parameters;
+ if (params.size() == 2 &&
+ (StringUtils::StartsWith(params[1], "/") || StringUtils::StartsWith(params[1], "?")))
+ urlParameters = params[1];
+ else if (params.size() > 1)
+ {
+ parameters.insert(parameters.begin(), params.begin() + 1, params.end());
+ urlParameters = "?" + StringUtils::Join(parameters, "&");
+ }
+ else
+ {
+ // Add '/' if addon is run without params (will be removed later so it's safe)
+ // Otherwise there are 2 entries for the same plugin in ViewModesX.db
+ urlParameters = "/";
+ }
+
+ std::string cmd;
+ if (plugin->Provides(CPluginSource::VIDEO))
+ cmd = StringUtils::Format("ActivateWindow(Videos,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
+ else if (plugin->Provides(CPluginSource::AUDIO))
+ cmd = StringUtils::Format("ActivateWindow(Music,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
+ else if (plugin->Provides(CPluginSource::EXECUTABLE))
+ cmd = StringUtils::Format("ActivateWindow(Programs,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
+ else if (plugin->Provides(CPluginSource::IMAGE))
+ cmd = StringUtils::Format("ActivateWindow(Pictures,plugin://%s%s,return)", addonid.c_str(), urlParameters.c_str());
+ else
+ // Pass the script name (params[0]) and all the parameters
+ // (params[1] ... params[x]) separated by a comma to RunPlugin
+ cmd = StringUtils::Format("RunPlugin(%s)", StringUtils::Join(params, ",").c_str());
+ CBuiltins::GetInstance().Execute(cmd);
+ }
+ else if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY))
+ {
+ // Pass the script name (params[0]) and all the parameters
+ // (params[1] ... params[x]) separated by a comma to RunScript
+ CBuiltins::GetInstance().Execute(StringUtils::Format("RunScript(%s)", StringUtils::Join(params, ",").c_str()));
+ }
+ else
+ CLog::Log(LOGERROR, "RunAddon: unknown add-on id '%s', or unexpected add-on type (not a script or plugin).", params[0].c_str());
+ }
+ else
+ {
+ CLog::Log(LOGERROR, "RunAddon called with no arguments.");
+ }
+
+ return 0;
+}
+
+/*! \brief Run a script add-on or an apple script.
+ * \param params The parameters.
+ * \details params[0] is the URL to the apple script
+ * or
+ * params[0] is the addon-ID to the script add-on
+ * or
+ * params[0] is the URL to the python script.
+ *
+ * Set the OnlyApple template parameter to true to only attempt
+ * execution of applescripts.
+ */
+template<bool OnlyApple=false>
+static int RunScript(const std::vector<std::string>& params)
+{
+#if defined(TARGET_DARWIN_OSX)
+ std::string execute;
+ std::string parameter = params.size() ? params[0] : "";
+ if (URIUtils::HasExtension(parameter, ".applescript|.scpt"))
+ {
+ std::string osxPath = CSpecialProtocol::TranslatePath(parameter);
+ Cocoa_DoAppleScriptFile(osxPath.c_str());
+ }
+ else if (OnlyApple)
+ return 1;
+ else
+#endif
+ {
+ AddonPtr addon;
+ std::string scriptpath;
+ // Test to see if the param is an addon ID
+ if (CAddonMgr::GetInstance().GetAddon(params[0], addon))
+ {
+ //Get the correct extension point to run
+ if (CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_WEATHER) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LYRICS) ||
+ CAddonMgr::GetInstance().GetAddon(params[0], addon, ADDON_SCRIPT_LIBRARY))
+ {
+ scriptpath = addon->LibPath();
+ }
+ else
+ {
+ //Run a random extension point (old behaviour).
+ CAddonMgr::GetInstance().GetAddon(params[0], addon);
+ scriptpath = addon->LibPath();
+ CLog::Log(LOGWARNING, "RunScript called for a non-script addon '%s'. This behaviour is deprecated.", params[0].c_str());
+ }
+ }
+ else
+ scriptpath = params[0];
+
+ // split the path up to find the filename
+ std::vector<std::string> argv = params;
+ std::string filename = URIUtils::GetFileName(scriptpath);
+ if (!filename.empty())
+ argv[0] = filename;
+
+ CScriptInvocationManager::GetInstance().ExecuteAsync(scriptpath, addon, argv);
+ }
+
+ return 0;
+}
+
+/*! \brief Open the settings for the default add-on of a given type.
+ * \param params The parameters.
+ * \details params[0] = The add-on type.
+ */
+static int OpenDefaultSettings(const std::vector<std::string>& params)
+{
+ AddonPtr addon;
+ ADDON::TYPE type = TranslateType(params[0]);
+ if (CAddonMgr::GetInstance().GetDefault(type, addon))
+ {
+ bool changed = CGUIDialogAddonSettings::ShowAndGetInput(addon);
+ if (type == ADDON_VIZ && changed)
+ g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0);
+ }
+
+ return 0;
+}
+
+/*! \brief Set the default add-on for a given type.
+ * \param params The parameters.
+ * \details params[0] = The add-on type
+ */
+static int SetDefaultAddon(const std::vector<std::string>& params)
+{
+ std::string addonID;
+ TYPE type = TranslateType(params[0]);
+ bool allowNone = false;
+ if (type == ADDON_VIZ)
+ allowNone = true;
+
+ if (type != ADDON_UNKNOWN &&
+ CGUIWindowAddonBrowser::SelectAddonID(type,addonID,allowNone))
+ {
+ CAddonMgr::GetInstance().SetDefault(type,addonID);
+ if (type == ADDON_VIZ)
+ g_windowManager.SendMessage(GUI_MSG_VISUALISATION_RELOAD, 0, 0);
+ }
+
+ return 0;
+}
+
+/*! \brief Open the settings for a given add-on.
+ * \param params The parameters.
+ * \details params[0] = The add-on ID.
+ */
+static int AddonSettings(const std::vector<std::string>& params)
+{
+ AddonPtr addon;
+ if (CAddonMgr::GetInstance().GetAddon(params[0], addon))
+ CGUIDialogAddonSettings::ShowAndGetInput(addon);
+
+ return 0;
+}
+
+/*! \brief Stop a running script.
+ * \param params The parameters.
+ * \details params[0] = The add-on ID of the script to stop
+ * or
+ * params[0] = The URL of the script to stop.
+ */
+static int StopScript(const std::vector<std::string>& params)
+{
+ // FIXME: This does not work for addons with multiple extension points!
+ // Are there any use for this? TODO: Fix hack in CScreenSaver::Destroy() and deprecate.
+ std::string scriptpath(params[0]);
+ // Test to see if the param is an addon ID
+ AddonPtr script;
+ if (CAddonMgr::GetInstance().GetAddon(params[0], script))
+ scriptpath = script->LibPath();
+ CScriptInvocationManager::GetInstance().Stop(scriptpath);
+
+ return 0;
+}
+
+/*! \brief Check add-on repositories for updates.
+ * \param params (ignored)
+ */
+static int UpdateRepos(const std::vector<std::string>& params)
+{
+ CRepositoryUpdater::GetInstance().CheckForUpdates();
+
+ return 0;
+}
+
+/*! \brief Check local add-on directories for updates.
+ * \param params (ignored)
+ */
+static int UpdateLocals(const std::vector<std::string>& params)
+{
+ CAddonMgr::GetInstance().FindAddons();
+
+ return 0;
+}
+
+CBuiltins::CommandMap CAddonBuiltins::GetOperations() const
+{
+ return {
+ {"addon.default.opensettings", {"Open a settings dialog for the default addon of the given type", 1, OpenDefaultSettings}},
+ {"addon.default.set", {"Open a select dialog to allow choosing the default addon of the given type", 1, SetDefaultAddon}},
+ {"addon.opensettings", {"Open a settings dialog for the addon of the given id", 1, AddonSettings}},
+ {"runaddon", {"Run the specified plugin/script", 1, RunAddon}},
+#ifdef TARGET_DARWIN
+ {"runapplescript", {"Run the specified AppleScript command", 1, RunScript<true>}},
+#endif
+ {"runplugin", {"Run the specified plugin", 1, RunPlugin}},
+ {"runscript", {"Run the specified script", 1, RunScript}},
+ {"stopscript", {"Stop the script by ID or path, if running", 1, StopScript}},
+ {"updateaddonrepos", {"Check add-on repositories for updates", 0, UpdateRepos}},
+ {"updatelocaladdons", {"Check for local add-on changes", 0, UpdateLocals}}
+ };
+}
diff --git a/xbmc/interfaces/Builtins.h b/xbmc/interfaces/builtins/AddonBuiltins.h
index 3f59ff5f18..2db2d30d1c 100644
--- a/xbmc/interfaces/Builtins.h
+++ b/xbmc/interfaces/builtins/AddonBuiltins.h
@@ -1,7 +1,6 @@
#pragma once
-
/*
- * Copyright (C) 2005-2013 Team XBMC
+ * Copyright (C) 2005-2015 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
@@ -20,18 +19,12 @@
*
*/
-#include <string>
-#include <vector>
+#include "Builtins.h"
-class CBuiltins
+//! \brief Class providing add-on related built-in commands.
+class CAddonBuiltins
{
public:
- static bool HasCommand(const std::string& execString);
- static bool IsSystemPowerdownCommand(const std::string& execString);
- static void GetHelp(std::string &help);
- static int Execute(const std::string& execString);
-
-private:
- static bool ActivateWindow(int iWindowID, const std::vector<std::string>& params = std::vector<std::string>(), bool swappingWindows = false);
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
};
-
diff --git a/xbmc/interfaces/builtins/AndroidBuiltins.cpp b/xbmc/interfaces/builtins/AndroidBuiltins.cpp
new file mode 100644
index 0000000000..95606160f9
--- /dev/null
+++ b/xbmc/interfaces/builtins/AndroidBuiltins.cpp
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "AndroidBuiltins.h"
+
+#include "messaging/ApplicationMessenger.h"
+
+/*! \brief Launch an android system activity.
+ * \param params The parameters.
+ * \details params[0] = package
+ * params[1] = intent (optional)
+ * params[2] = datatype (optional)
+ * params[2] = dataURI (optional)
+ */
+static int LaunchAndroidActivity(const std::vector<std::string>& params)
+{
+ KODI::MESSAGING::CApplicationMessenger::GetInstance().PostMsg(
+ TMSG_START_ANDROID_ACTIVITY, -1, -1, nullptr, "", params);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CAndroidBuiltins::GetOperations() const
+{
+ return {
+ {"startandroidactivity", {"Launch an Android native app with the given package name. Optional parms (in order): intent, dataType, dataURI.", 1, LaunchAndroidActivity}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/AndroidBuiltins.h b/xbmc/interfaces/builtins/AndroidBuiltins.h
new file mode 100644
index 0000000000..166e561df3
--- /dev/null
+++ b/xbmc/interfaces/builtins/AndroidBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing CEC related built-in commands.
+class CAndroidBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/ApplicationBuiltins.cpp b/xbmc/interfaces/builtins/ApplicationBuiltins.cpp
new file mode 100644
index 0000000000..26e6ef3819
--- /dev/null
+++ b/xbmc/interfaces/builtins/ApplicationBuiltins.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "ApplicationBuiltins.h"
+
+#include "Application.h"
+#include "filesystem/RarManager.h"
+#include "filesystem/ZipManager.h"
+#include "messaging/ApplicationMessenger.h"
+#include "interfaces/AnnouncementManager.h"
+#include "network/Network.h"
+#include "settings/AdvancedSettings.h"
+#include "settings/Settings.h"
+#include "utils/FileOperationJob.h"
+#include "utils/JSONVariantParser.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "utils/Variant.h"
+#include <stdlib.h>
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Extract an archive.
+ * \param params The parameters
+ * \details params[0] = The archive URL.
+ * params[1] = Destination path (optional).
+ * If not given, extracts to folder with archive.
+ */
+static int Extract(const std::vector<std::string>& params)
+{
+ // Detects if file is zip or rar then extracts
+ std::string strDestDirect;
+ if (params.size() < 2)
+ strDestDirect = URIUtils::GetDirectory(params[0]);
+ else
+ strDestDirect = params[1];
+
+ URIUtils::AddSlashAtEnd(strDestDirect);
+
+ if (URIUtils::IsZIP(params[0]))
+ g_ZipManager.ExtractArchive(params[0],strDestDirect);
+#ifdef HAS_FILESYSTEM_RAR
+ else if (URIUtils::IsRAR(params[0]))
+ g_RarManager.ExtractArchive(params[0],strDestDirect);
+#endif
+ else
+ CLog::Log(LOGERROR, "Extract, No archive given");
+
+ return 0;
+}
+
+/*! \brief Mute volume.
+ * \param params (ignored)
+ */
+static int Mute(const std::vector<std::string>& params)
+{
+ g_application.ToggleMute();
+
+ return 0;
+}
+
+/*! \brief Notify all listeners on announcement bus.
+ * \param params The parameters.
+ * \details params[0] = sender.
+ * params[1] = data.
+ * params[2] = JSON with extra parameters (optional).
+ */
+static int NotifyAll(const std::vector<std::string>& params)
+{
+ CVariant data;
+ if (params.size() > 2)
+ data = CJSONVariantParser::Parse((const unsigned char *)params[2].c_str(), params[2].size());
+
+ ANNOUNCEMENT::CAnnouncementManager::GetInstance().Announce(ANNOUNCEMENT::Other, params[0].c_str(), params[1].c_str(), data);
+
+ return 0;
+}
+
+/*! \brief Set volume.
+ * \param params the parameters.
+ * \details params[0] = Volume level.
+ * params[1] = "showVolumeBar" to show volume bar (optional).
+ */
+static int SetVolume(const std::vector<std::string>& params)
+{
+ float oldVolume = g_application.GetVolume();
+ float volume = (float)strtod(params[0].c_str(), nullptr);
+
+ g_application.SetVolume(volume);
+ if(oldVolume != volume)
+ {
+ if(params.size() > 1 && StringUtils::EqualsNoCase(params[1], "showVolumeBar"))
+ {
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_VOLUME_SHOW, oldVolume < volume ? ACTION_VOLUME_UP : ACTION_VOLUME_DOWN);
+ }
+ }
+
+ return 0;
+}
+
+/*! \brief Toggle debug info.
+ * \param params (ignored)
+ */
+static int ToggleDebug(const std::vector<std::string>& params)
+{
+ bool debug = CSettings::GetInstance().GetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO);
+ CSettings::GetInstance().SetBool(CSettings::SETTING_DEBUG_SHOWLOGINFO, !debug);
+ g_advancedSettings.SetDebugMode(!debug);
+
+ return 0;
+}
+
+/*! \brief Toggle DPMS state.
+ * \param params (ignored)
+ */
+static int ToggleDPMS(const std::vector<std::string>& params)
+{
+ g_application.ToggleDPMS(true);
+
+ return 0;
+}
+
+/*! \brief Send a WOL packet to a given host.
+ * \param params The parameters.
+ * \details params[0] = The MAC of the host to wake.
+ */
+static int WakeOnLAN(const std::vector<std::string>& params)
+{
+ g_application.getNetwork().WakeOnLan(params[0].c_str());
+
+ return 0;
+}
+
+CBuiltins::CommandMap CApplicationBuiltins::GetOperations() const
+{
+ return {
+ {"extract", {"Extracts the specified archive", 1, Extract}},
+ {"mute", {"Mute the player", 0, Mute}},
+ {"notifyall", {"Notify all connected clients", 2, NotifyAll}},
+ {"setvolume", {"Set the current volume", 1, SetVolume}},
+ {"toggledebug", {"Enables/disables debug mode", 0, ToggleDebug}},
+ {"toggledpms", {"Toggle DPMS mode manually", 0, ToggleDPMS}},
+ {"wakeonlan", {"Sends the wake-up packet to the broadcast address for the specified MAC address", 1, WakeOnLAN}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/ApplicationBuiltins.h b/xbmc/interfaces/builtins/ApplicationBuiltins.h
new file mode 100644
index 0000000000..57c88afac7
--- /dev/null
+++ b/xbmc/interfaces/builtins/ApplicationBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing application related built-in commands.
+class CApplicationBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/Builtins.cpp b/xbmc/interfaces/builtins/Builtins.cpp
new file mode 100644
index 0000000000..5d8bbbec34
--- /dev/null
+++ b/xbmc/interfaces/builtins/Builtins.cpp
@@ -0,0 +1,169 @@
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+#include "Builtins.h"
+
+#include "AddonBuiltins.h"
+#include "ApplicationBuiltins.h"
+#include "CECBuiltins.h"
+#include "GUIBuiltins.h"
+#include "GUIControlBuiltins.h"
+#include "GUIContainerBuiltins.h"
+#include "LibraryBuiltins.h"
+#include "OpticalBuiltins.h"
+#include "PictureBuiltins.h"
+#include "PlayerBuiltins.h"
+#include "ProfileBuiltins.h"
+#include "PVRBuiltins.h"
+#include "SkinBuiltins.h"
+#include "SystemBuiltins.h"
+#include "WeatherBuiltins.h"
+
+#include "input/InputManager.h"
+#include "powermanagement/PowerManager.h"
+#include "settings/Settings.h"
+#include "Util.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+
+#if defined(TARGET_ANDROID)
+#include "AndroidBuiltins.h"
+#endif
+
+#if defined(TARGET_POSIX)
+#include "linux/PlatformDefs.h"
+#endif
+
+CBuiltins::CBuiltins()
+{
+ RegisterCommands<CAddonBuiltins>();
+ RegisterCommands<CApplicationBuiltins>();
+ RegisterCommands<CGUIBuiltins>();
+ RegisterCommands<CGUIContainerBuiltins>();
+ RegisterCommands<CGUIControlBuiltins>();
+ RegisterCommands<CLibraryBuiltins>();
+ RegisterCommands<COpticalBuiltins>();
+ RegisterCommands<CPictureBuiltins>();
+ RegisterCommands<CPlayerBuiltins>();
+ RegisterCommands<CProfileBuiltins>();
+ RegisterCommands<CPVRBuiltins>();
+ RegisterCommands<CSkinBuiltins>();
+ RegisterCommands<CSystemBuiltins>();
+ RegisterCommands<CWeatherBuiltins>();
+
+#if defined(TARGET_ANDROID)
+ RegisterCommands<CAndroidBuiltins>();
+#endif
+}
+
+CBuiltins::~CBuiltins()
+{
+}
+
+CBuiltins& CBuiltins::GetInstance()
+{
+ static CBuiltins sBuiltins;
+ return sBuiltins;
+}
+
+bool CBuiltins::HasCommand(const std::string& execString)
+{
+ std::string function;
+ std::vector<std::string> parameters;
+ CUtil::SplitExecFunction(execString, function, parameters);
+ StringUtils::ToLower(function);
+ const auto& it = m_command.find(function);
+ if (it != m_command.end())
+ {
+ if (it->second.parameters == 0 || it->second.parameters <= parameters.size())
+ return true;
+ }
+
+ return false;
+}
+
+bool CBuiltins::IsSystemPowerdownCommand(const std::string& execString)
+{
+ std::string execute;
+ std::vector<std::string> params;
+ CUtil::SplitExecFunction(execString, execute, params);
+ StringUtils::ToLower(execute);
+
+ // Check if action is resulting in system powerdown.
+ if (execute == "reboot" ||
+ execute == "restart" ||
+ execute == "reset" ||
+ execute == "powerdown" ||
+ execute == "hibernate" ||
+ execute == "suspend" )
+ {
+ return true;
+ }
+ else if (execute == "shutdown")
+ {
+ switch (CSettings::GetInstance().GetInt(CSettings::SETTING_POWERMANAGEMENT_SHUTDOWNSTATE))
+ {
+ case POWERSTATE_SHUTDOWN:
+ case POWERSTATE_SUSPEND:
+ case POWERSTATE_HIBERNATE:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+void CBuiltins::GetHelp(std::string &help)
+{
+ help.clear();
+
+ for (const auto& it : m_command)
+ {
+ help += it.first;
+ help += "\t";
+ help += it.second.description;
+ help += "\n";
+ }
+}
+
+int CBuiltins::Execute(const std::string& execString)
+{
+ // Deprecated. Get the text after the "XBMC."
+ std::string execute;
+ std::vector<std::string> params;
+ CUtil::SplitExecFunction(execString, execute, params);
+ StringUtils::ToLower(execute);
+
+ const auto& it = m_command.find(execute);
+ if (it != m_command.end())
+ {
+ if (it->second.parameters == 0 || params.size() >= it->second.parameters)
+ return it->second.Execute(params);
+ else
+ {
+ CLog::Log(LOGERROR, "%s called with invalid number of parameters (should be: %" PRIdS ", is %" PRIdS")",
+ execute.c_str(), it->second.parameters, params.size());
+ return -1;
+ }
+ }
+ else
+ return CInputManager::GetInstance().ExecuteBuiltin(execute, params);
+}
diff --git a/xbmc/interfaces/builtins/Builtins.h b/xbmc/interfaces/builtins/Builtins.h
new file mode 100644
index 0000000000..87fdd0a482
--- /dev/null
+++ b/xbmc/interfaces/builtins/Builtins.h
@@ -0,0 +1,67 @@
+#pragma once
+
+/*
+ * Copyright (C) 2005-2013 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <map>
+#include <string>
+#include <vector>
+
+class CBuiltins
+{
+public:
+ //! \brief Struct representing a command from handler classes.
+ struct BUILT_IN
+ {
+ std::string description; //!< Description of command (help string)
+ size_t parameters; //!< Number of required parameters (can be 0)
+ int (*Execute)(const std::vector<std::string>& params); //!< Function to handle command
+ };
+
+ //! \brief A map of commands
+ typedef std::map<std::string,CBuiltins::BUILT_IN> CommandMap;
+
+ static CBuiltins& GetInstance();
+
+ bool HasCommand(const std::string& execString);
+ bool IsSystemPowerdownCommand(const std::string& execString);
+ void GetHelp(std::string &help);
+ int Execute(const std::string& execString);
+
+protected:
+ CBuiltins();
+ CBuiltins(const CBuiltins&);
+ const CBuiltins& operator=(const CBuiltins&);
+ virtual ~CBuiltins();
+
+private:
+ CommandMap m_command; //!< Map of registered commands
+
+
+ //! \brief Convenience template used to register commands from providers
+ template<class T>
+ void RegisterCommands()
+ {
+ T t;
+ CommandMap map = t.GetOperations();
+ m_command.insert(map.begin(), map.end());
+ }
+};
+
diff --git a/xbmc/interfaces/builtins/CECBuiltins.cpp b/xbmc/interfaces/builtins/CECBuiltins.cpp
new file mode 100644
index 0000000000..e38e614978
--- /dev/null
+++ b/xbmc/interfaces/builtins/CECBuiltins.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "CECBuiltins.h"
+
+#include "messaging/ApplicationMessenger.h"
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Wake up device through CEC.
+ * \param params (ignored)
+ */
+static int ActivateSource(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_CECACTIVATESOURCE);
+
+ return 0;
+}
+
+/*! \brief Put device in standby through CEC.
+ * \param params (ignored)
+ */
+static int Standby(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_CECSTANDBY);
+
+ return 0;
+}
+
+/*! \brief Toggle device state through CEC.
+ * \param params (ignored)
+ */
+static int ToggleState(const std::vector<std::string>& params)
+{
+ bool result;
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_CECTOGGLESTATE, 0, 0, static_cast<void*>(&result));
+
+ return 0;
+}
+
+CBuiltins::CommandMap CCECBuiltins::GetOperations() const
+{
+ return {
+ {"cectogglestate", {"Toggle state of playing device via a CEC peripheral", 0, ToggleState}},
+ {"cecactivatesource", {"Wake up playing device via a CEC peripheral", 0, ActivateSource}},
+ {"cecstandby", {"Put playing device on standby via a CEC peripheral", 0, Standby}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/CECBuiltins.h b/xbmc/interfaces/builtins/CECBuiltins.h
new file mode 100644
index 0000000000..ec18304b96
--- /dev/null
+++ b/xbmc/interfaces/builtins/CECBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing CEC related built-in commands.
+class CCECBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/GUIBuiltins.cpp b/xbmc/interfaces/builtins/GUIBuiltins.cpp
new file mode 100644
index 0000000000..dcbae990a6
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIBuiltins.cpp
@@ -0,0 +1,435 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "GUIBuiltins.h"
+
+#include "Application.h"
+#include "messaging/ApplicationMessenger.h"
+#include "dialogs/GUIDialogKaiToast.h"
+#include "dialogs/GUIDialogNumeric.h"
+#include "filesystem/Directory.h"
+#include "guilib/GUIWindowManager.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/StereoscopicsManager.h"
+#include "input/ButtonTranslator.h"
+#include "settings/AdvancedSettings.h"
+#include "settings/DisplaySettings.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "Util.h"
+#include "utils/URIUtils.h"
+#include "utils/Screenshot.h"
+#include "utils/RssManager.h"
+#include "utils/AlarmClock.h"
+#include "windows/GUIMediaWindow.h"
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Execute a GUI action.
+ * \param params The parameters.
+ * \details params[0] = Action to execute.
+ * params[1] = Window to send action to (optional).
+ */
+static int Action(const std::vector<std::string>& params)
+{
+ // try translating the action from our ButtonTranslator
+ int actionID;
+ if (CButtonTranslator::TranslateActionString(params[0].c_str(), actionID))
+ {
+ int windowID = params.size() == 2 ? CButtonTranslator::TranslateWindow(params[1]) : WINDOW_INVALID;
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, windowID, -1, static_cast<void*>(new CAction(actionID)));
+ }
+
+ return 0;
+}
+
+/*! \brief Activate a window.
+ * \param params The parameters.
+ * \details params[0] = The window name.
+ * params[1] = Window starting folder (optional).
+ *
+ * Set the Replace template parameter to true to replace current
+ * window in history.
+ */
+ template<bool Replace>
+static int ActivateWindow(const std::vector<std::string>& params2)
+{
+ std::vector<std::string> params(params2);
+ // get the parameters
+ std::string strWindow;
+ if (params.size())
+ {
+ strWindow = params[0];
+ params.erase(params.begin());
+ }
+
+ // confirm the window destination is valid prior to switching
+ int iWindow = CButtonTranslator::TranslateWindow(strWindow);
+ if (iWindow != WINDOW_INVALID)
+ {
+ // compate the given directory param with the current active directory
+ bool bIsSameStartFolder = true;
+ if (!params.empty())
+ {
+ CGUIWindow *activeWindow = g_windowManager.GetWindow(g_windowManager.GetActiveWindow());
+ if (activeWindow && activeWindow->IsMediaWindow())
+ bIsSameStartFolder = ((CGUIMediaWindow*) activeWindow)->IsSameStartFolder(params[0]);
+ }
+
+ // activate window only if window and path differ from the current active window
+ if (iWindow != g_windowManager.GetActiveWindow() || !bIsSameStartFolder)
+ {
+ g_application.WakeUpScreenSaverAndDPMS();
+ g_windowManager.ActivateWindow(iWindow, params, Replace);
+ return 0;
+ }
+ }
+ else
+ {
+ CLog::Log(LOGERROR, "Activate/ReplaceWindow called with invalid destination window: %s", strWindow.c_str());
+ return false;
+ }
+
+ return 1;
+}
+
+/*! \brief Activate a window and give given controls focus.
+ * \param params The parameters.
+ * \details params[0] = The window name.
+ * params[1,...] = Pair of (container ID, focus item).
+ *
+ * Set the Replace template parameter to true to replace current
+ * window in history.
+ */
+ template<bool Replace>
+static int ActivateAndFocus(const std::vector<std::string>& params)
+{
+ std::string strWindow = params[0];
+
+ // confirm the window destination is valid prior to switching
+ int iWindow = CButtonTranslator::TranslateWindow(strWindow);
+ if (iWindow != WINDOW_INVALID)
+ {
+ if (iWindow != g_windowManager.GetActiveWindow())
+ {
+ // disable the screensaver
+ g_application.WakeUpScreenSaverAndDPMS();
+ g_windowManager.ActivateWindow(iWindow, {}, Replace);
+
+ unsigned int iPtr = 1;
+ while (params.size() > iPtr + 1)
+ {
+ CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(),
+ atol(params[iPtr].c_str()),
+ (params.size() >= iPtr + 2) ? atol(params[iPtr + 1].c_str())+1 : 0);
+ g_windowManager.SendMessage(msg);
+ iPtr += 2;
+ }
+ return 0;
+ }
+
+ }
+ else
+ CLog::Log(LOGERROR, "Replace/ActivateWindowAndFocus called with invalid destination window: %s", strWindow.c_str());
+
+ return 1;
+}
+
+/*! \brief Start an alarm clock
+ * \param params The parameters.
+ * \details param[0] = name
+ * param[1] = command
+ * param[2] = Length in seconds (optional).
+ * param[3] = "silent" to suppress notifications.
+ * param[3] = "loop" to loop the alarm.
+ */
+static int AlarmClock(const std::vector<std::string>& params)
+{
+ // format is alarmclock(name,command[,seconds,true]);
+ float seconds = 0;
+ if (params.size() > 2)
+ {
+ if (params[2].find(':') == std::string::npos)
+ seconds = static_cast<float>(atoi(params[2].c_str())*60);
+ else
+ seconds = (float)StringUtils::TimeStringToSeconds(params[2]);
+ }
+ else
+ { // check if shutdown is specified in particular, and get the time for it
+ std::string strHeading;
+ if (StringUtils::EqualsNoCase(params[0], "shutdowntimer"))
+ strHeading = g_localizeStrings.Get(20145);
+ else
+ strHeading = g_localizeStrings.Get(13209);
+ std::string strTime;
+ if( CGUIDialogNumeric::ShowAndGetNumber(strTime, strHeading) )
+ seconds = static_cast<float>(atoi(strTime.c_str())*60);
+ else
+ return false;
+ }
+ bool silent = false;
+ bool loop = false;
+ for (unsigned int i = 3; i < params.size() ; i++)
+ {
+ // check "true" for backward comp
+ if (StringUtils::EqualsNoCase(params[i], "true") || StringUtils::EqualsNoCase(params[i], "silent"))
+ silent = true;
+ else if (StringUtils::EqualsNoCase(params[i], "loop"))
+ loop = true;
+ }
+
+ if( g_alarmClock.IsRunning() )
+ g_alarmClock.Stop(params[0],silent);
+ // no negative times not allowed, loop must have a positive time
+ if (seconds < 0 || (seconds == 0 && loop))
+ return false;
+ g_alarmClock.Start(params[0], seconds, params[1], silent, loop);
+
+ return 0;
+}
+
+/*! \brief Cancel an alarm clock.
+ * \param params The parameters.
+ * \details params[0] = "true" to silently cancel alarm (optional).
+ */
+static int CancelAlarm(const std::vector<std::string>& params)
+{
+ bool silent = (params.size() > 1 &&
+ (StringUtils::EqualsNoCase(params[1], "true") ||
+ StringUtils::EqualsNoCase(params[1], "silent")));
+ g_alarmClock.Stop(params[0],silent);
+
+ return 0;
+}
+
+/*! \brief Clear a property in a window.
+ * \param params The parameters.
+ * \details params[0] = The property to clear.
+ * params[1] = The window to clear property in (optional).
+ */
+static int ClearProperty(const std::vector<std::string>& params)
+{
+ CGUIWindow *window = g_windowManager.GetWindow(params.size() > 1 ? CButtonTranslator::TranslateWindow(params[1]) : g_windowManager.GetFocusedWindow());
+ if (window)
+ window->SetProperty(params[0],"");
+
+ return 0;
+}
+
+/*! \brief Close a dialog.
+ * \param params The parameters.
+ * \details params[0] = "all" to close all dialogs, or dialog name.
+ * params[1] = "true" to force close (skip animations) (optional).
+ */
+static int CloseDialog(const std::vector<std::string>& params)
+{
+ bool bForce = false;
+ if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "true"))
+ bForce = true;
+ if (StringUtils::EqualsNoCase(params[0], "all"))
+ {
+ g_windowManager.CloseDialogs(bForce);
+ }
+ else
+ {
+ int id = CButtonTranslator::TranslateWindow(params[0]);
+ CGUIWindow *window = (CGUIWindow *)g_windowManager.GetWindow(id);
+ if (window && window->IsDialog())
+ ((CGUIDialog *)window)->Close(bForce);
+ }
+
+ return 0;
+}
+
+/*! \brief Send a notification.
+ * \param params The parameters.
+ * \details params[0] = Notification title.
+ * params[1] = Notification text.
+ * params[2] = Display time in milliseconds (optional).
+ * params[3] = Notification icon (optional).
+ */
+static int Notification(const std::vector<std::string>& params)
+{
+ if (params.size() < 2)
+ return -1;
+ if (params.size() == 4)
+ CGUIDialogKaiToast::QueueNotification(params[3],params[0],params[1],atoi(params[2].c_str()));
+ else if (params.size() == 3)
+ CGUIDialogKaiToast::QueueNotification("",params[0],params[1],atoi(params[2].c_str()));
+ else
+ CGUIDialogKaiToast::QueueNotification(params[0],params[1]);
+
+ return 0;
+}
+
+/*! \brief Refresh RSS feed.
+ * \param params (ignored)
+ */
+static int RefreshRSS(const std::vector<std::string>& params)
+{
+ CRssManager::GetInstance().Reload();
+
+ return 0;
+}
+
+/*! \brief Take a screenshot.
+ * \param params The parameters.
+ * \details params[0] = URL to save file to. Blank to use default.
+ * params[1] = "sync" to run synchronously (optional).
+ */
+static int Screenshot(const std::vector<std::string>& params)
+{
+ if (!params.empty())
+ {
+ // get the parameters
+ std::string strSaveToPath = params[0];
+ bool sync = false;
+ if (params.size() >= 2)
+ sync = StringUtils::EqualsNoCase(params[1], "sync");
+
+ if (!strSaveToPath.empty())
+ {
+ if (XFILE::CDirectory::Exists(strSaveToPath))
+ {
+ std::string file = CUtil::GetNextFilename(URIUtils::AddFileToFolder(strSaveToPath, "screenshot%03d.png"), 999);
+
+ if (!file.empty())
+ {
+ CScreenShot::TakeScreenshot(file, sync);
+ }
+ else
+ {
+ CLog::Log(LOGWARNING, "Too many screen shots or invalid folder %s", strSaveToPath.c_str());
+ }
+ }
+ else
+ CScreenShot::TakeScreenshot(strSaveToPath, sync);
+ }
+ }
+ else
+ CScreenShot::TakeScreenshot();
+
+ return 0;
+}
+
+/*! \brief Set GUI language.
+ * \param params The parameters.
+ * \details params[0] = The language to use.
+ */
+static int SetLanguage(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_SETLANGUAGE, -1, -1, nullptr, params[0]);
+
+ return 0;
+}
+
+/*! \brief Set GUI resolution.
+ * \param params The parameters.
+ * \details params[0] = A resolution identifier.
+ */
+static int SetResolution(const std::vector<std::string>& params)
+{
+ RESOLUTION res = RES_PAL_4x3;
+ std::string paramlow(params[0]);
+ StringUtils::ToLower(paramlow);
+ if (paramlow == "pal") res = RES_PAL_4x3;
+ else if (paramlow == "pal16x9") res = RES_PAL_16x9;
+ else if (paramlow == "ntsc") res = RES_NTSC_4x3;
+ else if (paramlow == "ntsc16x9") res = RES_NTSC_16x9;
+ else if (paramlow == "720p") res = RES_HDTV_720p;
+ else if (paramlow == "720psbs") res = RES_HDTV_720pSBS;
+ else if (paramlow == "720ptb") res = RES_HDTV_720pTB;
+ else if (paramlow == "1080psbs") res = RES_HDTV_1080pSBS;
+ else if (paramlow == "1080ptb") res = RES_HDTV_1080pTB;
+ else if (paramlow == "1080i") res = RES_HDTV_1080i;
+ if (g_graphicsContext.IsValidResolution(res))
+ {
+ CDisplaySettings::GetInstance().SetCurrentResolution(res, true);
+ g_application.ReloadSkin();
+ }
+
+ return 0;
+}
+
+/*! \brief Set a property in a window.
+ * \param params The parameters.
+ * \details params[0] = The property to set.
+ * params[1] = The property value.
+ * params[2] = The window to set property in (optional).
+ */
+static int SetProperty(const std::vector<std::string>& params)
+{
+ CGUIWindow *window = g_windowManager.GetWindow(params.size() > 2 ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetFocusedWindow());
+ if (window)
+ window->SetProperty(params[0],params[1]);
+
+ return 0;
+}
+
+/*! \brief Set GUI stereo mode.
+ * \param params The parameters.
+ * \details param[0] = Stereo mode identifier.
+ */
+static int SetStereoMode(const std::vector<std::string>& params)
+{
+ CAction action = CStereoscopicsManager::GetInstance().ConvertActionCommandToAction("SetStereoMode", params[0]);
+ if (action.GetID() != ACTION_NONE)
+ CApplicationMessenger::GetInstance().SendMsg(TMSG_GUI_ACTION, WINDOW_INVALID, -1, static_cast<void*>(new CAction(action)));
+ else
+ {
+ CLog::Log(LOGERROR,"Builtin 'SetStereoMode' called with unknown parameter: %s", params[0].c_str());
+ return -2;
+ }
+
+ return 0;
+}
+
+/*! \brief Toggle visualization of dirty regions.
+ * \param params Ignored.
+ */
+static int ToggleDirty(const std::vector<std::string>&)
+{
+ g_advancedSettings.ToggleDirtyRegionVisualization();
+
+ return 0;
+}
+
+CBuiltins::CommandMap CGUIBuiltins::GetOperations() const
+{
+ return {
+ {"action", {"Executes an action for the active window (same as in keymap)", 1, Action}},
+ {"cancelalarm", {"Cancels an alarm", 1, CancelAlarm}},
+ {"alarmclock", {"Prompt for a length of time and start an alarm clock", 2, AlarmClock}},
+ {"activatewindow", {"Activate the specified window", 1, ActivateWindow<false>}},
+ {"activatewindowandfocus", {"Activate the specified window and sets focus to the specified id", 1, ActivateAndFocus<false>}},
+ {"clearproperty", {"Clears a window property for the current focused window/dialog (key,value)", 1, ClearProperty}},
+ {"dialog.close", {"Close a dialog", 1, CloseDialog}},
+ {"notification", {"Shows a notification on screen, specify header, then message, and optionally time in milliseconds and a icon.", 2, Notification}},
+ {"refreshrss", {"Reload RSS feeds from RSSFeeds.xml", 0, RefreshRSS}},
+ {"replacewindow", {"Replaces the current window with the new one and sets focus to the specified id", 1, ActivateWindow<true>}},
+ {"replacewindowandfocus", {"Replaces the current window with the new one and sets focus to the specified id", 1, ActivateAndFocus<true>}},
+ {"resolution", {"Change Kodi's Resolution", 1, SetResolution}},
+ {"setguilanguage", {"Set GUI Language", 1, SetLanguage}},
+ {"setproperty", {"Sets a window property for the current focused window/dialog (key,value)", 2, SetProperty}},
+ {"setstereomode", {"Changes the stereo mode of the GUI. Params can be: toggle, next, previous, select, tomono or any of the supported stereomodes (off, split_vertical, split_horizontal, row_interleaved, hardware_based, anaglyph_cyan_red, anaglyph_green_magenta, anaglyph_yellow_blue, monoscopic)", 1, SetStereoMode}},
+ {"takescreenshot", {"Takes a Screenshot", 0, Screenshot}},
+ {"toggledirtyregionvisualization", {"Enables/disables dirty-region visualization", 0, ToggleDirty}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/GUIBuiltins.h b/xbmc/interfaces/builtins/GUIBuiltins.h
new file mode 100644
index 0000000000..5d26aa0b13
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing GUI related built-in commands.
+class CGUIBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp b/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp
new file mode 100644
index 0000000000..c3921838f9
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIContainerBuiltins.cpp
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "GUIContainerBuiltins.h"
+
+#include "guilib/GUIWindowManager.h"
+#include "GUIUserMessages.h"
+#include "utils/StringUtils.h"
+
+/*! \brief Change sort method.
+ * \param params (ignored)
+ *
+ * Set the Dir template parameter to 1 to switch to next sort method
+ * or -1 to switch to previous sort method.
+ */
+ template<int Dir>
+static int ChangeSortMethod(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, 0, Dir);
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Change view mode.
+ * \param params (ignored)
+ *
+ * Set the Dir template parameter to 1 to switch to next view mode
+ * or -1 to switch to previous view mode.
+ */
+ template<int Dir>
+static int ChangeViewMode(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, 0, Dir);
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Refresh a media window.
+ * \param params The parameters.
+ * \details params[0] = The URL to refresh window at.
+ */
+static int Refresh(const std::vector<std::string>& params)
+{ // NOTE: These messages require a media window, thus they're sent to the current activewindow.
+ // This shouldn't stop a dialog intercepting it though.
+ CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 1); // 1 to reset the history
+ message.SetStringParam(params[0]);
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Set sort method.
+ * \param params The parameters.
+ * \details params[0] = ID of sort method.
+ */
+static int SetSortMethod(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_CHANGE_SORT_METHOD, g_windowManager.GetActiveWindow(), 0, atoi(params[0].c_str()));
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Set view mode.
+ * \param params The parameters.
+ * \details params[0] = ID of view mode.
+ */
+static int SetViewMode(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_CHANGE_VIEW_MODE, g_windowManager.GetActiveWindow(), 0, atoi(params[0].c_str()));
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Toggle sort direction.
+ * \param params (ignored)
+ */
+static int ToggleSortDirection(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_CHANGE_SORT_DIRECTION, g_windowManager.GetActiveWindow(), 0, 0);
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Update a listing in a media window.
+ * \param params The parameters.
+ * \details params[0] = The URL to update listing at.
+ * params[1] = "replace" to reset history (optional).
+ */
+static int Update(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_NOTIFY_ALL, g_windowManager.GetActiveWindow(), 0, GUI_MSG_UPDATE, 0);
+ message.SetStringParam(params[0]);
+ if (params.size() > 1 && StringUtils::EqualsNoCase(params[1], "replace"))
+ message.SetParam2(1); // reset the history
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CGUIContainerBuiltins::GetOperations() const
+{
+ return {
+ {"container.nextsortmethod", {"Change to the next sort method", 0, ChangeSortMethod<1>}},
+ {"container.nextviewmode", {"Move to the next view type (and refresh the listing)", 0, ChangeViewMode<1>}},
+ {"container.previoussortmethod", {"Change to the previous sort method", 0, ChangeSortMethod<-1>}},
+ {"container.previousviewmode", {"Move to the previous view type (and refresh the listing)", 0, ChangeViewMode<-1>}},
+ {"container.refresh", {"Refresh current listing", 1, Refresh}},
+ {"container.setsortdirection", {"Toggle the sort direction", 0, ToggleSortDirection}},
+ {"container.setsortmethod", {"Change to the specified sort method", 1, SetSortMethod}},
+ {"container.setviewmode", {"Move to the view with the given id", 1, SetViewMode}},
+ {"container.update", {"Update current listing. Send Container.Update(path,replace) to reset the path history", 1, Update}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/GUIContainerBuiltins.h b/xbmc/interfaces/builtins/GUIContainerBuiltins.h
new file mode 100644
index 0000000000..20df75c6e2
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIContainerBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing GUI container related built-in commands.
+class CGUIContainerBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/GUIControlBuiltins.cpp b/xbmc/interfaces/builtins/GUIControlBuiltins.cpp
new file mode 100644
index 0000000000..dc7be6b752
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIControlBuiltins.cpp
@@ -0,0 +1,129 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "GUIControlBuiltins.h"
+
+#include "guilib/GUIWindowManager.h"
+#include "input/ButtonTranslator.h"
+
+/*! \brief Send a move event to a GUI control.
+ * \param params The parameters.
+ * \details params[0] = ID of control.
+ * params[1] = Offset of move.
+ */
+static int ControlMove(const std::vector<std::string>& params)
+{
+ CGUIMessage message(GUI_MSG_MOVE_OFFSET, g_windowManager.GetFocusedWindow(),
+ atoi(params[0].c_str()), atoi(params[1].c_str()));
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+/*! \brief Send a click event to a GUI control.
+ * \param params The parameters.
+ * \details params[0] = ID of control.
+ * params[1] = ID for window with control (optional).
+ */
+static int SendClick(const std::vector<std::string>& params)
+{
+ if (params.size() == 2)
+ {
+ // have a window - convert it
+ int windowID = CButtonTranslator::TranslateWindow(params[0]);
+ CGUIMessage message(GUI_MSG_CLICKED, atoi(params[1].c_str()), windowID);
+ g_windowManager.SendMessage(message);
+ }
+ else
+ { // single param - assume you meant the active window
+ CGUIMessage message(GUI_MSG_CLICKED, atoi(params[0].c_str()), g_windowManager.GetActiveWindow());
+ g_windowManager.SendMessage(message);
+ }
+
+ return 0;
+}
+
+/*! \brief Send a message to a control.
+ * \param params The parameters.
+ * \details params[0] = ID of control.
+ * params[1] = Action name.
+ * \params[2] = ID of window with control (optional).
+ */
+static int SendMessage(const std::vector<std::string>& params)
+{
+ int controlID = atoi(params[0].c_str());
+ int windowID = (params.size() == 3) ? CButtonTranslator::TranslateWindow(params[2]) : g_windowManager.GetActiveWindow();
+ if (params[1] == "moveup")
+ g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, 1);
+ else if (params[1] == "movedown")
+ g_windowManager.SendMessage(GUI_MSG_MOVE_OFFSET, windowID, controlID, -1);
+ else if (params[1] == "pageup")
+ g_windowManager.SendMessage(GUI_MSG_PAGE_UP, windowID, controlID);
+ else if (params[1] == "pagedown")
+ g_windowManager.SendMessage(GUI_MSG_PAGE_DOWN, windowID, controlID);
+ else if (params[1] == "click")
+ g_windowManager.SendMessage(GUI_MSG_CLICKED, controlID, windowID);
+
+ return 0;
+}
+
+/*! \brief Give a control focus.
+ * \param params The parameters.
+ * \details params[0] = ID of control.
+ * params[1] = ID of subitem of control (optional).
+ */
+static int SetFocus(const std::vector<std::string>& params)
+{
+ int controlID = atol(params[0].c_str());
+ int subItem = (params.size() > 1) ? atol(params[1].c_str())+1 : 0;
+ CGUIMessage msg(GUI_MSG_SETFOCUS, g_windowManager.GetFocusedWindow(), controlID, subItem);
+ g_windowManager.SendMessage(msg);
+
+ return 0;
+}
+
+/*! \brief Shift page in a control.
+ * \param params The parameters.
+ * \details params[0] = ID of control
+ *
+ * Set Message template parameter to GUI_MSG_PAGE_DOWN/GUI_MSG_PAGE_UP.
+ */
+ template<int Message>
+static int ShiftPage(const std::vector<std::string>& params)
+{
+ int id = atoi(params[0].c_str());
+ CGUIMessage message(Message, g_windowManager.GetFocusedWindow(), id);
+ g_windowManager.SendMessage(message);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CGUIControlBuiltins::GetOperations() const
+{
+ return {
+ {"control.message", {"Send a given message to a control within a given window", 2, SendMessage}},
+ {"control.move", {"Tells the specified control to 'move' to another entry specified by offset", 2, ControlMove}},
+ {"control.setfocus", {"Change current focus to a different control id", 1, SetFocus}},
+ {"pagedown", {"Send a page down event to the pagecontrol with given id", 1, ShiftPage<GUI_MSG_PAGE_DOWN>}},
+ {"pageup", {"Send a page up event to the pagecontrol with given id", 1, ShiftPage<GUI_MSG_PAGE_UP>}},
+ {"sendclick", {"Send a click message from the given control to the given window", 1, SendClick}},
+ {"setfocus", {"Change current focus to a different control id", 1, SetFocus}},
+ };
+}
diff --git a/xbmc/interfaces/builtins/GUIControlBuiltins.h b/xbmc/interfaces/builtins/GUIControlBuiltins.h
new file mode 100644
index 0000000000..4f8f56fa13
--- /dev/null
+++ b/xbmc/interfaces/builtins/GUIControlBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing GUI control related built-in commands.
+class CGUIControlBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/LibraryBuiltins.cpp b/xbmc/interfaces/builtins/LibraryBuiltins.cpp
new file mode 100644
index 0000000000..e5a21579cf
--- /dev/null
+++ b/xbmc/interfaces/builtins/LibraryBuiltins.cpp
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "LibraryBuiltins.h"
+
+#include "Application.h"
+#include "dialogs/GUIDialogFileBrowser.h"
+#include "dialogs/GUIDialogYesNo.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/GUIWindowManager.h"
+#include "GUIUserMessages.h"
+#include "MediaSource.h"
+#include "messaging/helpers/DialogHelper.h"
+#include "music/MusicDatabase.h"
+#include "storage/MediaManager.h"
+#include "utils/log.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "video/VideoDatabase.h"
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Clean a library.
+ * \param params The parameters.
+ * \details params[0] = "video" or "music".
+ */
+static int CleanLibrary(const std::vector<std::string>& params)
+{
+ bool userInitiated = true;
+ if (params.size() > 1)
+ userInitiated = StringUtils::EqualsNoCase(params[1], "true");
+ if (!params.size() || StringUtils::EqualsNoCase(params[0], "video"))
+ {
+ if (!g_application.IsVideoScanning())
+ g_application.StartVideoCleanup(userInitiated);
+ else
+ CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning or cleaning");
+ }
+ else if (StringUtils::EqualsNoCase(params[0], "music"))
+ {
+ if (!g_application.IsMusicScanning())
+ g_application.StartMusicCleanup(userInitiated);
+ else
+ CLog::Log(LOGERROR, "CleanLibrary is not possible while scanning for media info");
+ }
+
+ return 0;
+}
+
+/*! \brief Export a library.
+ * \param params The parameters.
+ * \details params[0] = "video" or "music".
+ * params[1] = "true" to export to a single file (optional).
+ * params[2] = "true" to export thumbs (optional).
+ * params[3] = "true" to overwrite existing files (optional).
+ * params[4] = "true" to export actor thumbs (optional).
+ */
+static int ExportLibrary(const std::vector<std::string>& params)
+{
+ int iHeading = 647;
+ if (StringUtils::EqualsNoCase(params[0], "music"))
+ iHeading = 20196;
+ std::string path;
+ VECSOURCES shares;
+ g_mediaManager.GetLocalDrives(shares);
+ g_mediaManager.GetNetworkLocations(shares);
+ g_mediaManager.GetRemovableDrives(shares);
+ bool singleFile;
+ bool thumbs=false;
+ bool actorThumbs=false;
+ bool overwrite=false;
+ bool cancelled=false;
+
+ if (params.size() > 1)
+ singleFile = StringUtils::EqualsNoCase(params[1], "true");
+ else
+ {
+ HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20426}, CVariant{20428}, CVariant{20429});
+ cancelled = result == HELPERS::DialogResponse::CANCELLED;
+ singleFile = result != HELPERS::DialogResponse::YES;
+ }
+
+ if (cancelled)
+ return -1;
+
+ if (singleFile)
+ {
+ if (params.size() > 2)
+ thumbs = StringUtils::EqualsNoCase(params[2], "true");
+ else
+ {
+ HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20430}, CVariant{20428}, CVariant{20429});
+ cancelled = result == HELPERS::DialogResponse::CANCELLED;
+ thumbs = result == HELPERS::DialogResponse::YES;
+ }
+ }
+
+ if (cancelled)
+ return -1;
+
+ if (thumbs && StringUtils::EqualsNoCase(params[0], "video"))
+ {
+ if (params.size() > 4)
+ actorThumbs = StringUtils::EqualsNoCase(params[4], "true");
+ else
+ {
+ HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20436});
+ cancelled = result == HELPERS::DialogResponse::CANCELLED;
+ actorThumbs = result == HELPERS::DialogResponse::YES;
+ }
+ }
+
+ if (cancelled)
+ return -1;
+
+ if (singleFile)
+ {
+ if (params.size() > 3)
+ overwrite = StringUtils::EqualsNoCase(params[3], "true");
+ else
+ {
+ HELPERS::DialogResponse result = HELPERS::ShowYesNoDialogText(CVariant{iHeading}, CVariant{20431});
+ cancelled = result == HELPERS::DialogResponse::CANCELLED;
+ overwrite = result == HELPERS::DialogResponse::YES;
+ }
+ }
+
+ if (cancelled)
+ return -1;
+
+ if (params.size() > 2)
+ path=params[2];
+ if (singleFile || !path.empty() ||
+ CGUIDialogFileBrowser::ShowAndGetDirectory(shares, g_localizeStrings.Get(661),
+ path, true))
+ {
+ if (StringUtils::EqualsNoCase(params[0], "video"))
+ {
+ CVideoDatabase videodatabase;
+ videodatabase.Open();
+ videodatabase.ExportToXML(path, singleFile, thumbs, actorThumbs, overwrite);
+ videodatabase.Close();
+ }
+ else
+ {
+ if (URIUtils::HasSlashAtEnd(path))
+ path = URIUtils::AddFileToFolder(path, "musicdb.xml");
+ CMusicDatabase musicdatabase;
+ musicdatabase.Open();
+ musicdatabase.ExportToXML(path, singleFile, thumbs, overwrite);
+ musicdatabase.Close();
+ }
+ }
+
+ return 0;
+}
+
+/*! \brief Update a library.
+ * \param params The parameters.
+ * \details params[0] = "video" or "music".
+ * params[1] = "true" to suppress dialogs (optional).
+ */
+static int UpdateLibrary(const std::vector<std::string>& params)
+{
+ bool userInitiated = true;
+ if (params.size() > 2)
+ userInitiated = StringUtils::EqualsNoCase(params[2], "true");
+ if (StringUtils::EqualsNoCase(params[0], "music"))
+ {
+ if (g_application.IsMusicScanning())
+ g_application.StopMusicScan();
+ else
+ g_application.StartMusicScan(params.size() > 1 ? params[1] : "", userInitiated);
+ }
+ else if (StringUtils::EqualsNoCase(params[0], "video"))
+ {
+ if (g_application.IsVideoScanning())
+ g_application.StopVideoScan();
+ else
+ g_application.StartVideoScan(params.size() > 1 ? params[1] : "", userInitiated);
+ }
+
+ return 0;
+}
+
+/*! \brief Open a video library search.
+ * \param params (ignored)
+ */
+static int SearchVideoLibrary(const std::vector<std::string>& params)
+{
+ CGUIMessage msg(GUI_MSG_SEARCH, 0, 0, 0);
+ g_windowManager.SendMessage(msg, WINDOW_VIDEO_NAV);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CLibraryBuiltins::GetOperations() const
+{
+ return {
+ {"cleanlibrary", {"Clean the video/music library", 1, CleanLibrary}},
+ {"exportlibrary", {"Export the video/music library", 1, ExportLibrary}},
+ {"updatelibrary", {"Update the selected library (music or video)", 1, UpdateLibrary}},
+ {"videolibrary.search", {"Brings up a search dialog which will search the library", 0, SearchVideoLibrary}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/LibraryBuiltins.h b/xbmc/interfaces/builtins/LibraryBuiltins.h
new file mode 100644
index 0000000000..fbd58e3721
--- /dev/null
+++ b/xbmc/interfaces/builtins/LibraryBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing library related built-in commands.
+class CLibraryBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/Makefile.in b/xbmc/interfaces/builtins/Makefile.in
new file mode 100644
index 0000000000..ae0b40c3af
--- /dev/null
+++ b/xbmc/interfaces/builtins/Makefile.in
@@ -0,0 +1,25 @@
+SRCS = AddonBuiltins.cpp
+SRCS += ApplicationBuiltins.cpp
+SRCS += Builtins.cpp
+SRCS += CECBuiltins.cpp
+SRCS += GUIBuiltins.cpp
+SRCS += GUIContainerBuiltins.cpp
+SRCS += GUIControlBuiltins.cpp
+SRCS += LibraryBuiltins.cpp
+SRCS += OpticalBuiltins.cpp
+SRCS += PictureBuiltins.cpp
+SRCS += PlayerBuiltins.cpp
+SRCS += ProfileBuiltins.cpp
+SRCS += PVRBuiltins.cpp
+SRCS += SkinBuiltins.cpp
+SRCS += SystemBuiltins.cpp
+SRCS += WeatherBuiltins.cpp
+
+ifeq (@USE_ANDROID@,1)
+SRCS += AndroidBuiltins.cpp
+endif
+
+LIB=builtins.a
+
+include ../../../Makefile.include
+-include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
diff --git a/xbmc/interfaces/builtins/OpticalBuiltins.cpp b/xbmc/interfaces/builtins/OpticalBuiltins.cpp
new file mode 100644
index 0000000000..ff9807a0e8
--- /dev/null
+++ b/xbmc/interfaces/builtins/OpticalBuiltins.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "OpticalBuiltins.h"
+
+#include "system.h"
+
+#ifdef HAS_DVD_DRIVE
+#include "storage/MediaManager.h"
+#endif
+
+#ifdef HAS_CDDA_RIPPER
+#include "cdrip/CDDARipper.h"
+#endif
+
+/*! \brief Eject the tray of an optical drive.
+ * \param params (ignored)
+ */
+static int Eject(const std::vector<std::string>& params)
+{
+#ifdef HAS_DVD_DRIVE
+ g_mediaManager.ToggleTray();
+#endif
+
+ return 0;
+}
+
+/*! \brief Rip currently inserted CD.
+ * \param params (ignored)
+ */
+static int RipCD(const std::vector<std::string>& params)
+{
+#ifdef HAS_CDDA_RIPPER
+ CCDDARipper::GetInstance().RipCD();
+#endif
+
+ return 0;
+}
+
+CBuiltins::CommandMap COpticalBuiltins::GetOperations() const
+{
+ return {
+ {"ejecttray", {"Close or open the DVD tray", 0, Eject}},
+ {"ripcd", {"Rip the currently inserted audio CD", 0, RipCD}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/OpticalBuiltins.h b/xbmc/interfaces/builtins/OpticalBuiltins.h
new file mode 100644
index 0000000000..284f40fded
--- /dev/null
+++ b/xbmc/interfaces/builtins/OpticalBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing optical media related built-in commands.
+class COpticalBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/PVRBuiltins.cpp b/xbmc/interfaces/builtins/PVRBuiltins.cpp
new file mode 100644
index 0000000000..c0f3297e3f
--- /dev/null
+++ b/xbmc/interfaces/builtins/PVRBuiltins.cpp
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "PVRBuiltins.h"
+
+#include "Application.h"
+#include "pvr/PVRManager.h"
+
+/*! \brief Start the PVR manager.
+ * \param params (ignored)
+ */
+static int Start(const std::vector<std::string>& params)
+{
+ g_application.StartPVRManager();
+
+ return 0;
+}
+
+/*! \brief Stop the PVR manager.
+ * \param params (ignored)
+ */
+static int Stop(const std::vector<std::string>& params)
+{
+ g_application.StopPVRManager();
+
+ return 0;
+}
+
+/*! \brief Search for missing channel icons
+ * \param params (ignored)
+ */
+static int SearchMissingIcons(const std::vector<std::string>& params)
+{
+ PVR::CPVRManager::GetInstance().TriggerSearchMissingChannelIcons();
+
+ return 0;
+}
+
+CBuiltins::CommandMap CPVRBuiltins::GetOperations() const
+{
+ return {
+ {"startpvrmanager", {"(Re)Starts the PVR manager", 0, Start}}, // deprecated alias
+ {"pvr.startmanager", {"(Re)Starts the PVR manager", 0, Start}},
+ {"stoppvrmanager", {"Stops the PVR manager", 0, Stop}},
+ {"pvr.stopmanager", {"Stops the PVR manager", 0, Stop}},
+ {"pvr.searchmissingchannelicons", {"Search for missing channel icons", 0, SearchMissingIcons}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/PVRBuiltins.h b/xbmc/interfaces/builtins/PVRBuiltins.h
new file mode 100644
index 0000000000..794801cc8d
--- /dev/null
+++ b/xbmc/interfaces/builtins/PVRBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing PVR related built-in commands.
+class CPVRBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/PictureBuiltins.cpp b/xbmc/interfaces/builtins/PictureBuiltins.cpp
new file mode 100644
index 0000000000..0335a1ff88
--- /dev/null
+++ b/xbmc/interfaces/builtins/PictureBuiltins.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "PictureBuiltins.h"
+
+#include "guilib/GUIWindowManager.h"
+#include "GUIUserMessages.h"
+#include "utils/StringUtils.h"
+
+/*! \brief Show a picture.
+ * \param params The parameters.
+ * \details params[0] = URL of picture.
+ */
+static int Show(const std::vector<std::string>& params)
+{
+ CGUIMessage msg(GUI_MSG_SHOW_PICTURE, 0, 0);
+ msg.SetStringParam(params[0]);
+ CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW);
+ if (pWindow)
+ pWindow->OnMessage(msg);
+
+ return 0;
+}
+
+/*! \brief Start a slideshow.
+ * \param params The parameters.
+ * \details params[0] = Path to run slideshow for.
+ * params[1,..] = "recursive" to run a recursive slideshow.
+ * params[1,...] = "random" to randomize slideshow.
+ * params[1,...] = "notrandom" to not randomize slideshow.
+ * params[1,...] = "pause" to start slideshow paused.
+ * params[1,...] = "beginslide=<number>" to start at a given slide.
+ *
+ * Set the template parameter Recursive to true to run a recursive slideshow.
+ */
+ template<bool Recursive>
+static int Slideshow(const std::vector<std::string>& params)
+{
+ std::string beginSlidePath;
+ // leave RecursiveSlideShow command as-is
+ unsigned int flags = 0;
+ if (Recursive)
+ flags |= 1;
+
+ // SlideShow(dir[,recursive][,[not]random][,pause][,beginslide="/path/to/start/slide.jpg"])
+ // the beginslide value need be escaped (for '"' or '\' in it, by backslash)
+ // and then quoted, or not. See CUtil::SplitParams()
+ else
+ {
+ for (unsigned int i = 1 ; i < params.size() ; i++)
+ {
+ if (StringUtils::EqualsNoCase(params[i], "recursive"))
+ flags |= 1;
+ else if (StringUtils::EqualsNoCase(params[i], "random")) // set fullscreen or windowed
+ flags |= 2;
+ else if (StringUtils::EqualsNoCase(params[i], "notrandom"))
+ flags |= 4;
+ else if (StringUtils::EqualsNoCase(params[i], "pause"))
+ flags |= 8;
+ else if (StringUtils::StartsWithNoCase(params[i], "beginslide="))
+ beginSlidePath = params[i].substr(11);
+ }
+ }
+
+ CGUIMessage msg(GUI_MSG_START_SLIDESHOW, 0, 0, flags);
+ std::vector<std::string> strParams;
+ strParams.push_back(params[0]);
+ strParams.push_back(beginSlidePath);
+ msg.SetStringParams(strParams);
+ CGUIWindow *pWindow = g_windowManager.GetWindow(WINDOW_SLIDESHOW);
+ if (pWindow)
+ pWindow->OnMessage(msg);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CPictureBuiltins::GetOperations() const
+{
+ return {
+ {"recursiveslideshow", {"Run a slideshow from the specified directory, including all subdirs", 1, Slideshow<true>}},
+ {"showpicture", {"Display a picture by file path", 1, Show}},
+ {"slideshow", {"Run a slideshow from the specified directory", 1, Slideshow<false>}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/PictureBuiltins.h b/xbmc/interfaces/builtins/PictureBuiltins.h
new file mode 100644
index 0000000000..142a3a1ca1
--- /dev/null
+++ b/xbmc/interfaces/builtins/PictureBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing picture related built-in commands.
+class CPictureBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/PlayerBuiltins.cpp b/xbmc/interfaces/builtins/PlayerBuiltins.cpp
new file mode 100644
index 0000000000..5693faead4
--- /dev/null
+++ b/xbmc/interfaces/builtins/PlayerBuiltins.cpp
@@ -0,0 +1,499 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "PlayerBuiltins.h"
+
+#include "Application.h"
+#include "FileItem.h"
+#include "filesystem/Directory.h"
+#include "guilib/GUIWindowManager.h"
+#include "GUIUserMessages.h"
+#include "PartyModeManager.h"
+#include "PlayListPlayer.h"
+#include "settings/AdvancedSettings.h"
+#include "settings/MediaSettings.h"
+#include "settings/Settings.h"
+#include "storage/MediaManager.h"
+#include "system.h"
+#include "utils/log.h"
+#include "utils/SeekHandler.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "video/windows/GUIWindowVideoBase.h"
+#include "pvr/channels/PVRChannel.h"
+#include "pvr/recordings/PVRRecording.h"
+
+#ifdef HAS_DVD_DRIVE
+#include "Autorun.h"
+#endif
+
+/*! \brief Clear current playlist
+ * \param params (ignored)
+ */
+static int ClearPlaylist(const std::vector<std::string>& params)
+{
+ g_playlistPlayer.Clear();
+
+ return 0;
+}
+
+/*! \brief Start a playlist from a given offset.
+ * \param params The parameters.
+ * \details params[0] = Position in playlist or playlist type.
+ * params[1] = Position in playlist if params[0] is playlist type (optional).
+ */
+static int PlayOffset(const std::vector<std::string>& params)
+{
+ // playlist.playoffset(offset)
+ // playlist.playoffset(music|video,offset)
+ std::string strPos = params[0];
+ std::string paramlow(params[0]);
+ StringUtils::ToLower(paramlow);
+ if (params.size() > 1)
+ {
+ // ignore any other parameters if present
+ std::string strPlaylist = params[0];
+ strPos = params[1];
+
+ int iPlaylist = PLAYLIST_NONE;
+ if (paramlow == "music")
+ iPlaylist = PLAYLIST_MUSIC;
+ else if (paramlow == "video")
+ iPlaylist = PLAYLIST_VIDEO;
+
+ // unknown playlist
+ if (iPlaylist == PLAYLIST_NONE)
+ {
+ CLog::Log(LOGERROR,"Playlist.PlayOffset called with unknown playlist: %s", strPlaylist.c_str());
+ return false;
+ }
+
+ // user wants to play the 'other' playlist
+ if (iPlaylist != g_playlistPlayer.GetCurrentPlaylist())
+ {
+ g_application.StopPlaying();
+ g_playlistPlayer.Reset();
+ g_playlistPlayer.SetCurrentPlaylist(iPlaylist);
+ }
+ }
+ // play the desired offset
+ int pos = atol(strPos.c_str());
+ // playlist is already playing
+ if (g_application.m_pPlayer->IsPlaying())
+ g_playlistPlayer.PlayNext(pos);
+ // we start playing the 'other' playlist so we need to use play to initialize the player state
+ else
+ g_playlistPlayer.Play(pos);
+
+ return 0;
+}
+
+/*! \brief Control player.
+ * \param params The parameters
+ * \details params[0] = Control to execute.
+ * params[1] = "notify" to notify user (optional, certain controls).
+ */
+static int PlayerControl(const std::vector<std::string>& params)
+{
+ g_application.ResetScreenSaver();
+ g_application.WakeUpScreenSaverAndDPMS();
+
+ std::string paramlow(params[0]);
+ StringUtils::ToLower(paramlow);
+
+ if (paramlow == "play")
+ { // play/pause
+ // either resume playing, or pause
+ if (g_application.m_pPlayer->IsPlaying())
+ {
+ if (g_application.m_pPlayer->GetPlaySpeed() != 1)
+ g_application.m_pPlayer->SetPlaySpeed(1, g_application.IsMutedInternal());
+ else
+ g_application.m_pPlayer->Pause();
+ }
+ }
+ else if (paramlow == "stop")
+ {
+ g_application.StopPlaying();
+ }
+ else if (paramlow =="rewind" || paramlow == "forward")
+ {
+ if (g_application.m_pPlayer->IsPlaying() && !g_application.m_pPlayer->IsPaused())
+ {
+ int iPlaySpeed = g_application.m_pPlayer->GetPlaySpeed();
+ if (paramlow == "rewind" && iPlaySpeed == 1) // Enables Rewinding
+ iPlaySpeed *= -2;
+ else if (paramlow == "rewind" && iPlaySpeed > 1) //goes down a notch if you're FFing
+ iPlaySpeed /= 2;
+ else if (paramlow == "forward" && iPlaySpeed < 1) //goes up a notch if you're RWing
+ {
+ iPlaySpeed /= 2;
+ if (iPlaySpeed == -1) iPlaySpeed = 1;
+ }
+ else
+ iPlaySpeed *= 2;
+
+ if (iPlaySpeed > 32 || iPlaySpeed < -32)
+ iPlaySpeed = 1;
+
+ g_application.m_pPlayer->SetPlaySpeed(iPlaySpeed, g_application.IsMutedInternal());
+ }
+ }
+ else if (paramlow == "next")
+ {
+ g_application.OnAction(CAction(ACTION_NEXT_ITEM));
+ }
+ else if (paramlow == "previous")
+ {
+ g_application.OnAction(CAction(ACTION_PREV_ITEM));
+ }
+ else if (paramlow == "bigskipbackward")
+ {
+ if (g_application.m_pPlayer->IsPlaying())
+ g_application.m_pPlayer->Seek(false, true);
+ }
+ else if (paramlow == "bigskipforward")
+ {
+ if (g_application.m_pPlayer->IsPlaying())
+ g_application.m_pPlayer->Seek(true, true);
+ }
+ else if (paramlow == "smallskipbackward")
+ {
+ if (g_application.m_pPlayer->IsPlaying())
+ g_application.m_pPlayer->Seek(false, false);
+ }
+ else if (paramlow == "smallskipforward")
+ {
+ if (g_application.m_pPlayer->IsPlaying())
+ g_application.m_pPlayer->Seek(true, false);
+ }
+ else if (StringUtils::StartsWithNoCase(params[0], "seekpercentage"))
+ {
+ std::string offset;
+ if (params[0].size() == 14)
+ CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with no argument");
+ else if (params[0].size() < 17) // arg must be at least "(N)"
+ CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) called with invalid argument: \"%s\"", params[0].substr(14).c_str());
+ else
+ {
+ // Don't bother checking the argument: an invalid arg will do seek(0)
+ offset = params[0].substr(15);
+ StringUtils::TrimRight(offset, ")");
+ float offsetpercent = (float) atof(offset.c_str());
+ if (offsetpercent < 0 || offsetpercent > 100)
+ CLog::Log(LOGERROR,"PlayerControl(seekpercentage(n)) argument, %f, must be 0-100", offsetpercent);
+ else if (g_application.m_pPlayer->IsPlaying())
+ g_application.SeekPercentage(offsetpercent);
+ }
+ }
+ else if (paramlow == "showvideomenu")
+ {
+ if( g_application.m_pPlayer->IsPlaying() )
+ g_application.m_pPlayer->OnAction(CAction(ACTION_SHOW_VIDEOMENU));
+ }
+ else if (paramlow == "record")
+ {
+ if( g_application.m_pPlayer->IsPlaying() && g_application.m_pPlayer->CanRecord())
+ g_application.m_pPlayer->Record(!g_application.m_pPlayer->IsRecording());
+ }
+ else if (StringUtils::StartsWithNoCase(params[0], "partymode"))
+ {
+ std::string strXspPath;
+ //empty param=music, "music"=music, "video"=video, else xsp path
+ PartyModeContext context = PARTYMODECONTEXT_MUSIC;
+ if (params[0].size() > 9)
+ {
+ if (params[0].size() == 16 && StringUtils::EndsWithNoCase(params[0], "video)"))
+ context = PARTYMODECONTEXT_VIDEO;
+ else if (params[0].size() != 16 || !StringUtils::EndsWithNoCase(params[0], "music)"))
+ {
+ strXspPath = params[0].substr(10);
+ StringUtils::TrimRight(strXspPath, ")");
+ context = PARTYMODECONTEXT_UNKNOWN;
+ }
+ }
+ if (g_partyModeManager.IsEnabled())
+ g_partyModeManager.Disable();
+ else
+ g_partyModeManager.Enable(context, strXspPath);
+ }
+ else if (paramlow == "random" || paramlow == "randomoff" || paramlow == "randomon")
+ {
+ // get current playlist
+ int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
+
+ // reverse the current setting
+ bool shuffled = g_playlistPlayer.IsShuffled(iPlaylist);
+ if ((shuffled && paramlow == "randomon") || (!shuffled && paramlow == "randomoff"))
+ return 0;
+
+ // check to see if we should notify the user
+ bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify"));
+ g_playlistPlayer.SetShuffle(iPlaylist, !shuffled, notify);
+
+ // save settings for now playing windows
+ switch (iPlaylist)
+ {
+ case PLAYLIST_MUSIC:
+ CMediaSettings::GetInstance().SetMusicPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist));
+ CSettings::GetInstance().Save();
+ break;
+ case PLAYLIST_VIDEO:
+ CMediaSettings::GetInstance().SetVideoPlaylistShuffled(g_playlistPlayer.IsShuffled(iPlaylist));
+ CSettings::GetInstance().Save();
+ default:
+ break;
+ }
+
+ // send message
+ CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_RANDOM, 0, 0, iPlaylist, g_playlistPlayer.IsShuffled(iPlaylist));
+ g_windowManager.SendThreadMessage(msg);
+ }
+ else if (StringUtils::StartsWithNoCase(params[0], "repeat"))
+ {
+ // get current playlist
+ int iPlaylist = g_playlistPlayer.GetCurrentPlaylist();
+ PLAYLIST::REPEAT_STATE previous_state = g_playlistPlayer.GetRepeat(iPlaylist);
+
+ std::string paramlow(params[0]);
+ StringUtils::ToLower(paramlow);
+
+ PLAYLIST::REPEAT_STATE state;
+ if (paramlow == "repeatall")
+ state = PLAYLIST::REPEAT_ALL;
+ else if (paramlow == "repeatone")
+ state = PLAYLIST::REPEAT_ONE;
+ else if (paramlow == "repeatoff")
+ state = PLAYLIST::REPEAT_NONE;
+ else if (previous_state == PLAYLIST::REPEAT_NONE)
+ state = PLAYLIST::REPEAT_ALL;
+ else if (previous_state == PLAYLIST::REPEAT_ALL)
+ state = PLAYLIST::REPEAT_ONE;
+ else
+ state = PLAYLIST::REPEAT_NONE;
+
+ if (state == previous_state)
+ return 0;
+
+ // check to see if we should notify the user
+ bool notify = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "notify"));
+ g_playlistPlayer.SetRepeat(iPlaylist, state, notify);
+
+ // save settings for now playing windows
+ switch (iPlaylist)
+ {
+ case PLAYLIST_MUSIC:
+ CMediaSettings::GetInstance().SetMusicPlaylistRepeat(state == PLAYLIST::REPEAT_ALL);
+ CSettings::GetInstance().Save();
+ break;
+ case PLAYLIST_VIDEO:
+ CMediaSettings::GetInstance().SetVideoPlaylistRepeat(state == PLAYLIST::REPEAT_ALL);
+ CSettings::GetInstance().Save();
+ }
+
+ // send messages so now playing window can get updated
+ CGUIMessage msg(GUI_MSG_PLAYLISTPLAYER_REPEAT, 0, 0, iPlaylist, (int)state);
+ g_windowManager.SendThreadMessage(msg);
+ }
+ else if (StringUtils::StartsWithNoCase(params[0], "resumelivetv"))
+ {
+ CFileItem& fileItem(g_application.CurrentFileItem());
+ PVR::CPVRChannelPtr channel = fileItem.HasPVRRecordingInfoTag() ? fileItem.GetPVRRecordingInfoTag()->Channel() : PVR::CPVRChannelPtr();
+
+ if (channel)
+ {
+ CFileItem playItem(channel);
+ if (!g_application.PlayMedia(playItem, channel->IsRadio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO))
+ {
+ CLog::Log(LOGERROR, "ResumeLiveTv could not play channel: %s", channel->ChannelName().c_str());
+ return false;
+ }
+ }
+ }
+
+ return 0;
+}
+
+/*! \brief Play currently inserted DVD.
+ * \param params The parameters.
+ * \details params[0] = "restart" to restart from resume point (optional).
+ */
+static int PlayDVD(const std::vector<std::string>& params)
+{
+#ifdef HAS_DVD_DRIVE
+ bool restart = false;
+ if (!params.empty() && StringUtils::EqualsNoCase(params[0], "restart"))
+ restart = true;
+ MEDIA_DETECT::CAutorun::PlayDisc(g_mediaManager.GetDiscPath(), true, restart);
+#endif
+
+ return 0;
+}
+
+/*! \brief Start playback of media.
+ * \param params The parameters.
+ * \details params[0] = URL to media to play (optional).
+ * params[1,...] = "isdir" if media is a directory (optional).
+ * params[1,...] = "1" to start playback in fullscreen (optional).
+ * params[1,...] = "resume" to force resuming (optional).
+ * params[1,...] = "noresume" to force not resuming (optional).
+ * params[1,...] = "playoffset=<offset>" to start playback from a given position in a playlist (optional).
+ */
+static int PlayMedia(const std::vector<std::string>& params)
+{
+ CFileItem item(params[0], false);
+ if (URIUtils::HasSlashAtEnd(params[0]))
+ item.m_bIsFolder = true;
+
+ // restore to previous window if needed
+ if( g_windowManager.GetActiveWindow() == WINDOW_SLIDESHOW ||
+ g_windowManager.GetActiveWindow() == WINDOW_FULLSCREEN_VIDEO ||
+ g_windowManager.GetActiveWindow() == WINDOW_VISUALISATION )
+ g_windowManager.PreviousWindow();
+
+ // reset screensaver
+ g_application.ResetScreenSaver();
+ g_application.WakeUpScreenSaverAndDPMS();
+
+ // ask if we need to check guisettings to resume
+ bool askToResume = true;
+ int playOffset = 0;
+ for (unsigned int i = 1 ; i < params.size() ; i++)
+ {
+ if (StringUtils::EqualsNoCase(params[i], "isdir"))
+ item.m_bIsFolder = true;
+ else if (params[i] == "1") // set fullscreen or windowed
+ CMediaSettings::GetInstance().SetVideoStartWindowed(true);
+ else if (StringUtils::EqualsNoCase(params[i], "resume"))
+ {
+ // force the item to resume (if applicable) (see CApplication::PlayMedia)
+ item.m_lStartOffset = STARTOFFSET_RESUME;
+ askToResume = false;
+ }
+ else if (StringUtils::EqualsNoCase(params[i], "noresume"))
+ {
+ // force the item to start at the beginning (m_lStartOffset is initialized to 0)
+ askToResume = false;
+ }
+ else if (StringUtils::StartsWithNoCase(params[i], "playoffset=")) {
+ playOffset = atoi(params[i].substr(11).c_str()) - 1;
+ item.SetProperty("playlist_starting_track", playOffset);
+ }
+ }
+
+ if (!item.m_bIsFolder && item.IsPlugin())
+ item.SetProperty("IsPlayable", true);
+
+ if ( askToResume == true )
+ {
+ if ( CGUIWindowVideoBase::ShowResumeMenu(item) == false )
+ return false;
+ }
+ if (item.m_bIsFolder)
+ {
+ CFileItemList items;
+ std::string extensions = g_advancedSettings.m_videoExtensions + "|" + g_advancedSettings.GetMusicExtensions();
+ XFILE::CDirectory::GetDirectory(item.GetPath(),items,extensions);
+
+ bool containsMusic = false, containsVideo = false;
+ for (int i = 0; i < items.Size(); i++)
+ {
+ bool isVideo = items[i]->IsVideo();
+ containsMusic |= !isVideo;
+ containsVideo |= isVideo;
+
+ if (containsMusic && containsVideo)
+ break;
+ }
+
+ std::unique_ptr<CGUIViewState> state(CGUIViewState::GetViewState(containsVideo ? WINDOW_VIDEO_NAV : WINDOW_MUSIC, items));
+ if (state.get())
+ items.Sort(state->GetSortMethod());
+ else
+ items.Sort(SortByLabel, SortOrderAscending);
+
+ int playlist = containsVideo? PLAYLIST_VIDEO : PLAYLIST_MUSIC;;
+ if (containsMusic && containsVideo) //mixed content found in the folder
+ {
+ for (int i = items.Size() - 1; i >= 0; i--) //remove music entries
+ {
+ if (!items[i]->IsVideo())
+ items.Remove(i);
+ }
+ }
+
+ g_playlistPlayer.ClearPlaylist(playlist);
+ g_playlistPlayer.Add(playlist, items);
+ g_playlistPlayer.SetCurrentPlaylist(playlist);
+ g_playlistPlayer.Play(playOffset);
+ }
+ else
+ {
+ int playlist = item.IsAudio() ? PLAYLIST_MUSIC : PLAYLIST_VIDEO;
+ g_playlistPlayer.ClearPlaylist(playlist);
+ g_playlistPlayer.SetCurrentPlaylist(playlist);
+
+ // play media
+ if (!g_application.PlayMedia(item, playlist))
+ {
+ CLog::Log(LOGERROR, "PlayMedia could not play media: %s", params[0].c_str());
+ return false;
+ }
+ }
+
+ return 0;
+}
+
+/*! \brief Start playback with a given playback core.
+ * \param params The parameters.
+ * \details params[0] = Name of playback core.
+ */
+static int PlayWith(const std::vector<std::string>& params)
+{
+ g_application.m_eForcedNextPlayer = CPlayerCoreFactory::GetInstance().GetPlayerCore(params[0]);
+ g_application.OnAction(CAction(ACTION_PLAYER_PLAY));
+
+ return 0;
+}
+
+/*! \brief Seek in currently playing media.
+ * \param params The parameters.
+ * \details params[0] = Number of seconds to seek.
+ */
+static int Seek(const std::vector<std::string>& params)
+{
+ if (g_application.m_pPlayer->IsPlaying())
+ CSeekHandler::GetInstance().SeekSeconds(atoi(params[0].c_str()));
+
+ return 0;
+}
+
+CBuiltins::CommandMap CPlayerBuiltins::GetOperations() const
+{
+ return {
+ {"playdvd", {"Plays the inserted CD or DVD media from the DVD-ROM Drive!", 0, PlayDVD}},
+ {"playlist.clear", {"Clear the current playlist", 0, ClearPlaylist}},
+ {"playlist.playoffset", {"Start playing from a particular offset in the playlist", 1, PlayOffset}},
+ {"playercontrol", {"Control the music or video player", 1, PlayerControl}},
+ {"playmedia", {"Play the specified media file (or playlist)", 1, PlayMedia}},
+ {"playwith", {"Play the selected item with the specified core", 1, PlayWith}},
+ {"seek", {"Performs a seek in seconds on the current playing media file", 1, Seek}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/PlayerBuiltins.h b/xbmc/interfaces/builtins/PlayerBuiltins.h
new file mode 100644
index 0000000000..bfc1ecffc4
--- /dev/null
+++ b/xbmc/interfaces/builtins/PlayerBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing player related built-in commands.
+class CPlayerBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/ProfileBuiltins.cpp b/xbmc/interfaces/builtins/ProfileBuiltins.cpp
new file mode 100644
index 0000000000..302320bf7b
--- /dev/null
+++ b/xbmc/interfaces/builtins/ProfileBuiltins.cpp
@@ -0,0 +1,125 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "ProfileBuiltins.h"
+
+#include "addons/AddonManager.h"
+#include "Application.h"
+#include "messaging/ApplicationMessenger.h"
+#include "dialogs/GUIDialogKaiToast.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/GUIWindowManager.h"
+#include "GUIPassword.h"
+#include "GUIUserMessages.h"
+#include "network/Network.h"
+#include "network/NetworkServices.h"
+#include "profiles/ProfilesManager.h"
+#include "Util.h"
+#include "utils/StringUtils.h"
+#include "video/VideoLibraryQueue.h"
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Load a profile.
+ * \param params The parameters.
+ * \details params[0] = The profile name.
+ * params[1] = "prompt" to allow unlocking dialogs (optional)
+ */
+static int LoadProfile(const std::vector<std::string>& params)
+{
+ int index = CProfilesManager::GetInstance().GetProfileIndex(params[0]);
+ bool prompt = (params.size() == 2 && StringUtils::EqualsNoCase(params[1], "prompt"));
+ bool bCanceled;
+ if (index >= 0
+ && (CProfilesManager::GetInstance().GetMasterProfile().getLockMode() == LOCK_MODE_EVERYONE
+ || g_passwordManager.IsProfileLockUnlocked(index,bCanceled,prompt)))
+ {
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_LOADPROFILE, index);
+ }
+
+ return 0;
+}
+
+/*! \brief Log off currently signed in profile.
+ * \param params (ignored)
+ */
+static int LogOff(const std::vector<std::string>& params)
+{
+ // there was a commit from cptspiff here which was reverted
+ // for keeping the behaviour from Eden in Frodo - see
+ // git rev 9ee5f0047b
+ if (g_windowManager.GetActiveWindow() == WINDOW_LOGIN_SCREEN)
+ return -1;
+
+ g_application.StopPlaying();
+ if (g_application.IsMusicScanning())
+ g_application.StopMusicScan();
+
+ if (CVideoLibraryQueue::GetInstance().IsRunning())
+ CVideoLibraryQueue::GetInstance().CancelAllJobs();
+
+ ADDON::CAddonMgr::GetInstance().StopServices(true);
+
+ g_application.getNetwork().NetworkMessage(CNetwork::SERVICES_DOWN,1);
+ CProfilesManager::GetInstance().LoadMasterProfileForLogin();
+ g_passwordManager.bMasterUser = false;
+
+ g_application.WakeUpScreenSaverAndDPMS();
+ g_windowManager.ActivateWindow(WINDOW_LOGIN_SCREEN, {}, false);
+
+ if (!CNetworkServices::GetInstance().StartEventServer()) // event server could be needed in some situations
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(33102), g_localizeStrings.Get(33100));
+
+ return 0;
+}
+
+/*! \brief Toggle master mode.
+ * \param params (ignored)
+ */
+static int MasterMode(const std::vector<std::string>& params)
+{
+ if (g_passwordManager.bMasterUser)
+ {
+ g_passwordManager.bMasterUser = false;
+ g_passwordManager.LockSources(true);
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20053));
+ }
+ else if (g_passwordManager.IsMasterLockUnlocked(true))
+ {
+ g_passwordManager.LockSources(false);
+ g_passwordManager.bMasterUser = true;
+ CGUIDialogKaiToast::QueueNotification(CGUIDialogKaiToast::Warning, g_localizeStrings.Get(20052),g_localizeStrings.Get(20054));
+ }
+
+ CUtil::DeleteVideoDatabaseDirectoryCache();
+ CGUIMessage msg(GUI_MSG_NOTIFY_ALL, 0, 0, GUI_MSG_UPDATE);
+ g_windowManager.SendMessage(msg);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CProfileBuiltins::GetOperations() const
+{
+ return {
+ {"loadprofile", {"Load the specified profile (note; if locks are active it won't work)", 1, LoadProfile}},
+ {"mastermode", {"Control master mode", 0, MasterMode}},
+ {"system.logoff", {"Log off current user", 0, LogOff}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/ProfileBuiltins.h b/xbmc/interfaces/builtins/ProfileBuiltins.h
new file mode 100644
index 0000000000..62f2ed8c77
--- /dev/null
+++ b/xbmc/interfaces/builtins/ProfileBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing profile related built-in commands.
+class CProfileBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/SkinBuiltins.cpp b/xbmc/interfaces/builtins/SkinBuiltins.cpp
new file mode 100644
index 0000000000..009669e348
--- /dev/null
+++ b/xbmc/interfaces/builtins/SkinBuiltins.cpp
@@ -0,0 +1,416 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "SkinBuiltins.h"
+
+#include "addons/Addon.h"
+#include "addons/GUIWindowAddonBrowser.h"
+#include "Application.h"
+#include "dialogs/GUIDialogFileBrowser.h"
+#include "dialogs/GUIDialogNumeric.h"
+#include "guilib/GUIKeyboardFactory.h"
+#include "guilib/LocalizeStrings.h"
+#include "MediaSource.h"
+#include "settings/MediaSourceSettings.h"
+#include "settings/Settings.h"
+#include "settings/SkinSettings.h"
+#include "storage/MediaManager.h"
+#include "utils/StringUtils.h"
+#include "utils/URIUtils.h"
+#include "Util.h"
+#include "URL.h"
+
+using namespace ADDON;
+
+/*! \brief Reload current skin.
+ * \param params The parameters.
+ * \details params[0] = "confirm" to show a confirmation dialog (optional).
+ */
+static int ReloadSkin(const std::vector<std::string>& params)
+{
+ // Reload the skin
+ g_application.ReloadSkin(!params.empty() &&
+ StringUtils::EqualsNoCase(params[0], "confirm"));
+
+ return 0;
+}
+
+/*! \brief Unload current skin.
+ * \param params (ignored)
+ */
+static int UnloadSkin(const std::vector<std::string>& params)
+{
+ g_application.UnloadSkin(true); // we're reloading the skin after this
+
+ return 0;
+}
+
+/*! \brief Toggle a skin bool setting.
+ * \param params The parameters.
+ * \details params[0] = Skin setting to toggle.
+ */
+static int ToggleSetting(const std::vector<std::string>& params)
+{
+ int setting = CSkinSettings::GetInstance().TranslateBool(params[0]);
+ CSkinSettings::GetInstance().SetBool(setting, !CSkinSettings::GetInstance().GetBool(setting));
+ CSettings::GetInstance().Save();
+
+ return 0;
+}
+
+/*! \brief Set an add-on type skin setting.
+ * \param params The parameters.
+ * \details params[0] = Skin setting to store result in.
+ * params[1,...] = Add-on types to allow selecting.
+ */
+static int SetAddon(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::vector<ADDON::TYPE> types;
+ for (unsigned int i = 1 ; i < params.size() ; i++)
+ {
+ ADDON::TYPE type = TranslateType(params[i]);
+ if (type != ADDON_UNKNOWN)
+ types.push_back(type);
+ }
+ std::string result;
+ if (types.size() > 0 && CGUIWindowAddonBrowser::SelectAddonID(types, result, true) == 1)
+ {
+ CSkinSettings::GetInstance().SetString(string, result);
+ CSettings::GetInstance().Save();
+ }
+
+ return 0;
+}
+
+/*! \brief Set a skin bool setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ * params[1] = Value to set ("false", or "true") (optional).
+ */
+static int SetBool(const std::vector<std::string>& params)
+{
+ if (params.size() > 1)
+ {
+ int string = CSkinSettings::GetInstance().TranslateBool(params[0]);
+ CSkinSettings::GetInstance().SetBool(string, StringUtils::EqualsNoCase(params[1], "true"));
+ CSettings::GetInstance().Save();
+ return 0;
+ }
+ // default is to set it to true
+ int setting = CSkinSettings::GetInstance().TranslateBool(params[0]);
+ CSkinSettings::GetInstance().SetBool(setting, true);
+ CSettings::GetInstance().Save();
+
+ return 0;
+}
+
+/*! \brief Set a numeric skin setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ */
+static int SetNumeric(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ if (CGUIDialogNumeric::ShowAndGetNumber(value, g_localizeStrings.Get(611)))
+ CSkinSettings::GetInstance().SetString(string, value);
+
+ return 0;
+}
+
+/*! \brief Set a path skin setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ * params[1] = Extra URL to allow selection from (optional).
+ */
+static int SetPath(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ VECSOURCES localShares;
+ g_mediaManager.GetLocalDrives(localShares);
+ g_mediaManager.GetNetworkLocations(localShares);
+ if (params.size() > 1)
+ {
+ value = params[1];
+ URIUtils::AddSlashAtEnd(value);
+ bool bIsSource;
+ if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
+ {
+ CMediaSource share;
+ share.strName = g_localizeStrings.Get(13278);
+ share.strPath = value;
+ localShares.push_back(share);
+ }
+ }
+
+ if (CGUIDialogFileBrowser::ShowAndGetDirectory(localShares, g_localizeStrings.Get(1031), value))
+ CSkinSettings::GetInstance().SetString(string, value);
+
+ CSettings::GetInstance().Save();
+
+ return 0;
+}
+
+/*! \brief Set a skin file setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ * params[1] = File mask or add-on type (optional).
+ * params[2] = Extra URL to allow selection from or
+ * content type if mask is an addon-on type (optional).
+ */
+static int SetFile(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ VECSOURCES localShares;
+ g_mediaManager.GetLocalDrives(localShares);
+
+ // Note. can only browse one addon type from here
+ // if browsing for addons, required param[1] is addontype string, with optional param[2]
+ // as contenttype string see IAddon.h & ADDON::TranslateXX
+ std::string strMask = (params.size() > 1) ? params[1] : "";
+ StringUtils::ToLower(strMask);
+ ADDON::TYPE type;
+ if ((type = TranslateType(strMask)) != ADDON_UNKNOWN)
+ {
+ CURL url;
+ url.SetProtocol("addons");
+ url.SetHostName("enabled");
+ url.SetFileName(strMask+"/");
+ localShares.clear();
+ std::string content = (params.size() > 2) ? params[2] : "";
+ StringUtils::ToLower(content);
+ url.SetPassword(content);
+ std::string strMask;
+ if (type == ADDON_SCRIPT)
+ strMask = ".py";
+ std::string replace;
+ if (CGUIDialogFileBrowser::ShowAndGetFile(url.Get(), strMask, TranslateType(type, true), replace, true, true, true))
+ {
+ if (StringUtils::StartsWithNoCase(replace, "addons://"))
+ CSkinSettings::GetInstance().SetString(string, URIUtils::GetFileName(replace));
+ else
+ CSkinSettings::GetInstance().SetString(string, replace);
+ }
+ }
+ else
+ {
+ if (params.size() > 2)
+ {
+ value = params[2];
+ URIUtils::AddSlashAtEnd(value);
+ bool bIsSource;
+ if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
+ {
+ CMediaSource share;
+ share.strName = g_localizeStrings.Get(13278);
+ share.strPath = value;
+ localShares.push_back(share);
+ }
+ }
+ if (CGUIDialogFileBrowser::ShowAndGetFile(localShares, strMask, g_localizeStrings.Get(1033), value))
+ CSkinSettings::GetInstance().SetString(string, value);
+ }
+
+ return 0;
+}
+
+/*! \brief Set a skin image setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ * params[1] = Extra URL to allow selection from (optional).
+ */
+static int SetImage(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ VECSOURCES localShares;
+ g_mediaManager.GetLocalDrives(localShares);
+ if (params.size() > 1)
+ {
+ value = params[1];
+ URIUtils::AddSlashAtEnd(value);
+ bool bIsSource;
+ if (CUtil::GetMatchingSource(value,localShares,bIsSource) < 0) // path is outside shares - add it as a separate one
+ {
+ CMediaSource share;
+ share.strName = g_localizeStrings.Get(13278);
+ share.strPath = value;
+ localShares.push_back(share);
+ }
+ }
+ if (CGUIDialogFileBrowser::ShowAndGetImage(localShares, g_localizeStrings.Get(1030), value))
+ CSkinSettings::GetInstance().SetString(string, value);
+
+ return 0;
+}
+
+/*! \brief Set a skin large image setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ */
+static int SetLargeImage(const std::vector<std::string>& params)
+{
+ int string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ VECSOURCES localShares;
+ g_mediaManager.GetLocalDrives(localShares);
+ VECSOURCES *shares = CMediaSourceSettings::GetInstance().GetSources("pictures");
+ if (!shares)
+ shares = &localShares;
+ if (CGUIDialogFileBrowser::ShowAndGetImage(*shares, g_localizeStrings.Get(1030), value))
+ CSkinSettings::GetInstance().SetString(string, value);
+
+ return 0;
+}
+
+/*! \brief Set a string skin setting.
+ * \param params The parameters.
+ * \details params[0] = Name of skin setting.
+ * params[1] = Value of skin setting (optional).
+ */
+static int SetString(const std::vector<std::string>& params)
+{
+ // break the parameter up if necessary
+ int string = 0;
+ if (params.size() > 1)
+ {
+ string = CSkinSettings::GetInstance().TranslateString(params[0]);
+ CSkinSettings::GetInstance().SetString(string, params[1]);
+ CSettings::GetInstance().Save();
+ return 0;
+ }
+ else
+ string = CSkinSettings::GetInstance().TranslateString(params[0]);
+
+ std::string value = CSkinSettings::GetInstance().GetString(string);
+ if (CGUIKeyboardFactory::ShowAndGetInput(value, CVariant{g_localizeStrings.Get(1029)}, true))
+ CSkinSettings::GetInstance().SetString(string, value);
+
+ return 0;
+}
+
+/*! \brief Select skin theme.
+ * \param params The parameters.
+ * \details params[0] = 0 or 1 to increase theme, -1 to decrease.
+ */
+static int SetTheme(const std::vector<std::string>& params)
+{
+ // enumerate themes
+ std::vector<std::string> vecTheme;
+ CUtil::GetSkinThemes(vecTheme);
+
+ int iTheme = -1;
+
+ // find current theme
+ if (!StringUtils::EqualsNoCase(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME), "SKINDEFAULT"))
+ {
+ for (size_t i=0;i<vecTheme.size();++i)
+ {
+ std::string strTmpTheme(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME));
+ URIUtils::RemoveExtension(strTmpTheme);
+ if (StringUtils::EqualsNoCase(vecTheme[i], strTmpTheme))
+ {
+ iTheme=i;
+ break;
+ }
+ }
+ }
+
+ int iParam = atoi(params[0].c_str());
+ if (iParam == 0 || iParam == 1)
+ iTheme++;
+ else if (iParam == -1)
+ iTheme--;
+ if (iTheme > (int)vecTheme.size()-1)
+ iTheme = -1;
+ if (iTheme < -1)
+ iTheme = vecTheme.size()-1;
+
+ std::string strSkinTheme = "SKINDEFAULT";
+ if (iTheme != -1 && iTheme < (int)vecTheme.size())
+ strSkinTheme = vecTheme[iTheme];
+
+ CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINTHEME, strSkinTheme);
+ // also set the default color theme
+ std::string colorTheme(URIUtils::ReplaceExtension(strSkinTheme, ".xml"));
+ if (StringUtils::EqualsNoCase(colorTheme, "Textures.xml"))
+ colorTheme = "defaults.xml";
+ CSettings::GetInstance().SetString(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS, colorTheme);
+ g_application.ReloadSkin();
+
+ return 0;
+}
+
+/*! \brief Reset a skin setting.
+ * \param params The parameters.
+ * \details params[0] = Name of setting to reset.
+ */
+static int SkinReset(const std::vector<std::string>& params)
+{
+ CSkinSettings::GetInstance().Reset(params[0]);
+ CSettings::GetInstance().Save();
+
+ return 0;
+}
+
+/*! \brief Reset all skin settings.
+ * \param params (ignored)
+ */
+static int SkinResetAll(const std::vector<std::string>& params)
+{
+ CSkinSettings::GetInstance().Reset();
+ CSettings::GetInstance().Save();
+
+ return 0;
+}
+
+/*! \brief Toggle skin debug.
+ * \param params (ignored)
+ */
+static int SkinDebug(const std::vector<std::string>& params)
+{
+ g_SkinInfo->ToggleDebug();
+
+ return 0;
+}
+
+CBuiltins::CommandMap CSkinBuiltins::GetOperations() const
+{
+ return {
+ {"reloadskin", {"Reload Kodi's skin", 0, ReloadSkin}},
+ {"unloadskin", {"Unload Kodi's skin", 0, UnloadSkin}},
+ {"skin.reset", {"Resets a skin setting to default", 1, SkinReset}},
+ {"skin.resetsettings", {"Resets all skin settings", 0, SkinResetAll}},
+ {"skin.setaddon", {"Prompts and set an addon", 2, SetAddon}},
+ {"skin.setbool", {"Sets a skin setting on", 1, SetBool}},
+ {"skin.setfile", {"Prompts and sets a file", 1, SetFile}},
+ {"skin.setimage", {"Prompts and sets a skin image", 1, SetImage}},
+ {"skin.setlargeimage", {"Prompts and sets a large skin images", 1, SetLargeImage}},
+ {"skin.setnumeric", {"Prompts and sets numeric input", 1, SetNumeric}},
+ {"skin.setpath", {"Prompts and sets a skin path", 1, SetPath}},
+ {"skin.setstring", {"Prompts and sets skin string", 1, SetString}},
+ {"skin.theme", {"Control skin theme", 1, SetTheme}},
+ {"skin.toggledebug", {"Toggle skin debug", 0, SkinDebug}},
+ {"skin.togglesetting", {"Toggles a skin setting on or off", 1, ToggleSetting}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/SkinBuiltins.h b/xbmc/interfaces/builtins/SkinBuiltins.h
new file mode 100644
index 0000000000..5f8d10af97
--- /dev/null
+++ b/xbmc/interfaces/builtins/SkinBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing skin related built-in commands.
+class CSkinBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/SystemBuiltins.cpp b/xbmc/interfaces/builtins/SystemBuiltins.cpp
new file mode 100644
index 0000000000..961c6bb7cf
--- /dev/null
+++ b/xbmc/interfaces/builtins/SystemBuiltins.cpp
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "SystemBuiltins.h"
+
+#include "messaging/ApplicationMessenger.h"
+#include "utils/StringUtils.h"
+
+using namespace KODI::MESSAGING;
+
+/*! \brief Execute a system executable.
+ * \param params The parameters.
+ * \details params[0] = The path to the executable.
+ *
+ * Set the template parameter Wait to true to wait for execution exit.
+ */
+ template<int Wait=0>
+static int Exec(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE);
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_OS, Wait, -1, nullptr, params[0]);
+
+ return 0;
+}
+
+/*! \brief Hibernate system.
+ * \param params (ignored)
+ */
+static int Hibernate(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_HIBERNATE);
+
+ return 0;
+}
+
+/*! \brief Inhibit idle shutdown timer.
+ * \param params The parameters.
+ * \details params[0] = "true" to inhibit shutdown timer (optional).
+ */
+static int InhibitIdle(const std::vector<std::string>& params)
+{
+ bool inhibit = (params.size() == 1 && StringUtils::EqualsNoCase(params[0], "true"));
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_INHIBITIDLESHUTDOWN, inhibit);
+
+ return 0;
+}
+
+/*! \brief Minimize application.
+ * \param params (ignored)
+ */
+static int Minimize(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_MINIMIZE);
+
+ return 0;
+}
+
+/*! \brief Powerdown system.
+ * \param params (ignored)
+ */
+static int Powerdown(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_POWERDOWN);
+
+ return 0;
+}
+
+/*! \brief Quit application.
+ * \param params (ignored)
+ */
+static int Quit(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT);
+
+ return 0;
+}
+
+/*! \brief Reboot system.
+ * \param params (ignored)
+ */
+static int Reboot(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTART);
+
+ return 0;
+}
+
+/*! \brief Restart application.
+ * \param params (ignored)
+ */
+static int RestartApp(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_RESTARTAPP);
+
+ return 0;
+}
+
+/*! \brief Activate screensaver.
+ * \param params (ignored)
+ */
+static int Screensaver(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_ACTIVATESCREENSAVER);
+
+ return 0;
+}
+
+/*! \brief Shutdown system.
+ * \param params (ignored)
+ */
+static int Shutdown(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_SHUTDOWN);
+
+ return 0;
+}
+
+/*! \brief Suspend system.
+ * \param params (ignored)
+ */
+static int Suspend(const std::vector<std::string>& params)
+{
+ CApplicationMessenger::GetInstance().PostMsg(TMSG_SUSPEND);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CSystemBuiltins::GetOperations() const
+{
+ return {
+ {"activatescreensaver", {"Activate Screensaver", 0, Screensaver}},
+ {"hibernate", {"Hibernates the system", 0, Hibernate}},
+ {"inhibitidleshutdown", {"Inhibit idle shutdown", 0, InhibitIdle}},
+ {"minimize", {"Minimize Kodi", 0, Minimize}},
+ {"powerdown", {"Powerdown system", 0, Powerdown}},
+ {"quit", {"Quit Kodi", 0, Quit}},
+ {"reboot", {"Reboot the system", 0, Reboot}},
+ {"reset", {"Reset the system (same as reboot)", 0, Reboot}},
+ {"restart", {"Restart the system (same as reboot)", 0, Reboot}},
+ {"restartapp", {"Restart Kodi", 0, RestartApp}},
+ {"shutdown", {"Shutdown the system", 0, Shutdown}},
+ {"suspend", {"Suspends the system", 0, Suspend}},
+ {"system.exec", {"Execute shell commands", 1, Exec<0>}},
+ {"system.execwait", {"Execute shell commands and freezes Kodi until shell is closed", 1, Exec<1>}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/SystemBuiltins.h b/xbmc/interfaces/builtins/SystemBuiltins.h
new file mode 100644
index 0000000000..458f41caca
--- /dev/null
+++ b/xbmc/interfaces/builtins/SystemBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing system related built-in commands.
+class CSystemBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/builtins/WeatherBuiltins.cpp b/xbmc/interfaces/builtins/WeatherBuiltins.cpp
new file mode 100644
index 0000000000..9e8f3971fa
--- /dev/null
+++ b/xbmc/interfaces/builtins/WeatherBuiltins.cpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "WeatherBuiltins.h"
+
+#include "guilib/GUIWindowManager.h"
+
+/*! \brief Switch to a given weather location.
+ * \param params The parameters.
+ * \details params[0] = 1, 2 or 3.
+ */
+static int SetLocation(const std::vector<std::string>& params)
+{
+ int loc = atoi(params[0].c_str());
+ CGUIMessage msg(GUI_MSG_ITEM_SELECT, 0, 0, loc);
+ g_windowManager.SendMessage(msg, WINDOW_WEATHER);
+
+ return 0;
+}
+
+/*! \brief Switch weather location or refresh current.
+ * \param params (ignored)
+ *
+ * The Direction template parameter can be -1 for previous location,
+ * 1 for next location or 0 to refresh current location.
+ */
+ template<int Direction>
+static int SwitchLocation(const std::vector<std::string>& params)
+{
+ CGUIMessage msg(GUI_MSG_MOVE_OFFSET, 0, 0, Direction);
+ g_windowManager.SendMessage(msg, WINDOW_WEATHER);
+
+ return 0;
+}
+
+CBuiltins::CommandMap CWeatherBuiltins::GetOperations() const
+{
+ return {
+ {"weather.refresh", {"Force weather data refresh", 0, SwitchLocation<0>}},
+ {"weather.locationnext", {"Switch to next weather location", 0, SwitchLocation<1>}},
+ {"weather.locationprevious", {"Switch to previous weather location", 0, SwitchLocation<-1>}},
+ {"weather.locationset", {"Switch to given weather location (parameter can be 1-3)", 1, SetLocation}}
+ };
+}
diff --git a/xbmc/interfaces/builtins/WeatherBuiltins.h b/xbmc/interfaces/builtins/WeatherBuiltins.h
new file mode 100644
index 0000000000..7714a84e8e
--- /dev/null
+++ b/xbmc/interfaces/builtins/WeatherBuiltins.h
@@ -0,0 +1,30 @@
+#pragma once
+/*
+ * Copyright (C) 2005-2015 Team XBMC
+ * http://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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "Builtins.h"
+
+//! \brief Class providing weather related built-in commands.
+class CWeatherBuiltins
+{
+public:
+ //! \brief Returns the map of operations.
+ CBuiltins::CommandMap GetOperations() const;
+};
diff --git a/xbmc/interfaces/json-rpc/GUIOperations.cpp b/xbmc/interfaces/json-rpc/GUIOperations.cpp
index 03d04f4517..1233a1ea9a 100644
--- a/xbmc/interfaces/json-rpc/GUIOperations.cpp
+++ b/xbmc/interfaces/json-rpc/GUIOperations.cpp
@@ -24,7 +24,7 @@
#include "GUIInfoManager.h"
#include "guilib/GUIWindowManager.h"
#include "input/Key.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "dialogs/GUIDialogKaiToast.h"
#include "addons/AddonManager.h"
#include "settings/Settings.h"
@@ -65,7 +65,7 @@ JSONRPC_STATUS CGUIOperations::ActivateWindow(const std::string &method, ITransp
cmd += "," + param->asString();
}
cmd += ")";
- CBuiltins::Execute(cmd);
+ CBuiltins::GetInstance().Execute(cmd);
return ACK;
}
diff --git a/xbmc/interfaces/json-rpc/PlayerOperations.cpp b/xbmc/interfaces/json-rpc/PlayerOperations.cpp
index 58cd00d9d8..b0ee2c8a9b 100644
--- a/xbmc/interfaces/json-rpc/PlayerOperations.cpp
+++ b/xbmc/interfaces/json-rpc/PlayerOperations.cpp
@@ -25,7 +25,7 @@
#include "input/Key.h"
#include "GUIUserMessages.h"
#include "pictures/GUIWindowSlideShow.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "PartyModeManager.h"
#include "messaging/ApplicationMessenger.h"
#include "FileItem.h"
@@ -290,7 +290,7 @@ JSONRPC_STATUS CPlayerOperations::PlayPause(const std::string &method, ITranspor
return FailedToExecute;
if (parameterObject["play"].isString())
- CBuiltins::Execute("playercontrol(play)");
+ CBuiltins::GetInstance().Execute("playercontrol(play)");
else
{
if (parameterObject["play"].asBoolean())
@@ -366,9 +366,9 @@ JSONRPC_STATUS CPlayerOperations::SetSpeed(const std::string &method, ITransport
else if (parameterObject["speed"].isString())
{
if (parameterObject["speed"].asString().compare("increment") == 0)
- CBuiltins::Execute("playercontrol(forward)");
+ CBuiltins::GetInstance().Execute("playercontrol(forward)");
else
- CBuiltins::Execute("playercontrol(rewind)");
+ CBuiltins::GetInstance().Execute("playercontrol(rewind)");
}
else
return InvalidParams;
@@ -403,13 +403,13 @@ JSONRPC_STATUS CPlayerOperations::Seek(const std::string &method, ITransportLaye
{
std::string step = value.isString() ? value.asString() : value["step"].asString();
if (step == "smallforward")
- CBuiltins::Execute("playercontrol(smallskipforward)");
+ CBuiltins::GetInstance().Execute("playercontrol(smallskipforward)");
else if (step == "smallbackward")
- CBuiltins::Execute("playercontrol(smallskipbackward)");
+ CBuiltins::GetInstance().Execute("playercontrol(smallskipbackward)");
else if (step == "bigforward")
- CBuiltins::Execute("playercontrol(bigskipforward)");
+ CBuiltins::GetInstance().Execute("playercontrol(bigskipforward)");
else if (step == "bigbackward")
- CBuiltins::Execute("playercontrol(bigskipbackward)");
+ CBuiltins::GetInstance().Execute("playercontrol(bigskipbackward)");
else
return InvalidParams;
}
diff --git a/xbmc/interfaces/json-rpc/SystemOperations.cpp b/xbmc/interfaces/json-rpc/SystemOperations.cpp
index bbb46475ab..0ffce750a7 100644
--- a/xbmc/interfaces/json-rpc/SystemOperations.cpp
+++ b/xbmc/interfaces/json-rpc/SystemOperations.cpp
@@ -20,7 +20,7 @@
#include "SystemOperations.h"
#include "messaging/ApplicationMessenger.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "utils/Variant.h"
#include "powermanagement/PowerManager.h"
@@ -48,7 +48,7 @@ JSONRPC_STATUS CSystemOperations::GetProperties(const std::string &method, ITran
JSONRPC_STATUS CSystemOperations::EjectOpticalDrive(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
{
- return CBuiltins::Execute("EjectTray") == 0 ? ACK : FailedToExecute;
+ return CBuiltins::GetInstance().Execute("EjectTray") == 0 ? ACK : FailedToExecute;
}
JSONRPC_STATUS CSystemOperations::Shutdown(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
diff --git a/xbmc/network/EventServer.cpp b/xbmc/network/EventServer.cpp
index 206d00ec0c..35c00f3a82 100644
--- a/xbmc/network/EventServer.cpp
+++ b/xbmc/network/EventServer.cpp
@@ -28,7 +28,7 @@
#include "Socket.h"
#include "threads/CriticalSection.h"
#include "Application.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "input/ButtonTranslator.h"
#include "threads/SingleLock.h"
#include "Zeroconf.h"
@@ -36,7 +36,7 @@
#include "input/Key.h"
#include "utils/log.h"
#include "utils/SystemInfo.h"
-
+#include "Util.h"
#include <map>
#include <queue>
#include <cassert>
@@ -343,13 +343,16 @@ bool CEventServer::ExecuteNextAction()
switch(actionEvent.actionType)
{
case AT_EXEC_BUILTIN:
- CBuiltins::Execute(actionEvent.actionName);
+ CBuiltins::GetInstance().Execute(actionEvent.actionName);
break;
case AT_BUTTON:
{
int actionID;
- CButtonTranslator::TranslateActionString(actionEvent.actionName.c_str(), actionID);
+ std::vector<std::string> parameters;
+ std::string function;
+ CUtil::SplitExecFunction(actionEvent.actionName, function, parameters);
+ CButtonTranslator::TranslateActionString(function.c_str(), actionID);
CAction action(actionID, 1.0f, 0.0f, actionEvent.actionName);
g_audioManager.PlayActionSound(action);
g_application.OnAction(action);
diff --git a/xbmc/powermanagement/PowerManager.cpp b/xbmc/powermanagement/PowerManager.cpp
index 59d69e6a58..845105e0cd 100644
--- a/xbmc/powermanagement/PowerManager.cpp
+++ b/xbmc/powermanagement/PowerManager.cpp
@@ -29,7 +29,7 @@
#include "windowing/WindowingFactory.h"
#include "utils/log.h"
#include "utils/Weather.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "interfaces/AnnouncementManager.h"
#include "guilib/LocalizeStrings.h"
#include "guilib/GUIWindowManager.h"
@@ -248,7 +248,7 @@ void CPowerManager::OnSleep()
// stop lirc
#if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE)
CLog::Log(LOGNOTICE, "%s: Stopping lirc", __FUNCTION__);
- CBuiltins::Execute("LIRC.Stop");
+ CBuiltins::GetInstance().Execute("LIRC.Stop");
#endif
PVR::CPVRManager::GetInstance().SetWakeupCommand();
@@ -285,7 +285,7 @@ void CPowerManager::OnWake()
// restart lirc
#if defined(HAS_LIRC) || defined(HAS_IRSERVERSUITE)
CLog::Log(LOGNOTICE, "%s: Restarting lirc", __FUNCTION__);
- CBuiltins::Execute("LIRC.Start");
+ CBuiltins::GetInstance().Execute("LIRC.Start");
#endif
CAEFactory::Resume();
diff --git a/xbmc/settings/MediaSettings.cpp b/xbmc/settings/MediaSettings.cpp
index abf5714713..ceed26d3fc 100644
--- a/xbmc/settings/MediaSettings.cpp
+++ b/xbmc/settings/MediaSettings.cpp
@@ -27,7 +27,7 @@
#include "PlayListPlayer.h"
#include "dialogs/GUIDialogContextMenu.h"
#include "dialogs/GUIDialogFileBrowser.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "music/MusicDatabase.h"
#include "messaging/ApplicationMessenger.h"
#include "messaging/helpers/DialogHelper.h"
@@ -368,7 +368,7 @@ void CMediaSettings::OnSettingAction(const CSetting *setting)
g_application.StartMusicCleanup(true);
}
else if (settingId == CSettings::SETTING_MUSICLIBRARY_EXPORT)
- CBuiltins::Execute("exportlibrary(music)");
+ CBuiltins::GetInstance().Execute("exportlibrary(music)");
else if (settingId == CSettings::SETTING_MUSICLIBRARY_IMPORT)
{
std::string path;
@@ -391,7 +391,7 @@ void CMediaSettings::OnSettingAction(const CSetting *setting)
g_application.StartVideoCleanup(true);
}
else if (settingId == CSettings::SETTING_VIDEOLIBRARY_EXPORT)
- CBuiltins::Execute("exportlibrary(video)");
+ CBuiltins::GetInstance().Execute("exportlibrary(video)");
else if (settingId == CSettings::SETTING_VIDEOLIBRARY_IMPORT)
{
std::string path;
diff --git a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp
index b81f7f2aae..e00e1e682e 100644
--- a/xbmc/settings/dialogs/GUIDialogContentSettings.cpp
+++ b/xbmc/settings/dialogs/GUIDialogContentSettings.cpp
@@ -34,7 +34,7 @@
#include "dialogs/GUIDialogKaiToast.h"
#include "guilib/GUIWindowManager.h"
#include "input/Key.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "settings/lib/Setting.h"
#include "settings/lib/SettingDependency.h"
#include "settings/lib/SettingsManager.h"
@@ -114,7 +114,7 @@ bool CGUIDialogContentSettings::OnMessage(CGUIMessage &message)
std::string content = m_vecItems->Get(iSelected)->GetPath().substr(14);
OnCancel();
Close();
- CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)");
+ CBuiltins::GetInstance().Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.metadata.scraper." + content + ",return)");
return true;
}
diff --git a/xbmc/storage/AutorunMediaJob.cpp b/xbmc/storage/AutorunMediaJob.cpp
index 1d91710567..9d1a64514c 100644
--- a/xbmc/storage/AutorunMediaJob.cpp
+++ b/xbmc/storage/AutorunMediaJob.cpp
@@ -19,7 +19,7 @@
*/
#include "AutorunMediaJob.h"
#include "Application.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "guilib/GUIWindowManager.h"
#include "guilib/LocalizeStrings.h"
#include "dialogs/GUIDialogSelect.h"
@@ -56,7 +56,7 @@ bool CAutorunMediaJob::DoWork()
if (selection >= 0)
{
std::string strAction = StringUtils::Format("ActivateWindow(%s, %s)", GetWindowString(selection), m_path.c_str());
- CBuiltins::Execute(strAction);
+ CBuiltins::GetInstance().Execute(strAction);
}
return true;
diff --git a/xbmc/utils/RssManager.cpp b/xbmc/utils/RssManager.cpp
index f6820f5224..ec7a0d4444 100644
--- a/xbmc/utils/RssManager.cpp
+++ b/xbmc/utils/RssManager.cpp
@@ -22,7 +22,7 @@
#include "addons/AddonInstaller.h"
#include "addons/AddonManager.h"
#include "filesystem/File.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "messaging/ApplicationMessenger.h"
#include "messaging/helpers/DialogHelper.h"
#include "profiles/ProfilesManager.h"
@@ -79,7 +79,7 @@ void CRssManager::OnSettingAction(const CSetting *setting)
if (!CAddonInstaller::GetInstance().InstallModal("script.rss.editor", addon))
return;
}
- CBuiltins::Execute("RunScript(script.rss.editor)");
+ CBuiltins::GetInstance().Execute("RunScript(script.rss.editor)");
}
}
diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp
index 3466e7b887..b8b0053b71 100644
--- a/xbmc/windows/GUIMediaWindow.cpp
+++ b/xbmc/windows/GUIMediaWindow.cpp
@@ -50,7 +50,7 @@
#include "guilib/GUIKeyboardFactory.h"
#include "guilib/GUIWindowManager.h"
#include "guilib/LocalizeStrings.h"
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "interfaces/generic/ScriptInvocationManager.h"
#include "input/Key.h"
#include "network/Network.h"
@@ -1013,7 +1013,7 @@ bool CGUIMediaWindow::OnClick(int iItem)
}
else if (StringUtils::StartsWithNoCase(pItem->GetPath(), "addons://more/"))
{
- CBuiltins::Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.addon." + pItem->GetPath().substr(14) + ",return)");
+ CBuiltins::GetInstance().Execute("ActivateWindow(AddonBrowser,addons://all/xbmc.addon." + pItem->GetPath().substr(14) + ",return)");
return true;
}
diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp
index 809f999e0a..77b3ab150b 100644
--- a/xbmc/windows/GUIWindowLoginScreen.cpp
+++ b/xbmc/windows/GUIWindowLoginScreen.cpp
@@ -30,7 +30,7 @@
#ifdef HAS_JSONRPC
#include "interfaces/json-rpc/JSONRPC.h"
#endif
-#include "interfaces/Builtins.h"
+#include "interfaces/builtins/Builtins.h"
#include "utils/log.h"
#include "utils/Weather.h"
#include "utils/StringUtils.h"
@@ -148,7 +148,7 @@ bool CGUIWindowLoginScreen::OnAction(const CAction &action)
StringUtils::ToLower(actionName);
if ((actionName.find("shutdown") != std::string::npos) &&
PVR::g_PVRManager.CanSystemPowerdown())
- CBuiltins::Execute(action.GetName());
+ CBuiltins::GetInstance().Execute(action.GetName());
return true;
}
return CGUIWindow::OnAction(action);