javaextensions/midppush/pushregistryplugin/inc/pushdatacontainer.h
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/midppush/pushregistryplugin/inc/pushdatacontainer.h	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,368 @@
+/*
+* Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifndef PUSHDATACONTAINER_H
+#define PUSHDATACONTAINER_H
+
+#include <memory>
+#include <map>
+#include <set>
+#include "pushregdata.h"
+#include "javastorage.h"
+#include "javauid.h"
+#include "pushdbhandler.h"
+
+namespace java
+{
+namespace captain
+{
+class CoreInterface;
+}
+namespace push
+{
+
+class PushDBHandler;
+
+/**
+ * This is internal class used by PushDataContainer class.
+ */
+class PushRegistrationData
+{
+public:
+
+    enum RegistrationType_t {DYNAMIC_REG = 0,STATIC_REG = 1};
+
+    PushRegistrationData(const std::wstring& aUri,const std::wstring& aMidletClass,
+                         const std::wstring& aFilter,RegistrationType_t aType)
+            : mUri(aUri),mMidletClass(aMidletClass),mFilter(aFilter),mType(aType),
+            mPendingStatus(false) {}
+
+    virtual ~PushRegistrationData() {}
+
+    PushRegistrationData &operator=(const PushRegistrationData &x)
+    {
+        mUri = x.mUri;
+        mMidletClass = x.mMidletClass;
+        mFilter = x.mFilter;
+        mType = x.mType;
+        mPendingStatus = x.mPendingStatus;
+        return *this;
+    }
+
+    PushRegistrationData(const PushRegistrationData& x)
+    {
+        *this = x;
+    }
+
+    std::wstring mUri;
+    std::wstring mMidletClass;
+    std::wstring mFilter;
+    RegistrationType_t mType;
+    //true' means that message has arrived to the connection.
+    //'false' means that application has started to handle arrived msg of the push connection
+    //        or msg has not been arrived to the connection.
+    bool mPendingStatus;
+
+};
+
+class PushRegistrationDataWithUid
+{
+public:
+
+    //This class does not take ownership of the aData argument.
+    PushRegistrationDataWithUid(const java::util::Uid& aUid,
+                                PushRegistrationData* aData)
+            : mUid(aUid),mPushRegData(aData) {}
+
+    virtual ~PushRegistrationDataWithUid() {}
+
+    PushRegistrationDataWithUid &operator=(const PushRegistrationDataWithUid &x)
+    {
+        mUid = x.mUid;
+        mPushRegData = x.mPushRegData;
+        return *this;
+    }
+
+    PushRegistrationDataWithUid(const PushRegistrationDataWithUid& x)
+    {
+        *this = x;
+    }
+
+    //MIDlet's uid.
+    java::util::Uid mUid;
+    PushRegistrationData* mPushRegData;
+};
+
+/**
+ * This class manages push registrations in the Java Captain process.
+ * This class reads all push registrations from the Java Storage and caches
+ * push registrations. Dynamic puush registrations can be register/unregister
+ * via this class.
+ */
+
+class PushDataContainer
+{
+public:
+
+    PushDataContainer(java::captain::CoreInterface& aCore,
+                      PushDBHandler& aDbHandler);
+
+    virtual ~PushDataContainer();
+
+    void getIdsOfMidlets(std::set<java::util::Uid>& aUidList);
+
+    /**
+     * Informs whether MIDlet has push registrations.
+     * @param aUid UID of the MIDlet.
+     * @return 'true' if MIDlet has static and/or dynamic push connedction(s).
+     */
+    bool isPushConnections(const java::util::Uid& aUid);
+
+    /**
+     * Returns push registrations of the application.
+     * @param aUid UID of the application.
+     * @param aOutputList Output parameter. Contains push registrations of the application.
+     */
+    void getPushRegsOfMidlet(const java::util::Uid& aUid,std::list<PushRegData>& aOutputList);
+
+    /**
+     * This operation stores dynamic push registration to the java storage.
+     * @param aUid          UID of the MIDlet.
+     * @param aUri          Push connection URI.
+     * @param aMidletName   Class name of the MIdlet.
+     * @param aFilter       Connection URL indicating which senders are allowed to cause
+       *                      the MIDlet to be launched.
+     * @throws              PushException with following error codes:
+     *                      PUSH_CONNECTION_ALREADY_EXISTS:
+     *                      Push connection already exists.
+     *                      DB_ERROR:
+       *                      Inserting dynamic push connection to the database failed.
+     */
+    void storeDynamicPushRegistration(const java::util::Uid& aUid,const std::wstring& aUri,
+                                      const std::wstring& aMidletName,
+                                      const std::wstring& aFilter);
+
+    /**
+     * This operation removes dynamic push connection from the MIDlet.
+     * @throws  PushException with following error codes:
+     *          NOT_DYNAMIC_PUSH_URI:
+     *          URI is static push URI.
+     *          URI_BELONGS_TO_OTHER_MIDLET:
+     *          Push URI is reserved for other MIDlet.
+     *          SRV_CONN_NOT_FOUND:
+     *          Server connection is not found from the push registry db.
+     *          DB_ERROR:
+       *          Database error occurred.
+     */
+    void unregisterDynamicPushRegistration(const java::util::Uid& aUid,const std::wstring& aUri);
+
+    /**
+     * This method sets MIDlet to the "do not launch" list. This means that MIDlet
+     * is not try to re-launch in the listening until device has booted next time.
+     * This operation does not throw exceptions.
+     * @param aUid UID of the MIDlet.
+     */
+    void setMidletDoNotLaunchList(const java::util::Uid& aUid);
+
+    /**
+     * This method removes MIDlet to the "do not launch" list.
+     * This operation does not throw exceptions.
+     * @param aUid UID of the MIDlet.
+     */
+    void removeMidletFromDoNotLaunchList(const java::util::Uid& aUid);
+
+    /**
+     * This operation does not throw exceptions.
+     * @return 'true' if MIDlet is not in the "do not launch" list.
+     */
+    bool isMidletInDoNotLaunchList(const java::util::Uid& aUid);
+
+    /**
+     * This operation removes application from all containers.
+     */
+    void removeApp(const java::util::Uid& aUid);
+
+    /**
+     * This operation reads application's push registrations from the db and adds
+     * those ones into the internal cache. It also removes application from the
+     * 'do not launch in the push listening mode' list.
+     * @param aUid  UID of the application.
+     * @throws This operation does not throw exceptions.
+     */
+    void readAppDataFromDb(const java::util::Uid& aUid);
+
+    /**
+     * This method updates pending status of the push connection. Pending status is needed
+     * by PushRegistry.listConnections() operation when this operation is called with 'true'
+     * argument.
+     * @param aUid UID of the application.
+     * @param aUri URI of the push connection.
+     * @param aMsgWaitsHandling status flag of push connection.
+     *        - 'true' means that message has arrived to the connection.
+     *        - 'false' means that application has started to handle arrived msg
+     *          of the push connection.
+     * @throws This operation does not throw exceptions.
+     */
+    void setPendingStatusOfConn(const java::util::Uid& aUid,const std::wstring& aUri,
+                                bool aMsgWaitsHandling);
+
+    /**
+     * Sets pending status of MIDlet's all push connections to "not active".
+     * @param aMidletUid UID of the application.
+     * @throws This operation does not throw exceptions.
+     */
+    void clearPendingStatusesOfMidlet(const java::util::Uid& aMidletUid);
+
+    /**
+     * This method returns push connections of all MIDlets' in the MIDlet suite.
+     * @param aMidletSuiteUid MIDlet suite UID.
+     * @param aAllConnsFlag this flag indicates whether only "pending conns"
+     *        are returned:
+     *        'true'  => all MIDlets' push connections are returned.
+     *        'false' => only push connections which waiting application's handling.
+     * @param listOfPushUris URIs of push connections.
+     * @throws This operation does not throw exceptions.
+     */
+    void getPushRegsOfMidletSuite(const java::util::Uid& aMidletSuiteUid,bool aAllConnsFlag,
+                                  std::list<std::wstring>& aListOfPushUris);
+
+    /**
+     * Returns filter argument of the push registration.
+     * @param aSuiteUid   MIDlet suite UID.
+     * @param aUri        push URI.
+     * @throws            PushException with following error codes:
+     *                    SRV_CONN_NOT_FOUND:
+     *                    - Push connection by URI and suite uid is not found.
+     */
+    const std::wstring& getFilterOfPushConn(const java::util::Uid& aSuiteUid,
+                                            const std::wstring& aUri);
+
+    /**
+     * Returns class name of the push registration.
+     * @param aSuiteUid   MIDlet suite UID.
+     * @param aUri        push URI.
+     * @throws            PushException with following error codes:
+     *                    SRV_CONN_NOT_FOUND:
+     *                    - Push connection by URI and suite uid is not found.
+     */
+    const std::wstring& getClassNameOfPushConn(const java::util::Uid& aSuiteUid,
+            const std::wstring& aUri);
+
+    /**
+     * This operation returns MIDlet's uid. MIDlet is identified by suite uid and
+     * class name of the MIDlet.
+     * @param aSuiteUid   MIDlet suite UID.
+     * @param aClassName  Class name of the MIDlet.
+     * @throws            PushException with following error code:
+     *                    INCORRECT_APP_DATA:
+     *                    - aClassName does not match to any MIDlet in the suite.
+     */
+    const java::util::Uid& getMidletUid(const java::util::Uid& aSuiteUid,
+                                        const std::wstring& aClassName);
+
+
+    /**
+     * This operation returns suite uid of the push connection retrieved by
+     * base URI. Base URI means "starts with" URI in this context.
+     * Comparison is case insensitive and it assumes that URI contains
+     * only us-ascii characters.
+     * E.g. Match occurs if full URI is "socket://:1234?param1=value1"
+     * and base URI is "socket://:1234".
+     * @param aBaseUri "starts with" URI.
+     * @param aOutputSuiteUid Output parameter. Suite uid of the MIDlet.
+     * @return true if aBaseUri argument match to one push connection URI.
+     */
+    bool getSuiteUidByBaseUri(const std::wstring& aBaseUri,java::util::Uid& aOutputSuiteUid);
+
+    /**
+     * This operation returns MIDlet's media uid.
+     * @return MIDlet's media id. Returns -2 if MIDlet by uid is not found.
+     *         Returns -1 if "is mmc available" check is not needed to do.
+     */
+    int getMediaIdByMidletUid(const java::util::Uid& aMidletUid);
+
+
+    /**
+     * This operation returns list of MIDlet's uids by media id.
+     * @param aMediaId media id of the drive.
+     * @param aUidList Output argument. List of MIDlet's uids installed to the certain drive.
+     * @throws This operation does not throw exceptions.
+     */
+    void getMidletUidsByMediaId(unsigned int aMediaId,std::list<java::util::Uid>& aUidList);
+
+private:
+
+    //Datamembers.
+    java::captain::CoreInterface& mCore;
+    PushDBHandler& mPushDbHandler;
+
+    //Container for push registrations.
+    typedef std::multimap<java::util::Uid,PushRegistrationData> PushRegsContainer_t;
+    typedef std::multimap<java::util::Uid,PushRegistrationData>::iterator PushRegsContainerIter_t;
+    PushRegsContainer_t mPushRegistrations;
+    bool mPushRegsLoaded;
+
+    typedef std::set<java::util::Uid> DoNotLaunchList_t;
+    typedef std::set<java::util::Uid>::iterator DoNotLaunchListIter_t;
+    DoNotLaunchList_t mDoNotLaunchList;
+
+    //Container for MIDlet suite info.
+    //Uid is reserved for the suite uid.
+    typedef std::multimap<java::util::Uid,MidletSuiteData> MidletSuiteInfoContainer_t;
+    typedef std::multimap<java::util::Uid,MidletSuiteData>::iterator MidletSuiteInfoContainerIter_t;
+    MidletSuiteInfoContainer_t mMidletSuiteInfo;
+
+    //Internal operations.
+    void loadPushRegs();
+    void readPushRegs(const java::util::Uid& aUid);
+    void insertPushRegToInternalContainer(java::storage::JavaStorageApplicationList_t::iterator& aIter);
+    bool pushRegExists(const std::wstring& aUri);
+    void fillConnectionsOfMidlet(const java::util::Uid& aMidletUid,bool aAllConnsFlag,
+                                 std::list<std::wstring>& aListOfPushUris);
+    bool isMidletPartOfSuite(const java::util::Uid& aSuiteUid,
+                             const java::util::Uid& aMidletUid);
+    PushRegistrationData* getPushConnOfSuite(const java::util::Uid& aSuiteUid,
+            const std::wstring& aUri);
+    PushRegistrationData* getPushDataByMidletUidAndUri(const java::util::Uid& aMidletUid,
+            const std::wstring& aUri);
+    PushRegistrationDataWithUid getPushDataByUri(const std::wstring& aUri);
+
+    bool getSuiteUidByMidletUid(const java::util::Uid& aMidletUid,
+                                java::util::Uid& aOutputSuiteUid);
+    /**
+     * This operation compares whether aFullUri starts with value of the aBaseUri
+     * argument. Comparison is case insensitive and both URIs can contains only
+     * us-ascii characters.
+     */
+    bool isUriStartingWith(const std::string& aFullUri,const std::string& aBaseUri);
+
+    /**
+     * This operation compares whether two chars are equals.
+     * Comparison is case insensitive.
+     */
+    static bool caseInsensitiveCompare(const char a1,const char a2);
+
+    //Not implemented.
+    PushDataContainer(const PushDataContainer &x);
+    PushDataContainer &operator=(const PushDataContainer &x);
+};
+
+}//end namespace push
+}//end namespace java
+
+#endif // PUSHDATACONTAINER_H