searchfw/plugins/contactsplugin/src/contactssearchplugin.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 10:12:19 +0200
changeset 0 f979ecb2b13e
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2006-2007 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:   Plugin for contactsplugin information search.
*
*/




//SYSTEM INCLUDES
#include <e32cmn.h>
#include <e32def.h>
#include <bautils.h>
#include <f32file.h>
#include <s32mem.h>
#include <data_caging_path_literals.hrh>
#include <utf.h>
#include <barsc.h>
#include <AknsConstants.h>
//#include <CPbk2ViewState.h>
#include <MVPbkContactLink.h>
#include <platform/app/Pbk2UID.h>
#include <viewcli.h>
#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
#include <viewclipartner.h>
#endif
#include <searchcommon.h>
#include <searchcontent.h>
#include <searchiconinfo.h>
#include <searchdocumentid.h>
#include <contactssearchplugin.mbg>
#include <bautils.h>

//USER INCLUDES
#include "contactssearchplugin.h"
#include "contactssearchplugindefines.h"
#include "contactssearchresource.rsg"

//FORWARD DECLARATION
class CVwsSessionWrapper;



// ------------------------------------------------------
// 1st phase constructor
// ------------------------------------------------------
CContactSearchPlugin* CContactSearchPlugin::NewL()
{
	CContactSearchPlugin* self = new ( ELeave ) CContactSearchPlugin();
	
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );

	return self;
}


// ------------------------------------------------------
// Desstructor
// ------------------------------------------------------
CContactSearchPlugin::~CContactSearchPlugin()
    {
       if(iContactsCaption)
           {
           delete iContactsCaption;
           iContactsCaption = NULL;   	
           }
       
       if(iSimCaption)
           {
           delete iSimCaption;
           iSimCaption = NULL;   	
           }
       
       if(iPhoneMemoryCaption)
           {
           delete iPhoneMemoryCaption;
           iPhoneMemoryCaption= NULL;   	
           }
       
       if(iViewSrvSession)
       {
       	delete iViewSrvSession;
       	iViewSrvSession = NULL;
       }
       
    }
    
    

// ------------------------------------------------------
// Creates a content searcher and ownership is transfered 
// to calling function
// ------------------------------------------------------
//
MSearchContentSearcher* CContactSearchPlugin::ContentSearcherL(
  const RArray<TUid>& aContentIdArray, const CSearchCondition& aCondition,
  MSearchPluginObserver& aObserver )
{
		
	 for( TInt j = 0; j < aContentIdArray.Count(); j++ ) 
	{
	    //  create the iImagesSearcher   
	  if( (aContentIdArray[j].iUid == KSearchCClassContactsUid.iUid ))
	  {	
		   iContactsSearcher = NULL;
           iContactsSearcher = CContactsSearcher::NewL( aContentIdArray,
        						aCondition, this->PluginId(),aObserver); 
           return iContactsSearcher;												
      }
	}
	return NULL;
}


