2 def __init__(self, _id, _title, _url, _parent, _type):
8 def dump(self, _intent=' '):
9 print "%s-> %d, %s, %s, %d, %d" % (_intent, self.mId, self.mTitle, self.mUrl, self.mParent, self.mType)
12 def __init__(self, _id, _name):
17 def setBookmarks(self, _bookmarks):
18 self.mBookmarks = _bookmarks
20 def appendBookmark(self, _bookmark):
21 self.mBookmarks[_bookmark.mId] = _bookmark
24 print " -> %d, %s" % (self.mId, self.mName)
25 for key in self.mBookmarks.iterkeys():
26 self.mBookmarks[key].dump(' ')
29 class SimpleConfigParser:
33 self.mCategoryCurrentIdx = 0
34 self.mBookmarkCurrentIdx = 0
35 self.mDataValid = False
36 self.mPopulateValid = False
42 self.mConfig.read(self.mFileName)
44 self.mCategoryCurrentIdx = self.getNumber('__SYS__', 'category_current_idx')
45 self.mBookmarkCurrentIdx = self.getNumber('__SYS__', 'bookmark_current_idx')
46 self.mDataValid = True
49 with open(self.mFileName, 'wb') as bookmarkFile:
50 self.mConfig.write(bookmarkFile)
51 self.mDataValid = False
52 self.mPopulateValid = False
54 def _del(self, _section, _option=None):
55 #print _section, ' :', _option
57 if not self.exist(_section):
59 self.mConfig.remove_section(_section)
61 if not self.exist(_section, _option):
63 self.mConfig.remove_option(_section, _option)
65 def _get(self, _section, _option, _default):
67 data = self.mConfig.get(_section, _option)
73 def _set(self, _section, _option, _value):
74 self.mConfig.set(_section, _option, _value)
76 def exist(self, _section, _option=None):
78 return self.mConfig.has_section(_section)
79 return self.mConfig.has_option(_section, _option)
81 def setNumber(self, _section, _option, _value):
82 self._set(_section, _option, str(_value))
84 def setString(self, _section, _option, _value):
85 self._set(_section, _option, _value)
87 def getNumber(self, _section, _option, _default=0):
88 return int(self._get(_section, _option, _default))
90 def getString(self, _section, _option, _default=''):
91 return self._get(_section, _option, _default)
93 def delOption(self, _section, _option):
94 self._del(_section, _option)
96 def addSection(self, _section):
97 self.mConfig.add_section(_section)
99 def delSection(self, _section):
102 def init(self, _fileName):
103 self.mFileName = _fileName
104 self.mConfig = ConfigParser.RawConfigParser()
105 if self.mConfig is None:
110 class BookmarkManager(SimpleConfigParser):
112 def __new__(cls, *args, **kwargs):
113 if not cls._instance:
114 cls._instance = super(Singleton, cls).__new__(
115 cls, *args, **kwargs)
118 def __init__(self, _dbFileName):
119 SimpleConfigParser.__init__(self)
121 self.mBookmarkRoot = None
122 self.mDebugEnable = True
125 if not os.path.exists(_dbFileName):
126 f = file('/proc/stb/info/vumodel')
127 model = f.read().strip()
129 manualmode = (model == "solo2" or model == "duo2")
131 os.system('echo "[__SYS__]" > %s'%(_dbFileName))
132 os.system('echo "category_current_idx = 1" >> %s'%(_dbFileName))
134 os.system('echo "bookmark_current_idx = 2" >> %s'%(_dbFileName))
135 else: os.system('echo "bookmark_current_idx = 1" >> %s'%(_dbFileName))
136 os.system('echo "[c-1]" >> %s'%(_dbFileName))
137 os.system('echo "id = 1" >> %s'%(_dbFileName))
138 os.system('echo "name = My favorite" >> %s'%(_dbFileName))
139 os.system('echo "[b-1]" >> %s'%(_dbFileName))
140 os.system('echo "url = http://www.vuplus.com/" >> %s'%(_dbFileName))
141 os.system('echo "id = 1" >> %s'%(_dbFileName))
142 os.system('echo "parent = 1" >> %s'%(_dbFileName))
143 os.system('echo "title = Vuplus Home" >> %s'%(_dbFileName))
144 os.system('echo "type = 0" >> %s'%(_dbFileName))
146 os.system('echo "[b-2]" >> %s'%(_dbFileName))
147 os.system('echo "url = file:///usr/local/manual/main.html" >> %s'%(_dbFileName))
148 os.system('echo "id = 2" >> %s'%(_dbFileName))
149 os.system('echo "parent = 1" >> %s'%(_dbFileName))
150 os.system('echo "title = User Manual" >> %s'%(_dbFileName))
151 os.system('echo "type = 1" >> %s'%(_dbFileName))
152 self.init(_dbFileName)
154 def message(self, format, params=None):
155 if not self.mDebugEnable:
159 else: print format % (params)
161 def getBookmark(self, _title):
163 for key in self.mBookmarkRoot.iterkeys():
164 for key2 in self.mBookmarkRoot[key].mBookmarks.iterkeys():
165 if self.mBookmarkRoot[key].mBookmarks[key2].mTitle == _title:
166 return 'b-%d' % (self.mBookmarkRoot[key].mBookmarks[key2].mId)
169 def addBookmark(self, _title, _url, _parent, _type):
170 if self.getBookmark(_title) is not None:
172 i = self.mBookmarkCurrentIdx + 1
174 self.message("add bookmark : %s, %s, %d, %d", (_title, _url, _parent, _type,))
176 self.mConfig.add_section(s)
177 self.setNumber(s, 'id', i)
178 self.setString(s, 'title', _title)
179 self.setString(s, 'url', _url)
180 self.setNumber(s, 'parent', _parent)
181 self.setNumber(s, 'type', _type)
182 self.setNumber('__SYS__', 'bookmark_current_idx', i)
187 def deleteBookmark(self, _id):
189 self.message("delete bookmark : %d", (_id,))
190 self.delSection('b-%d' % (_id,))
193 def updateBookmark(self, _bookmark):
195 s = "b-%d" % (_bookmark.mId)
196 self.message("update bookmark : %s, %s, %d, %d", (_bookmark.mTitle, _bookmark.mUrl, _bookmark.mParent, _bookmark.mType,))
197 self.setString(s, 'title', _bookmark.mTitle)
198 self.setString(s, 'url', _bookmark.mUrl)
199 self.setNumber(s, 'parent', _bookmark.mParent)
200 self.setNumber(s, 'type', _bookmark.mType)
203 def getCategory(self, _name):
205 for key in self.mBookmarkRoot.iterkeys():
206 if self.mBookmarkRoot[key].mName == _name:
207 return 'c-%d' % (self.mBookmarkRoot[key].mId)
210 def addCategory(self, _name):
211 if self.getCategory(_name) is not None:
213 self.message("add category : %s", (_name,))
214 i = self.mCategoryCurrentIdx + 1
217 self.mConfig.add_section(s)
218 self.setNumber(s, 'id', i)
219 self.setNumber(s, 'name', _name)
220 self.setNumber('__SYS__', 'category_current_idx', i)
225 def deleteCategory(self, _id):
227 self.message("delete category : %d", (_id,))
229 for key in self.mBookmarkRoot[_id].mBookmarks.iterkeys():
230 self.delSection('b-%d' % (key,))
232 self.delSection('c-%d' % (_id,))
235 def updateCategory(self, _category):
237 self.message("update category : %s", (_category.mName,))
238 s = "c-%d" % (_category.mId)
239 self.setNumber(s, 'name', _category.mName)
245 self.message("populate : %d, %d", (self.mPopulateValid, self.mDataValid))
248 if self.mPopulateValid:
251 while cx <= self.mCategoryCurrentIdx:
253 i = self.getNumber(s, 'id', -1)
255 n = self.getString(s, 'name')
256 categoryList[i] = CategoryData(i, n)
259 while bx <= self.mBookmarkCurrentIdx:
261 i = self.getNumber(s, 'id', -1)
263 t = self.getString(s, 'title')
264 u = self.getString(s, 'url')
265 p = self.getNumber(s, 'parent')
266 e = self.getNumber(s, 'type')
268 categoryList[p].appendBookmark(BookmarkData(i, t, u, p, e))
269 except Exception, e: self._del(s)
271 for key in categoryList.iterkeys():
272 sorted(categoryList[key].mBookmarks)
273 self.mBookmarkRoot = categoryList
274 self.mPopulateValid = True
277 def getBookmarkRoot(self):
279 return self.mBookmarkRoot
282 if not self.mDebugEnable:
285 print "-- snapshot --"
286 for key in self.mBookmarkRoot.iterkeys():
287 self.mBookmarkRoot[key].dump()
288 print "--------------"
292 return BookmarkManager('/usr/lib/enigma2/python/Plugins/Extensions/HbbTV/bookmark.ini')