diff --git a/bindings/python/MANIFEST.in b/bindings/python/MANIFEST.in index f2039627..de92c867 100644 --- a/bindings/python/MANIFEST.in +++ b/bindings/python/MANIFEST.in @@ -1,3 +1,3 @@ include telldus.c include telldus-core.h -recursive-include example/* \ No newline at end of file +recursive-include example/* diff --git a/bindings/python/example/__init__.py b/bindings/python/example/__init__.py index 2f9c52f4..5e1f823c 100644 --- a/bindings/python/example/__init__.py +++ b/bindings/python/example/__init__.py @@ -9,34 +9,34 @@ print "Devices: %d\n" % devices allMethods = telldus.TELLDUS_TURNON | telldus.TELLDUS_TURNOFF | telldus.TELLDUS_BELL | telldus.TELLDUS_DIM for i in xrange(devices): - deviceid = telldus.tdGetDeviceId(i) - name = telldus.tdGetName(deviceid) - - print "%s - %s\n" % (deviceid, name) - - methods = telldus.tdMethods(deviceid, allMethods) - - if methods & telldus.TELLDUS_TURNON: - print " * TurnOn\n" - telldus.tdTurnOn(deviceid) - time.sleep(1) - - if methods & telldus.TELLDUS_TURNOFF: - print " * TurnOff\n" - telldus.tdTurnOff(deviceid) - time.sleep(1) - - if methods & telldus.TELLDUS_BELL: - echo " * Bell\n" - telldus.tdBell(deviceid) - time.sleep(1) - - if methods & telldus.TELLDUS_TOGGLE: - print " * Toggle\n" - - if methods & telldus.TELLDUS_DIM: - print " * Dim\n" - telldus.tdDim(deviceid, 128) - time.sleep(1) + deviceid = telldus.tdGetDeviceId(i) + name = telldus.tdGetName(deviceid) + + print "%s - %s\n" % (deviceid, name) + + methods = telldus.tdMethods(deviceid, allMethods) + + if methods & telldus.TELLDUS_TURNON: + print " * TurnOn\n" + telldus.tdTurnOn(deviceid) + time.sleep(1) + + if methods & telldus.TELLDUS_TURNOFF: + print " * TurnOff\n" + telldus.tdTurnOff(deviceid) + time.sleep(1) + + if methods & telldus.TELLDUS_BELL: + echo " * Bell\n" + telldus.tdBell(deviceid) + time.sleep(1) + + if methods & telldus.TELLDUS_TOGGLE: + print " * Toggle\n" + + if methods & telldus.TELLDUS_DIM: + print " * Dim\n" + telldus.tdDim(deviceid, 128) + time.sleep(1) telldus.tdClose() \ No newline at end of file diff --git a/bindings/python/setup.py b/bindings/python/setup.py index f1a9f336..635121fa 100644 --- a/bindings/python/setup.py +++ b/bindings/python/setup.py @@ -7,337 +7,337 @@ PLATFORM_IS_WINDOWS = sys.platform.lower().startswith('win') if PLATFORM_IS_WINDOWS: - __doc__="""This is a distutils setup-script for the telldus extension - - To build the telldus extensions, simply execute: - python setup.py -q build - or - python setup.py -q install - to build and install into your current Python installation. - - These extensions require a number of libraries to build, some of which may - require you to install special SDKs or toolkits. This script will attempt - to build as many as it can, and at the end of the build will report any - extension modules that could not be built and why. - - This has got complicated due to the various different versions of - Visual Studio used - some VS versions are not compatible with some SDK - versions. Below are the Windows SDK versions required (and the URL - although - these are subject to being changed by MS at any time:) - - Python 2.6+: - - Build using Microsoft Visual Studio 2008 Express Edition: - http://www.microsoft.com/en-us/download/details.aspx?id=6506 - http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/ - http://www.cppblog.com/Files/xcpp/VCE64BIT_WIN7SDK.zip + __doc__="""This is a distutils setup-script for the telldus extension + + To build the telldus extensions, simply execute: + python setup.py -q build + or + python setup.py -q install + to build and install into your current Python installation. + + These extensions require a number of libraries to build, some of which may + require you to install special SDKs or toolkits. This script will attempt + to build as many as it can, and at the end of the build will report any + extension modules that could not be built and why. + + This has got complicated due to the various different versions of + Visual Studio used - some VS versions are not compatible with some SDK + versions. Below are the Windows SDK versions required (and the URL - although + these are subject to being changed by MS at any time:) + + Python 2.6+: + + Build using Microsoft Visual Studio 2008 Express Edition: + http://www.microsoft.com/en-us/download/details.aspx?id=6506 + http://jenshuebel.wordpress.com/2009/02/12/visual-c-2008-express-edition-and-64-bit-targets/ + http://www.cppblog.com/Files/xcpp/VCE64BIT_WIN7SDK.zip - For 32bit build: - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b - Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars32.bat to - C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat - - For 64bit build: - Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 (ISO) GRMSDKX_EN_DVD.iso - http://www.microsoft.com/en-us/download/details.aspx?id=18950 - Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars64.bat to - C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat - - Python 2.3->2.5: - - Microsoft Windows Software Development Kit Update for Windows Vista (version 6.0) - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4377f86d-c913-4b5c-b87e-ef72e5b4e065 - ** If you want to build Python 2.3, be sure to install the SDK compilers - too - although we don't use them, this setup option installs some .lib - files we do need. - ** - - If you multiple SDK versions on a single machine, set the MSSDK environment - variable to point at the one you want to use. Note that using the SDK for - a particular platform (eg, Windows 7) doesn't force you to use that OS as your - build environment. If the links above don't work, use google to find them. - - Building: - --------- - - To install the telldus extension, execute: - python setup.py -q install - - This will install the built extensions into your site-packages directory, - create an appropriate .pth file, and should leave everything ready to use. - There is no need to modify the registry. - - To build or install debug (_d) versions of these extensions, ensure you have - built or installed a debug version of Python itself, then pass the "--debug" - flag to the build command - eg: - python setup.py -q build --debug - or to build and install a debug version: - python setup.py -q build --debug install - - To build 64bit versions of this: - - * py2.5 and earlier - sorry, I've given up in disgust. Using VS2003 with - the Vista SDK is just too painful to make work, and VS2005 is not used for - any released versions of Python. See revision 1.69 of this file for the - last version that attempted to support and document this process. - - * 2.6 and later: On a 64bit OS, just build as you would on a 32bit platform. - On a 32bit platform (ie, to cross-compile), you must use VS2008 to - cross-compile Python itself. Note that by default, the 64bit tools are not - installed with VS2008, so you may need to adjust your VS2008 setup (see "For 64bit build"). Then - use: - vcs - setup.py build --plat-name=win-amd64 - - see the distutils cross-compilation documentation for more details. - """ - # Originally by Thomas Heller, started in 2000 or so. - import os - import shutil - - is_py3k = sys.version_info > (3,) # get this out of the way early on... - # We have special handling for _winreg so our setup3.py script can avoid - # using the 'imports' fixer and therefore start much faster... - if is_py3k: - import winreg as _winreg - else: - import _winreg - - try: - from distutils import log - except ImportError: - class Log: - def debug(self, msg, *args): - print msg % args - def info(self, msg, *args): - print msg % args - log = Log() - - try: - this_file = __file__ - except NameError: - this_file = sys.argv[0] - - this_file = os.path.abspath(this_file) - # We get upset if the cwd is not our source dir, but it is a PITA to - # insist people manually CD there first! - if os.path.dirname(this_file): - os.chdir(os.path.dirname(this_file)) + For 32bit build: + Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 + http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b + Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars32.bat to + C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat + + For 64bit build: + Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 (ISO) GRMSDKX_EN_DVD.iso + http://www.microsoft.com/en-us/download/details.aspx?id=18950 + Copy C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvars64.bat to + C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat + + Python 2.3->2.5: + + Microsoft Windows Software Development Kit Update for Windows Vista (version 6.0) + http://www.microsoft.com/downloads/en/details.aspx?FamilyID=4377f86d-c913-4b5c-b87e-ef72e5b4e065 + ** If you want to build Python 2.3, be sure to install the SDK compilers + too - although we don't use them, this setup option installs some .lib + files we do need. + ** + + If you multiple SDK versions on a single machine, set the MSSDK environment + variable to point at the one you want to use. Note that using the SDK for + a particular platform (eg, Windows 7) doesn't force you to use that OS as your + build environment. If the links above don't work, use google to find them. + + Building: + --------- + + To install the telldus extension, execute: + python setup.py -q install + + This will install the built extensions into your site-packages directory, + create an appropriate .pth file, and should leave everything ready to use. + There is no need to modify the registry. + + To build or install debug (_d) versions of these extensions, ensure you have + built or installed a debug version of Python itself, then pass the "--debug" + flag to the build command - eg: + python setup.py -q build --debug + or to build and install a debug version: + python setup.py -q build --debug install + + To build 64bit versions of this: + + * py2.5 and earlier - sorry, I've given up in disgust. Using VS2003 with + the Vista SDK is just too painful to make work, and VS2005 is not used for + any released versions of Python. See revision 1.69 of this file for the + last version that attempted to support and document this process. + + * 2.6 and later: On a 64bit OS, just build as you would on a 32bit platform. + On a 32bit platform (ie, to cross-compile), you must use VS2008 to + cross-compile Python itself. Note that by default, the 64bit tools are not + installed with VS2008, so you may need to adjust your VS2008 setup (see "For 64bit build"). Then + use: + vcs + setup.py build --plat-name=win-amd64 + + see the distutils cross-compilation documentation for more details. + """ + # Originally by Thomas Heller, started in 2000 or so. + import os + import shutil + + is_py3k = sys.version_info > (3,) # get this out of the way early on... + # We have special handling for _winreg so our setup3.py script can avoid + # using the 'imports' fixer and therefore start much faster... + if is_py3k: + import winreg as _winreg + else: + import _winreg + + try: + from distutils import log + except ImportError: + class Log: + def debug(self, msg, *args): + print msg % args + def info(self, msg, *args): + print msg % args + log = Log() + + try: + this_file = __file__ + except NameError: + this_file = sys.argv[0] + + this_file = os.path.abspath(this_file) + # We get upset if the cwd is not our source dir, but it is a PITA to + # insist people manually CD there first! + if os.path.dirname(this_file): + os.chdir(os.path.dirname(this_file)) - - # We need to know the platform SDK dir before we can list the extensions. - def find_platform_sdk_dir(): - # Finding the Platform SDK install dir is a treat. There can be some - # dead ends so we only consider the job done if we find the "windows.h" - # landmark. - landmark = "include\\windows.h" - # 1. The use might have their current environment setup for the - # SDK, in which case the "MSSdk" env var is set. - sdkdir = os.environ.get("MSSdk") - if sdkdir: - if DEBUG: - print "PSDK: try %%MSSdk%%: '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - # 2. The "Install Dir" value in the - # HKLM\Software\Microsoft\MicrosoftSDK\Directories registry key - # sometimes points to the right thing. However, after upgrading to - # the "Platform SDK for Windows Server 2003 SP1" this is dead end. - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\MicrosoftSDK\Directories") - sdkdir, ignore = _winreg.QueryValueEx(key, "Install Dir") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ - "\Directories\Install Dir': '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - # 3. Each installed SDK (not just the platform SDK) seems to have GUID - # subkey of HKLM\Software\Microsoft\MicrosoftSDK\InstalledSDKs and - # it *looks* like the latest installed Platform SDK will be the - # only one with an "Install Dir" sub-value. - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\MicrosoftSDK\InstalledSDKs") - i = 0 - while True: - guid = _winreg.EnumKey(key, i) - guidkey = _winreg.OpenKey(key, guid) - try: - sdkdir, ignore = _winreg.QueryValueEx(guidkey, "Install Dir") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ - "\InstallSDKs\%s\Install Dir': '%s'"\ - % (guid, sdkdir) - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - i += 1 - except EnvironmentError: - pass - # 4. Vista's SDK - try: - key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, - r"Software\Microsoft\Microsoft SDKs\Windows") - sdkdir, ignore = _winreg.QueryValueEx(key, "CurrentInstallFolder") - except EnvironmentError: - pass - else: - if DEBUG: - print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDKs"\ - "\Windows\CurrentInstallFolder': '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - - # 5. Failing this just try a few well-known default install locations. - progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") - defaultlocs = [ - os.path.join(progfiles, "Microsoft Platform SDK"), - os.path.join(progfiles, "Microsoft SDK"), - ] - for sdkdir in defaultlocs: - if DEBUG: - print "PSDK: try default location: '%s'" % sdkdir - if os.path.isfile(os.path.join(sdkdir, landmark)): - return sdkdir - - - # Some nasty hacks to prevent most of our extensions using a manifest, as - # the manifest - even without a reference to the CRT assembly - is enough - # to prevent the extension from loading. For more details, see - # http://bugs.python.org/issue7833 - that issue has a patch, but it is - # languishing and will probably never be fixed for Python 2.6... - if sys.version_info > (2,6): - from distutils.spawn import spawn - from distutils.msvc9compiler import MSVCCompiler - MSVCCompiler._orig_spawn = MSVCCompiler.spawn - MSVCCompiler._orig_link = MSVCCompiler.link - - # We need to override this method for versions where issue7833 *has* landed - # (ie, 2.7 and 3.2+) - def manifest_get_embed_info(self, target_desc, ld_args): - _want_assembly_kept = getattr(self, '_want_assembly_kept', False) - if not _want_assembly_kept: - return None - for arg in ld_args: - if arg.startswith("/MANIFESTFILE:"): - orig_manifest = arg.split(":", 1)[1] - if target_desc==self.EXECUTABLE: - rid = 1 - else: - rid = 2 - return orig_manifest, rid - return None - # always monkeypatch it in even though it will only be called in 2.7 - # and 3.2+. - MSVCCompiler.manifest_get_embed_info = manifest_get_embed_info - - def monkeypatched_spawn(self, cmd): - is_link = cmd[0].endswith("link.exe") or cmd[0].endswith('"link.exe"') - is_mt = cmd[0].endswith("mt.exe") or cmd[0].endswith('"mt.exe"') - _want_assembly_kept = getattr(self, '_want_assembly_kept', False) - if not _want_assembly_kept and is_mt: - # We don't want mt.exe run... - return - if not _want_assembly_kept and is_link: - # remove /MANIFESTFILE:... and add MANIFEST:NO - # (but note that for winxpgui, which specifies a manifest via a - # .rc file, this is ignored by the linker - the manifest specified - # in the .rc file is still added) - for i in range(len(cmd)): - if cmd[i].startswith("/MANIFESTFILE:"): - cmd[i] = "/MANIFEST:NO" - break - if _want_assembly_kept and is_mt: - # We want mt.exe run with the original manifest - for i in range(len(cmd)): - if cmd[i] == "-manifest": - cmd[i+1] = cmd[i+1] + ".orig" - break - self._orig_spawn(cmd) - if _want_assembly_kept and is_link: - # We want a copy of the original manifest so we can use it later. - for i in range(len(cmd)): - if cmd[i].startswith("/MANIFESTFILE:"): - mfname = cmd[i][14:] - shutil.copyfile(mfname, mfname + ".orig") - break - - def monkeypatched_link(self, target_desc, objects, output_filename, *args, **kw): - # no manifests for 3.3+ - self._want_assembly_kept = sys.version_info < (3,3) and \ - (os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \ - os.path.basename(output_filename).startswith("perfmondata.dll") or \ - os.path.basename(output_filename).startswith("win32ui.pyd") or \ - target_desc==self.EXECUTABLE) - try: - return self._orig_link(target_desc, objects, output_filename, *args, **kw) - finally: - delattr(self, '_want_assembly_kept') - MSVCCompiler.spawn = monkeypatched_spawn - MSVCCompiler.link = monkeypatched_link - - def find_telldus_dev_dir(): - landmark = "telldus-core.h" - dev_dir = os.environ.get("TELLDUS_DEVDIR") - if dev_dir: - if DEBUG: - print "Telldus dev dir:" % dev_dir - if os.path.isfile(os.path.join(dev_dir, landmark)): - return dev_dir + + # We need to know the platform SDK dir before we can list the extensions. + def find_platform_sdk_dir(): + # Finding the Platform SDK install dir is a treat. There can be some + # dead ends so we only consider the job done if we find the "windows.h" + # landmark. + landmark = "include\\windows.h" + # 1. The use might have their current environment setup for the + # SDK, in which case the "MSSdk" env var is set. + sdkdir = os.environ.get("MSSdk") + if sdkdir: + if DEBUG: + print "PSDK: try %%MSSdk%%: '%s'" % sdkdir + if os.path.isfile(os.path.join(sdkdir, landmark)): + return sdkdir + # 2. The "Install Dir" value in the + # HKLM\Software\Microsoft\MicrosoftSDK\Directories registry key + # sometimes points to the right thing. However, after upgrading to + # the "Platform SDK for Windows Server 2003 SP1" this is dead end. + try: + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, + r"Software\Microsoft\MicrosoftSDK\Directories") + sdkdir, ignore = _winreg.QueryValueEx(key, "Install Dir") + except EnvironmentError: + pass + else: + if DEBUG: + print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ + "\Directories\Install Dir': '%s'" % sdkdir + if os.path.isfile(os.path.join(sdkdir, landmark)): + return sdkdir + # 3. Each installed SDK (not just the platform SDK) seems to have GUID + # subkey of HKLM\Software\Microsoft\MicrosoftSDK\InstalledSDKs and + # it *looks* like the latest installed Platform SDK will be the + # only one with an "Install Dir" sub-value. + try: + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, + r"Software\Microsoft\MicrosoftSDK\InstalledSDKs") + i = 0 + while True: + guid = _winreg.EnumKey(key, i) + guidkey = _winreg.OpenKey(key, guid) + try: + sdkdir, ignore = _winreg.QueryValueEx(guidkey, "Install Dir") + except EnvironmentError: + pass + else: + if DEBUG: + print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDK"\ + "\InstallSDKs\%s\Install Dir': '%s'"\ + % (guid, sdkdir) + if os.path.isfile(os.path.join(sdkdir, landmark)): + return sdkdir + i += 1 + except EnvironmentError: + pass + # 4. Vista's SDK + try: + key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, + r"Software\Microsoft\Microsoft SDKs\Windows") + sdkdir, ignore = _winreg.QueryValueEx(key, "CurrentInstallFolder") + except EnvironmentError: + pass + else: + if DEBUG: + print r"PSDK: try 'HKLM\Software\Microsoft\MicrosoftSDKs"\ + "\Windows\CurrentInstallFolder': '%s'" % sdkdir + if os.path.isfile(os.path.join(sdkdir, landmark)): + return sdkdir + + # 5. Failing this just try a few well-known default install locations. + progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") + defaultlocs = [ + os.path.join(progfiles, "Microsoft Platform SDK"), + os.path.join(progfiles, "Microsoft SDK"), + ] + for sdkdir in defaultlocs: + if DEBUG: + print "PSDK: try default location: '%s'" % sdkdir + if os.path.isfile(os.path.join(sdkdir, landmark)): + return sdkdir + + + # Some nasty hacks to prevent most of our extensions using a manifest, as + # the manifest - even without a reference to the CRT assembly - is enough + # to prevent the extension from loading. For more details, see + # http://bugs.python.org/issue7833 - that issue has a patch, but it is + # languishing and will probably never be fixed for Python 2.6... + if sys.version_info > (2,6): + from distutils.spawn import spawn + from distutils.msvc9compiler import MSVCCompiler + MSVCCompiler._orig_spawn = MSVCCompiler.spawn + MSVCCompiler._orig_link = MSVCCompiler.link + + # We need to override this method for versions where issue7833 *has* landed + # (ie, 2.7 and 3.2+) + def manifest_get_embed_info(self, target_desc, ld_args): + _want_assembly_kept = getattr(self, '_want_assembly_kept', False) + if not _want_assembly_kept: + return None + for arg in ld_args: + if arg.startswith("/MANIFESTFILE:"): + orig_manifest = arg.split(":", 1)[1] + if target_desc==self.EXECUTABLE: + rid = 1 + else: + rid = 2 + return orig_manifest, rid + return None + # always monkeypatch it in even though it will only be called in 2.7 + # and 3.2+. + MSVCCompiler.manifest_get_embed_info = manifest_get_embed_info + + def monkeypatched_spawn(self, cmd): + is_link = cmd[0].endswith("link.exe") or cmd[0].endswith('"link.exe"') + is_mt = cmd[0].endswith("mt.exe") or cmd[0].endswith('"mt.exe"') + _want_assembly_kept = getattr(self, '_want_assembly_kept', False) + if not _want_assembly_kept and is_mt: + # We don't want mt.exe run... + return + if not _want_assembly_kept and is_link: + # remove /MANIFESTFILE:... and add MANIFEST:NO + # (but note that for winxpgui, which specifies a manifest via a + # .rc file, this is ignored by the linker - the manifest specified + # in the .rc file is still added) + for i in range(len(cmd)): + if cmd[i].startswith("/MANIFESTFILE:"): + cmd[i] = "/MANIFEST:NO" + break + if _want_assembly_kept and is_mt: + # We want mt.exe run with the original manifest + for i in range(len(cmd)): + if cmd[i] == "-manifest": + cmd[i+1] = cmd[i+1] + ".orig" + break + self._orig_spawn(cmd) + if _want_assembly_kept and is_link: + # We want a copy of the original manifest so we can use it later. + for i in range(len(cmd)): + if cmd[i].startswith("/MANIFESTFILE:"): + mfname = cmd[i][14:] + shutil.copyfile(mfname, mfname + ".orig") + break + + def monkeypatched_link(self, target_desc, objects, output_filename, *args, **kw): + # no manifests for 3.3+ + self._want_assembly_kept = sys.version_info < (3,3) and \ + (os.path.basename(output_filename).startswith("PyISAPI_loader.dll") or \ + os.path.basename(output_filename).startswith("perfmondata.dll") or \ + os.path.basename(output_filename).startswith("win32ui.pyd") or \ + target_desc==self.EXECUTABLE) + try: + return self._orig_link(target_desc, objects, output_filename, *args, **kw) + finally: + delattr(self, '_want_assembly_kept') + MSVCCompiler.spawn = monkeypatched_spawn + MSVCCompiler.link = monkeypatched_link + + def find_telldus_dev_dir(): + landmark = "telldus-core.h" + dev_dir = os.environ.get("TELLDUS_DEVDIR") + if dev_dir: + if DEBUG: + print "Telldus dev dir:" % dev_dir + if os.path.isfile(os.path.join(dev_dir, landmark)): + return dev_dir - progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") - defaultlocs = [ - os.path.join(progfiles + ' (x86)', "Telldus", "Development"), - os.path.join(progfiles, "Telldus", "Development"), - ] - for dev_dir in defaultlocs: - if DEBUG: - print "Telldus dev dir: '%s'" % dev_dir - if os.path.isfile(os.path.join(dev_dir, landmark)): - return dev_dir - if DEBUG: - print "Telldus dev dir not found, make sure dev code is installed. Or set TELLDUS_DEVDIR." + progfiles = os.environ.get("ProgramFiles", r"C:\Program Files") + defaultlocs = [ + os.path.join(progfiles + ' (x86)', "Telldus", "Development"), + os.path.join(progfiles, "Telldus", "Development"), + ] + for dev_dir in defaultlocs: + if DEBUG: + print "Telldus dev dir: '%s'" % dev_dir + if os.path.isfile(os.path.join(dev_dir, landmark)): + return dev_dir + if DEBUG: + print "Telldus dev dir not found, make sure dev code is installed. Or set TELLDUS_DEVDIR." - sdk_dir = find_platform_sdk_dir() - sdk_include_dir = os.path.join(sdk_dir, 'Include') + sdk_dir = find_platform_sdk_dir() + sdk_include_dir = os.path.join(sdk_dir, 'Include') - telldus_dev_dir = find_telldus_dev_dir() - telldus_platform = os.environ.get("TELLDUS_PLATFORM", 'x86_64') - telldus_library_dir = os.path.join(telldus_dev_dir, telldus_platform) - - include_dirs = [sdk_include_dir, os.path.dirname(this_file)] - library_dirs = [telldus_library_dir] - libraries = ['python%i%i' % (sys.version_info[0], sys.version_info[1]) , 'TelldusCore'] - define_macros = [('_WINDOWS', 1)] - + telldus_dev_dir = find_telldus_dev_dir() + telldus_platform = os.environ.get("TELLDUS_PLATFORM", 'x86_64') + telldus_library_dir = os.path.join(telldus_dev_dir, telldus_platform) + + include_dirs = [sdk_include_dir, os.path.dirname(this_file)] + library_dirs = [telldus_library_dir] + libraries = ['python%i%i' % (sys.version_info[0], sys.version_info[1]) , 'TelldusCore'] + define_macros = [('_WINDOWS', 1)] + else: - include_dirs = ['/usr/include', '/usr/local/include'] - library_dirs = ['/usr/lib', '/usr/local/lib'] - libraries = ['telldus-core'] - define_macros = [] - + include_dirs = ['/usr/include', '/usr/local/include'] + library_dirs = ['/usr/lib', '/usr/local/lib'] + libraries = ['telldus-core'] + define_macros = [] + telldus = Extension( - 'telldus', - include_dirs = include_dirs, - libraries = libraries, - library_dirs = library_dirs, - define_macros = define_macros, - sources = ['telldus.c'] + 'telldus', + include_dirs = include_dirs, + libraries = libraries, + library_dirs = library_dirs, + define_macros = define_macros, + sources = ['telldus.c'] ) setup( - name = 'telldus', - version = '1.0', - description = 'Python bindings for telldus', - author='Oyvind Saltvik', - author_email='oyvind.saltvik@gmail.com', - url='http://github.com/fivethreeo/telldus/', - ext_modules = [telldus] -) \ No newline at end of file + name = 'telldus', + version = '1.0', + description = 'Python bindings for telldus', + author='Oyvind Saltvik', + author_email='oyvind.saltvik@gmail.com', + url='http://github.com/fivethreeo/telldus/', + ext_modules = [telldus] +) diff --git a/bindings/python/telldus.c b/bindings/python/telldus.c index 14934e04..1b1673d2 100644 --- a/bindings/python/telldus.c +++ b/bindings/python/telldus.c @@ -10,7 +10,7 @@ * * estrdup returns a copy of its argument, located in memory * allocated from the heap. If it is unable to allocate the - * necessary memory, estrdup executes error("no memory"). + * necessary memory, estrdup executes PyErr_NoMemory(); * (Generally, the routine error is not expected to return, * but if it does, estrdup will return NULL.) */ @@ -18,610 +18,611 @@ char * estrdup(char *s) { - register char *t; + register char *t; - if (NULL == (t = malloc(strlen(s)+1))) { - return PyErr_NoMemory(); - } - strcpy(t, s); - return(t); + if (NULL == (t = malloc(strlen(s)+1))) { + return PyErr_NoMemory(); + } + strcpy(t, s); + return(t); } static PyObject * telldus_tdInit(PyObject *self) { - /* PyEval_InitThreads(); */ - tdInit(); - Py_INCREF(Py_None); - return Py_None; + tdInit(); + Py_INCREF(Py_None); + return Py_None; } static PyObject * telldus_tdClose(PyObject *self) { - tdClose(); - Py_INCREF(Py_None); - return Py_None; + tdClose(); + Py_INCREF(Py_None); + return Py_None; } static PyObject * telldus_tdTurnOn(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyBool_FromLong((long) tdTurnOn(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyBool_FromLong((long) tdTurnOn(id)); } static PyObject * telldus_tdTurnOff(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyBool_FromLong((long) tdTurnOff(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyBool_FromLong((long) tdTurnOff(id)); } static PyObject * telldus_tdBell(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyBool_FromLong((long) tdBell(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyBool_FromLong((long) tdBell(id)); } static PyObject * telldus_tdDim(PyObject *self, PyObject *args) { - long id; - unsigned char level; + long id; + unsigned char level; - if (!PyArg_ParseTuple(args, "lb", &id, &level)) - return NULL; - - if (level < 0 || level > 255) - return NULL; + if (!PyArg_ParseTuple(args, "lb", &id, &level)) + return NULL; + + if (level < 0 || level > 255) + return NULL; - return PyBool_FromLong((long) tdDim(id, level)); + return PyBool_FromLong((long) tdDim(id, level)); } static PyObject * telldus_tdLearn(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyBool_FromLong((long) tdLearn(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyBool_FromLong((long) tdLearn(id)); } static PyObject * telldus_tdMethods(PyObject *self, PyObject *args) { - long id; - long supportedmethods; + long id; + long supportedmethods; - if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) - return NULL; + if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) + return NULL; - return PyLong_FromLong((long) tdMethods(id, supportedmethods)); + return PyLong_FromLong((long) tdMethods(id, supportedmethods)); } - + static PyObject * telldus_tdLastSentCommand(PyObject *self, PyObject *args) { - long id; - long supportedmethods; + long id; + long supportedmethods; - if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) - return NULL; + if (!PyArg_ParseTuple(args, "ll", &id, &supportedmethods)) + return NULL; - return PyLong_FromLong((long) tdLastSentCommand(id, supportedmethods)); + return PyLong_FromLong((long) tdLastSentCommand(id, supportedmethods)); } static PyObject * telldus_tdLastSentValue(PyObject *self, PyObject *args) { - long id; - char* value; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - value = tdLastSentValue(id); - retval = estrdup(value); - tdReleaseString(value); - return PyString_FromString(retval); + long id; + char* value; + char* retval; + + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + value = tdLastSentValue(id); + retval = estrdup(value); + tdReleaseString(value); + return PyString_FromString(retval); } static PyObject * telldus_tdGetNumberOfDevices(PyObject *self) { - return PyLong_FromLong((long) tdGetNumberOfDevices()); + return PyLong_FromLong((long) tdGetNumberOfDevices()); } static PyObject * telldus_tdGetDeviceId(PyObject *self, PyObject *args) { - long index; + long index; - if (!PyArg_ParseTuple(args, "l", &index)) - return NULL; - - return PyLong_FromLong((long) tdGetDeviceId(index)); + if (!PyArg_ParseTuple(args, "l", &index)) + return NULL; + + return PyLong_FromLong((long) tdGetDeviceId(index)); } static PyObject * telldus_tdGetDeviceType(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyLong_FromLong((long) tdGetDeviceType(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyLong_FromLong((long) tdGetDeviceType(id)); } static PyObject * telldus_tdGetErrorString(PyObject *self, PyObject *args) { - long errorno; - char* errorString; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &errorno)) - return NULL; - - errorString = tdGetErrorString(errorno); - retval = estrdup(errorString); - tdReleaseString(errorString); - return PyString_FromString(retval); + long errorno; + char* errorString; + char* retval; + + if (!PyArg_ParseTuple(args, "l", &errorno)) + return NULL; + + errorString = tdGetErrorString(errorno); + retval = estrdup(errorString); + tdReleaseString(errorString); + return PyString_FromString(retval); } static PyObject * telldus_tdGetName(PyObject *self, PyObject *args) { - long id; - char* name; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - name = tdGetName(id); - retval = estrdup(name); - tdReleaseString(name); - return PyString_FromString(retval); + long id; + char* name; + char* retval; + + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + name = tdGetName(id); + retval = estrdup(name); + tdReleaseString(name); + return PyString_FromString(retval); } static PyObject * telldus_tdSetName(PyObject *self, PyObject *args) { - long id; - char* name; - - if (!PyArg_ParseTuple(args, "ls", &id, &name)) - return NULL; - - return PyBool_FromLong((long) tdSetName(id, name)); + long id; + char* name; + + if (!PyArg_ParseTuple(args, "ls", &id, &name)) + return NULL; + + return PyBool_FromLong((long) tdSetName(id, name)); } static PyObject * telldus_tdGetProtocol(PyObject *self, PyObject *args) { - long id; - char* protocol; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - protocol = tdGetProtocol(id); - retval = estrdup(protocol); - tdReleaseString(protocol); - return PyString_FromString(retval); + long id; + char* protocol; + char* retval; + + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + protocol = tdGetProtocol(id); + retval = estrdup(protocol); + tdReleaseString(protocol); + return PyString_FromString(retval); } static PyObject * telldus_tdSetProtocol(PyObject *self, PyObject *args) { - long id; - char* protocol; - - if (!PyArg_ParseTuple(args, "ls", &id, &protocol)) - return NULL; - - return PyBool_FromLong((long) tdSetProtocol(id, protocol)); + long id; + char* protocol; + + if (!PyArg_ParseTuple(args, "ls", &id, &protocol)) + return NULL; + + return PyBool_FromLong((long) tdSetProtocol(id, protocol)); } static PyObject * telldus_tdGetModel(PyObject *self, PyObject *args) { - long id; - char* model; - char* retval; - - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - model = tdGetModel(id); - retval = estrdup(model); - tdReleaseString(model); - return PyString_FromString(retval); + long id; + char* model; + char* retval; + + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + model = tdGetModel(id); + retval = estrdup(model); + tdReleaseString(model); + return PyString_FromString(retval); } static PyObject * telldus_tdSetModel(PyObject *self, PyObject *args) { - long id; - char* model; - - if (!PyArg_ParseTuple(args, "ls", &id, &model)) - return NULL; - - return PyBool_FromLong((long) tdSetProtocol(id, model)); + long id; + char* model; + + if (!PyArg_ParseTuple(args, "ls", &id, &model)) + return NULL; + + return PyBool_FromLong((long) tdSetProtocol(id, model)); } static PyObject * telldus_tdGetDeviceParameter(PyObject *self, PyObject *args) { - long id; - char* name; - char* defaultValue; - char* param; - char* retval; - - if (!PyArg_ParseTuple(args, "lss", &id, &name, &defaultValue)) - return NULL; - - param = tdGetDeviceParameter(id, name, defaultValue); - retval = estrdup(param); - tdReleaseString(param); - return PyString_FromString(retval); + long id; + char* name; + char* defaultValue; + char* param; + char* retval; + + if (!PyArg_ParseTuple(args, "lss", &id, &name, &defaultValue)) + return NULL; + + param = tdGetDeviceParameter(id, name, defaultValue); + retval = estrdup(param); + tdReleaseString(param); + return PyString_FromString(retval); } static PyObject * telldus_tdSetDeviceParameter(PyObject *self, PyObject *args) { - long id; - char* name; - char* value; - - if (!PyArg_ParseTuple(args, "lss", &id, &name, &value)) - return NULL; - - return PyBool_FromLong((long) tdSetDeviceParameter(id, name, value)); + long id; + char* name; + char* value; + + if (!PyArg_ParseTuple(args, "lss", &id, &name, &value)) + return NULL; + + return PyBool_FromLong((long) tdSetDeviceParameter(id, name, value)); } static PyObject * telldus_tdAddDevice(PyObject *self) { - return PyLong_FromLong((long) tdAddDevice()); + return PyLong_FromLong((long) tdAddDevice()); } static PyObject * telldus_tdRemoveDevice(PyObject *self, PyObject *args) { - long id; + long id; - if (!PyArg_ParseTuple(args, "l", &id)) - return NULL; - - return PyBool_FromLong((long) tdRemoveDevice(id)); + if (!PyArg_ParseTuple(args, "l", &id)) + return NULL; + + return PyBool_FromLong((long) tdRemoveDevice(id)); } static PyObject * telldus_tdSendRawCommand(PyObject *self, PyObject *args) { - char *command; - long reserved = 0; + char *command; + long reserved = 0; - if (!PyArg_ParseTuple(args, "s|l", &command, &reserved)); - return NULL; + if (!PyArg_ParseTuple(args, "s|l", &command, &reserved)); + return NULL; - return PyLong_FromLong((long) tdSendRawCommand(command, reserved)); + return PyLong_FromLong((long) tdSendRawCommand(command, reserved)); } /* - Work in progress event callbacks + Work in progress event callbacks */ /* void telldus_deviceEventCallback(int deviceId, int method, const char *data, int callbackId, void *pyfunc) { - PyObject * arglist; - PyObject * result; - PyGILState_STATE gstate; - - gstate = PyGILState_Ensure(); - - // prepare the arg list to pass into the Python callback function - arglist = Py_BuildValue("llsl", deviceId, method, data, callbackId); + PyObject * arglist; + PyObject * result; + PyGILState_STATE gstate; + + gstate = PyGILState_Ensure(); + + // prepare the arg list to pass into the Python callback function + arglist = Py_BuildValue("llsl", deviceId, method, data, callbackId); - // now call the Python callback function - result = PyEval_CallObject(pyfunc, arglist); + // now call the Python callback function + result = PyEval_CallObject(pyfunc, arglist); - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } + if (result == NULL) { + // something went wrong so print to stderr + PyErr_Print(); + } - // take care of reference handling - Py_DECREF(arglist); - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; + // take care of reference handling + Py_DECREF(arglist); + Py_XDECREF(result); + + PyGILState_Release(gstate); + + return; } - + void telldus_deviceChangeEventCallback(int deviceId, int changeEvent, int changeType, int callbackId, void *pyfunc) { - PyObject * arglist; - PyObject * result; - PyGILState_STATE gstate; - - gstate = PyGILState_Ensure(); - - // prepare the arg list to pass into the Python callback function - arglist = Py_BuildValue("llll", deviceId, changeEvent, changeType, callbackId); + PyObject * arglist; + PyObject * result; + PyGILState_STATE gstate; + + gstate = PyGILState_Ensure(); + + // prepare the arg list to pass into the Python callback function + arglist = Py_BuildValue("llll", deviceId, changeEvent, changeType, callbackId); - // now call the Python callback function - result = PyEval_CallObject(pyfunc, arglist); + // now call the Python callback function + result = PyEval_CallObject(pyfunc, arglist); - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } + if (result == NULL) { + // something went wrong so print to stderr + PyErr_Print(); + } - // take care of reference handling - Py_DECREF(arglist); - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; + // take care of reference handling + Py_DECREF(arglist); + Py_XDECREF(result); + + PyGILState_Release(gstate); + + return; } - + void telldus_rawDeviceEventCallback(const char *data, int controllerId, int callbackId, void *pyfunc) { - PyObject * arglist; - PyObject * result; - PyGILState_STATE gstate; - - gstate = PyGILState_Ensure(); - - // prepare the arg list to pass into the Python callback function - arglist = Py_BuildValue("sll", data, controllerId, callbackId); + PyObject * arglist; + PyObject * result; + PyGILState_STATE gstate; + + gstate = PyGILState_Ensure(); + + // prepare the arg list to pass into the Python callback function + arglist = Py_BuildValue("sll", data, controllerId, callbackId); - // now call the Python callback function - result = PyEval_CallObject(pyfunc, arglist); + // now call the Python callback function + result = PyEval_CallObject(pyfunc, arglist); - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } + if (result == NULL) { + // something went wrong so print to stderr + PyErr_Print(); + } - // take care of reference handling - Py_DECREF(arglist); - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; + // take care of reference handling + Py_DECREF(arglist); + Py_XDECREF(result); + + PyGILState_Release(gstate); + + return; } void telldus_sensorEventCallback(const char *protocol, const char *model, int id, int dataType, const char *value, int timestamp, int callbackId, void *pyfunc) { - PyObject * arglist; - PyObject * result; - PyGILState_STATE gstate; - - gstate = PyGILState_Ensure(); - - // prepare the arg list to pass into the Python callback function - arglist = Py_BuildValue("ssllsll", protocol, model, id, dataType, value, timestamp, callbackId); + PyObject * arglist; + PyObject * result; + PyGILState_STATE gstate; + + gstate = PyGILState_Ensure(); + + // prepare the arg list to pass into the Python callback function + arglist = Py_BuildValue("ssllsll", protocol, model, id, dataType, value, timestamp, callbackId); - // now call the Python callback function - result = PyEval_CallObject(pyfunc, arglist); + // now call the Python callback function + result = PyEval_CallObject(pyfunc, arglist); - if (result == NULL) { - // something went wrong so print to stderr - PyErr_Print(); - } + if (result == NULL) { + // something went wrong so print to stderr + PyErr_Print(); + } - // take care of reference handling - Py_DECREF(arglist); - Py_XDECREF(result); - - PyGILState_Release(gstate); - - return; + // take care of reference handling + Py_DECREF(arglist); + Py_XDECREF(result); + + PyGILState_Release(gstate); + + return; } static PyObject * telldus_tdRegisterDeviceEvent(PyObject *self, PyObject *args) { - PyObject *func; + PyObject *func; - if (!PyArg_ParseTuple(args, "O", &func)); - return NULL; - - return PyLong_FromLong((long) tdRegisterDeviceEvent((TDDeviceEvent) telldus_deviceEventCallback, &func)); + if (!PyArg_ParseTuple(args, "O", &func)); + return NULL; + + return PyLong_FromLong((long) tdRegisterDeviceEvent((TDDeviceEvent) telldus_deviceEventCallback, &func)); } static PyObject * telldus_tdRegisterDeviceChangeEvent(PyObject *self, PyObject *args) { - PyObject *func; + PyObject *func; - if (!PyArg_ParseTuple(args, "O", &func)); - return NULL; - - return PyLong_FromLong((long) tdRegisterDeviceChangeEvent((TDDeviceChangeEvent) telldus_deviceChangeEventCallback, &func)); + if (!PyArg_ParseTuple(args, "O", &func)); + return NULL; + + return PyLong_FromLong((long) tdRegisterDeviceChangeEvent((TDDeviceChangeEvent) telldus_deviceChangeEventCallback, &func)); } static PyObject * telldus_tdRegisterRawDeviceEvent(PyObject *self, PyObject *args) { - PyObject *func; + PyObject *func; - if (!PyArg_ParseTuple(args, "O", &func)); - return NULL; - - return PyLong_FromLong((long) tdRegisterRawDeviceEvent((TDRawDeviceEvent) telldus_rawDeviceEventCallback, &func)); + if (!PyArg_ParseTuple(args, "O", &func)); + return NULL; + + return PyLong_FromLong((long) tdRegisterRawDeviceEvent((TDRawDeviceEvent) telldus_rawDeviceEventCallback, &func)); } static PyObject * telldus_tdRegisterSensorEvent(PyObject *self, PyObject *args) { - PyObject *func; + PyObject *func; - if (!PyArg_ParseTuple(args, "O", &func)); - return NULL; - - return PyLong_FromLong((long) tdRegisterSensorEvent((TDSensorEvent) telldus_sensorEventCallback, &func)); + if (!PyArg_ParseTuple(args, "O", &func)); + return NULL; + + return PyLong_FromLong((long) tdRegisterSensorEvent((TDSensorEvent) telldus_sensorEventCallback, &func)); } */ static PyMethodDef telldus_methods[] = { - /* The cast of the function is necessary since PyCFunction values - * only take two PyObject* parameters, and keywdarg_parrot() takes - * three. - */ - {"tdInit", (PyCFunction) telldus_tdInit, METH_NOARGS, "Initiate telldus."}, - {"tdClose", (PyCFunction) telldus_tdClose, METH_NOARGS, "Close telldus."}, - {"tdTurnOn", (PyCFunction) telldus_tdTurnOn, METH_VARARGS, "Turn on device."}, - {"tdTurnOff", (PyCFunction) telldus_tdTurnOff, METH_VARARGS, "Turn off device."}, - {"tdBell", (PyCFunction) telldus_tdBell, METH_VARARGS, "Bell device."}, - {"tdDim", (PyCFunction) telldus_tdDim, METH_VARARGS, "Dim device."}, - {"tdLearn", (PyCFunction) telldus_tdLearn, METH_VARARGS, "Learn device."}, - {"tdMethods", (PyCFunction) telldus_tdMethods, METH_VARARGS, "Methods comment."}, - {"tdLastSentCommand", (PyCFunction) telldus_tdLastSentCommand, METH_VARARGS, "LastSentCommand comment."}, - {"tdLastSentValue", (PyCFunction) telldus_tdLastSentValue, METH_VARARGS, "LastSentValue comment."}, - {"tdGetNumberOfDevices", (PyCFunction) telldus_tdGetNumberOfDevices, METH_VARARGS, "GetNumberOfDevices comment."}, - {"tdGetDeviceId", (PyCFunction) telldus_tdGetDeviceId, METH_VARARGS, "GetDeviceId comment."}, - {"tdGetDeviceType", (PyCFunction) telldus_tdGetDeviceType, METH_VARARGS, "GetDeviceType comment."}, - {"tdGetErrorString", (PyCFunction) telldus_tdGetErrorString, METH_VARARGS, "GetErrorString comment."}, - {"tdGetName", (PyCFunction) telldus_tdGetName, METH_VARARGS, "GetName comment."}, - {"tdSetName", (PyCFunction) telldus_tdSetName, METH_VARARGS, "SetName comment."}, - {"tdGetProtocol", (PyCFunction) telldus_tdGetProtocol, METH_VARARGS, "GetProtocol comment."}, - {"tdSetProtocol", (PyCFunction) telldus_tdSetProtocol, METH_VARARGS, "SetProtocol comment."}, - {"tdGetModel", (PyCFunction) telldus_tdGetModel, METH_VARARGS, "GetModel comment."}, - {"tdSetModel", (PyCFunction) telldus_tdSetModel, METH_VARARGS, "SetModel comment."}, - {"tdGetDeviceParameter", (PyCFunction) telldus_tdGetDeviceParameter, METH_VARARGS, "GetDeviceParameter comment."}, - {"tdSetDeviceParameter", (PyCFunction) telldus_tdSetDeviceParameter, METH_VARARGS, "SetDeviceParameter comment."}, - {"tdAddDevice", (PyCFunction) telldus_tdAddDevice, METH_NOARGS, "AddDevice comment."}, - {"tdRemoveDevice", (PyCFunction) telldus_tdRemoveDevice, METH_VARARGS, "RemoveDevice comment."}, - {"tdSendRawCommand", (PyCFunction) telldus_tdSendRawCommand, METH_VARARGS, "SendRawCommand comment."}, + /* The cast of the function is necessary since PyCFunction values + * only take two PyObject* parameters, and keywdarg_parrot() takes + * three. + */ + {"tdInit", (PyCFunction) telldus_tdInit, METH_NOARGS, "Initiate telldus."}, + {"tdClose", (PyCFunction) telldus_tdClose, METH_NOARGS, "Close telldus."}, + {"tdTurnOn", (PyCFunction) telldus_tdTurnOn, METH_VARARGS, "Turn on device."}, + {"tdTurnOff", (PyCFunction) telldus_tdTurnOff, METH_VARARGS, "Turn off device."}, + {"tdBell", (PyCFunction) telldus_tdBell, METH_VARARGS, "Bell device."}, + {"tdDim", (PyCFunction) telldus_tdDim, METH_VARARGS, "Dim device."}, + {"tdLearn", (PyCFunction) telldus_tdLearn, METH_VARARGS, "Learn device."}, + {"tdMethods", (PyCFunction) telldus_tdMethods, METH_VARARGS, "Methods comment."}, + {"tdLastSentCommand", (PyCFunction) telldus_tdLastSentCommand, METH_VARARGS, "LastSentCommand comment."}, + {"tdLastSentValue", (PyCFunction) telldus_tdLastSentValue, METH_VARARGS, "LastSentValue comment."}, + {"tdGetNumberOfDevices", (PyCFunction) telldus_tdGetNumberOfDevices, METH_VARARGS, "GetNumberOfDevices comment."}, + {"tdGetDeviceId", (PyCFunction) telldus_tdGetDeviceId, METH_VARARGS, "GetDeviceId comment."}, + {"tdGetDeviceType", (PyCFunction) telldus_tdGetDeviceType, METH_VARARGS, "GetDeviceType comment."}, + {"tdGetErrorString", (PyCFunction) telldus_tdGetErrorString, METH_VARARGS, "GetErrorString comment."}, + {"tdGetName", (PyCFunction) telldus_tdGetName, METH_VARARGS, "GetName comment."}, + {"tdSetName", (PyCFunction) telldus_tdSetName, METH_VARARGS, "SetName comment."}, + {"tdGetProtocol", (PyCFunction) telldus_tdGetProtocol, METH_VARARGS, "GetProtocol comment."}, + {"tdSetProtocol", (PyCFunction) telldus_tdSetProtocol, METH_VARARGS, "SetProtocol comment."}, + {"tdGetModel", (PyCFunction) telldus_tdGetModel, METH_VARARGS, "GetModel comment."}, + {"tdSetModel", (PyCFunction) telldus_tdSetModel, METH_VARARGS, "SetModel comment."}, + {"tdGetDeviceParameter", (PyCFunction) telldus_tdGetDeviceParameter, METH_VARARGS, "GetDeviceParameter comment."}, + {"tdSetDeviceParameter", (PyCFunction) telldus_tdSetDeviceParameter, METH_VARARGS, "SetDeviceParameter comment."}, + {"tdAddDevice", (PyCFunction) telldus_tdAddDevice, METH_NOARGS, "AddDevice comment."}, + {"tdRemoveDevice", (PyCFunction) telldus_tdRemoveDevice, METH_VARARGS, "RemoveDevice comment."}, + {"tdSendRawCommand", (PyCFunction) telldus_tdSendRawCommand, METH_VARARGS, "SendRawCommand comment."}, /* - {"tdRegisterDeviceEvent", (PyCFunction) telldus_tdRegisterDeviceEvent, METH_VARARGS, "RegisterDeviceEvent comment."}, - {"tdRegisterDeviceChangeEvent", (PyCFunction) telldus_tdRegisterDeviceChangeEvent, METH_VARARGS, "RegisterDeviceChangeEvent comment."}, - {"tdRegisterRawDeviceEvent", (PyCFunction) telldus_tdRegisterRawDeviceEvent, METH_VARARGS, "RegisterRawDeviceEvent comment."}, - {"tdRegisterSensorEvent", (PyCFunction) telldus_tdRegisterSensorEvent, METH_VARARGS, "RegisterSensorEvent comment."}, - + {"tdRegisterDeviceEvent", (PyCFunction) telldus_tdRegisterDeviceEvent, METH_VARARGS, "RegisterDeviceEvent comment."}, + {"tdRegisterDeviceChangeEvent", (PyCFunction) telldus_tdRegisterDeviceChangeEvent, METH_VARARGS, "RegisterDeviceChangeEvent comment."}, + {"tdRegisterRawDeviceEvent", (PyCFunction) telldus_tdRegisterRawDeviceEvent, METH_VARARGS, "RegisterRawDeviceEvent comment."}, + {"tdRegisterSensorEvent", (PyCFunction) telldus_tdRegisterSensorEvent, METH_VARARGS, "RegisterSensorEvent comment."}, + */ - {NULL, NULL, 0, NULL} /* sentinel */ + {NULL, NULL, 0, NULL} /* sentinel */ }; void inittelldus(void) { - PyObject *module; - - PyObject *TELLSTICK_TURNON_GLUE; - PyObject *TELLSTICK_TURNOFF_GLUE; - PyObject *TELLSTICK_BELL_GLUE; - PyObject *TELLSTICK_TOGGLE_GLUE; - PyObject *TELLSTICK_DIM_GLUE; - PyObject *TELLSTICK_LEARN_GLUE; - PyObject *TELLSTICK_SUCCESS_GLUE; - PyObject *TELLSTICK_ERROR_NOT_FOUND_GLUE; - PyObject *TELLSTICK_ERROR_PERMISSION_DENIED_GLUE; - PyObject *TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE; - PyObject *TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE; - PyObject *TELLSTICK_ERROR_COMMUNICATION_GLUE; - PyObject *TELLSTICK_ERROR_UNKNOWN_GLUE; - PyObject *TELLSTICK_TYPE_DEVICE_GLUE; - PyObject *TELLSTICK_TYPE_GROUP_GLUE; + PyObject *module; + + PyObject *TELLSTICK_TURNON_GLUE; + PyObject *TELLSTICK_TURNOFF_GLUE; + PyObject *TELLSTICK_BELL_GLUE; + PyObject *TELLSTICK_TOGGLE_GLUE; + PyObject *TELLSTICK_DIM_GLUE; + PyObject *TELLSTICK_LEARN_GLUE; + PyObject *TELLSTICK_SUCCESS_GLUE; + PyObject *TELLSTICK_ERROR_NOT_FOUND_GLUE; + PyObject *TELLSTICK_ERROR_PERMISSION_DENIED_GLUE; + PyObject *TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE; + PyObject *TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE; + PyObject *TELLSTICK_ERROR_COMMUNICATION_GLUE; + PyObject *TELLSTICK_ERROR_UNKNOWN_GLUE; + PyObject *TELLSTICK_TYPE_DEVICE_GLUE; + PyObject *TELLSTICK_TYPE_GROUP_GLUE; - /* Create the module and add the functions */ - - module = Py_InitModule("telldus", telldus_methods); - - TELLSTICK_TURNON_GLUE = PyLong_FromLong((long) TELLSTICK_TURNON); - PyObject_SetAttrString(module, "TELLSTICK_TURNON", TELLSTICK_TURNON_GLUE); - Py_DECREF(TELLSTICK_TURNON_GLUE); - - TELLSTICK_TURNOFF_GLUE = PyLong_FromLong((long) TELLSTICK_TURNOFF); - PyObject_SetAttrString(module, "TELLSTICK_TURNOFF", TELLSTICK_TURNOFF_GLUE); - Py_DECREF(TELLSTICK_TURNOFF_GLUE); - - TELLSTICK_BELL_GLUE = PyLong_FromLong((long) TELLSTICK_BELL); - PyObject_SetAttrString(module, "TELLSTICK_BELL", TELLSTICK_BELL_GLUE); - Py_DECREF(TELLSTICK_BELL_GLUE); - - TELLSTICK_TOGGLE_GLUE = PyLong_FromLong((long) TELLSTICK_TOGGLE); - PyObject_SetAttrString(module, "TELLSTICK_TOGGLE", TELLSTICK_TOGGLE_GLUE); - Py_DECREF(TELLSTICK_TOGGLE_GLUE); - - TELLSTICK_DIM_GLUE = PyLong_FromLong((long) TELLSTICK_DIM); - PyObject_SetAttrString(module, "TELLSTICK_DIM", TELLSTICK_DIM_GLUE); - Py_DECREF(TELLSTICK_DIM_GLUE); - - TELLSTICK_LEARN_GLUE = PyLong_FromLong((long) TELLSTICK_LEARN); - PyObject_SetAttrString(module, "TELLSTICK_LEARN", TELLSTICK_LEARN_GLUE); - Py_DECREF(TELLSTICK_LEARN_GLUE); - - TELLSTICK_SUCCESS_GLUE = PyLong_FromLong((long) TELLSTICK_SUCCESS); - PyObject_SetAttrString(module, "TELLSTICK_SUCCESS", TELLSTICK_SUCCESS_GLUE); - Py_DECREF(TELLSTICK_SUCCESS_GLUE); - - TELLSTICK_ERROR_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_NOT_FOUND); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND_GLUE); - Py_DECREF(TELLSTICK_ERROR_NOT_FOUND_GLUE); - - TELLSTICK_ERROR_PERMISSION_DENIED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_PERMISSION_DENIED); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); - Py_DECREF(TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); - - TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_DEVICE_NOT_FOUND); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); - Py_DECREF(TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); - - TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_METHOD_NOT_SUPPORTED); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); - Py_DECREF(TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); - - TELLSTICK_ERROR_COMMUNICATION_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_COMMUNICATION); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION_GLUE); - Py_DECREF(TELLSTICK_ERROR_COMMUNICATION_GLUE); - - TELLSTICK_ERROR_UNKNOWN_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_UNKNOWN); - PyObject_SetAttrString(module, "TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN_GLUE); - Py_DECREF(TELLSTICK_ERROR_UNKNOWN_GLUE); + /* Create the module and add the functions */ - TELLSTICK_TYPE_DEVICE_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_DEVICE); - PyObject_SetAttrString(module, "TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE_GLUE); - Py_DECREF(TELLSTICK_TYPE_DEVICE_GLUE); - - TELLSTICK_TYPE_GROUP_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_GROUP); - PyObject_SetAttrString(module, "TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP_GLUE); - Py_DECREF(TELLSTICK_TYPE_GROUP_GLUE); -} \ No newline at end of file + /* PyEval_InitThreads(); */ + + module = Py_InitModule("telldus", telldus_methods); + + TELLSTICK_TURNON_GLUE = PyLong_FromLong((long) TELLSTICK_TURNON); + PyObject_SetAttrString(module, "TELLSTICK_TURNON", TELLSTICK_TURNON_GLUE); + Py_DECREF(TELLSTICK_TURNON_GLUE); + + TELLSTICK_TURNOFF_GLUE = PyLong_FromLong((long) TELLSTICK_TURNOFF); + PyObject_SetAttrString(module, "TELLSTICK_TURNOFF", TELLSTICK_TURNOFF_GLUE); + Py_DECREF(TELLSTICK_TURNOFF_GLUE); + + TELLSTICK_BELL_GLUE = PyLong_FromLong((long) TELLSTICK_BELL); + PyObject_SetAttrString(module, "TELLSTICK_BELL", TELLSTICK_BELL_GLUE); + Py_DECREF(TELLSTICK_BELL_GLUE); + + TELLSTICK_TOGGLE_GLUE = PyLong_FromLong((long) TELLSTICK_TOGGLE); + PyObject_SetAttrString(module, "TELLSTICK_TOGGLE", TELLSTICK_TOGGLE_GLUE); + Py_DECREF(TELLSTICK_TOGGLE_GLUE); + + TELLSTICK_DIM_GLUE = PyLong_FromLong((long) TELLSTICK_DIM); + PyObject_SetAttrString(module, "TELLSTICK_DIM", TELLSTICK_DIM_GLUE); + Py_DECREF(TELLSTICK_DIM_GLUE); + + TELLSTICK_LEARN_GLUE = PyLong_FromLong((long) TELLSTICK_LEARN); + PyObject_SetAttrString(module, "TELLSTICK_LEARN", TELLSTICK_LEARN_GLUE); + Py_DECREF(TELLSTICK_LEARN_GLUE); + + TELLSTICK_SUCCESS_GLUE = PyLong_FromLong((long) TELLSTICK_SUCCESS); + PyObject_SetAttrString(module, "TELLSTICK_SUCCESS", TELLSTICK_SUCCESS_GLUE); + Py_DECREF(TELLSTICK_SUCCESS_GLUE); + + TELLSTICK_ERROR_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_NOT_FOUND); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_NOT_FOUND", TELLSTICK_ERROR_NOT_FOUND_GLUE); + Py_DECREF(TELLSTICK_ERROR_NOT_FOUND_GLUE); + + TELLSTICK_ERROR_PERMISSION_DENIED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_PERMISSION_DENIED); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_PERMISSION_DENIED", TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); + Py_DECREF(TELLSTICK_ERROR_PERMISSION_DENIED_GLUE); + + TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_DEVICE_NOT_FOUND); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_DEVICE_NOT_FOUND", TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); + Py_DECREF(TELLSTICK_ERROR_DEVICE_NOT_FOUND_GLUE); + + TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_METHOD_NOT_SUPPORTED); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_METHOD_NOT_SUPPORTED", TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); + Py_DECREF(TELLSTICK_ERROR_METHOD_NOT_SUPPORTED_GLUE); + + TELLSTICK_ERROR_COMMUNICATION_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_COMMUNICATION); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_COMMUNICATION", TELLSTICK_ERROR_COMMUNICATION_GLUE); + Py_DECREF(TELLSTICK_ERROR_COMMUNICATION_GLUE); + + TELLSTICK_ERROR_UNKNOWN_GLUE = PyLong_FromLong((long) TELLSTICK_ERROR_UNKNOWN); + PyObject_SetAttrString(module, "TELLSTICK_ERROR_UNKNOWN", TELLSTICK_ERROR_UNKNOWN_GLUE); + Py_DECREF(TELLSTICK_ERROR_UNKNOWN_GLUE); + + TELLSTICK_TYPE_DEVICE_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_DEVICE); + PyObject_SetAttrString(module, "TELLSTICK_TYPE_DEVICE", TELLSTICK_TYPE_DEVICE_GLUE); + Py_DECREF(TELLSTICK_TYPE_DEVICE_GLUE); + + TELLSTICK_TYPE_GROUP_GLUE = PyLong_FromLong((long) TELLSTICK_TYPE_GROUP); + PyObject_SetAttrString(module, "TELLSTICK_TYPE_GROUP", TELLSTICK_TYPE_GROUP_GLUE); + Py_DECREF(TELLSTICK_TYPE_GROUP_GLUE); +}