instrumentation: add next-share/
[cs-p2p-next.git] / instrumentation / next-share / BaseLib / Core / Utilities / win32regchecker.py
1 # Written by ABC authors and Arno Bakker
2 # see LICENSE.txt for license information
3
4 import sys
5 import os
6 from traceback import print_exc
7
8 if (sys.platform == 'win32'):
9     import _winreg
10
11     # short for PyHKEY from "_winreg" module
12     HKCR = _winreg.HKEY_CLASSES_ROOT
13     HKLM = _winreg.HKEY_LOCAL_MACHINE
14     HKCU = _winreg.HKEY_CURRENT_USER
15 else:
16     HKCR = 0
17     HKLM = 1
18     HKCU = 2
19
20 DEBUG = False
21
22 class Win32RegChecker:
23     def __init__(self):
24         pass
25
26     def readRootKey(self,key_name,value_name=""):
27         return self.readKey(HKCR,key_name,value_name)
28         
29     def readKey(self,hkey,key_name,value_name=""):
30         if (sys.platform != 'win32'):
31             return None
32             
33         try:
34             # test that shell/open association with ABC exist
35             if DEBUG:
36                 print >>sys.stderr,"win32regcheck: Opening",key_name,value_name
37             full_key = _winreg.OpenKey(hkey, key_name, 0, _winreg.KEY_READ)
38             
39             if DEBUG:
40                 print >>sys.stderr,"win32regcheck: Open returned",full_key
41             
42             value_data, value_type = _winreg.QueryValueEx(full_key, value_name)
43             if DEBUG:
44                 print >>sys.stderr,"win32regcheck: Read",value_data,value_type
45             _winreg.CloseKey(full_key)
46                     
47             return value_data
48         except:
49             print_exc(file=sys.stderr)
50             # error, test failed, key don't exist
51             # (could also indicate a unicode error)
52             return None
53
54
55     def readKeyRecursively(self,hkey,key_name,value_name=""):
56         if (sys.platform != 'win32'):
57             return None
58             
59         lasthkey = hkey
60         try:
61             toclose = []
62             keyparts = key_name.split('\\')
63             print >>sys.stderr,"win32regcheck: keyparts",keyparts
64             for keypart in keyparts:
65                 if keypart == '':
66                     continue
67                 if DEBUG:
68                     print >>sys.stderr,"win32regcheck: Opening",keypart
69                 full_key = _winreg.OpenKey(lasthkey, keypart, 0, _winreg.KEY_READ)
70                 lasthkey = full_key
71                 toclose.append(full_key)
72             
73             if DEBUG:
74                 print >>sys.stderr,"win32regcheck: Open returned",full_key
75             
76             value_data, value_type = _winreg.QueryValueEx(full_key, value_name)
77             if DEBUG:
78                 print >>sys.stderr,"win32regcheck: Read",value_data,value_type
79             for hkey in toclose:
80                 _winreg.CloseKey(hkey)
81                     
82             return value_data
83         except:
84             print_exc()
85             # error, test failed, key don't exist
86             # (could also indicate a unicode error)
87             return None
88
89
90     def writeKey(self,hkey,key_name,value_name,value_data,value_type):
91         try:
92             # kreate desired key in Windows register
93             full_key = _winreg.CreateKey(hkey, key_name)
94         except EnvironmentError:
95             return False;
96         # set desired value in created Windows register key
97         _winreg.SetValueEx(full_key, value_name, 0, value_type, value_data)
98         # close Windows register key
99         _winreg.CloseKey(full_key)
100             
101         return True
102
103
104
105 if __name__ == "__main__":
106     w = Win32RegChecker()
107     winfiletype = w.readRootKey(".wmv")
108     playkey = winfiletype+"\shell\play\command"
109     urlplay = w.readRootKey(playkey)
110     print urlplay
111     openkey = winfiletype+"\shell\open\command"
112     urlopen = w.readRootKey(openkey)
113     print urlopen