--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/commsfwtools/preparedefaultcommsdatabase/src/CommsDatNotifier.cpp Thu Dec 17 09:22:25 2009 +0200
@@ -0,0 +1,405 @@
+// Copyright (c) 2004-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:
+// Meta-database declarations
+//
+//
+
+/**
+ @file
+*/
+
+#include "CommsDatInternalDefs.h"
+#include "CommsDatTypeInfoV1_1.h"
+#include "NotifierServ.H"
+#include <cdbcols.h>
+#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS
+#include <commsdat_partner.h>
+#endif
+using namespace CommsDat;
+
+CCDNotifier::CCDNotifier(CMDBSessionImpl& aOwner)
+ : iSuppressRollBackEvents(EFalse), iOwner(aOwner)
+ {
+ }
+
+
+CCDNotifier::~CCDNotifier()
+ {
+ CancelAllNotifications();
+
+ iNotifications.Close();
+ }
+
+
+CCDNotifier* CCDNotifier::NewL(CMDBSessionImpl& aOwner)
+ {
+ CCDNotifier* r=new(ELeave) CCDNotifier(aOwner);
+ CleanupStack::PushL(r);
+ r->ConstructL();
+ CleanupStack::Pop();
+ return r;
+ }
+
+void CCDNotifier::ConstructL()
+ {
+ }
+
+
+TInt CCDNotifier::RegisterNotifyL(TRequestStatus& aStatus)
+/**
+@internalTechnology
+*/
+ {
+ TInt ret(KErrNone);
+ if(!iNotifier.Handle())
+ {
+ ret = iNotifier.Connect(); //Also starts the server if not running allready
+ }
+
+ if(ret == KErrNone)
+ {
+ iNotifier.RequestNotification(aStatus);
+ }
+
+ return ret;
+ }
+
+
+
+TInt CCDNotifier::CancelAllNotifications()
+/**
+@internalComponent
+*/
+ {
+ if(iNotifier.Handle())
+ {
+ iNotifier.CancelAllNotifications();
+ iNotifier.Close();
+ }
+
+ return KErrNone;
+ }
+
+
+
+TInt CCDNotifier::CancelNotify(TRequestStatus& aStatus)
+/**
+This function will cancel individual requests if given a particular TRequestStatus
+
+@internalComponent
+*/
+ {
+ if(iNotifier.Handle())
+ {
+ iNotifier.CancelNotification(aStatus);
+ return KErrNone;
+ }
+
+ return KErrNotFound;
+ }
+
+
+TInt CCDNotifier::NotifyClients(TInt aEventType)
+/**
+@internalTechnology
+*/
+ {
+ // Discreetly drop the signalling of this event if our process lacks the necessary capabilities.
+ //
+ // For an EClose event, this means that readers finishing a session won't signal the fact that
+ // they've closed a session. However, since they don't signal the fact that they've opened a
+ // session either, that's not such a concern.
+ //
+ // For all other events, the client requires the same capability to Set the property as they
+ // do for the associated CommsDat operation that it is signalling, so we presume that if they've
+ // got this far, they have the necessary capabilities.
+ //
+ if (!RProcess().HasCapability(KCommsDatNotificationSetCapability, KSuppressPlatSecDiagnostic))
+ {
+ return KErrNone;
+ }
+
+ return RProperty::Set(KUidSystemCategory, KUidCommDbNotificationEvent.iUid, aEventType);
+ }
+
+
+//
+// for Publish and Subscribe notifications
+
+
+void CCDNotifier::NotifyAllChanges()
+/*
+Does the notification for all the changes that are stored in the member variable iNotifications.
+
+@internalComponent
+*/
+ {
+ TInt result(KErrNone);
+ // we attempt all notifications regardless of the failure of individual ones since
+ // different clients will be waiting on different notifications
+ for (TInt i=0; i < iNotifications.Count(); ++i)
+ {
+ //nithin: iValue maybe redundant...could be removed
+ result = RProperty::Set(KUidSystemCategory, iNotifications[i].iUid.iUid, iNotifications[i].iValue);
+ if ( result != KErrNone)
+ {
+ // Log error but nothing to do
+ }
+ }
+ iNotifications.Reset();
+ }
+
+void CCDNotifier::ClearPubSubNotifications()
+/*
+Does the notification for all the changes that are stored in the member variable iNotifications.
+
+@internalComponent
+*/
+ {
+ iNotifications.Close();
+ }
+
+/*
+Does the notification for all the changes that are stored in the member variable iNotifications.
+
+@internalComponent
+*/
+void CCDNotifier::MaybeNotifyChange(TMDBElementId aElementId)
+ {
+ TCommsDatPubSubNotification notification;
+ ConvertToUid(aElementId, notification);
+ if (notification.iUid != KNullUid)
+ {
+ iNotifications.Append(notification); // nothing to do if fails
+ }
+ }
+
+/*
+Does the notification for delete operations and stores in member variable iNotifications.
+
+@internalComponent
+*/
+void CCDNotifier::MaybeNotifyChangeForDelete(TMDBElementId aElementId, TBool aModemBearerDeleted)
+ {
+ MaybeNotifyChange(aElementId);
+
+ if (aModemBearerDeleted)
+ {
+ // there are three special notification when the modem bearer table is deleted
+
+ TCommsDatPubSubNotification notification;
+
+ // TSY name change notification
+ const TUint32 rand1 = GetNewNumber(KUidCommDbModemTsyNameChange);
+ notification.Set(KUidCommDbModemTsyNameChange, rand1);
+ iNotifications.Append(notification);
+
+ // Data and fax change notification
+ const TUint32 rand2 = GetNewNumber(KUidCommDbModemDataAndFaxChange);
+ notification.Set(KUidCommDbModemDataAndFaxChange, rand2);
+ iNotifications.Append(notification);
+
+ // Phone services and SMS change notification
+ const TUint32 rand3 = GetNewNumber(KUidCommDbModemPhoneServicesAndSMSChange);
+ notification.Set(KUidCommDbModemPhoneServicesAndSMSChange, rand3);
+ iNotifications.Append(notification);
+ }
+ }
+
+void CCDNotifier::ConvertToUid(TMDBElementId aId, TCommsDatPubSubNotification& aNotification)
+
+//Checks for the type of the setting passed and sets the value in the Commdb publish subscribe notification appropriately.
+
+//@param aSetting Setting to get
+//@param aVal Setting value.
+//@param aNotification A reference to TCommDbPublishSubscribeNotification
+ {
+
+ if( (aId & KCDMaskShowRecordType) == KCDTIdDefaultWCDMARecord)
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbGPRSDefaultParamsChange);
+ aNotification.Set(KUidCommDbGPRSDefaultParamsChange, rand);
+ }
+ else if((aId & KCDMaskShowRecordType) == KCDTIdModemBearerRecord)
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbModemRecordChange);
+ aNotification.Set(KUidCommDbModemRecordChange, rand);
+
+ if((aId & KCDMaskShowType) == KCDTIdTsyName)
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbModemTsyNameChange);
+ aNotification.Set(KUidCommDbModemTsyNameChange, rand);
+ }
+ }
+ else if((aId & KCDMaskShowRecordType) == KCDTIdProxiesRecord)
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbProxiesRecordChange);
+ aNotification.Set(KUidCommDbProxiesRecordChange, rand);
+ }
+ else if((aId & KCDMaskShowRecordType) == KCDTIdGlobalSettingsRecord)
+ {
+ switch(aId & KCDMaskShowType)
+ {
+ case KCDTIdSMSBearer : // global settings field
+ {
+ aNotification.Set(KUidCommDbSMSBearerChange, 1);
+ break;
+ }
+ case KCDTIdSMSReceiveMode : // global settings field
+ {
+ aNotification.Set(KUidCommDbSMSReceiveModeChange, 1);
+ break;
+ }
+ case KCDTIdGPRSAttachMode : // global settings field
+ {
+ aNotification.Set(KUidCommDbGPRSAttachModeChange, 1);
+ break;
+ }
+ case KCDTIdModemDataFax : // Global setting field
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbModemDataAndFaxChange);
+ aNotification.Set(KUidCommDbModemDataAndFaxChange, rand);
+ break;
+ }
+ case KCDTIdModemPhoneServicesSMS : // Global setting field
+ {
+ const TUint32 rand = GetNewNumber(KUidCommDbModemPhoneServicesAndSMSChange);
+ aNotification.Set(KUidCommDbModemPhoneServicesAndSMSChange, rand);
+ break;
+ }
+ };
+ }
+
+ // else not an error since we dont want to notify
+ }
+
+
+TUint32 CCDNotifier::GetNewNumber(TUid aUid)
+//Generates a new number for the given UID
+
+//@param aUid UID for which the new number is to be generated
+//@return The new number generated
+
+ {
+ TInt value;
+ TInt result = RProperty::Get(KUidSystemCategory, aUid.iUid, value);
+ return ++value; //don't worry about overflow - it doesn't matter
+ }
+
+
+
+//
+
+
+TCommsDatPubSubNotification::TCommsDatPubSubNotification()
+ : iUid(KNullUid), iValue(0)
+ {
+ }
+
+
+void TCommsDatPubSubNotification::Set(TUid aUid,TInt aVal)
+//Sets the given values of aUid and aVal to the members iUid and aVal.
+
+//@param aUid UID to be set
+//@param aVal Value to be set
+ {
+ iUid=aUid;
+ iValue=aVal;
+ }
+
+//
+
+
+RCommsdatNotifier::RCommsdatNotifier()
+ /** Constructor. */
+ {}
+
+
+TInt RCommsdatNotifier::StartNotifierProcess()
+ {
+ RProcess server;
+
+ TInt ret=server.Create(KCommsdatNotifierExecutable, KNullDesC);
+
+ if (ret!=KErrNone)
+ {
+ return ret;
+ }
+ TRequestStatus stat;
+ server.Rendezvous(stat);
+ server.Resume();
+ server.Close();
+ User::WaitForRequest(stat);
+ return stat.Int();
+ }
+
+TInt RCommsdatNotifier::Connect()
+ /** Connects to the server.
+ *
+ *
+ * @return KErrNone if successful; otherwise, a system-wide error code. */
+ {
+ TInt ret = CreateSession(COMMSDATNOTIFIER_SERVER_NAME,Version(),-1);
+
+ if (ret!=KErrNone)
+ {
+ ret=StartNotifierProcess();
+ if (ret==KErrNone || ret==KErrAlreadyExists)
+ {
+ ret = CreateSession(COMMSDATNOTIFIER_SERVER_NAME,Version(),-1);
+ }
+ }
+
+ if (ret==KErrNone)
+ {
+ ret = ShareProtected();
+ }
+
+ return ret;
+ }
+
+TVersion RCommsdatNotifier::Version() const
+ /** Gets the client side version number.
+ *
+ * @return The client version number. */
+ {
+ return(TVersion(KCommsdatNotifierMajorVersionNumber,KCommsdatNotifierMinorVersionNumber,KCommsdatNotifierSpecialBuildVersionNumber));
+ }
+
+void RCommsdatNotifier::RequestNotification(TRequestStatus& aStatus)
+ {
+ SendReceive(ERequestNotify, TIpcArgs(),aStatus);
+ }
+
+void RCommsdatNotifier::CancelNotification(TRequestStatus& aStatus)
+/**
+Cancel a previously registered notification.
+
+@param aStatus the TRequestStatus of the notification. This will be completed with KErrCancel.
+*/
+ {
+ SendReceive(ECancelNotify, TIpcArgs(&aStatus));
+ }
+
+void RCommsdatNotifier::CancelAllNotifications()
+ {
+ SendReceive(ECancelAllNotify, TIpcArgs());
+ }
+
+void RCommsdatNotifier::Close()
+ {
+ RHandleBase::Close();
+ }
+
+// EOF