presencefwsimpleadpt/inc/simplepluginpublisher.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Mon, 15 Mar 2010 12:42:13 +0200
branchRCL_3
changeset 8 aca99fb8a3dd
parent 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201009 Kit: 201010

/*
* Copyright (c) 2006 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:    Simple Protocol implementation for Presence Framework
*
*/




#ifndef CSIMPLEPLUGINPUBLISHER_H
#define CSIMPLEPLUGINPUBLISHER_H

#include <e32std.h>

#include <ximpbase.h>
#include <protocolpresencepublishing.h>

#include <msimplepublishobserver.h>
#include <msimplewatcherobserver.h>

#include "simpleplugincommon.h"
#include "msimplepluginconnectionobs.h"
#include "msimplepluginsettings.h"

class TXIMPRequestId;
class MXIMPIdentity;
class MXIMPProtocolConnectionHost;

class MPersonPresenceInfo;
class MServicePresenceInfo;
class MDevicePresenceInfo;

class MSimplePublisher;
class MSimpleDocument;
class MSimpleWinfo;
class MSimpleWatcher;
class MSimpleElement;


/**
 * CSimplePluginWatcherInfo
 *
 * watcher info.
 *
 * @lib ?library
 * @since s60 v5.0
 */
NONSHARABLE_CLASS( CSimplePluginWatcherInfo ): public CBase
    {
public:

    /**
     * Constructor.
     * @param aId watcher id
     * @param aSipId watcher SIP identity
     */
    static CSimplePluginWatcherInfo* NewL(
        const TDesC8& aId,
        const TDesC& aSipId );

    virtual ~CSimplePluginWatcherInfo();
            
    /**
     * Destructor
     */
    void Destroy();
    
    /** 
     * Match to given info
     * @param aId watcher id
     * @param aSipId watcher SIP identity     
     * @return ETrue if current entity matches to the parameters
     */
    TBool Match( const TDesC8& aId,
        const TDesC& aSipId ); 
        
    TPtrC SipId();    
    
    inline static TInt LinkOffset(); 
    
private:

    CSimplePluginWatcherInfo( );

    /** 
     * Constructor
     * @param aId watcher id
     * @param aSipId watcher SIP identity     
     */
    void ConstructL( 
        const TDesC8& aId,
        const TDesC& aSipId ); 
   
public: // data        

    TDblQueLink iLink;
    
private: // data
    
    HBufC8* iId;
    HBufC* iSipId;

    };

/**
 * CSimplePluginPublisher
 *
 * publisher.
 *
 * @lib ?library
 * @since s60 v5.0
 */
