diff options
author | Rainer Hochecker <fernetmenta@online.de> | 2015-09-12 12:27:34 +0200 |
---|---|---|
committer | Rainer Hochecker <fernetmenta@online.de> | 2015-09-12 12:27:34 +0200 |
commit | a00a747b6c1ba633e8d83adcf50f93ce888f65dd (patch) | |
tree | c09af6cf8d4e6883fe821a13489809e644f088cf | |
parent | 5f9ea4c60dbbc6f34b26ec70b55669aaad149b69 (diff) | |
parent | 28ca16a057d7867aff7b88d8cd14c7602771ff8b (diff) |
Merge pull request #8018 from FernetMenta/builtins
refactor builtins
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*>(¶ms)); - } - 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 ¶meterObject, 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 ¶meterObject, 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); |