/*
* 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 SERVERCONNECTIONBASE_H
#define SERVERCONNECTIONBASE_H

#include "serverconnection.h"
#include "javasmsattributes.h"


namespace java
{
namespace wma
{
/**
 *  ServerConnectionBase abstract class extends interface  ServerConnection.
 *  It defines the interfaces that are to be implemented by the corresponding
 *  protocol ServerConnection class.
 *
 *  @smsserverconnection.dll
 *  @
 */

class ServerConnectionBase: public java::push::ServerConnection
{

public:
    /**
     * factory method to create the server connection
     * @param[in] aUri - uri on which the server connection to be opened
     * @param[in] aFilter - filter to allow messages to be received from
     * desired sender.
     * @return ServerConnection
     */
    static ServerConnection* getServerConnection(const std::wstring& aUri,
            const std::wstring& aFilter);

    virtual ~ServerConnectionBase()
    {

    }
    /**
     * Opens the connection. It registers the server URI to the messaging system
     *  for receiving messages.
     * Throws COMMON_SRV_CONN_PLUGIN_ERROR exception if there is an error while
     * registering the connection.
     * @param[in] aListener: Listener to be notified when message arrives.
     * @param[in] aAppLaunched : bool to notify listening by midlet or push.
     */
    OS_IMPORT virtual void open(java::push::ConnectionListener* aListener,
                                bool aAppLaunched) =0;
    /**
     * from ServerConnection
     * Return the push register URI
     * @return uri as std::wstring
     */
    OS_IMPORT virtual std::wstring getUri() const;
    /**
     * from ServerConnection
     * Sets the Filter
     * @param aFilter - filter which defines the acceptable messages
     * @return
     */
    OS_IMPORT virtual void setFilter(const std::wstring& aFilter);
    /**
     * from ServerConnection
     * Return the filter string
     * @return std::wstring
     */
    OS_IMPORT virtual std::wstring getFilter() const;
    /**
     * Return the number of messages that have arrived and to be read by the
     * application.
     * @return int - number of messages that needs to be read by application
     */
    OS_IMPORT int getMessagesOnStore() const;
    /**
     * retrieves the received message
     * @param[out] aSmsBuf:the message buffer into which the received message is
     * written into.
     * @return SUCCESS or FAILURE status
     */
    virtual int retrieveMessage(TJavaMessageParametersBuf& aSmsBuf)=0;
protected:
    //Constructor
    ServerConnectionBase(const std::wstring& aUri, const std::wstring& aFilter);
    /**
     * Deletes a message on store.
     */
    void deleteMessage();

    /**
     * Creates a Message store , to save incoming messages
     * so that the application can read the message from the store.
     * @param path:the message store path
     * @returns SUCCESS or FAILURE
     */
    int createMessageStore(std::wstring aPath);

    /**
     * Removes the directory specified.
     * @param dirPath: the directory that has to be removed
     * @returns SUCCESS or FAILURE
     */
    int removeDir(const std::wstring aDirPath);
    /**
     * Creates the specified directory if it doesn't exists .
     * @param dirPath the directory path
     * @returns SUCCESS or FAILURE
     */
    int makeDirAll(const std::wstring aDirPath);

protected:
    // Flag to indicate whether the server connection is opened by push or by
    // application;
    bool mIsAppLaunched;
    // Flag to indicate whether listening or not
    bool mIsListening;
    //port on which the push connection is opened
    int mPort;
    // Uri of the push connection
    std::wstring mUri;
    //Filter
    std::wstring mFilter;
    //the number of messages in store
    int mMessagesOnStore;
    //next message to be stored
    int mNextMessageInStore;
    //first message in store
    int mFirstMessageInStore;
    //message store
    std::wstring mMessageStoreDirName;
};

}// end of namespace wma
}// end of namespace java
#endif // SERVERCONNECTIONBASE_H