NONSHARABLE_CLASS( CSimplePluginPublisher ): public CActive,
    public MSimplePublishObserver,
    public MSimpleWatcherObserver,
    public MProtocolPresencePublishing
    {
public:

    /**
     * Current operation
     */
    enum TPluginPublishOperation
        {
        ENoOperation,
        EPublishOwn,
        ESubscribeOwn,
        EUnsubscribeOwn,
        ESubscribeWinfo,
        EUnsubscribeWinfo
        };

    /**
     * Constructor.
     * @param aConnSetts current settings
     * @param aObs callback for complete requests
     * @param aConn Simple Engine connection
     */
    static CSimplePluginPublisher* NewL(
        MSimplePluginSettings& aConnSetts,
        MSimplePluginConnectionObs& aObs,
        MSimpleConnection& aConn );

    virtual ~CSimplePluginPublisher();

    /**
     * WinfoTerminatedL
     *
     * SIMPLE Winfo watcher sunscription is terminated
     * @param aReason reason code
     */
     void WinfoTerminatedL( TInt aReason );

     /**
      * WINFO received from SIMPLE
      * @param aWinfo WINFO
      */
     void WinfoNotificationL( MSimpleWinfo& aWinfo );

private:

    CSimplePluginPublisher(
        MSimplePluginSettings& aConnSetts,    
        MSimplePluginConnectionObs& aObs,
        MSimpleConnection& aConn );

    void ConstructL( );


public:

// from base class MSimplePublishObserver

    /**
     * Defined in a base class
     */
    void PublishReqCompleteL( TInt aOpid, TInt aStatus);

    /**
     * Defined in a base class
     */
    void PublishTerminatedL( TInt aOpid );

// from base class MSimpleWatcherObserver

    /**
     * Defined in a base class
     */
    void WatcherReqCompleteL( TInt aOpId, TInt aStatus );

    /**
     * Defined in a base class
     */
    void WatcherNotificationL( MSimpleDocument& aDocument );

    /**
     * Defined in a base class
     */
    void WatcherListNotificationL( MSimplePresenceList& aList );

    /**
     * Defined in a base class
     */
    void WatcherTerminatedL(
        TInt aOpId, TInt aReason );


// from base class MXIMPBase
public:

    /**
     * Defined in a base class
     */
    TAny* GetInterface(
        TInt32 aInterfaceId,
        TIfGetOps aOps );

    /**
     * Defined in a base class
     */
    const TAny* GetInterface(
        TInt32 aInterfaceId,
        TIfGetOps aOps ) const;

    /**
     * Defined in a base class
     */
    TInt32 GetInterfaceId() const;


// from base class MProtocolPresencePublishing
public:

    /**
     * Defined in a base class
     */
    void DoPublishOwnPresenceL(
        const MPresenceInfo& aOwnPresence,
        TXIMPRequestId aReqId );

    /**
     * Defined in a base class
     */
    void DoSubscribeOwnPresenceL(
        const MPresenceInfoFilter& aPif,
        TXIMPRequestId aReqId );

    /**
     * Defined in a base class
     */
    void DoUpdateOwnPresenceSubscriptionPifL(
        const MPresenceInfoFilter& aPif,
        TXIMPRequestId aReqId );

    /**
     * Defined in a base class
     */
    void DoUnsubscribeOwnPresenceL(
        TXIMPRequestId aReqId );

    /**
     * Defined in a base class
     */
    void DoSubscribePresenceWatcherListL(
        TXIMPRequestId aReqId );

    /**
     * Defined in a base class
     */
    void DoUnsubscribePresenceWatcherListL(
        TXIMPRequestId aReqId );


protected:

// from base class CActive

    /**
     * Defined in a base class
     */
    void RunL();

    /**
     * Defined in a base class
     */
    TInt RunError( TInt aError );

    /**
     * Defined in a base class
     */
    void DoCancel();

private:


    /**
     * Calls MXIMPProtocolConnectionHost callback
     * @param aStatus error status
     */
    void CompletePrFwReq( TInt aStatus );

    /**
     * Initialize a document
     */
    void InitializeSimpleDocumentL( );

    /**
     * Add person information to the document.
     * @param aPersInfo personal information
     */
    void AddSimpleDocumentPersL(
        const MPersonPresenceInfo* aInfo );

    void AddSimpleDocumentServiceL(
        const MServicePresenceInfo& aInfo );

    void AddSimpleDocumentDeviceL(
        const MDevicePresenceInfo& aInfo );

    /**
     * Make a publish request
     */
    void MakePublishReqL();

    /**
     * Start XDM initialization
     */
    void StartXdmOperationL( TXIMPRequestId aReqId );
    
    /**
     * Start XDM initialization. StartXdmOperationL calls this.
     */
    void DoStartXdmOperationL( TXIMPRequestId aReqId );    
    
    /**
     * Delete watcher information
     */
    void DeleteWatchers();  
    
    void AddWatcherIfNotExistsL( const TDesC8& aId, const TDesC& aSipId );
        
    void RemoveWatcherIfExistsL( const TDesC8& aId, const TDesC& aSipId ); 
    
    CDesCArrayFlat* MakeCurrentWatcherListLC();  
    
    
    /**
     * Update private data member of active watchers list
     * @param aElems SIMPLE elements [IN]
     */
    void UpdateActiveWatchersListL( 
        RPointerArray<MSimpleElement>& aElems );     


private: // Data

    /**
     * PrFw Plugin connection observer
     */
    MSimplePluginConnectionObs& iConnObs;
    
    /**
     * Current settings
     */
    MSimplePluginSettings& iConnSets;

    /**
     * SIMPLE engine connection
     */
    MSimpleConnection& iConnection;

    /**
     * SIMPLE engine publisher
     * Own.
     */
    MSimplePublisher* iPublisher;

    /**
     * SIMPLE engine watcher
     * Own.
     */
    MSimpleWatcher* iWatcher;

    /**
     * PrFW request id
     */
    TXIMPRequestId iPrFwId;

    /**
     * Simple Engine request id
     */
    TInt iSimpleId;

    /**
     * Subscribed winfo
     */
    TBool iSubscribed;

    /**
     * Subscribed own data
     */
    TBool iSubscribedOwn;

    /**
     * Published own data
     */
    TBool iPublished;

    /**
     * Current operation
     */
    TPluginPublishOperation iOperation;

    /**
     * Simple publish document
     * Own.
     */
    MSimpleDocument* iDocument;

    /**
     * XDM Utils
     * Not own.
     */
    CSimplePluginXdmUtils* iXdmUtils;
    
    /**
     * WINFO watchers
     * Own.
     */
    TDblQue<CSimplePluginWatcherInfo> iWatcherList;

    };
    
    TInt CSimplePluginWatcherInfo::LinkOffset()
        {
        return _FOFF(CSimplePluginWatcherInfo, iLink);
        }     

#endif // CSimplePluginPublisher_H