diff -r 000000000000 -r e686773b3f54 pimprotocols/pbap/pbaplogeng/pbaplogeng.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pimprotocols/pbap/pbaplogeng/pbaplogeng.cpp Tue Feb 02 10:12:17 2010 +0200 @@ -0,0 +1,254 @@ +// Copyright (c) 2006-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: +// + +#include "pbaplogeng.h" + +#include "btaccesshostlog.h" + +// +// CPbapLogWrapper +// + +/*static*/ EXPORT_C CPbapLogWrapper* CPbapLogWrapper::NewL(RFs& aFs) + { + LOG_STATIC_FUNC + CPbapLogWrapper* self = new(ELeave) CPbapLogWrapper; + CleanupStack::PushL(self); + self->ConstructL(aFs); + CleanupStack::Pop(self); + return self; + } + +CPbapLogWrapper::CPbapLogWrapper() + { + LOG_FUNC + } + +void CPbapLogWrapper::ConstructL(RFs& aFs) + { + LOG_FUNC + + // create the CLogWrapper to forward requests to. + iLogWrapper = CLogWrapper::NewL(aFs); + + if (iLogWrapper->ClientAvailable()) + { + iLogClient = static_cast(&iLogWrapper->Log()); + } + else + { + // if no client is available then we have no access to the call history + // information. The PBAP server will continue anyway but only giving + // access to the contact information. + User::Leave(KErrNotSupported); + } + } + +EXPORT_C CPbapLogWrapper::~CPbapLogWrapper() + { + LOG_FUNC + + iPbapObservers.Close(); + + delete iLogWrapper; + } + +EXPORT_C TBool CPbapLogWrapper::ClientAvailable() const + { + LOG_FUNC + return iLogWrapper->ClientAvailable(); + } + +EXPORT_C TInt CPbapLogWrapper::GetString(TDes &aString, TInt aId) const + { + LOG_FUNC + return iLogClient->GetString(aString, aId); + } + +CLogClient& CPbapLogWrapper::LogClient() + { + LOG_FUNC + return *iLogClient; + } + +TInt CPbapLogWrapper::AddPbapObserver(MPbapLogEngViewObserver& aObserver) + { + LOG_FUNC + TInt rerr = iPbapObservers.Append(&aObserver); + + if ((iPbapObservers.Count() == 1) && (rerr == KErrNone)) + { + // first observer was just successfully added, register for global events + TRAP(rerr, iLogClient->SetGlobalChangeObserverL(this)); + } + + return rerr; + } + +void CPbapLogWrapper::RemovePbapObserver(MPbapLogEngViewObserver& aObserver) + { + LOG_FUNC + + for (TInt i = iPbapObservers.Count() - 1; i >= 0; i--) + { + if (iPbapObservers[i] == &aObserver) + { + iPbapObservers.Remove(i); // don't delete - it's not ours! + } + } + + if (iPbapObservers.Count() == 0) + { + // no more observers, deregister for global events + TRAP_IGNORE(iLogClient->SetGlobalChangeObserverL(NULL)); + } + } + +// from MLogClientChangeObserver +void CPbapLogWrapper::HandleLogClientChangeEventL(TUid aChangeType, TInt aParam1, TInt aParam2, TInt aParam3) + { + LOG_FUNC + + // Notify all of the PBAP Observers and turn the LogEng Global events into PBAP view events + for (TInt i = iPbapObservers.Count() - 1; i >= 0; i--) + { + iPbapObservers[i]->PbapLogEngViewChangeEventL(aChangeType, aParam1, aParam2, aParam3); + } + } + +// +// CPbapLogViewEvent +// + +/*static*/ EXPORT_C CPbapLogViewEvent* CPbapLogViewEvent::NewL(CPbapLogWrapper& aLogWrap) + { + LOG_STATIC_FUNC + CPbapLogViewEvent* self = new(ELeave) CPbapLogViewEvent(aLogWrap); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +/*static*/ EXPORT_C CPbapLogViewEvent* CPbapLogViewEvent::NewL(CPbapLogWrapper& aLogWrap, MPbapLogEngViewObserver& aObserver) + { + LOG_STATIC_FUNC + CPbapLogViewEvent* self = new(ELeave) CPbapLogViewEvent(aLogWrap); + CleanupStack::PushL(self); + self->ConstructL(&aObserver); + CleanupStack::Pop(self); + return self; + } + +CPbapLogViewEvent::CPbapLogViewEvent(CPbapLogWrapper& aLogWrap) : iWrapper(aLogWrap) + { + LOG_FUNC + } + +void CPbapLogViewEvent::ConstructL(MPbapLogEngViewObserver* aObserver) + { + LOG_FUNC + + // create the CLogViewEvent to forward requests to. + if (aObserver != NULL) + { + // store the observer and add it receive global logeng events + User::LeaveIfError(iWrapper.AddPbapObserver(*aObserver)); + iPbapObserver = aObserver; + + iViewEvent = CLogViewEvent::NewL(iWrapper.LogClient(), *this); + } + else + { + iViewEvent = CLogViewEvent::NewL(iWrapper.LogClient()); + } + } + +EXPORT_C CPbapLogViewEvent::~CPbapLogViewEvent() + { + LOG_FUNC + + if (iPbapObserver) + { + // remove observer from receiving global events + iWrapper.RemovePbapObserver(*iPbapObserver); + } + + delete iViewEvent; + } + +EXPORT_C TBool CPbapLogViewEvent::SetFilterL(const CLogFilterList& aFilterList, TRequestStatus& aStatus) + { + LOG_FUNC + return iViewEvent->SetFilterL(aFilterList, aStatus); + } + +EXPORT_C TBool CPbapLogViewEvent::SetFilterL(const CLogFilter& aFilter, TRequestStatus& aStatus) + { + LOG_FUNC + return iViewEvent->SetFilterL(aFilter, aStatus); + } + +EXPORT_C const CLogEvent& CPbapLogViewEvent::Event() const + { + LOG_FUNC + return iViewEvent->Event(); + } + +EXPORT_C TBool CPbapLogViewEvent::FirstL(TRequestStatus& aStatus) + { + LOG_FUNC + return iViewEvent->FirstL(aStatus); + } + +EXPORT_C TBool CPbapLogViewEvent::NextL(TRequestStatus& aStatus) + { + LOG_FUNC + return iViewEvent->NextL(aStatus); + } + +EXPORT_C TInt CPbapLogViewEvent::CountL() + { + LOG_FUNC + return iViewEvent->CountL(); + } + +EXPORT_C void CPbapLogViewEvent::Cancel() + { + LOG_FUNC + iViewEvent->Cancel(); + } + +// from MLogViewChangeObserver, pass all events to the PBAP view event observer +void CPbapLogViewEvent::HandleLogViewChangeEventAddedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount) + { + LOG_FUNC + + iPbapObserver->PbapLogEngViewChangeEventAddedL(aId, aViewIndex, aChangeIndex, aTotalChangeCount); + } + +void CPbapLogViewEvent::HandleLogViewChangeEventChangedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount) + { + LOG_FUNC + + iPbapObserver->PbapLogEngViewChangeEventChangedL(aId, aViewIndex, aChangeIndex, aTotalChangeCount); + } + +void CPbapLogViewEvent::HandleLogViewChangeEventDeletedL(TLogId aId, TInt aViewIndex, TInt aChangeIndex, TInt aTotalChangeCount) + { + LOG_FUNC + + iPbapObserver->PbapLogEngViewChangeEventDeletedL(aId, aViewIndex, aChangeIndex, aTotalChangeCount); + }