--- /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 <AknNotifierWrapperDefs.h>
+#include "AknNotifierAppServer.h"
+#include "AknNotifierAppServerSession.h"
+#include "AknNotiferAppServerApplication.h"
+
+typedef CArrayPtr<MEikSrvNotifierBase2>* (*CreateEikSrvNotifierBase)();
+
+class CNotifierNames: public CBase
+ {
+public:
+ ~CNotifierNames()
+ {
+ for (TInt i = 0; i < iNotifierNames.Count(); i++)
+ {
+ delete (iNotifierNames[i]);
+ }
+
+ iNotifierNames.Close();
+ }
+
+ MNotifLibraryOwningServer* iFinder;
+ RPointerArray<HBufC> 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<MEikSrvNotifierBase2>* const array =
+ reinterpret_cast<CArrayPtr<MEikSrvNotifierBase2>*>(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<MEikSrvNotifierBase2>* 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<MEikSrvNotifierBase2>* 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<MEikSrvNotifierBase2>* array =
+ reinterpret_cast<CArrayPtr<MEikSrvNotifierBase2>*>((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