diff -r 000000000000 -r 5e5d6b214f4f imstatuspaneindicatorplugin/src/imstatuspaneindicatorpluginimplementation.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/imstatuspaneindicatorplugin/src/imstatuspaneindicatorpluginimplementation.cpp Tue Feb 02 10:12:18 2010 +0200 @@ -0,0 +1,253 @@ +/* +* Copyright (c) 2009 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: This class is the plugin implementation +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +// imlauncher +#include + +//sp settings +#include +#include +#include + +#include "imstatuspaneindicator.h" +#include "imstatuspaneindicatorpluginimplementation.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::CIMStatusPaneIndicatorPluginImplementation +// C++ default constructor can NOT contain any code, that +// might leave. +// --------------------------------------------------------------------------- +// +CIMStatusPaneIndicatorPluginImplementation::CIMStatusPaneIndicatorPluginImplementation() +: iCoeEnv( *CCoeEnv::Static() ) + { + } + +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::ConstructL +// Symbian 2nd phase constructor can leave. +// --------------------------------------------------------------------------- +// +void CIMStatusPaneIndicatorPluginImplementation::ConstructL() + { + TFileName resPathWithoutDrive; + resPathWithoutDrive.Zero(); + resPathWithoutDrive.Append( KResourceDir() ); + resPathWithoutDrive.Append( KIndicatorResourceFile() ); + + TFileName path; + Dll::FileName(path); //get the location of the dll + + TDriveName drive( TParsePtrC( path ).Drive( ) ); // solve drive + + // leave to stack, LC method + HBufC* resourceFilePath = HBufC::NewLC( KMaxResourcePathLength ); + TPtr ptr( resourceFilePath->Des() ); + ptr.Append( resPathWithoutDrive ); // without drive + ptr.Insert( 0, drive ); // insert drive + + // NearestLanguageFile takes only TFileName + path.Zero(); + path.Append( *resourceFilePath ); + + if ( path.Length() != 0 ) + { + BaflUtils::NearestLanguageFile( iCoeEnv.FsSession(), path ); + } + + CleanupStack::PopAndDestroy(resourceFilePath); + + iResourceOffset = iCoeEnv.AddResourceFileL(path); + + iPopupTextOne = StringLoader::LoadLC( R_QTN_SERVTAB_UNIPANE_ONENEWMSG ); + CleanupStack::Pop(); + iPopupTextMultiple = StringLoader::LoadLC( R_QTN_SERVTAB_UNIPANE_NEWMSGS ); + CleanupStack::Pop(); + iIMStatusPaneIndicator = CIMStatusPaneIndicator::NewL(); + } + +// ----------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CIMStatusPaneIndicatorPluginImplementation* CIMStatusPaneIndicatorPluginImplementation::NewL() + { + CIMStatusPaneIndicatorPluginImplementation* self = + new( ELeave ) CIMStatusPaneIndicatorPluginImplementation(); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + + +// Destructor +CIMStatusPaneIndicatorPluginImplementation::~CIMStatusPaneIndicatorPluginImplementation() + { + delete iIMStatusPaneIndicator; + iCoeEnv.DeleteResourceFile( iResourceOffset ); + delete iPopupTextMultiple; + delete iPopupTextOne; + iViewServices.Close(); + } + + +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::HandleIndicatorTapL +// --------------------------------------------------------------------------- +// +void CIMStatusPaneIndicatorPluginImplementation::HandleIndicatorTapL( const TInt aUid) + { + if(EAknIndicatorMecoServiceTab == aUid) + { + ShowMessageL(); + } + } + +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::CreatePopupContentMessageL() +// --------------------------------------------------------------------------- +// +HBufC* CIMStatusPaneIndicatorPluginImplementation::CreatePopupContentMessageL() + { + if( !iPopupTextMultiple || !iPopupTextOne ) + { + // do not allocate KNullDesC>AllocL() memory here, as the avakon component + // donot test for the lenght of the text, instead it tests if + // the text is valid or not. + // Load resource strings before calling this method! + return NULL; + } + + HBufC* dynStringBuf = NULL; + if(iIMStatusPaneIndicator) + { + TInt Count = iIMStatusPaneIndicator->MsgCount(); + if( 1 == Count ) + { + dynStringBuf = iPopupTextOne->AllocL(); + } + else if(Count > 1) + { + TInt reqDynLen = iPopupTextMultiple->Length() + + KMaxMessageNumberLength; + dynStringBuf = HBufC::NewL( reqDynLen ); + TPtr dynString = dynStringBuf->Des(); + StringLoader::Format( dynString, + iPopupTextMultiple->Des(), + -1, //No index code in source string + Count ); + } + } + + return dynStringBuf; + } + +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::TextL() +// --------------------------------------------------------------------------- +// +HBufC* CIMStatusPaneIndicatorPluginImplementation::TextL( const TInt aUid, TInt& aTextType ) + { + if(EAknIndicatorMecoServiceTab == aUid) + { + // check the uid, if its only my uid then call the functionality below. + aTextType = CAknIndicatorPlugin::EAknIndicatorPluginLinkText; + return CreatePopupContentMessageL(); + } + return NULL; + } +// --------------------------------------------------------------------------- +// CIMStatusPaneIndicatorPluginImplementation::ShowMessageL() +// --------------------------------------------------------------------------- +// +void CIMStatusPaneIndicatorPluginImplementation::ShowMessageL() + { + if(iIMStatusPaneIndicator) + { + // conversation view should be launched if is 1 message or if more than + // one message, but the sender is same of all the messages. + if(iIMStatusPaneIndicator->MsgCount() >= 1 && iIMStatusPaneIndicator->IsMultipleSenders() == 1 ) + { + TVwsViewId activeViewId; + CCoeEnv::Static()->AppUi()->GetActiveViewId( activeViewId ); + // launch the conversation view + // imlauncher call for luanching the conversationview with seletced user id + IMCVLauncher::LaunchImConversationViewL(activeViewId, iIMStatusPaneIndicator->ServiceId(), iIMStatusPaneIndicator->SenderId()); + } + // servie tab is launched when there are more than one messages received from different + // senders. + else if(iIMStatusPaneIndicator->MsgCount() > 1 ) + { + //launch service tab based on the service id. + TInt serviceviewId = 0 ; + TInt seriveId = iIMStatusPaneIndicator->ServiceId(); + if( seriveId != KErrNotFound) + { + CSPSettings* spSettings = CSPSettings::NewL(); + CleanupStack::PushL(spSettings); + //get the tabview id from settings + CSPProperty* property = CSPProperty::NewLC(); + spSettings->FindPropertyL( seriveId, + EPropertyContactViewId, + *property ); + property->GetValue(serviceviewId); + CleanupStack::PopAndDestroy( property ); + CleanupStack::PopAndDestroy( spSettings ); + } + // Launched from service tab, go back there + TInt err = iViewServices.Open(); + if ( KErrServerTerminated == err || KErrNotFound == err ) + { + iViewServices.Close(); + err = iViewServices.Open(); + } + // this error comes when the phonebook is already open, hence we should directly launch the + // service tab. + if(KErrAlreadyExists != err) + { + User::LeaveIfError( err ); + } + // Activate the service tab in phonebook. + User::LeaveIfError( iViewServices.Activate( + KMECOIMPLEMENTATIONUID, + serviceviewId ) ); + + } + } + } + + + +// End of File