smsprotocols/smsstack/smsprot/Src/smspstor.cpp
changeset 20 244d7c5f118e
parent 0 3553901f7fa8
child 24 6638e7f4bd8f
child 42 3adadc800673
equal deleted inserted replaced
19:1f776524b15c 20:244d7c5f118e
   557 	return entry.PassedToClient();
   557 	return entry.PassedToClient();
   558 	} // CSmsReassemblyStore::PassedToClient
   558 	} // CSmsReassemblyStore::PassedToClient
   559 
   559 
   560 
   560 
   561 void CSmsReassemblyStore::SetPassedToClientL(TInt aIndex, TBool aPassed)
   561 void CSmsReassemblyStore::SetPassedToClientL(TInt aIndex, TBool aPassed)
   562 //TODO CommentThisFunction
       
   563 	{
   562 	{
   564 	LOGSMSPROT1("CSmsReassemblyStore::SetPassedToClientL()");
   563 	LOGSMSPROT1("CSmsReassemblyStore::SetPassedToClientL()");
   565 
   564 
   566 	TSmsReassemblyEntry entry(reinterpret_cast<const TSmsReassemblyEntry&>(Entries()[aIndex]));
   565 	TSmsReassemblyEntry entry(reinterpret_cast<const TSmsReassemblyEntry&>(Entries()[aIndex]));
   567 
   566 
   772 	const TInt count=Entries().Count();
   771 	const TInt count=Entries().Count();
   773 	const TLogId logid=(TLogId) aCommand.LogServerId();
   772 	const TLogId logid=(TLogId) aCommand.LogServerId();
   774 
   773 
   775 	BeginTransactionLC();
   774 	BeginTransactionLC();
   776 
   775 
   777 	//TODO AA: What is it doing here? Please comment
       
   778 	for (TInt i=count-1; i>=0; --i)
   776 	for (TInt i=count-1; i>=0; --i)
   779 		{
   777 		{
   780 		if ((logid!=KLogNullId) && (logid==Entries()[i].LogServerId()))
   778 		if ((logid!=KLogNullId) && (logid==Entries()[i].LogServerId()))
   781 			{
   779 			{
   782 			DeleteEntryL(i);
   780 			DeleteEntryL(i);
   816 				ExternalizeEntryL(streamid,smsaddr,*smsmessage, aRefStatus);
   814 				ExternalizeEntryL(streamid,smsaddr,*smsmessage, aRefStatus);
   817 				PopulateEntry(entry,*smsmessage, aRefStatus);
   815 				PopulateEntry(entry,*smsmessage, aRefStatus);
   818 				ChangeEntryL(j,entry);
   816 				ChangeEntryL(j,entry);
   819 				}
   817 				}
   820 
   818 
   821 			//TODO What is happening here? Seems strange
       
   822 			RSmsSegmentationStoreRefStatusArray refStatusTemp;
   819 			RSmsSegmentationStoreRefStatusArray refStatusTemp;
   823 			CleanupClosePushL(refStatusTemp);
   820 			CleanupClosePushL(refStatusTemp);
   824 
   821 
   825 			streamid=KNullStreamId;
   822 			streamid=KNullStreamId;
   826 
   823 
   842 	} // CSmsSegmentationStore::AddCommandL
   839 	} // CSmsSegmentationStore::AddCommandL
   843 
   840 
   844 
   841 
   845 TBool CSmsSegmentationStore::AddReferenceL(const CSmsMessage& aSmsMessage,TInt aReference)
   842 TBool CSmsSegmentationStore::AddReferenceL(const CSmsMessage& aSmsMessage,TInt aReference)
   846 	{
   843 	{
   847 	TSmsSegmentationEntry entry; // TODO const and inside loop
       
   848 	const TInt count=Entries().Count();
   844 	const TInt count=Entries().Count();
   849 	LOGSMSPROT3("CSmsSegmentationStore::AddReferenceL [count=%d, ref=%d]", count, aReference);
   845 	LOGSMSPROT3("CSmsSegmentationStore::AddReferenceL [count=%d, ref=%d]", count, aReference);
   850 	TInt i=0;
   846 	TInt i=0;
   851 	TInt logserverid=aSmsMessage.LogServerId();
   847 	TInt logserverid=aSmsMessage.LogServerId();
   852 	if (logserverid!=KLogNullId)
   848 	if (logserverid!=KLogNullId)
   853 		{
   849 		{
   854 		for (i=0; i<count; i++)
   850 		for (i=0; i<count; i++)
   855 			{
   851 			{
   856 			entry = (TSmsSegmentationEntry&)Entries()[i];
   852             if (logserverid==((TSmsSegmentationEntry&)Entries()[i]).LogServerId())
   857 			if (logserverid==entry.LogServerId())
       
   858 				break;
   853 				break;
   859 			}
   854 			}
   860 		}
   855 		}
   861 	else
   856 	else
   862 		{
   857 		{
   863 		TGsmSmsTelNumber parsedaddress;
   858 		TGsmSmsTelNumber parsedaddress;
   864 		aSmsMessage.ParsedToFromAddress(parsedaddress);
   859 		aSmsMessage.ParsedToFromAddress(parsedaddress);
   865 		TInt telLen;
   860 		TInt telLen;
   866 		for (i=0; i<count; i++)
   861 		for (i=0; i<count; i++)
   867 			{
   862 			{
   868 			entry = (TSmsSegmentationEntry&)Entries()[i];
   863             TSAREntry tsareenty = Entries()[i];      
   869 			telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
   864             TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);        
   870 			const CSmsPDU::TSmsPDUType type=entry.PduType();
   865             telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
   871 			if ((type==aSmsMessage.Type()) && (!entry.IsComplete()) && (aSmsMessage.Time()==entry.Time()) && (entry.Description2().Right(telLen)==parsedaddress.iTelNumber.Right(telLen)))
   866             const CSmsPDU::TSmsPDUType type=entry.PduType();
   872 				break;
   867             if ((type==aSmsMessage.Type()) && (!entry.IsComplete()) && (aSmsMessage.Time()==entry.Time()) && (entry.Description2().Right(telLen)==parsedaddress.iTelNumber.Right(telLen)))
   873 			}
   868                     break;
   874 		}
   869                 }
   875 //	__ASSERT_DEBUG(i<count,SmspPanic(KSmspPanicEntryWithLogServerIdNotFound)); TODO
   870             }
   876 	if(i>=count)
   871 	if(i>=count)
   877 		{
   872 		{
   878 		LOGSMSPROT3("WARNING! KSmspPanicEntryWithLogServerIdNotFound [i=%d, count=%d]", i, count);
   873 		LOGSMSPROT3("WARNING! KSmspPanicEntryWithLogServerIdNotFound [i=%d, count=%d]", i, count);
       
   874 		return EFalse;
   879 		}
   875 		}
   880 
   876 
   881 	RSmsSegmentationStoreRefStatusArray refStatusArray;
   877 	RSmsSegmentationStoreRefStatusArray refStatusArray;
   882 	CleanupClosePushL(refStatusArray);
   878 	CleanupClosePushL(refStatusArray);
   883 
   879 
       
   880 	TSAREntry tsareenty = Entries()[i];      
       
   881 	TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);        
   884 	TStreamId streamid=entry.DataStreamId();
   882 	TStreamId streamid=entry.DataStreamId();
   885 	TSmsAddr smsaddr;
   883 	TSmsAddr smsaddr;
   886 	CSmsBuffer* buffer=CSmsBuffer::NewL();
   884 	CSmsBuffer* buffer=CSmsBuffer::NewL();
   887 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
   885 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
   888 	CleanupStack::PushL(smsmessage);
   886 	CleanupStack::PushL(smsmessage);
   921  *  @param aSmsMessage Reference to CSmsMessage.
   919  *  @param aSmsMessage Reference to CSmsMessage.
   922  *  @param aReference  The PDU reference.
   920  *  @param aReference  The PDU reference.
   923  */
   921  */
   924 TBool CSmsSegmentationStore::AddReferenceStatusPairL(const CSmsMessage& aSmsMessage,TInt aReference, TUint aSegmentSequenceNumber)
   922 TBool CSmsSegmentationStore::AddReferenceStatusPairL(const CSmsMessage& aSmsMessage,TInt aReference, TUint aSegmentSequenceNumber)
   925  	{
   923  	{
   926 	TSmsSegmentationEntry entry; // TODO const and inside loop
       
   927 	const TInt count=Entries().Count();
   924 	const TInt count=Entries().Count();
   928 	LOGSMSPROT3("CSmsSegmentationStore::AddReferenceStatusPairL [count=%d, ref=%d]", count, aReference);
   925 	LOGSMSPROT3("CSmsSegmentationStore::AddReferenceStatusPairL [count=%d, ref=%d]", count, aReference);
   929 	TInt i=0;
   926 	TInt i=0;
   930 	TInt logserverid=aSmsMessage.LogServerId();
   927 	TInt logserverid=aSmsMessage.LogServerId();
   931 	if (logserverid!=KLogNullId)
   928 	if (logserverid!=KLogNullId)
   932 		{
   929 		{
   933 		for (i=0; i<count; i++)
   930 		for (i=0; i<count; i++)
   934 			{
   931 			{
   935 			entry = (TSmsSegmentationEntry&)Entries()[i];
   932             if (logserverid==((TSmsSegmentationEntry&)Entries()[i]).LogServerId())
   936 			if (logserverid==entry.LogServerId())
       
   937 				break;
   933 				break;
   938 			}
   934 			}
   939 		}
   935 		}
   940 	else
   936 	else
   941 		{
   937 		{
   942 		TGsmSmsTelNumber parsedaddress;
   938 		TGsmSmsTelNumber parsedaddress;
   943 		aSmsMessage.ParsedToFromAddress(parsedaddress);
   939 		aSmsMessage.ParsedToFromAddress(parsedaddress);
   944 		TInt telLen;
   940 		TInt telLen;
   945 		for (i=0; i<count; i++)
   941 		for (i=0; i<count; i++)
   946 			{
   942 			{
   947 			entry = (TSmsSegmentationEntry&)Entries()[i];
   943             TSAREntry tsareenty = Entries()[i];  
       
   944             TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);
   948 			telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
   945 			telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
   949 			const CSmsPDU::TSmsPDUType type=entry.PduType();
   946 			const CSmsPDU::TSmsPDUType type=entry.PduType();
   950 			if ((type==aSmsMessage.Type()) && (!entry.IsComplete()) && (aSmsMessage.Time()==entry.Time()) && (entry.Description2().Right(telLen)==parsedaddress.iTelNumber.Right(telLen)))
   947 			if ((type==aSmsMessage.Type()) && (!entry.IsComplete()) && (aSmsMessage.Time()==entry.Time()) && (entry.Description2().Right(telLen)==parsedaddress.iTelNumber.Right(telLen)))
   951 				break;
   948 				break;
   952 			}
   949 			}
   953 		}
   950 		}
   954 //	__ASSERT_DEBUG(i<count,SmspPanic(KSmspPanicEntryWithLogServerIdNotFound)); TODO
       
   955 	if(i>=count)
   951 	if(i>=count)
   956 		{
   952 		{
   957 		LOGSMSPROT3("WARNING! KSmspPanicEntryWithLogServerIdNotFound [i=%d, count=%d]", i, count);
   953 		LOGSMSPROT3("WARNING! KSmspPanicEntryWithLogServerIdNotFound [i=%d, count=%d]", i, count);
       
   954 		return EFalse;
   958 		}
   955 		}
   959 
   956 
   960 	RSmsSegmentationStoreRefStatusArray refStatusArray;
   957 	RSmsSegmentationStoreRefStatusArray refStatusArray;
   961 	CleanupClosePushL(refStatusArray);
   958 	CleanupClosePushL(refStatusArray);
       
   959     TSAREntry tsareenty = Entries()[i];  
       
   960     TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);
   962 
   961 
   963 	TStreamId streamid=entry.DataStreamId();
   962 	TStreamId streamid=entry.DataStreamId();
   964 	TSmsAddr smsaddr;
   963 	TSmsAddr smsaddr;
   965 	CSmsBuffer* buffer=CSmsBuffer::NewL();
   964 	CSmsBuffer* buffer=CSmsBuffer::NewL();
   966 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
   965 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
  1057 	CSmsBuffer* buffer=CSmsBuffer::NewL();
  1056 	CSmsBuffer* buffer=CSmsBuffer::NewL();
  1058 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
  1057 	CSmsMessage* smsmessage=CSmsMessage::NewL(iFs, CSmsPDU::ESmsDeliver,buffer);
  1059 	CleanupStack::PushL(smsmessage);
  1058 	CleanupStack::PushL(smsmessage);
  1060 	TGsmSmsTelNumber parsedaddress;
  1059 	TGsmSmsTelNumber parsedaddress;
  1061 	aStatusReport.ParsedToFromAddress(parsedaddress);
  1060 	aStatusReport.ParsedToFromAddress(parsedaddress);
  1062 	TSmsSegmentationEntry entry; // TODO const ref and inside loop
       
  1063 
  1061 
  1064 	BeginTransactionLC();
  1062 	BeginTransactionLC();
  1065 
  1063 
  1066 	aIndex = count1;
  1064 	aIndex = count1;
  1067 
  1065 
  1068 	TInt telLen;
  1066 	TInt telLen;
  1069 	while (!found && aIndex--)
  1067 	while (!found && aIndex--)
  1070 		{
  1068 		{
  1071 		entry = (TSmsSegmentationEntry&)Entries()[aIndex];
  1069         TSAREntry tsareenty = Entries()[aIndex]; 
       
  1070         TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);  
  1072 
  1071 
  1073 		// Remove leading zeros of national numbers
  1072 		// Remove leading zeros of national numbers
  1074 		TPtrC trimmedTelNumber(TrimLeadingZeros(entry.Description2()));
  1073 		TPtrC trimmedTelNumber(TrimLeadingZeros(entry.Description2()));
  1075 		TPtrC trimmedParsedTelNumber(TrimLeadingZeros(parsedaddress.iTelNumber));
  1074 		TPtrC trimmedParsedTelNumber(TrimLeadingZeros(parsedaddress.iTelNumber));
  1076 
  1075 
  1147 
  1146 
  1148 		aComplete=EFalse;
  1147 		aComplete=EFalse;
  1149 		TInt telLen;
  1148 		TInt telLen;
  1150 		for (aIndex=0; aIndex<count1; aIndex++)
  1149 		for (aIndex=0; aIndex<count1; aIndex++)
  1151 			{
  1150 			{
  1152 			entry = (TSmsSegmentationEntry&)Entries()[aIndex];
  1151             TSAREntry tsareenty = Entries()[aIndex]; 
       
  1152 	        TSmsSegmentationEntry& entry = static_cast<TSmsSegmentationEntry&>(tsareenty);  
  1153 			telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
  1153 			telLen=Min(entry.Description2().Length(),parsedaddress.iTelNumber.Length());
  1154 			const CSmsPDU::TSmsPDUType type = entry.PduType();
  1154 			const CSmsPDU::TSmsPDUType type = entry.PduType();
  1155 			if ((type==CSmsPDU::ESmsSubmit) &&
  1155 			if ((type==CSmsPDU::ESmsSubmit) &&
  1156 				 entry.IsComplete() &&
  1156 				 entry.IsComplete() &&
  1157 			    (entry.Time()==time) &&
  1157 			    (entry.Time()==time) &&
  1174 				InternalizeEntryL(entry.DataStreamId(),smsaddr,*smsmessage, refStatusArray2);
  1174 				InternalizeEntryL(entry.DataStreamId(),smsaddr,*smsmessage, refStatusArray2);
  1175 				const TInt count2 = refStatusArray.Count();
  1175 				const TInt count2 = refStatusArray.Count();
  1176 				__ASSERT_DEBUG(count2 == refStatusArray2.Count(),SmspPanic(KSmspPanicBadReferenceArray));
  1176 				__ASSERT_DEBUG(count2 == refStatusArray2.Count(),SmspPanic(KSmspPanicBadReferenceArray));
  1177 				for (TInt i=0; i<count2; i++)
  1177 				for (TInt i=0; i<count2; i++)
  1178 					{
  1178 					{
  1179 					//TODO What is this doing?
       
  1180 					TSmsSegmentationStoreRefStatus& refStatus2 = refStatusArray2[i];
  1179 					TSmsSegmentationStoreRefStatus& refStatus2 = refStatusArray2[i];
  1181 					if (!IsPermanentStatus(refStatus2.Status()))
  1180 					if (!IsPermanentStatus(refStatus2.Status()))
  1182 						{
  1181 						{
  1183 						refStatus2.SetStatus(refStatusArray[i].Status());
  1182 						refStatus2.SetStatus(refStatusArray[i].Status());
  1184 						}
  1183 						}
  1319 	if (aSmsMessage.Type()==CSmsPDU::ESmsSubmit)
  1318 	if (aSmsMessage.Type()==CSmsPDU::ESmsSubmit)
  1320 		{
  1319 		{
  1321 		aEntry.SetReference(0);
  1320 		aEntry.SetReference(0);
  1322 		aEntry.SetTotal(1);
  1321 		aEntry.SetTotal(1);
  1323 		CSmsSubmit& submit=(CSmsSubmit&) aSmsMessage.SmsPDU();
  1322 		CSmsSubmit& submit=(CSmsSubmit&) aSmsMessage.SmsPDU();
  1324 		aEntry.SetValidityPeriod(submit.ValidityPeriod().Int()); // TODO use val per type
  1323 		aEntry.SetValidityPeriod(submit.ValidityPeriod().Int());
  1325 		
  1324 		
  1326 		if (aSmsMessage.Scheme() == EDefaultScheme)
  1325 		if (aSmsMessage.Scheme() == EDefaultScheme)
  1327 		    {
  1326 		    {
  1328 	    	statusreportrequest=((CSmsSubmit&) aSmsMessage.SmsPDU()).StatusReportRequest();		    
  1327 	    	statusreportrequest=((CSmsSubmit&) aSmsMessage.SmsPDU()).StatusReportRequest();		    
  1329 		    }
  1328 		    }
  1424 		const TBool ret = IsPermanentStatus(aRefStatusArray[i].Status());
  1423 		const TBool ret = IsPermanentStatus(aRefStatusArray[i].Status());
  1425 		LOGSMSPROT4("CSmsSegmentationStore::IsPermanentStatus [Status: %d, RetVal: %d, count=%d]", aRefStatusArray[i].Status(), ret, count);
  1424 		LOGSMSPROT4("CSmsSegmentationStore::IsPermanentStatus [Status: %d, RetVal: %d, count=%d]", aRefStatusArray[i].Status(), ret, count);
  1426 		if (ret)
  1425 		if (ret)
  1427 			permanent++;
  1426 			permanent++;
  1428 		}
  1427 		}
  1429 	/*
       
  1430 	 *  
       
  1431 	 *  TODO ahe - for release
       
  1432 	 *  tested hack: the messagereceived function will be called right
       
  1433 	 *  I did a lot of testing with multipart messages, the sms are
       
  1434 	 *  almost always received and sent now, there might be only problems
       
  1435 	 *  with the SR now - to wait for more logs to see what happens in this
       
  1436 	 *  special cases - and the device crashes and is too slow of course
       
  1437 	 *  
       
  1438 	 */
       
  1439 	return (permanent==count) && (permanent==aEntry.Total() );
  1428 	return (permanent==count) && (permanent==aEntry.Total() );
  1440 	} // CSmsSegmentationStore::StatusArrayComplete
  1429 	} // CSmsSegmentationStore::StatusArrayComplete
  1441 
  1430 
  1442 
  1431 
  1443   /**
  1432   /**