4 def __init__(self, _id, _title, _url, _parent, _type):
10 def dump(self, _intent=' '):
11 print "%s-> %d, %s, %s, %d, %d" % (_intent, self.mId, self.mTitle, self.mUrl, self.mParent, self.mType)
14 def __init__(self, _id, _name):
19 def setBookmarks(self, _bookmarks):
20 self.mBookmarks = _bookmarks
22 def appendBookmark(self, _bookmark):
23 self.mBookmarks[_bookmark.mId] = _bookmark
26 print " -> %d, %s" % (self.mId, self.mName)
27 for key in self.mBookmarks.iterkeys():
28 self.mBookmarks[key].dump(' ')
31 class SimpleConfigParser:
35 self.mCategoryCurrentIdx = 0
36 self.mBookmarkCurrentIdx = 0
37 self.mDataValid = False
38 self.mPopulateValid = False
43 self.mConfig.read(self.mFileName)
45 self.mCategoryCurrentIdx = self.getNumber('__SYS__', 'category_current_idx')
46 self.mBookmarkCurrentIdx = self.getNumber('__SYS__', 'bookmark_current_idx')
47 self.mDataValid = True
50 with open(self.mFileName, 'wb') as bookmarkFile:
51 self.mConfig.write(bookmarkFile)
52 self.mDataValid = False
53 self.mPopulateValid = False
55 def _del(self, _section, _option=None):
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__(cls, *args, **kwargs)
117 def __init__(self, _dbFileName):
118 SimpleConfigParser.__init__(self)
119 self.mBookmarkRoot = None
120 self.mDebugEnable = True
123 if not os.path.exists(_dbFileName):
124 f = file('/proc/stb/info/vumodel')
125 model = f.read().strip()
127 manualmode = (model == "solo2" or model == "duo2" or model == "solose")
129 os.system('echo "[__SYS__]" > %s'%(_dbFileName))
130 os.system('echo "category_current_idx = 1" >> %s'%(_dbFileName))
132 os.system('echo "bookmark_current_idx = 2" >> %s'%(_dbFileName))
133 else: os.system('echo "bookmark_current_idx = 1" >> %s'%(_dbFileName))
134 os.system('echo "[c-1]" >> %s'%(_dbFileName))
135 os.system('echo "id = 1" >> %s'%(_dbFileName))
136 os.system('echo "name = My favorite" >> %s'%(_dbFileName))
137 os.system('echo "[b-1]" >> %s'%(_dbFileName))
138 os.system('echo "url = http://www.vuplus.com/" >> %s'%(_dbFileName))
139 os.system('echo "id = 1" >> %s'%(_dbFileName))
140 os.system('echo "parent = 1" >> %s'%(_dbFileName))
141 os.system('echo "title = Vuplus Home" >> %s'%(_dbFileName))
142 os.system('echo "type = 0" >> %s'%(_dbFileName))
144 os.system('echo "[b-2]" >> %s'%(_dbFileName))
145 os.system('echo "url = file:///usr/local/manual/main.html" >> %s'%(_dbFileName))
146 os.system('echo "id = 2" >> %s'%(_dbFileName))
147 os.system('echo "parent = 1" >> %s'%(_dbFileName))
148 os.system('echo "title = User Manual" >> %s'%(_dbFileName))
149 os.system('echo "type = 1" >> %s'%(_dbFileName))
150 self.init(_dbFileName)
152 def message(self, format, params=None):
153 if not self.mDebugEnable:
158 vbcfg.DEBUG(format % (params))
160 def getBookmark(self, _title):
162 for key in self.mBookmarkRoot.iterkeys():
163 for key2 in self.mBookmarkRoot[key].mBookmarks.iterkeys():
164 if self.mBookmarkRoot[key].mBookmarks[key2].mTitle == _title:
165 return 'b-%d' % (self.mBookmarkRoot[key].mBookmarks[key2].mId)
168 def addBookmark(self, _title, _url, _parent, _type):
169 if self.getBookmark(_title) is not None:
171 i = self.mBookmarkCurrentIdx + 1
173 self.message("add bookmark : %s, %s, %d, %d", (_title, _url, _parent, _type,))
175 self.mConfig.add_section(s)
176 self.setNumber(s, 'id', i)
177 self.setString(s, 'title', _title)
178 self.setString(s, 'url', _url)
179 self.setNumber(s, 'parent', _parent)
180 self.setNumber(s, 'type', _type)
181 self.setNumber('__SYS__', 'bookmark_current_idx', i)
186 def deleteBookmark(self, _id):
188 self.message("delete bookmark : %d", (_id,))
189 self.delSection('b-%d' % (_id,))
192 def updateBookmark(self, _bookmark):
194 s = "b-%d" % (_bookmark.mId)
195 self.message("update bookmark : %s, %s, %d, %d", (_bookmark.mTitle, _bookmark.mUrl, _bookmark.mParent, _bookmark.mType,))
196 self.setString(s, 'title', _bookmark.mTitle)
197 self.setString(s, 'url', _bookmark.mUrl)
198 self.setNumber(s, 'parent', _bookmark.mParent)
199 self.setNumber(s, 'type', _bookmark.mType)
202 def getCategory(self, _name):
204 for key in self.mBookmarkRoot.iterkeys():
205 if self.mBookmarkRoot[key].mName == _name:
206 return 'c-%d' % (self.mBookmarkRoot[key].mId)
209 def addCategory(self, _name):
210 if self.getCategory(_name) is not None:
212 self.message("add category : %s", (_name,))
213 i = self.mCategoryCurrentIdx + 1
216 self.mConfig.add_section(s)
217 self.setNumber(s, 'id', i)
218 self.setNumber(s, 'name', _name)
219 self.setNumber('__SYS__', 'category_current_idx', i)
224 def deleteCategory(self, _id):
226 self.message("delete category : %d", (_id,))
228 for key in self.mBookmarkRoot[_id].mBookmarks.iterkeys():
229 self.delSection('b-%d' % (key,))
231 self.delSection('c-%d' % (_id,))
234 def updateCategory(self, _category):
236 self.message("update category : %s", (_category.mName,))
237 s = "c-%d" % (_category.mId)
238 self.setNumber(s, 'name', _category.mName)
244 self.message("populate : %d, %d", (self.mPopulateValid, self.mDataValid))
247 if self.mPopulateValid:
250 while cx <= self.mCategoryCurrentIdx:
252 i = self.getNumber(s, 'id', -1)
254 n = self.getString(s, 'name')
255 categoryList[i] = CategoryData(i, n)
258 while bx <= self.mBookmarkCurrentIdx:
260 i = self.getNumber(s, 'id', -1)
262 t = self.getString(s, 'title')
263 u = self.getString(s, 'url')
264 p = self.getNumber(s, 'parent')
265 e = self.getNumber(s, 'type')
267 categoryList[p].appendBookmark(BookmarkData(i, t, u, p, e))
268 except Exception, e: self._del(s)
270 for key in categoryList.iterkeys():
271 sorted(categoryList[key].mBookmarks)
272 self.mBookmarkRoot = categoryList
273 self.mPopulateValid = True
276 def getBookmarkRoot(self):
278 return self.mBookmarkRoot
281 if not self.mDebugEnable:
284 print "-- snapshot --"
285 for key in self.mBookmarkRoot.iterkeys():
286 self.mBookmarkRoot[key].dump()
287 print "--------------"
291 return BookmarkManager(vbcfg.PLUGINROOT + "/bookmark.ini")