src/location/qmlbackendtriggerchangeao_s60.cpp
changeset 0 876b1a06bc25
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/location/qmlbackendtriggerchangeao_s60.cpp	Wed Aug 25 15:49:42 2010 +0300
@@ -0,0 +1,349 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** No Commercial Usage
+** This file contains pre-release code and may not be distributed.
+** You may use this file in accordance with the terms and conditions
+** contained in the Technology Preview License Agreement accompanying
+** this package.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights.  These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+**
+**
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qmlbackendmonitorao_s60_p.h"
+#include "qgeoareamonitor_s60_p.h"
+#include "qmlbackendmonitorinfo_s60_p.h"
+#include "qmlbackendtriggerchangeao_s60_p.h"
+
+#include <lbtsessiontrigger.h>
+#include <lbttriggerentry.h>
+
+QTM_BEGIN_NAMESPACE
+
+//Design chnages
+
+QMLBackendTriggerChangeAO* QMLBackendTriggerChangeAO::instance = NULL;
+TInt QMLBackendTriggerChangeAO::refCount = 0;
+
+
+//request for the notification of trigger change event with the
+//LBT server
+void QMLBackendTriggerChangeAO::NotifyChangeEvent()
+{
+    if (!IsActive()) {
+        iStatus = KRequestPending;
+        iLbt.NotifyTriggerChangeEvent(iTriggerChangeEvent, iStatus);
+        SetActive();
+    }
+}
+
+
+QMLBackendTriggerChangeAO::~QMLBackendTriggerChangeAO()
+{
+    Cancel();
+    iLbt.Close();
+}
+
+void  QMLBackendTriggerChangeAO::DoCancel()
+{
+    if (IsActive()) { //if AO is active,cancel the trigger change event request
+        iLbt.CancelNotifyTriggerChangeEvent();
+    }
+}
+
+void QMLBackendTriggerChangeAO::RunL()
+{
+    switch (iStatus.Int()) {
+        case KErrNone :
+#if 0
+            //implementation takes the updation, deletion into consideration
+            //from the UI, which is'nt possible with the current UI for LBT.
+            //The same should be considered once made availbale as part of the UI
+            //check for Multiple trigger change events
+            if (iTriggerChangeEvent.iEventType == ELbtTriggerChangeEventMultiple) {
+                CMonitorTriggerInfo* triggerInfo1 = NULL;
+
+                CMonitorTriggerInfo* triggerInfo2 = NULL;
+
+                CMonitorTriggerInfo* triggerInfo3 = NULL;
+
+                TInt i = 0, count = 0;
+
+                RPointerArray < CLbtTriggerInfo > trigInfoList;
+
+                CLbtTriggerEntry* entry = NULL;
+
+                //retrieve the list of triggers created by the client
+                iLbt.GetTriggersL(trigInfoList);
+
+                CleanupClosePushL(trigInfoList);
+
+                count = trigInfoList.Count();
+
+                //get the header of the linked list holding the information
+                //of the trigger
+                triggerInfo1 = iTriggerMonitorInfo->getMonitorTriggerInfo();
+
+                while (triggerInfo1) {
+                    for (i = 0; i < count; i++) {
+                        //get the trigger entryinfo
+                        entry = trigInfoList[i]->TriggerEntry();
+
+                        //if the triggerinfo retrieved matches the trigInfoList
+                        //id break
+                        if (triggerInfo1->iTriggerID == entry->Id())
+                            break;
+                    }
+
+                    triggerInfo2 = triggerInfo1->next;
+
+                    if (i == count)   //if the triggerinfo1->triggerid not found
+                        //in the trigger list of the LBT server,
+                        //remove the triggerinfo from the linked list
+                    {
+                        iTriggerMonitorInfo->removeMonitorTriggerInfo(
+                            triggerInfo1->iTriggerID);
+                    } else {
+
+                        //if triggerinfo1->triggerid is found in the trigger list,
+                        //and if it is an entry trigger, search for the corresponding
+                        //exit trigger in the linked list
+                        if (triggerInfo1->iType == EntryTrigger)
+                            triggerInfo3 = iTriggerMonitorInfo->getMonitorTriggerInfo(
+                                               triggerInfo1->iParent , ExitTrigger);
+
+                        //if triggerinfo1->triggerid is found in the trigger list,
+                        //and if it is an entry trigger, search for the corresponding
+                        //entry trigger in the linked list
+                        else if (triggerInfo1->iType == ExitTrigger)
+                            triggerInfo3 = iTriggerMonitorInfo->getMonitorTriggerInfo(
+                                               triggerInfo1->iParent, EntryTrigger);
+
+                        //callback called for the notification change event of the trigger
+                        if (triggerInfo3) {
+
+                            (triggerInfo1->iParent)->handleTriggerChangeEvent(iTriggerChangeEvent.iEventType, trigInfoList[i],
+                                    triggerInfo3->iTriggerID);
+                        } else {
+                            (triggerInfo1->iParent)->handleTriggerChangeEvent(iTriggerChangeEvent.iEventType, trigInfoList[i],
+                                    NULL);
+                        }
+
+                    }
+                    triggerInfo3 = NULL;
+
+                    triggerInfo1 = triggerInfo2;
+                }
+
+                CleanupStack::Pop(1);
+
+                //cloae the trigInfoList, holding the list of trigger
+                //info
+                trigInfoList.Close();
+
+            }
+            //check for trigger delete event
+            else if (iTriggerChangeEvent.iEventType == ELbtTriggerChangeEventDeleted) {
+                //delete the entry from the linked list,corresponding to the
+                //iTriggerChangeEvent.iTriggerId
+                iTriggerMonitorInfo->removeMonitorTriggerInfo(
+                    iTriggerChangeEvent.iTriggerId);
+            }
+            //check for trigger updation event
+            else if (iTriggerChangeEvent.iEventType == ELbtTriggerChangeEventUpdated) {
+                CLbtTriggerInfo *info = NULL;
+
+                //get the triggerinfo from the linked list corresponding
+                //to the iTriggerChangeEvent.iTriggerId
+                CMonitorTriggerInfo* triggerInfo1 = iTriggerMonitorInfo->getMonitorTriggerInfo(
+                                                        iTriggerChangeEvent.iTriggerId);
+
+                if (!triggerInfo1)
+                    break;
+
+                //get the triggerinfo of trigger with id - iTriggerChangeEvent.iTriggerId
+                //from the LBT server
+                info = iLbt.GetTriggerLC(iTriggerChangeEvent.iTriggerId);
+
+                if (info == NULL)
+                    break;
+
+                //change in one-trigger,must update the corresponding entry/exit
+                //trigger
+                if (triggerInfo1) {
+                    CMonitorTriggerInfo* triggerInfo2 = NULL;
+
+                    //if the trigger updated is EntryTrigger, get the information
+                    //of the corresponding ExitTrigger if any,from the
+                    //linked list
+                    if (triggerInfo1->iType == EntryTrigger)
+                        triggerInfo2 = iTriggerMonitorInfo->getMonitorTriggerInfo(
+                                           triggerInfo1->iParent, ExitTrigger);
+
+                    //if the trigger updated is ExitTrigger, get the information
+                    //of the corresponding EntryTrigger if any,fro mthe
+                    //linked list
+                    else if (triggerInfo1->iType == ExitTrigger)
+                        triggerInfo2 = iTriggerMonitorInfo->getMonitorTriggerInfo(
+                                           triggerInfo1->iParent, EntryTrigger);
+
+                    //callback called for the notification change event for the trigger
+                    if (triggerInfo2) {
+                        (triggerInfo1->iParent)->handleTriggerChangeEvent(iTriggerChangeEvent.iEventType, info,
+                                triggerInfo2->iTriggerID);
+                    } else {
+                        (triggerInfo1->iParent)->handleTriggerChangeEvent(iTriggerChangeEvent.iEventType, info,
+                                NULL);
+                    }
+                }
+
+                //pop and destroy the triggerinfo retrived from GetTriggerLC()
+                CleanupStack::PopAndDestroy(info);
+            }
+#endif
+            if (iTriggerChangeEvent.iEventType == ELbtTriggerChangeEventMultiple) {
+
+                CMonitorTriggerInfo* triggerInfo1 = NULL;
+
+                CMonitorTriggerInfo* triggerInfo2 = NULL;
+
+                TInt i = 0, count = 0;
+
+                RArray < TLbtTriggerId > triggerIdList;
+
+
+                //retrieve the list of trigger IDs created by the client
+                TRAPD(ret, iLbt.ListTriggerIdsL(triggerIdList));
+
+                if (ret != KErrNone) {
+                    break;
+                }
+
+                CleanupClosePushL(triggerIdList);
+
+                count = triggerIdList.Count();
+
+                //get the header of the linked list holding the information
+                //of the trigger
+                triggerInfo1 = iTriggerMonitorInfo->getMonitorTriggerInfo();
+
+                while (triggerInfo1) {
+                    for (i = 0; i < count; i++) {
+                        //if the triggerinfo retrieved matches the triggerIdList
+                        //id break
+                        if (triggerInfo1->iTriggerID == triggerIdList[i])
+                            break;
+                    }
+
+                    triggerInfo2 = triggerInfo1->next;
+
+                    if (i == count)   //if the triggerinfo1->triggerid not found
+                        //in the trigger list of the LBT server,
+                        //remove the triggerinfo from the linked list
+                    {
+                        iTriggerMonitorInfo->removeMonitorTriggerInfo(
+                            triggerInfo1->iTriggerID);
+                    }
+
+                    triggerInfo1 = triggerInfo2;
+                }
+
+                CleanupStack::Pop(1);
+
+                //close the trigInfoList, holding the list of trigger
+                //info
+                triggerIdList.Close();
+            }
+
+            //check for trigger delete event
+            else if (iTriggerChangeEvent.iEventType == ELbtTriggerChangeEventDeleted) {
+                //delete the entry from the linked list,corresponding to the
+                //iTriggerChangeEvent.iTriggerId
+                iTriggerMonitorInfo->removeMonitorTriggerInfo(
+                    iTriggerChangeEvent.iTriggerId);
+            }
+            break;
+
+        default :
+            break;
+    }
+
+    //request for the notification of any notification change events
+    NotifyChangeEvent();
+}
+
+
+//static function called prior to the destruction of the
+//singleton QMLBackendTriggerChangeAO object
+void QMLBackendTriggerChangeAO::DeleteAO()
+{
+    //decrement the referent count
+    refCount--;
+
+    if (!refCount) { //if reference count becomes 0 delete the instance
+        delete instance;
+        instance = NULL;
+    }
+}
+
+QMLBackendTriggerChangeAO* QMLBackendTriggerChangeAO::NewL(RLbtServer& aLbtServ)
+{
+
+    if (!instance) {
+        instance = new  QMLBackendTriggerChangeAO;
+        instance->ConstructL(aLbtServ);
+        if (!instance->isValid()) {
+            delete instance;
+            instance = NULL;
+            return NULL;
+        }
+    }
+    refCount++;
+    return instance;
+
+}
+
+QMLBackendTriggerChangeAO::QMLBackendTriggerChangeAO() : CActive(EPriorityNormal), iTriggerMonitorInfo(NULL)
+{
+    CActiveScheduler::Add(this);        //add current AO, to the Schedular
+}
+
+void QMLBackendTriggerChangeAO::ConstructL(RLbtServer& aLbtServ)
+{
+    if (iLbt.Open(aLbtServ) == KErrNone) { //open the RLBT subsesion
+        subsessionCreated = TRUE;
+        //Get the pointer to the CBackendMonitorInfo singleton object
+        iTriggerMonitorInfo = CBackendMonitorInfo::NewL();
+    }
+}
+
+QTM_END_NAMESPACE