50
51
DBUS_DATA_PROVIDER_PATH = '/com/ubuntu/SoftwareCenterDataProvider'
54
def update_activity_timestamp(fn):
55
def wrapped(*args, **kwargs):
57
self._update_activity_timestamp()
58
return fn(*args, **kwargs)
53
62
class SoftwareCenterDataProvider(dbus.service.Object):
55
def __init__(self, bus_name, object_path=DBUS_DATA_PROVIDER_PATH):
66
IDLE_CHECK_INTERVAL = 60
68
def __init__(self, bus_name, object_path=DBUS_DATA_PROVIDER_PATH,
56
70
dbus.service.Object.__init__(self, bus_name, object_path)
57
71
self.bus_name = bus_name
73
main_loop = GObject.MainLoop(GObject.main_context_default())
74
self.main_loop = main_loop
59
76
self.db = StoreDatabase()
66
83
self.review_loader.refresh_review_stats()
67
84
# ensure we query new applications
68
85
run_software_center_agent(self.db)
86
# setup inactivity timer
87
self._update_activity_timestamp()
88
self._idle_timeout = GObject.timeout_add_seconds(
89
self.IDLE_CHECK_INTERVAL, self._check_inactivity)
71
92
""" stop the dbus controller and remove from the bus """
72
self.remove_from_connection()
93
LOG.debug("stop() called")
98
def _check_inactivity(self):
99
""" Check for activity """
101
if (self._activity_timestamp + self.IDLE_TIMEOUT) < now:
102
LOG.info("stopping after %s inactivity" % self.IDLE_TIMEOUT)
106
def _update_activity_timestamp(self):
107
self._activity_timestamp = time.time()
109
# public dbus methods with their implementations, the dbus decorator
110
# does not like additional decorators so we use a seperate function
111
# for the actual implementation
74
112
@dbus.service.method(DBUS_DATA_PROVIDER_IFACE,
75
113
in_signature='ss', out_signature='a{sv}')
76
114
def GetAppDetails(self, appname, pkgname):
77
115
LOG.debug("GetAppDetails() called with ('%s', '%s')" % (
78
116
appname, pkgname))
117
return self._get_app_details(appname, pkgname)
119
@update_activity_timestamp
120
def _get_app_details(self, appname, pkgname):
79
121
app = Application(appname, pkgname)
80
122
appdetails = app.get_details(self.db)
81
123
return appdetails.as_dbus_property_dict()
84
126
in_signature='', out_signature='as')
85
127
def GetAvailableCategories(self):
86
128
LOG.debug("GetAvailableCategories() called")
129
return self._get_available_categories()
131
@update_activity_timestamp
132
def _get_available_categories(self):
87
133
return [cat.name for cat in self.categories]
89
135
@dbus.service.method(DBUS_DATA_PROVIDER_IFACE,
90
136
in_signature='s', out_signature='as')
91
137
def GetAvailableSubcategories(self, category_name):
92
138
LOG.debug("GetAvailableSubcategories() called")
139
return self._get_available_subcategories(category_name)
141
@update_activity_timestamp
142
def _get_available_subcategories(self, category_name):
93
143
cat = get_category_by_name(self.categories, category_name)
94
144
return [subcat.name for subcat in cat.subcategories]
97
147
in_signature='s', out_signature='a(ssss)')
98
148
def GetItemsForCategory(self, category_name):
99
149
LOG.debug("GetItemsForCategory() called with ('%s')" % category_name)
150
return self._get_items_for_category(category_name)
152
@update_activity_timestamp
153
def _get_items_for_category(self, category_name):
101
155
cat = get_category_by_name(self.categories, category_name)
102
156
for doc in cat.get_documents(self.db):
112
166
def dbus_main(bus=None):
114
168
bus = dbus.SessionBus()
170
main_context = GObject.main_context_default()
171
main_loop = GObject.MainLoop(main_context)
115
173
bus_name = dbus.service.BusName(DBUS_BUS_NAME, bus)
116
data_provider = SoftwareCenterDataProvider(bus_name)
174
data_provider = SoftwareCenterDataProvider(bus_name, main_loop=main_loop)
117
175
data_provider # pyflakes
119
main_context = GObject.main_context_default()
120
main_loop = GObject.MainLoop(main_context)