diff -r 000000000000 -r 72b543305e3a mobilemessaging/smsmtm/servermtm/src/smssactive.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smsmtm/servermtm/src/smssactive.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,448 @@ +// Copyright (c) 1999-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: +// + +#ifdef _DEBUG +#undef _MSG_NO_LOGGING +#endif + +#include "smssactive.h" + +#include +#include +#include +#include +#include + +#include "SMSSPAN.H" + + +#ifndef _MSG_NO_LOGGING + #include + _LIT(KSmssLogFile, "Smss.txt"); + _LIT(KSmssLogDir, "Sms"); + const TInt KSmssLogMaxLength = KLogBufferSize - 22; + /** + Names for Multimode ETel sub-sessions + */ + _LIT(KETelMeSmsStore,"S13"); + _LIT(KETelIccSmsStore,"S14"); + _LIT(KETelCombinedSmsStore,"S15"); +#endif + + + +CSmssActive::CSmssActive(RFs& aFs, CMsvServerEntry& aServerEntry, TInt aPriority) +: CActive(aPriority), iFs(aFs), iServerEntry(aServerEntry) + { + } + +CSmssActive::~CSmssActive() + { +#ifndef _MSG_NO_LOGGING + delete iLastLogFile; + + if (iFlogger.LogValid()) + iFlogger.CloseLog(); + + iFlogger.Close(); +#endif + } + +void CSmssActive::RequestComplete(TRequestStatus* aStatus, TInt aError, TBool aSetActive) + { + User::RequestComplete(aStatus, aError); + + if (aSetActive) + { + SetActive(); + } + } + +void CSmssActive::Queue(TRequestStatus& aStatus) +// +// call this last when an asynch operation has been requested +// + { + __ASSERT_DEBUG(iReport==NULL, Panic(KSmssPanicAlreadyActive)); + + aStatus=KRequestPending; + iReport=&aStatus; + } + +void CSmssActive::DoCancel() +// +// must be called at end of derived classes DoCancel() +// + { + DoSmssCancel(); + TInt result=KErrCancel; + Complete(result); // can be done safely as asynch reporting + } + +TInt CSmssActive::RunError(TInt aError) + { + Complete(aError); + return KErrNone; + } + +void CSmssActive::RunL() + { + User::LeaveIfError(iStatus.Int()); //This will be traped by RunError(). + + DoRunL(); + + if (!IsActive()) + Complete(iStatus.Int()); + } + +TInt CSmssActive::Complete(TInt aStatus) + { + if (iReport) + { + const TBool isCancelling = (aStatus == KErrCancel); + + DoComplete(aStatus); + + if (!IsActive() || isCancelling) + { + User::RequestComplete(iReport, aStatus); + iReport = NULL; + } + } + + return aStatus; + } + +TBool CSmssActive::CanSendMessage(const TMsvEntry& aEntry) const + { + TBool retVal = ETrue; + switch (aEntry.SendingState()) + { + case KMsvSendStateSuspended: + case KMsvSendStateSent: + case KMsvSendStateNotApplicable: + retVal = EFalse; + break; + default: + break; + } + + return retVal; + } + +TBool CSmssActive::CanSendMessageToRecipient(const TMsvEntry& aEntry, const CSmsNumber& aRcpt) const + { + return (aRcpt.Status() != CMsvRecipient::ESentSuccessfully) && CanSendMessage(aEntry); + } + +#ifndef _MSG_NO_LOGGING +TInt CSmssActive::FLogMessage(const TMsvEntry& aEntry, const CSmsMessage& aSmsMessage, TBioMsgIdType aBearer, const TDesC& aFile) + { + TRAPD(err, DoFLogMessageL(aEntry, aSmsMessage, aBearer, aFile)); + return err; + } + +void CSmssActive::DoFLogMessageL(const TMsvEntry& aEntry, const CSmsMessage& aSmsMessage, TBioMsgIdType aBearer, const TDesC& aFile) + { + if (!IsLogging(aFile)) + return; + + TBuf8<32> temp; + TBuf16<32> temp1; + TPtrC temp2; + + switch (aSmsMessage.Type()) + { + case CSmsPDU::ESmsSubmit: + temp = _L8("[Submit%d]"); + break; + case CSmsPDU::ESmsDeliver: + temp = _L8("[Deliver%d]"); + break; + default: + temp = _L8("[Message%d]"); + break; + } + + FLogFormat(aFile, temp, aEntry.Id()); + + TInt length = aSmsMessage.Buffer().Length(); + HBufC* hBuf = HBufC::NewLC(32 + length); + TPtr buf(hBuf->Des()); + aSmsMessage.Buffer().Extract(buf, 0, length); + buf.Insert(0, _L("Message= ")); + FLog(aFile, buf, EFalse); + CleanupStack::PopAndDestroy(hBuf); + hBuf = NULL; + + temp2.Set(aSmsMessage.ToFromAddress()); + FLogFormat(aFile, _L("Recipients= %S"), &temp2); + + temp2.Set(aSmsMessage.ServiceCenterAddress()); + FLogFormat(aFile, _L("SC= %S"), &temp2); + + FLogFormat(aFile, _L("BioUid= %d"), aEntry.iBioType); + + const CSmsPDU& pdu = aSmsMessage.SmsPDU(); + + if (pdu.DataCodingSchemePresent()) + { + temp.Zero(); + temp.Append(_L8("Encoding= ")); + + switch (pdu.Alphabet()) + { + case TSmsDataCodingScheme::ESmsAlphabet7Bit: + temp.Append(_L8("7")); + break; + case TSmsDataCodingScheme::ESmsAlphabet8Bit: + temp.Append(_L8("8")); + break; + case TSmsDataCodingScheme::ESmsAlphabetUCS2: + temp.Append(_L8("16")); + break; + default: + temp.Append(_L8("Unsupported")); + break; + } + + FLogFormat(aFile, temp); + } + + if (aSmsMessage.Type() == CSmsPDU::ESmsSubmit) + { + temp.Zero(); + temp.Append(_L8("DeliveryReport= ")); + + const CSmsSubmit& submit = (CSmsSubmit&) pdu; + if (submit.StatusReportRequest()) + { + temp.Append(_L8("YES")); + } + else + { + temp.Append(_L8("NO")); + } + + FLogFormat(aFile, temp); + } + + temp.Zero(); + temp.Append(_L("Bearer= ")); + + switch (aBearer) + { + case EBioMsgIdNbs: + temp.Append(_L("NBS")); + break; + case EBioMsgIdWap: + temp.Append(_L("WAP")); + break; + case EBioMsgIdWapSecure: + temp.Append(_L("WAPSE")); + break; + default: + temp.Append(_L("UnSup")); + break; + } + + FLogFormat(aFile, temp); + + temp1.Zero(); + temp1.Append(_L("Storage= ")); + + switch (aSmsMessage.Storage()) + { + case CSmsMessage::ESmsSIMStorage: + temp1.Append(KETelIccSmsStore); + break; + case CSmsMessage::ESmsPhoneStorage: + temp1.Append(KETelMeSmsStore); + break; + case CSmsMessage::ESmsCombinedStorage: + temp1.Append(KETelCombinedSmsStore); + break; + case CSmsMessage::ESmsNoStorage: + default: + temp1.Append(_L("NONE")); + }; + + FLogFormat(aFile, temp1); + FLogFormat(aFile, KNullDesC); + } + +void CSmssActive::FLog(const TDesC& aFile, const TDesC& aInputLine, TBool aIgnoreLineBreaks) + { + if (!IsLogging(aFile)) + return; + + TPtrC str(aInputLine); + TInt length = str.Length(); + + if (aIgnoreLineBreaks) + { + //Ignore trailing spaces + while (length--) + { + const TChar ch(str[length]); + if (!ch.IsSpace()) + { + break; + } + } + + length++; + str.Set(aInputLine.Left(length)); + + //Break the message up and print only 255 chars at a time + TInt start = 0; + + while (start < length) + { + TPtrC buf(str.Mid(start, Min(KSmssLogMaxLength, length - start))); + iFlogger.Write(buf); + start += KSmssLogMaxLength; + } + } + else + { + //Log each line in aInputLine individually + while (length > 0) + { + TInt find = str.Locate('\n'); + + if (find == KErrNotFound) + { + FLog(aFile, str, ETrue); + break; + } + else + { + if (find == 0) + FLog(aFile, KNullDesC, ETrue); + else + FLog(aFile, str.Left(find), ETrue); + + if (find < length - 1) + str.Set(str.Mid(find + 1)); + else + break; + } + + length = str.Length(); + } + } + } + +void CSmssActive::FLog(const TDesC& aInputLine, TBool aIgnoreLineBreaks) + { + FLog(KSmssLogFile, aInputLine, aIgnoreLineBreaks); + } + +void CSmssActive::FLogFormat(const TDesC& aFile, TRefByValue aFormat, ...) + { + VA_LIST list; + VA_START(list, aFormat); + FLogFormat(aFile, aFormat, list); + } + +void CSmssActive::FLogFormat(const TDesC& aFile, TRefByValue aFormat, VA_LIST& aList) + { + if (!IsLogging(aFile)) + return; + + iFlogger.WriteFormat(aFormat, aList); + } + + +void CSmssActive::FLogFormat(TRefByValue aFormat, ...) + { + VA_LIST list; + VA_START(list, aFormat); + FLogFormat(KSmssLogFile, aFormat, list); + } + +void CSmssActive::FLogFormat(const TDesC& aFile, TRefByValue aFormat, ...) + { + VA_LIST list; + VA_START(list, aFormat); + FLogFormat(aFile, aFormat, list); + } + +void CSmssActive::FLogFormat(const TDesC& aFile, TRefByValue aFormat, VA_LIST& aList) + { + if (!IsLogging(aFile)) + return; + + iFlogger.WriteFormat(aFormat, aList); + } + + +void CSmssActive::FLogFormat(TRefByValue aFormat, ...) + { + VA_LIST list; + VA_START(list, aFormat); + FLogFormat(KSmssLogFile, aFormat, list); + } + +TBool CSmssActive::IsLogging(const TDesC& aFile) + { + return (ConstructFlogger(aFile) == KErrNone); + } + +TInt CSmssActive::ConstructFlogger(const TDesC& aFile) + { + TRAPD(err, DoConstructFloggerL(aFile)); + return err; + } + +void CSmssActive::DoConstructFloggerL(const TDesC& aFile) + { + if (iFlogger.Handle() == NULL) + User::LeaveIfError(iFlogger.Connect()); + + if (iLastLogFile == NULL || *iLastLogFile != aFile) + { + if (iFlogger.LogValid()) + iFlogger.CloseLog(); + + delete iLastLogFile; + iLastLogFile = NULL; + iLastLogFile = aFile.AllocL(); + iFlogger.CreateLog(KSmssLogDir, aFile, EFileLoggingModeAppend); + } + + if (!iFlogger.LogValid()) + User::Leave(KErrNotFound); + } +#endif + + +void CSmssActive::ChangeEntryL(const TMsvEntry& aNewEntry) + { + __ASSERT_DEBUG(iServerEntry.Entry().Id() == aNewEntry.Id(), Panic(ESmssEntryNotSet)); + + if (!(aNewEntry == iServerEntry.Entry())) + User::LeaveIfError(iServerEntry.ChangeEntry(aNewEntry)); + } + +void CSmssActive::StoreHeaderL(const CSmsHeader& aNewHeader) + { + CMsvStore* msvStore = iServerEntry.EditStoreL(); + CleanupStack::PushL(msvStore); + aNewHeader.StoreL(*msvStore); + msvStore->CommitL(); + CleanupStack::PopAndDestroy(msvStore); + }