diff -r 000000000000 -r a4daefaec16c sipvoipprovider/src/svpsslogcall.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sipvoipprovider/src/svpsslogcall.cpp Mon Jan 18 20:12:36 2010 +0200 @@ -0,0 +1,480 @@ +/* +* Copyright (c) 2002-2004 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: Logs Call details in case of Do Not Disturb +* +*/ + + +// INCLUDE FILES +#include "svpsslogcall.h" +#include "svpconsts.h" +#include "svplogger.h" + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include + +// LOCAL CONSTANTS +_LIT( KLogSubject, "0" ); + +_LIT8( KLogTagVOIP, "VOIP" ); +_LIT8( KLogTagURL, "URL" ); +_LIT8( KLogTagMA, "MA" ); +_LIT8( KLogFieldDelimiter, "\t" ); +_LIT8( KLogValueDelimiter, "=" ); + +const TInt KLogEventTempBufSize = 300; +const TInt KMaxAddressLength = 256; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::SVPSSLogCall +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CSVPSSLogCall::CSVPSSLogCall() : CActive(0) + { + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::ConstructL() + { + SVPDEBUG1("CSVPSSLogCall::ConstructL, Enter"); + User::LeaveIfError( iFs.Connect() ); + + iLogEvent = CLogEvent::NewL(); + iLogClient = CLogClient::NewL( iFs ); + iLogsSession = CRepository::NewL( KCRUidLogs ); + + CActiveScheduler::Add(this); + SVPDEBUG1("CSVPSSLogCall::ConstructL, Exit"); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CSVPSSLogCall* CSVPSSLogCall::NewL() + { + SVPDEBUG1("CSVPSSLogCall::NewL, Enter"); + + CSVPSSLogCall* self = new( ELeave ) CSVPSSLogCall; + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + SVPDEBUG1("CSVPSSLogCall::NewL, Exit"); + return self; + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::~CSVPSSLogCall +// Destructor +// ----------------------------------------------------------------------------- +// +CSVPSSLogCall::~CSVPSSLogCall() + { + SVPDEBUG1("CSVPSSLogCall::~CSVPSSLogCall, Enter"); + + Cancel(); + delete iLogsSession; + delete iLogClient; + delete iLogEvent; + iFs.Close(); + + SVPDEBUG1("CSVPSSLogCall::~CSVPSSLogCall, Exit"); + } + + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::Reset +// REsets iLogEvent +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::Reset() + { + SVPDEBUG1("CSVPSSLogCall::Reset, Enter"); + + iLogEvent->SetId( KLogNullId ); + iLogEvent->SetEventType( KNullUid ); + iLogEvent->SetRemoteParty( KNullDesC ); + iLogEvent->SetDirection( KNullDesC ); + iLogEvent->SetTime( Time::NullTTime() ); + iLogEvent->SetDurationType( KLogNullDurationType ); + iLogEvent->SetDuration( KLogNullDuration ); + iLogEvent->SetStatus( KNullDesC ); + iLogEvent->SetSubject( KNullDesC ); + iLogEvent->SetNumber( KNullDesC ); + iLogEvent->SetContact( KNullContactId ); + iLogEvent->SetLink( KLogNullLink ); + iLogEvent->SetDescription( KNullDesC ); + iLogEvent->SetFlags( KLogNullFlags ); + TRAP_IGNORE( iLogEvent->SetDataL( KNullDesC8 ) ); + + SVPDEBUG1("CSVPSSLogCall::Reset, Exit"); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::FindContactIdL +// Finds contact if from phonebook if one exists +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +HBufC* CSVPSSLogCall::FindContactTitleL( const TDesC& aSipUri ) + { + SVPDEBUG1("CSVPSSLogCall::FindContactTitleL, Enter"); + HBufC* title ( NULL ); + TBool manyCompleteMatches( EFalse ); + TContactItemId compId( NULL ); + + CPbkContactEngine* contacts = CPbkContactEngine::NewL(); + CleanupStack::PushL( contacts ); + + CPbkContactIter* iter = contacts->CreateContactIteratorLC(); + TContactItemId contactId = iter->FirstL(); + + while ( contactId != KNullContactId && !manyCompleteMatches ) + { + //Get contact item + CPbkContactItem* tempContactItem = iter->CurrentL(); + + TInt count = tempContactItem->CardFields().Count(); + SVPDEBUG2(" CSVPSSLogCall::FindContactTitleL count: %d", count ); + + for ( TInt ind = 0; ind < count ; ind++ ) + { + if ( EPbkFieldIdVOIP == + tempContactItem->CardFields()[ind].FieldInfo().FieldId() || + EPbkFieldIdXsp == + tempContactItem->CardFields()[ind].FieldInfo().FieldId() || + tempContactItem->CardFields()[ind].FieldInfo().IsVoipField() ) + { + SVPDEBUG1(" CSVPSSLogCall::FindContactTitleL: Contact is FOUND" ); + + //If contact have phone or Internet number fields, get address.. + TBuf tmpPbookNumber( + tempContactItem->CardFields()[ind].Text() ); + + RemoveUnusedCharsFromSipAddress( tmpPbookNumber ); + + if ( EPbkFieldIdXsp == tempContactItem->CardFields( + )[ind].FieldInfo().FieldId() ) + { + SVPDEBUG1("CSVPSSLogCall::FindContactTitleL, EPbkFieldIdXsp" ); + // remove all characters before ":" only leftmost part + TInt pos = tmpPbookNumber.Find( KSVPCln2 ); + if ( KErrNotFound != pos ) + { + tmpPbookNumber.Delete( KErrNone, pos + 1 ); + } + } + + SVPDEBUG3(" CSVPSSLogCall::FindContactTitleL FoundContactText%d = %S", + ind, &tmpPbookNumber ); + + // Compare complete addresses and set Id if found. + if ( CompareSipUri( aSipUri, tmpPbookNumber ) ) + { + if ( compId ) + { + SVPDEBUG1("CSVPSSLogCall::FindContactTitleL, manyCompleteMatches"); + manyCompleteMatches = ETrue; + } + else + { + iLogEvent->SetContact( contactId ); // Set aItem based on complete match. + title = tempContactItem->GetContactTitleL(); + compId = contactId; + ind = count; + } + } + } + } + contactId = iter->NextL(); + } + + CleanupStack::PopAndDestroy( iter ); + CleanupStack::PopAndDestroy( contacts ); + + SVPDEBUG1("CSVPSSLogCall::FindContactTitleL, Exit"); + return title; + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::HandleCallLoggingL +// Logs Call information +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::HandleCallLoggingL( const TDesC8& aFrom ) + { + SVPDEBUG1("CSVPSSLogCall::HandleCallLoggingL, Enter"); + + Reset(); + + // For recognizing VoIP number and getting + // correct "Options" and internet call icon to log. + TBuf8 tempBufOne; + TBuf8 tempBufTwo; + + tempBufOne.Append( KLogTagVOIP() ); + tempBufOne.Append( KLogFieldDelimiter() ); + tempBufOne.Append( KLogTagURL() ); + tempBufOne.Append( KLogValueDelimiter() ); + + iLogEvent->SetEventType(KLogCallEventTypeUid); + iLogEvent->SetSubject(KLogSubject); + + TLogString missed; + iLogClient->GetString(missed, R_LOG_DIR_MISSED); + iLogEvent->SetDirection(missed); + + iLogEvent->SetDurationType( KLogDurationNone ); + TLogDuration duration = 0; + iLogEvent->SetDuration( duration ); + + iLogEvent->SetNumber( KNullDesC ); + + TLogString number; + CnvUtfConverter::ConvertToUnicodeFromUtf8( number, aFrom ); + RemoveUnusedCharsFromSipAddress( number ); + SVPDEBUG2(" CSVPSSLogCall::HandleCallLoggingL, number = %S", &number ); + + if ( KErrNotFound == aFrom.Find( KSVPAnonymousName8 ) ) + { + SVPDEBUG1(" CSVPSSLogCall::HandleCallLoggingL, URI address is seen" ); + HBufC* contactName = FindContactTitleL( number ); + if ( contactName ) + { // Phonebook contact id has been found + //tempBufTwo.Copy( contactName->Des() ); + tempBufTwo.Copy( number ); + iLogEvent->SetRemoteParty( contactName->Des() ); + } + else + { // No phonebook contact id has been found + tempBufTwo.Copy( number ); + iLogEvent->SetRemoteParty( number ); + } + delete contactName; + tempBufOne.Append( tempBufTwo ); + tempBufTwo.Zero(); + tempBufOne.Append( KLogFieldDelimiter() ); + tempBufOne.Append( KLogTagMA() ); + tempBufOne.Append( KLogValueDelimiter() ); + } + else + { + SVPDEBUG1(" CSVPSSLogCall::HandleCallLoggingL, URI address is Anonymous" ); + iLogEvent->SetRemoteParty( KSVPPrivateNumber ); + } + TRAP_IGNORE( iLogEvent->SetDataL( tempBufOne ) ); + TTime eventTime; + eventTime.UniversalTime(); + iLogEvent->SetTime(eventTime); + iLogClient->AddEvent(*iLogEvent, iStatus); + + SetActive(); + SVPDEBUG1("CSVPSSLogCall::HandleCallLoggingL, Exit"); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::DoCancel +// Called when an aychronic request is cancelled +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::DoCancel() + { + SVPDEBUG1("CSVPSSLogCall::DoCancel"); + iLogClient->Cancel(); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::RunL +// Called when an aychronic request is completed +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::RunL() + { + SVPDEBUG1("CSVPSSLogCall::RunL, Enter"); + // If LogClient AddEvent successful, then show missed call soft notifier + if ( KErrNone == iStatus.Int() ) + { + TInt missedCallCount(0); + TInt err = iLogsSession->Get( KLogsNewMissedCalls, missedCallCount ); + + if( KErrNotFound == err || KErrUnknown == err || missedCallCount < 0 ) + { + missedCallCount = 0; + iLogsSession->Set( KLogsNewMissedCalls, missedCallCount ); + } + else + { + missedCallCount++; + iLogsSession->Set( KLogsNewMissedCalls, missedCallCount ); + } + SVPDEBUG2(" CSVPSSLogCall::RunL, missedCallCount: %d", missedCallCount ); + } + + SVPDEBUG1("CSVPSSLogCall::RunL, Exit"); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::RemoveUnusedCharsFromSipAddress +// Removes unused chars from sip address +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSVPSSLogCall::RemoveUnusedCharsFromSipAddress( TDes& aAddress ) + { + SVPDEBUG1("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: Enter" ); + // Display name, '<' and '>' are not used when comparing addresses. + TInt pos = aAddress.Find( KSVPLeftBracketMark2 ); + if ( KErrNotFound != pos ) + { + SVPDEBUG1("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: '<' from uri" ); + aAddress.Delete( 0, pos + 1 ); + } + + pos = aAddress.Find( KSVPRightBracketMark2 ); + if ( KErrNotFound != pos ) + { + SVPDEBUG3("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: \ + '>' in uri pos = %d, length = %d", + pos, aAddress.Length() ); + aAddress.Delete( pos, aAddress.Length() - pos ); + } + + // "sip:" is not used when comparing addresses. + if ( KSVPSipPrefixLength < aAddress.Length() ) + { + TBuf sipPrefix; + sipPrefix.Copy( aAddress.Left( KSVPSipPrefixLength ) ); + sipPrefix.LowerCase(); + if ( !sipPrefix.Compare( KSVPSipPrefix2 ) ) + { + SVPDEBUG1("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: 'sip:' in uri" ); + aAddress.Delete( KErrNone, KSVPSipPrefixLength ); + } + } + + // remove all extra parameters from given address + pos = aAddress.Find( KSVPSemiColon ); + if ( KErrNotFound != pos ) + { + SVPDEBUG3("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: \ + There is ';' in uri pos = %d, length = %d", + pos, aAddress.Length() ); + + // Delete ";" and text after it + aAddress.Delete( pos, aAddress.Length() - pos ); + } + + SVPDEBUG1("CSVPSSLogCall::RemoveUnusedCharsFromSipAddress: Exit" ); + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::::CompareSipUri +// Compares whole sip uri +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSVPSSLogCall::CompareSipUri( + const TDesC& aTelNumber, const TDesC& aPbookNumber ) + { + // Complete SIP address must contain host part. + if ( KErrNotFound < aTelNumber.Find( KSVPAt2 ) && + KErrNotFound < aPbookNumber.Find( KSVPAt2 ) ) + { + TBuf tmpTelNumber( aTelNumber ); + TBuf tmpPbookNumber( aPbookNumber ); + + // Compare username parts, which are case sensitive. + if ( CompareUsernamePart( tmpTelNumber, tmpPbookNumber ) ) + { + // Convert descriptors to lowercase. + tmpTelNumber.LowerCase(); + tmpPbookNumber.LowerCase(); + + // Compare host part, which is not case sensitive. + if ( !tmpTelNumber.Compare( tmpPbookNumber ) ) + { + SVPDEBUG1("CSVPSSLogCall::CompareSipUri: SipUri's EQUAL"); + return ETrue; + } + } + } + SVPDEBUG1("CSVPSSLogCall::CompareSipUri: SipUri's do NOT EQUAL"); + return EFalse; + } + +// ----------------------------------------------------------------------------- +// SVPSSLogCall::::CompareUsernamePart +// Compares username of sip uri +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CSVPSSLogCall::CompareUsernamePart( + const TDesC& aTelNumber, const TDesC& aPbookNumber ) + { + TBuf tmpTelNumber( aTelNumber ); + TBuf tmpPbookNumber( aPbookNumber ); + + // Remove uri part from tel. number. + TInt pos = tmpTelNumber.Find( KSVPAt2 ); + if ( KErrNotFound < pos ) + { + tmpTelNumber.Delete( pos, tmpTelNumber.Length() - pos ); + } + + // Remove uri part from phonebook number. + pos = tmpPbookNumber.Find( KSVPAt2 ); + if ( KErrNotFound < pos ) + { + tmpPbookNumber.Delete( pos, tmpPbookNumber.Length() - pos ); + } + + // Compare parsed numbers. + if ( !tmpTelNumber.Compare( tmpPbookNumber ) ) + { + SVPDEBUG1("CSVPSSLogCall::CompareUsernamePart: Names EQUAL"); + return ETrue; + } + SVPDEBUG1("CSVPSSLogCall::CompareUsernamePart: Names do NOT EQUAL"); + return EFalse; + } + +// End of File