diff -r 000000000000 -r 2f259fa3e83a uifw/AknGlobalUI/NotifierWrapper/src/AknNotifierAppServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/uifw/AknGlobalUI/NotifierWrapper/src/AknNotifierAppServer.cpp Tue Feb 02 01:00:49 2010 +0200 @@ -0,0 +1,238 @@ +/* +* Copyright (c) 2004-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: Notifier app server implementation. +* +*/ + +#include +#include "AknNotifierAppServer.h" +#include "AknNotifierAppServerSession.h" +#include "AknNotiferAppServerApplication.h" + +typedef CArrayPtr* (*CreateEikSrvNotifierBase)(); + +class CNotifierNames: public CBase + { +public: + ~CNotifierNames() + { + for (TInt i = 0; i < iNotifierNames.Count(); i++) + { + delete (iNotifierNames[i]); + } + + iNotifierNames.Close(); + } + + MNotifLibraryOwningServer* iFinder; + RPointerArray iNotifierNames; + }; + + +EXPORT_C CAknNotifierAppServer::CAknNotifierAppServer() + { + } + +EXPORT_C CAknNotifierAppServer::~CAknNotifierAppServer() + { + TInt i; + + delete iNotifierNames; + + for (i = 0; i < iNotifierArray.Count(); i++) + { + iNotifierArray[i]->Release(); + } + + iNotifierArray.Close(); + + for (i = 0; i < iLibraries.Count(); i++) + { + iLibraries[i].Close(); + } + + iLibraries.Close(); + } + + +EXPORT_C void CAknNotifierAppServer::StartNotifierL(TUid aNotifierUid, const TDesC8& aBuffer, + TDes8& aResponse) + { + MEikSrvNotifierBase2* impl = FindImplementation(aNotifierUid); + User::LeaveIfNull(impl); + aResponse.Copy(impl->StartL(aBuffer)); + } + + +EXPORT_C void CAknNotifierAppServer::CancelNotifier(TUid aNotifierUid) + { + MEikSrvNotifierBase2* impl = FindImplementation(aNotifierUid); + if (impl) + { + impl->Cancel(); + } + } + + +EXPORT_C void CAknNotifierAppServer::StartNotifierAndGetResponseL(TUid aNotifierUid, + TDesC8& aBuffer, const RMessagePtr2& aMsg, TInt aReplySlot) + { + MEikSrvNotifierBase2* impl = FindImplementation(aNotifierUid); + User::LeaveIfNull(impl); + impl->StartL(aBuffer,aReplySlot,aMsg); + } + + +EXPORT_C void CAknNotifierAppServer::UpdateNotifierL(TUid aNotifierUid, const TDesC8& aBuffer, + TDes8& aResponse) + { + MEikSrvNotifierBase2* impl = FindImplementation(aNotifierUid); + User::LeaveIfNull(impl); + aResponse.Copy(impl->UpdateL(aBuffer)); + } + +EXPORT_C void CAknNotifierAppServer::UpdateNotifierAndGetResponseL(TUid aNotifierUid, + TDesC8& aBuffer, const RMessagePtr2& aMsg, TInt aReplySlot) + { + MEikSrvNotifierBase2* impl = FindImplementation(aNotifierUid); + User::LeaveIfNull(impl); + impl->UpdateL( aBuffer, aReplySlot, aMsg ); + } + +LOCAL_C void DeleteTempMArray(TAny* aPtr) + { + CArrayPtr* const array = + reinterpret_cast*>(aPtr); + + for (TInt i = array->Count()-1; i >= 0 ; i--) + { + array->At(i)->Release(); // effectively delete + } + + delete array; + } + + +EXPORT_C void CAknNotifierAppServer::LoadNotifiersL() + { + __ASSERT_DEBUG(iNotifierNames && iNotifierNames->iNotifierNames.Count(), User::Invariant()); + + TInt i, j; + CArrayPtr* notArray; + + const TUid KDllUid = {0x10000079}; + + for (i = 0; i < iNotifierNames->iNotifierNames.Count(); i++) + { + notArray = CreateImplementationsL( + *(iNotifierNames->iNotifierNames[i]), + TUidType(KDllUid, KUidNotifierPlugInV2, KNullUid)); + + User::LeaveIfNull(notArray); + CleanupStack::PushL(TCleanupItem(DeleteTempMArray,notArray)); + const TInt count = notArray->Count(); + for (j = count-1; j >= 0 ; j--) + { + notArray->At(j)->RegisterL(); + User::LeaveIfError(iNotifierArray.Append(notArray->At(j))); + + notArray->At(j)=0; + notArray->Delete(j); + } + + CleanupStack::PopAndDestroy(notArray); + } + } + + +EXPORT_C void CAknNotifierAppServer::AppendNotifierLibNameL(const TDesC& aLibraryName) + { + if (!iNotifierNames) + { + iNotifierNames = new (ELeave) CNotifierNames; + } + + HBufC* libName = aLibraryName.AllocLC(); + User::LeaveIfError(iNotifierNames->iNotifierNames.Append(libName)); + CleanupStack::Pop(); + } + + +MEikSrvNotifierBase2* CAknNotifierAppServer::FindImplementation(TUid aUid) const + { + if (iNotifierNames && iNotifierNames->iFinder) + { + return iNotifierNames->iFinder->FindImplementation(aUid); + } + for (TInt i = 0; i < iNotifierArray.Count(); i++) + { + if (iNotifierArray[i]->Info().iUid == aUid) + { + return iNotifierArray[i]; + } + } + + return NULL; + } + + +CArrayPtr* CAknNotifierAppServer::CreateImplementationsL( + const TDesC& aLibName, const TUidType& aUidType) + { + RLibrary lib; + + CleanupClosePushL(lib); + User::LeaveIfError(lib.Load(aLibName,_L("z:\\sys\\bin\\"),aUidType)); + CreateEikSrvNotifierBase libEntry =(CreateEikSrvNotifierBase)(lib.Lookup(1)); + + CArrayPtr* array = + reinterpret_cast*>((libEntry)()); + + iLibraries.AppendL(lib); + CleanupStack::Pop(); // lib + + return array; + } + + +EXPORT_C CApaAppServiceBase* CAknNotifierAppServer::CreateServiceL(TUid aServiceType) const + { + if (aServiceType == KAknNotifierServiceUid) + { + return new (ELeave) CAknNotifierServerAppService(*this); + } + else + { + return CAknAppServer::CreateServiceL(aServiceType); + } + } + +EXPORT_C void CAknNotifierAppServer::SetImplementationFinderL(MNotifLibraryOwningServer* aFinder) + { + if (!iNotifierNames) + { + iNotifierNames = new (ELeave) CNotifierNames; + } + iNotifierNames->iFinder = aFinder; + } + +EXPORT_C void CAknNotifierAppServer::UnbalanceReferenceCountForNotif(TUid aUid, TBool aAddCount) + { + if(iNotifierNames && iNotifierNames->iFinder) + { + iNotifierNames->iFinder->UnbalanceReferenceCount(aUid, aAddCount); + } + } + +// End of file