|
1 #include "eventloggerengine_maemo_p.h" |
|
2 #include "telepathyengine_maemo_p.h" |
|
3 #include <QDebug> |
|
4 |
|
5 QTM_BEGIN_NAMESPACE |
|
6 |
|
7 |
|
8 Q_GLOBAL_STATIC(EventLoggerEngine,eventLoggerEngine); |
|
9 |
|
10 |
|
11 EventLoggerEngine* EventLoggerEngine::instance() |
|
12 { |
|
13 return eventLoggerEngine(); |
|
14 } |
|
15 |
|
16 |
|
17 EventLoggerEngine::EventLoggerEngine(QObject *parent) |
|
18 { |
|
19 Q_UNUSED(parent); |
|
20 // qDebug() << "EventLoggerEngine::EventLoggerEngine"; |
|
21 DBusError err=DBUS_ERROR_INIT; |
|
22 g_type_init(); |
|
23 dbus = dbus_bus_get(DBUS_BUS_SESSION, &err); // Create dummy Dbus object and |
|
24 dbus_connection_setup_with_g_main (dbus, NULL); //add it to g_mainloop because eventlogger library expects that someone alse has added session bus to g_mainloop |
|
25 el=rtcom_el_new (); |
|
26 if(!RTCOM_IS_EL(el)) qDebug() << "EventLoggerEngine::EventLoggerEngine():Could't create RTComEl\n"; |
|
27 |
|
28 |
|
29 |
|
30 g_signal_connect(G_OBJECT(el), "new-event", G_CALLBACK(new_event_cb),(void*)this); |
|
31 } |
|
32 |
|
33 void EventLoggerEngine::new_event_cb(RTComEl *el,int event_id, |
|
34 const char *local_uid,const char *remote_uid,const char *remote_ebook_uid, |
|
35 const char *group_uid,const char *service,EventLoggerEngine *p) |
|
36 { |
|
37 p->newEvent(event_id, local_uid,remote_uid ,remote_ebook_uid,group_uid,service); |
|
38 }; |
|
39 |
|
40 void EventLoggerEngine::newEvent(int event_id, |
|
41 const char *local_uid,const char *remote_uid,const char *remote_ebook_uid, |
|
42 const char *group_uid,const char *service) |
|
43 { |
|
44 Q_UNUSED(local_uid); Q_UNUSED(remote_uid);Q_UNUSED(remote_ebook_uid); |
|
45 Q_UNUSED(group_uid);Q_UNUSED(service); |
|
46 QString eventIds=QString::number(event_id); |
|
47 QMessageId id(eventIds); |
|
48 |
|
49 |
|
50 notification(event_id,service,QMessageStorePrivate::Added); |
|
51 } |
|
52 |
|
53 QMessageManager::NotificationFilterId EventLoggerEngine::registerNotificationFilter(QMessageStorePrivate& aPrivateStore, |
|
54 const QMessageFilter &filter) |
|
55 { |
|
56 iListenForNotifications = true; |
|
57 ipMessageStorePrivate = &aPrivateStore; |
|
58 |
|
59 int filterId = ++_filterId; |
|
60 _filters.insert(filterId, filter); |
|
61 return filterId; |
|
62 } |
|
63 |
|
64 void EventLoggerEngine::unregisterNotificationFilter(QMessageManager::NotificationFilterId notificationFilterId) |
|
65 { |
|
66 _filters.remove(notificationFilterId); |
|
67 if (_filters.count() == 0) { |
|
68 iListenForNotifications = false; |
|
69 } |
|
70 } |
|
71 QMessage EventLoggerEngine::eventToMessage(RTComElEvent & ev) |
|
72 { |
|
73 |
|
74 QMessage message; |
|
75 |
|
76 if (!strcmp(ev.fld_service, "RTCOM_EL_SERVICE_SMS")) { |
|
77 message.setType(QMessage::Sms); |
|
78 } else if (!strcmp(ev.fld_service,"RTCOM_EL_SERVICE_CHAT")) { |
|
79 message.setType(QMessage::InstantMessage); |
|
80 } else { |
|
81 message.setType(QMessage::NoType); // Other type, as exampele voice Call |
|
82 }; |
|
83 |
|
84 message.setParentAccountId(QMessageAccountId(QString("y/Account/%1").arg(ev.fld_local_uid))); |
|
85 |
|
86 if (!ev.fld_is_read) { |
|
87 message.setStatus(QMessage::Read); |
|
88 }; |
|
89 message.setPriority(QMessage::NormalPriority); |
|
90 message.setDate(QDateTime::fromTime_t(ev.fld_start_time)); |
|
91 message.setReceivedDate(QDateTime::fromTime_t(ev.fld_start_time)); |
|
92 if (ev.fld_outgoing) QMessagePrivate::setStandardFolder(message,QMessage::SentFolder); |
|
93 else |
|
94 QMessagePrivate::setStandardFolder(message,QMessage::InboxFolder); |
|
95 // qDebug() << "event_type:" << ev.fld_event_type << ev.fld_event_type_id << "Outgoing:" << ev.fld_outgoing << " Folder:" << message.standardFolder(); |
|
96 message.setFrom(QMessageAddress(QMessageAddress::Phone, QString(ev.fld_remote_uid))); |
|
97 QMessagePrivate::setSenderName(message, QString(ev.fld_remote_uid)); |
|
98 QMessageAddressList messageAddresslist; |
|
99 messageAddresslist.append(QMessageAddress(QMessageAddress::Phone, QString(ev.fld_local_uid))); |
|
100 message.setTo(messageAddresslist); |
|
101 message.setBody(QString(ev.fld_free_text)); |
|
102 QMessagePrivate* privateMessage = QMessagePrivate::implementation(message); |
|
103 privateMessage->_id = QMessageId(QString::number(ev.fld_id)); |
|
104 privateMessage->_modified = false; |
|
105 // qDebug() << "id:" << message.id().toString() << "From:" << message.from().addressee() << "Text:" << message.textContent(); |
|
106 return message; |
|
107 |
|
108 } |
|
109 |
|
110 |
|
111 bool EventLoggerEngine::deleteMessage(const QMessageId& id) |
|
112 { |
|
113 int status=rtcom_el_delete_event(el,id.toString().toInt(),NULL); |
|
114 return status==0; |
|
115 } |
|
116 |
|
117 QMessage EventLoggerEngine::message(const QMessageId& id) |
|
118 { |
|
119 |
|
120 QMessage message; |
|
121 |
|
122 // qDebug() << "EventLoggerEngine::getMessage id=" << id.toString(); |
|
123 |
|
124 RTComElEvent ev; |
|
125 bzero(&ev,sizeof(ev)); |
|
126 RTComElQuery *q=rtcom_el_query_new(el); |
|
127 rtcom_el_query_prepare(q,"id",id.toString().toInt(),RTCOM_EL_OP_EQUAL,NULL); |
|
128 RTComElIter *iter=rtcom_el_get_events(el,q); |
|
129 g_object_unref(q); |
|
130 if(iter && rtcom_el_iter_first(iter)) |
|
131 { |
|
132 gboolean res=rtcom_el_iter_get_full(iter,&ev); |
|
133 if(res) { |
|
134 #if 0 |
|
135 printf("got event id=%d service_id=%d event_typ_id=%d\n\ |
|
136 local_uid=%s local_name=%s\n\ |
|
137 remote_uid=%s remote_name=%s remote_ebook_uid=%s\n\ |
|
138 channel=%s free_text=%s group_uid=%s\n\ |
|
139 service=%s event_type=%s\n\ |
|
140 additional_text=%s icon_name=%s pango_markup=%s\n", |
|
141 ev.fld_id,ev.fld_service_id,ev.fld_event_type_id, |
|
142 ev.fld_local_uid,ev.fld_local_name, |
|
143 ev.fld_remote_uid,ev.fld_remote_name,ev.fld_remote_ebook_uid, |
|
144 ev.fld_channel,ev.fld_free_text,ev.fld_group_uid, |
|
145 ev.fld_service,ev.fld_event_type, |
|
146 ev.fld_additional_text,ev.fld_icon_name,ev.fld_pango_markup); |
|
147 #endif |
|
148 if (!strcmp(ev.fld_service, "RTCOM_EL_SERVICE_SMS")) { |
|
149 message.setType(QMessage::Sms); |
|
150 } else if (!strcmp(ev.fld_service,"RTCOM_EL_SERVICE_CHAT")) { |
|
151 message.setType(QMessage::InstantMessage); |
|
152 } else { |
|
153 message.setType(QMessage::NoType); // Other type, as exampele voice Call |
|
154 }; |
|
155 //QMessageAccount account = TelepathyEngine::instance()->account(QMessageAccountId(QString("/y/Account%1").arg(ev.fld_local_uid))); |
|
156 |
|
157 message.setParentAccountId(QMessageAccountId(QString("/y/Account/%1").arg(ev.fld_local_uid))); |
|
158 if (!ev.fld_is_read) { |
|
159 message.setStatus(QMessage::Read); |
|
160 }; |
|
161 message.setPriority(QMessage::NormalPriority); |
|
162 message.setDate(QDateTime::fromTime_t(ev.fld_start_time)); |
|
163 message.setReceivedDate(QDateTime::fromTime_t(ev.fld_start_time)); |
|
164 if (ev.fld_outgoing) QMessagePrivate::setStandardFolder(message,QMessage::SentFolder); |
|
165 else |
|
166 QMessagePrivate::setStandardFolder(message,QMessage::InboxFolder); |
|
167 message.setFrom(QMessageAddress(QMessageAddress::Phone, QString(ev.fld_remote_uid))); |
|
168 QMessagePrivate::setSenderName(message, QString(ev.fld_remote_uid)); |
|
169 QMessageAddressList messageAddresslist; |
|
170 messageAddresslist.append(QMessageAddress(QMessageAddress::Phone, QString(ev.fld_local_uid))); |
|
171 message.setTo(messageAddresslist); |
|
172 message.setBody(QString(ev.fld_free_text)); |
|
173 QMessagePrivate* privateMessage = QMessagePrivate::implementation(message); |
|
174 privateMessage->_id = id; |
|
175 privateMessage->_modified = false; |
|
176 // qDebug() << "id:" << message.id().toString() << "From:" << message.from().addressee() << "Text:" << message.textContent(); |
|
177 }; |
|
178 }; |
|
179 if(iter) g_object_unref(iter); |
|
180 // debugMessage(message); |
|
181 |
|
182 return message; |
|
183 |
|
184 } |
|
185 |
|
186 void EventLoggerEngine::debugMessage(QMessage &message) |
|
187 { |
|
188 qDebug() << "id:" << message.id().toString() << "type:" << message.type() << "size:" << message.size() << "status:" << message.status() << "priority:" << message.priority(); |
|
189 qDebug() << "AccountId:" << message.parentAccountId().toString() << "StantardFolder" << message.standardFolder() << "parenFolderId:" << message.parentFolderId().toString(); |
|
190 qDebug() << "Date:" << message.date() << "receivedDate:" << message.receivedDate() << "Subject:" << message.subject(); |
|
191 qDebug() << "From:" << message.from().addressee(); |
|
192 qDebug() << "To:" << (message.to().isEmpty() ? "**none**" : message.to().first().addressee()); |
|
193 qDebug() << "Body:" <<message.textContent(); |
|
194 } |
|
195 |
|
196 |
|
197 void EventLoggerEngine::notification(int eventId, QString service,QMessageStorePrivate::NotificationType notificationType) |
|
198 { |
|
199 |
|
200 |
|
201 QMessageManager::NotificationFilterIdSet matchingFilters; |
|
202 // qDebug() << "EventLoggerEngine::notification id=" << eventId; |
|
203 |
|
204 // Copy the filter map to protect against modification during traversal |
|
205 QMap<int, QMessageFilter> filters(_filters); |
|
206 QMap<int, QMessageFilter>::const_iterator it = filters.begin(), end = filters.end(); |
|
207 QMessage msg; |
|
208 bool messageRetrieved = false; |
|
209 |
|
210 for ( ; it != end; ++it) { |
|
211 const QMessageFilter &filter(it.value()); |
|
212 if (filter.isEmpty()) { |
|
213 // Empty filter matches to all messages |
|
214 matchingFilters.insert(it.key()); |
|
215 } else { |
|
216 QMessageFilterPrivate* privateMessageFilter = QMessageFilterPrivate::implementation(filter); |
|
217 if (!messageRetrieved && (privateMessageFilter->_field == QMessageFilterPrivate::Type)) { |
|
218 if (service == "RTCOM_EL_SERVICE_SMS") { |
|
219 msg.setType(QMessage::Sms); |
|
220 } else if (service== "RTCOM_EL_SERVICE_CHAT") { |
|
221 msg.setType(QMessage::InstantMessage); |
|
222 } else { |
|
223 msg.setType(QMessage::NoType); // Other type, as eample voice calll |
|
224 } |
|
225 } |
|
226 else if (!messageRetrieved) { |
|
227 msg = this->message(QMessageId(QString::number(eventId))); |
|
228 if (msg.type() == QMessage::NoType) { |
|
229 matchingFilters.clear(); |
|
230 break; |
|
231 } else { |
|
232 messageRetrieved = true; |
|
233 } |
|
234 } |
|
235 if (privateMessageFilter->filter(msg)) { |
|
236 matchingFilters.insert(it.key()); |
|
237 } |
|
238 } |
|
239 } |
|
240 |
|
241 if (matchingFilters.count() > 0) { |
|
242 ipMessageStorePrivate->messageNotification(notificationType, |
|
243 QMessageId(QString::number(eventId)), |
|
244 matchingFilters); |
|
245 } |
|
246 |
|
247 } |
|
248 |
|
249 #if 0 |
|
250 QMessageIdList EventLoggerEngine::filterAndOrderMessages(const QMessageFilter &filter, const QMessageSortOrder& sortOrder, |
|
251 QString body, QMessageDataComparator::MatchFlags matchFlags) |
|
252 { |
|
253 filterAndOrderMessages(filte, sortOrder, body, matchFlags); |
|
254 } |
|
255 #endif |
|
256 |
|
257 QMessageIdList EventLoggerEngine::filterAndOrderMessages(const QMessageFilter &filter, |
|
258 const QMessageSortOrder& sortOrder, |
|
259 QString body, |
|
260 QMessageDataComparator::MatchFlags matchFlags) |
|
261 { |
|
262 Q_UNUSED(body); |
|
263 Q_UNUSED(matchFlags); |
|
264 Q_UNUSED(sortOrder); |
|
265 QMessageId fId; // Filtering id |
|
266 // QMessageType fType; |
|
267 QDate fDate; |
|
268 RTComElEvent ev; |
|
269 QMessage message; |
|
270 |
|
271 const char *services[]={"RTCOM_EL_SERVICE_CHAT","RTCOM_EL_SERVICE_SMS", NULL }; |
|
272 |
|
273 QMessageIdList idList; |
|
274 |
|
275 QMessageFilterPrivate* pf = QMessageFilterPrivate::implementation(filter); |
|
276 #if 0 |
|
277 if ((filters.count() == 1) && (pf->_field == QMessageFilterPrivate::None) && (pf->_filterList.count() == 0)) { |
|
278 if (pf->_notFilter) { |
|
279 // There is only one filter: empty ~QMessageFilter() |
|
280 // => return empty QMessageIdList |
|
281 return idList; |
|
282 } else { |
|
283 // There is only one filter: empty QMessageFilter() |
|
284 // => return all messages |
|
285 |
|
286 } |
|
287 } |
|
288 // Pre-filtering setup |
|
289 switch (pf->_field) { |
|
290 case QMessageFilterPrivate::Id: |
|
291 case QMessageFilterPrivate::ParentAccountId: |
|
292 { |
|
293 if (pf->_comparatorType == QMessageFilterPrivate::Equality) { // QMessageAccountId |
|
294 iNumberOfHandledFilters++; |
|
295 QMessageDataComparator::EqualityComparator cmp(static_cast<QMessageDataComparator::EqualityComparator>(pf->_comparatorValue)); |
|
296 if (cmp == QMessageDataComparator::Equal) { |
|
297 QMessageAccount messageAccount = TelepathyEngine::instance()->account(QMessageAccountId(QString("/y/Account%1").arg(pf->_value.toString()))); |
|
298 } |
|
299 } |
|
300 } |
|
301 } |
|
302 #endif |
|
303 RTComElQuery *q=rtcom_el_query_new(el); |
|
304 rtcom_el_query_prepare(q,"service", services, RTCOM_EL_OP_IN_STRV, NULL); |
|
305 RTComElIter *iter=rtcom_el_get_events(el,q); |
|
306 g_object_unref(q); |
|
307 if(iter && rtcom_el_iter_first(iter)) |
|
308 do { |
|
309 bzero(&ev,sizeof(ev)); |
|
310 if(rtcom_el_iter_get_full(iter,&ev)) |
|
311 { |
|
312 message=eventToMessage(ev); |
|
313 // debugMessage(message); |
|
314 if (pf->filter(message)) { |
|
315 // qDebug() <<"Filter :filtering match" << message.id().toString(); |
|
316 //matchingFilters.insert(it.key()); |
|
317 idList.append(message.id()); |
|
318 }; |
|
319 }; |
|
320 } |
|
321 while( rtcom_el_iter_next(iter)); |
|
322 #if 0 |
|
323 foreach(const QMessageId& id, idList) { |
|
324 qDebug() << "id=" << id.toString(); |
|
325 } |
|
326 #endif |
|
327 return idList; |
|
328 } |
|
329 |
|
330 QTM_END_NAMESPACE |