// ------------------------------------------------------
// Gets supported contents
// ------------------------------------------------------
//
void CContactSearchPlugin::GetSupportedContentL( 
			RPointerArray<CSearchContent>& aContent ) 
{

    CSearchContent* content = NULL;
	CSearchIconInfo* icon = NULL;
	
	content = CSearchContent::NewL( CSearchContent::ETypeContentClass );
	CleanupStack::PushL( content );

		
	content->SetContentId( KSearchCClassContactsUid );
	content->SetSubContentId(0 );
	content->SetPluginId( this->PluginId() );
	
	
	 
	RFs fsSession;
	_LIT( KContactsMifFileName, "contactssearchplugin.mif" );
    
    TPtrC driveLetter = TParsePtrC( RProcess().FileName() ).Drive();
	TFileName mifFileName( driveLetter );
	mifFileName.Append( KDC_APP_BITMAP_DIR );
	mifFileName.Append( KContactsMifFileName );
	
	icon = CSearchIconInfo::NewL();
	CleanupStack::PushL( icon );
	icon->SetSkinId( KAknsIIDQgnPropFmgrFileApps );
	icon->SetIconFileL( mifFileName );
	
	//Set the correct prop_file_images_sub and mask
	icon->SetIconIndex( EMbmContactssearchpluginQgn_prop_search_contacts );
	icon->SetIconMaskIndex( EMbmContactssearchpluginQgn_prop_search_contacts_mask );
	CleanupStack::Pop( icon );
	content->SetIconInfo( icon );
	


	content->SetCaptionL( *iContactsCaption );
		
    aContent.Append( content );
   
    CleanupStack::Pop( content );
    
    CSearchContent* simContent = NULL;
    simContent = CSearchContent::NewL( CSearchContent::ETypeContentFolder );
    CleanupStack::PushL( simContent );
   
    // Icon for sim contacts
    CSearchIconInfo* simIconInfo = CSearchIconInfo::NewL();
    CleanupStack::PushL( simIconInfo );
    
    if( simIconInfo )
    {
	    simIconInfo->SetIconFileL( mifFileName );
	    simIconInfo->SetIconIndex( EMbmContactssearchpluginQgn_prop_search_contacts );
	    simIconInfo->SetIconMaskIndex( EMbmContactssearchpluginQgn_prop_search_contacts_mask );
	    simIconInfo->SetSkinId( KAknsIIDQgnIndiCdrReminder );
    }
	
    if( simIconInfo && simContent )
    	simContent->SetIconInfo( simIconInfo );
    
    if(simContent && content )
    {    
    	simContent->SetContentId( KSearchCClassContactsUid );
    	simContent->SetSubContentId( KSearchCFolderSIMUid.iUid );
    	simContent->SetPluginId( this->PluginId() );
        // set caption "SIM contacts"
      	simContent->SetCaptionL( *iSimCaption );			
		content->AddChildL( simContent );
    }
    
    CleanupStack::Pop( simIconInfo );
    CleanupStack::Pop( simContent );
    
    CSearchContent* phoneContent = NULL;
    phoneContent = CSearchContent::NewL( CSearchContent::ETypeContentFolder );
    CleanupStack::PushL( phoneContent );
    
    // Icon for Phone contacts
    CSearchIconInfo* phoneIconInfo = CSearchIconInfo::NewL();
    CleanupStack::PushL( phoneIconInfo );
    
    if( phoneIconInfo )
    {
	    phoneIconInfo->SetIconFileL( mifFileName );
	    phoneIconInfo->SetIconIndex( EMbmContactssearchpluginQgn_prop_search_contacts );
	    phoneIconInfo->SetIconMaskIndex( EMbmContactssearchpluginQgn_prop_search_contacts_mask );
	    phoneIconInfo->SetSkinId( KAknsIIDQgnIndiCdrReminder );
    }
	
    if( phoneIconInfo && phoneContent )
    	phoneContent->SetIconInfo( phoneIconInfo );
    
    if(phoneContent && content)
    {    
    	phoneContent->SetContentId( KSearchCClassContactsUid );
    	phoneContent->SetSubContentId( KSearchCFolderPhoneUid.iUid);
    	phoneContent->SetPluginId( this->PluginId() );
    	
        // set caption "Phone contacts"
    	phoneContent->SetCaptionL( *iPhoneMemoryCaption );			
		content->AddChildL( phoneContent );
    }
    
    CleanupStack::Pop( phoneIconInfo );
    CleanupStack::Pop( phoneContent );
    
    
}




// ------------------------------------------------------
// Returns if the given content is supported or not
// ------------------------------------------------------
//
TBool CContactSearchPlugin::IsSupportedContent( TUid aContentId )
{
	if( KSearchCClassContactsUid.iUid == aContentId.iUid 
		|| KSearchCFolderPhoneUid.iUid == aContentId.iUid 
		|| KSearchCFolderSIMUid.iUid == aContentId.iUid ) 
	{
		return ETrue;
	}
	
	return EFalse;
}


