OSDN Git Service

Use gconf for getting board host name from board id
[fukui-no-namari/fukui-no-namari.git] / src / Hage1 / brdlist.py
1 # Copyright (C) 2006 by Aiwota Programmer
2 # aiwotaprog@tetteke.tk
3 #
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 2 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program; if not, write to the Free Software
16 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17
18 import os.path
19 import ConfigParser
20 import gconf
21
22 import config
23
24 # key: bbs id, value: board dict
25 # board dict:: key: board id ,value: attr dict
26 # attr dict:: key: attr name, value attr value
27 # /apps/hage1/boards
28 #   /2ch
29 #      /morningcoffee
30 #          /host
31 #          /name
32 #      /ainotane
33 #          /host
34 #          /name
35
36 brd_list = None
37 key_root = None
38
39 def get(bbs, board, attr):
40     if not bbs or not board or not attr:
41         raise ValueError, "parameter must not be empty"
42
43     if brd_list and \
44        bbs in brd_list and brd_list[bbs] and \
45        board in brd_list[bbs] and brd_list[bbs][board] and \
46        attr in brd_list[bbs][board]:
47         return brd_list[bbs][board][attr]
48     else:
49         raise RuntimeError, \
50               "brdlist.get: "+bbs+"::"+board+"::"+attr+" not found"
51
52 def split_key(key):
53     """Returns (bbs, board, attribute)"""
54     global key_root
55
56     if not key:
57         print "no key"
58         return None, None, None
59     if not key.startswith(key_root+"/"):
60         print "invalid key", key
61         return None, None, None
62     key_unpref = key[len(key_root+"/"):]
63     list = key_unpref.split("/", 2)
64     bbs = None
65     board = None
66     attr = None
67     if len(list) > 0:
68         bbs = list[0]
69     if len(list) > 1:
70         board = list[1]
71     if len(list) > 2:
72         attr = list[2]
73     return bbs, board, attr
74
75 def remove_attr(bbs, board, attr):
76     if not bbs or not board or not attr:
77         return
78
79     if brd_list and bbs in brd_list and board in brd_list[bbs] \
80        and attr in brd_list[bbs][board]:
81         print "delete", bbs, board, attr
82         del brd_list[bbs][board][attr]
83         if not brd_list[bbs][board]:
84             print "delete", bbs, board
85             del brd_list[bbs][board]
86             if not brd_list[bbs]:
87                 print "delete", bbs
88                 del brd_list[bbs]
89
90 def modify_attr(bbs, board, attr, value):
91     if not bbs or not board or not attr:
92         return
93
94     global brd_list
95
96     if not brd_list:
97         print "create root brd_list"
98         brd_list = {}
99     if bbs not in brd_list or not brd_list[bbs]:
100         print "create", bbs
101         brd_list[bbs] = {}
102     if board not in brd_list[bbs] or not brd_list[bbs][board]:
103         print "create", bbs, board
104         brd_list[bbs][board] = {}
105
106     print "modified", attr, value
107     brd_list[bbs][board][attr] = str(value)
108
109 def key_changed_callback(client, cnxn_id, entry, user_data = None):
110     print "notify", cnxn_id, entry.key
111
112     bbs, board, attr = split_key(entry.key)
113     if not bbs or not board or not attr:
114         print "key is not /apps/{appname}/boards/{bbs}/{board}/{attr}"
115         return
116
117     if not entry.value:
118         # entry.key is unset
119         print "unset"
120         remove_attr(bbs, board, attr)
121     elif entry.value.type != gconf.VALUE_STRING:
122         # entry value is invalid type
123         print "invalid type"
124         remove_attr(bbs, board, attr)
125     else:
126         # entry.key is modified, or new
127         value = entry.value.to_string()
128         print "modified or new", value
129         modify_attr(bbs, board, attr, value)
130
131 def init():
132     global key_root
133
134     key_root = "/apps/" + config.APPNAME.lower() + "/boards"
135     client = gconf.client_get_default()
136
137     # init
138     print "init brd_list for gconf"
139     for bbs_dir in client.all_dirs(key_root):
140         for board_dir in client.all_dirs(bbs_dir):
141             # host
142             key = board_dir + "/host"
143             value = client.get_string(key)
144             if value:
145                 bbs, board, attr = split_key(key)
146                 modify_attr(bbs, board, attr, value)
147             # name
148             key = board_dir + "/name"
149             value = client.get_string(key)
150             if value:
151                 bbs, board, attr = split_key(key)
152                 modify_attr(bbs, board, attr, value)
153
154     # register notification
155     print "register gconf notification"
156     client.add_dir(key_root, gconf.CLIENT_PRELOAD_NONE)
157     client.notify_add(key_root, key_changed_callback)