--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/javaextensions/midppush/pushcontroller/inc/pushserverconnpluginmanager.h Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,267 @@
+/*
+* 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 PUSHSERVERCONNPLUGINMANAGER_H
+#define PUSHSERVERCONNPLUGINMANAGER_H
+
+#include <memory>
+#include <list>
+#include <map>
+#include <string>
+#include <exception>
+
+#include "dynamiclibloader.h"
+#include "scopedlocks.h"
+#include "serverconnectionfactory.h"
+#include "serverconnection.h"
+#include "connectionlistener.h"
+#include "pushregdata.h"
+
+
+namespace java
+{
+namespace push
+{
+
+class PushControllerErrorHandlerInterface
+{
+public:
+
+ virtual ~PushControllerErrorHandlerInterface() {}
+
+ /**
+ * This operation sends IPC_PR_ALL_CONNS_FAILED msg
+ * to PushRegistryPlugin.
+ * @throws This operation does not throw exceptions.
+ */
+ virtual void sendAllConnsFailedMsg() = 0;
+
+ /**
+ * This operation informs Runtime to close itself.
+ * @throws This operation does not throw exceptions.
+ */
+ virtual void closeRuntime() = 0;
+
+};
+
+class ConnManagedInterface
+{
+public:
+
+ virtual ~ConnManagedInterface() {}
+
+ /**
+ * This method sends IPC_PR_CONN_COMPLETED comms message to PushRegistryPlugin
+ * when push connection, registered/unregistered by other MIDlet, has been completed.
+ * @param aUri URI of the managed connection.
+ */
+ virtual void connCompleted(const std::wstring& aUri) = 0;
+
+};
+
+/**
+ * This class contains Server Connection Plugin data. Reserved only for internal usage.
+ */
+class ServerConnectionPluginData
+{
+public:
+
+ /**
+ * @param aSrvConnLibAccess This class does not take ownership of this object.
+ */
+ ServerConnectionPluginData(java::util::DynamicLibLoader* aSrvConnLibAccess,
+ java::push::ServerConnectionFactory& aServerConnFactory)
+ : mSrvConnLibAccess(aSrvConnLibAccess),mServerConnFactory(aServerConnFactory)
+ {
+ }
+
+ virtual ~ServerConnectionPluginData()
+ {
+ }
+
+ ServerConnectionPluginData(const ServerConnectionPluginData& x)
+ : mSrvConnLibAccess(x.mSrvConnLibAccess),mServerConnFactory(x.mServerConnFactory)
+ {
+ }
+
+ java::util::DynamicLibLoader* mSrvConnLibAccess;
+ java::push::ServerConnectionFactory& mServerConnFactory;
+
+private:
+ //Not implemented.
+ ServerConnectionPluginData &operator=(const ServerConnectionPluginData&);
+};
+
+/**
+ * This class caches Server Connection Plugins. This class provides functionality to start
+ * listening push connections, register and unregister new dynamic push registrations and
+ * getting information from Server Connections.
+ */
+class PushServerConnPluginManager
+{
+public:
+
+ typedef std::list<PushRegData> UriList_t;
+ typedef std::list<PushRegData>::iterator UriListIter_t;
+
+ /**
+ * @param aListener This class does not take ownership into this argument.
+ * @param aPendingConnListener This class does not take ownership into this argument.
+ */
+ PushServerConnPluginManager(ConnectionListener* aListener,
+ PendingConnectionListener* aPendingConnListener,
+ ConnManagedInterface* aConnManagedInterface);
+
+ virtual ~PushServerConnPluginManager();
+
+ /**
+ * This operation is used to open push connections to listen arriving messages.
+ * This operation loads Server Connection Plugins, creates ServerConnection objects and
+ * calls ServerConnection.open() operation for each URI.
+ * @param aUriList Push connection URIs.
+ * @param aThrowException indicates whether this operation throws an exception
+ * if creation/opening a connection fails.
+ * @throws PushException with following error codes:
+ * INVALID_URI:
+ * Uri passed as argument is not valid.
+ * COMMON_SRV_CONN_PLUGIN_ERROR:
+ * creation of ServerConnection object failed.
+ * INIT_OF_ALL_PUSH_CONNS_FAILED:
+ initialization of all operations fails
+ * LibraryLoaderException with following error codes:
+ * OPENING_LIBRARY_FAILED:
+ * if opening a Server Connection Plugin failed.
+ * E.g. in the situation where certain protocol is not supported.
+ * CANNOT_FIND_FUNCTION_FAILURE:
+ * if function function by "getServerConnectionFactory" name is not found
+ * from ServerConnection Plugin.
+ */
+ void startListen(UriList_t& aUriList,bool aThrowException,bool aCallConnectionHandled);
+
+ /**
+ * This operation is used to update push connnections. This operation creates and
+ * opens new push connections or closes and deletes/sets to "non-push" existing push connections.
+ * @param aUriList Push connection URIs.
+ * @param aErrorHandler error handler object.
+ * @throws If error occurs in the update this operation send same exceptions as
+ * startListen(UriList_t& aUriList) operation.
+ * In the unregistering case this operation does not throw exceptions.
+ */
+ void updatePushRegs(UriList_t& aUriList,PushControllerErrorHandlerInterface& aErrorHandler);
+
+ /**
+ * This operation populates aUriList output argument with active or all push
+ * connection URIs of the MIDlet depending value of the aAvailable argument.
+ * @param aAvailable 'true' means that only active push connections are returned.
+ * Active push connection means connection where msg has been arrived.
+ * 'false' means that all push connections of the MIDlet is returned.
+ * @param aUriList Output argument. Push connection URIs are populated into this list.
+ * @throws This operation does not throw exceptions.
+ */
+ void listConnections(bool aAvailable,std::list<std::wstring>& aUriList);
+
+ /**
+ * This operation returns push ServerConnection object.
+ * @throws PushException with following error codes:
+ * SRV_CONN_NOT_FOUND:
+ * ServerConnectionFactory object by URI is not found or if ServerConnection
+ * by URI is not found.
+ * INVALID_URI:
+ * Scheme cannot be resolved from the URI.
+ */
+ ServerConnection& getPushConnection(const std::wstring& aUri);
+
+ /**
+ * Changed dynamic push registration to normal ServerConnection in the Server Connection Plugin.
+ * This operation does not do anything if ServerConnection by URI is not found.
+ * @throws PushException with following error codes:
+ * INVALID_URI:
+ * Scheme cannot be resolved from the URI.
+ */
+ void unregisterDynamicPushConn(const std::wstring& aUri);
+
+ /**
+ * Push ServerConnection can be set to failed by this operation in the case where
+ * ServerConnection calls error() operation.
+ * @param aUri Push connection URI.
+ * @return int Returns number of successful push ServerConnections.
+ */
+ int setConnFailed(const std::wstring& aUri);
+
+ /**
+ * Deletes ServerConnection from the ServerConnectionFactory.
+ * This can be used e.g. in the error situation to remove already created
+ * ServerConnection objects.
+ * @param aUri Push connection URI.
+ * @throws This operation does not thrown exception.
+ */
+ void deletePushServerConn(const std::wstring& aUri);
+
+ /**
+ * This operation checks that connection is not accepted by an another
+ * application. This operation must be called when push connection is registered
+ * dynamically to other MIDlet in the suite.
+ * @param aUri Push connection URI.
+ * @return true if URI is valid and push connection can be registered.
+ * @throws This operation does not throw exceptions.
+ */
+ bool isValidPushUri(const std::wstring& aUri);
+
+private:
+
+ //Datamembers.
+ typedef std::map<std::wstring,ServerConnectionPluginData> SrvConnContainer_t;
+ typedef std::map<std::wstring,ServerConnectionPluginData>::iterator SrvConnContainerIter_t;
+ SrvConnContainer_t mSrvConnContainer;
+
+ typedef std::map<std::wstring,bool> SuccessPushConnList_t;
+ typedef std::map<std::wstring,bool>::iterator SuccessPushConnListIter_t;
+ SuccessPushConnList_t mSuccessPushConnList;
+
+ //This class does not take ownershhip of the object.
+ ConnectionListener* mConnListener;
+ java::util::ScopedMutex mMutex;
+ //This class does not take ownershhip of the object.
+ PendingConnectionListener* mPendingConnListener;
+ //This class does not take ownershhip of the object.
+ ConnManagedInterface* mConnManagedInterface;
+
+ //Internal operations.
+ ServerConnectionFactory* getDllFromContainer(const std::wstring& aScheme);
+ ServerConnectionFactory& loadAndStoreDll(const std::wstring& aUri,
+ std::wstring& aOutScheme);
+ void createAndOpenConn(const PushRegData& aData,const std::wstring& aScheme);
+ std::wstring resolveScheme(const std::wstring& aUri) const;
+ std::string resolveDllName(const std::wstring& aScheme) const;
+ int getNumOfSuccessfulPushConns();
+ void findAndDeleteUnregPushConns(std::list<std::wstring>& aExistingUriList,
+ UriList_t& aNewUriListFromStorage,
+ PushControllerErrorHandlerInterface& aErrorHandler);
+ void findAndAddNewPushConns(std::list<std::wstring>& aExistingUriList,
+ UriList_t& aNewUriListFromStorage);
+
+ //Not implemented.
+ PushServerConnPluginManager(const PushServerConnPluginManager &x);
+ PushServerConnPluginManager &operator=(const PushServerConnPluginManager &x);
+
+};
+
+}//end namespace push
+}//end namespace java
+
+#endif // PUSHSERVERCONNPLUGINMANAGER_H