qtmobility/src/messaging/eventloggerengine_maemo.cpp
changeset 4 90517678cc4f
child 8 71781823f776
equal deleted inserted replaced
1:2b40d63a9c3d 4:90517678cc4f
       
     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