// ------------------------------------------------------
// Launches the application corresponding to document id
// ------------------------------------------------------
//
void CContactSearchPlugin::LaunchApplicationL( const TDesC8& aLaunchInfo )
{


 //if(aDocumentId.PluginId() == this->PluginId() )
   {       
   
    //   if( KErrNone == err)
	  {
		// Write parameters in a buffer
		TBuf8<80> param;
		
    //    MVPbkContactLink* launchContact = 
      //     iContactsSearcher->GetContactLinkAtIndexLC(myArrayIndex);
        //if(launchContact) 
        {
		
		RDesWriteStream stream( param );
		stream.PushL();
		stream.WriteInt8L( 1 );                 // opcode Version
		stream.WriteInt8L( 1 );					// opcode EFocusedContact
		HBufC8* buf = HBufC8::NewLC(aLaunchInfo.Length());
		buf->Des().Append(aLaunchInfo);
		
		//HBufC8* buf = launchContact->PackLC();   // pack the contact link
		stream.WriteUint16L( buf->Length() );   // write link length
	    stream.WriteL( *buf ,buf->Length() );
	                // write the actual link buffer
		CleanupStack::PopAndDestroy();         // cleanup buf
		stream.WriteInt32L( 4 );                 // opcode EFocusedFieldIndex
		stream.WriteInt16L( KFocussedFieldIndex ); // field index 3
		stream.CommitL();
		CleanupStack::PopAndDestroy();
		//CleanupStack::PopAndDestroy();         // cleanup stream

		// Make view id with Phonebook's app UID3 and Contact Info View's id
		const TVwsViewId viewId( TUid::Uid(KPbk2UID3), TUid::Uid(4) );

		// Activate the view
		iViewSrvSession->ActivateView( viewId, TUid::Uid( 0x102072a0 ), param );
	    	
        }
        //else
        {
        //	 User::Leave( KErrNotFound );
        }
	  }
    
   	}

}


// ------------------------------------------------------
// Constructor
// ------------------------------------------------------
//
CContactSearchPlugin::CContactSearchPlugin( )
{
	
		
}

    
// ------------------------------------------------------
// 2nd phase constructor
// ------------------------------------------------------
//
void CContactSearchPlugin::ConstructL()
{
	RResourceFile resourceFile;    	
    HBufC* resourceFileName = HBufC::NewL( KMaxFileName );
    TPtr resourceFileNamePtr = resourceFileName->Des();
    
    TPtrC driveLetter = TParsePtrC( RProcess().FileName() ).Drive();
    RFs fsSession;
    User::LeaveIfError( fsSession.Connect() ); 
    //Read resource file
	resourceFileNamePtr.Copy( driveLetter );  
    resourceFileNamePtr.Append( KDC_ECOM_RESOURCE_DIR );
    resourceFileNamePtr.Append( KResoureFileName );
    
    CleanupClosePushL( resourceFile );
    TFileName fileName = resourceFileName->Des();
    BaflUtils::NearestLanguageFile( fsSession,fileName );
    resourceFile.OpenL(fsSession,fileName );
  	resourceFile.ConfirmSignatureL(0);
  	
  	// Fetch the caption "contacts"
  	{
  		
  	
  	HBufC8* readBuffer = resourceFile.AllocReadLC( R_QTN_SEARCH_TYPES_CONTACTS );
	
	const TPtrC16 ptrReadBuffer( ( TText16*) readBuffer->Ptr(),
								( readBuffer->Length()+1 )>>1 );		
								
	iContactsCaption = ptrReadBuffer.AllocL();
	CleanupStack::PopAndDestroy( readBuffer );

    }
	// Fetch the caption "SIM Contacts"
	{
		
	HBufC8* readBuffer = resourceFile.AllocReadLC( R_QTN_SEARCH_SUBFOLDERS_SIM );
	
	const TPtrC16 ptrReadBuffer( ( TText16*) readBuffer->Ptr(),
								( readBuffer->Length()+1 )>>1 );		
								
	iSimCaption = ptrReadBuffer.AllocL();
	CleanupStack::PopAndDestroy( readBuffer );

	}
	//Fetch the caption "Phone contacts"
	{
		
	HBufC8* readBuffer = resourceFile.AllocReadLC( R_QTN_SEARCH_SUBFOLDERS_PHONE );
	
	const TPtrC16 ptrReadBuffer( ( TText16*) readBuffer->Ptr(),
								( readBuffer->Length()+1 )>>1 );		
								
	iPhoneMemoryCaption = ptrReadBuffer.AllocL();
	
	CleanupStack::PopAndDestroy( readBuffer );

	}
	CleanupStack::Pop( );
	resourceFile.Close();
	delete resourceFileName;
	resourceFileName = NULL;
	fsSession.Close();	
	
	//Create the view session
	iViewSrvSession = CVwsSessionWrapper::NewL();
}