realtimenetprots/sipfw/SIP/Codec/src/CSIPRAckHeader.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2005-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : CSIPRAckHeader.cpp
       
    15 // Part of       : SIP Codec
       
    16 // Version       : SIP/4.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 #include "siprackheader.h"
       
    22 #include "sipcodecerr.h"
       
    23 #include "SIPSyntaxCheck.h"
       
    24 #include "sipstrings.h"
       
    25 #include "sipstrconsts.h"
       
    26 #include "sipcodecutils.h"
       
    27 #include "_sipcodecdefs.h"
       
    28 
       
    29 const TInt KMaxTRealLength(32);
       
    30 const TInt KSpace = 32;
       
    31 _LIT8(KTUintFormat, "%u");
       
    32 
       
    33 
       
    34 // ----------------------------------------------------------------------------
       
    35 // CSIPRAckHeader::DecodeL
       
    36 // ----------------------------------------------------------------------------
       
    37 //
       
    38 EXPORT_C CSIPRAckHeader* CSIPRAckHeader::DecodeL(const TDesC8& aValue)
       
    39 	{
       
    40     CSIPRAckHeader* header = new (ELeave) CSIPRAckHeader;
       
    41     CleanupStack::PushL(header);
       
    42     header->ParseL(aValue);
       
    43     CleanupStack::Pop(header);
       
    44     return header;
       
    45 	}
       
    46 
       
    47 // ----------------------------------------------------------------------------
       
    48 // CSIPRAckHeader::NewL
       
    49 // ----------------------------------------------------------------------------
       
    50 //
       
    51 EXPORT_C CSIPRAckHeader* CSIPRAckHeader::NewL(TUint aSeq,
       
    52                                              TUint aCSeqNum,
       
    53                                              RStringF aMethod)
       
    54     {
       
    55     CSIPRAckHeader* self = CSIPRAckHeader::NewLC(aSeq, aCSeqNum, aMethod);
       
    56     CleanupStack::Pop(self);
       
    57     return self;
       
    58     }
       
    59 
       
    60 // ----------------------------------------------------------------------------
       
    61 // CSIPRAckHeader::NewLC
       
    62 // ----------------------------------------------------------------------------
       
    63 //
       
    64 EXPORT_C CSIPRAckHeader* CSIPRAckHeader::NewLC(TUint aSeq,
       
    65                                               TUint aCSeqNum,
       
    66                                               RStringF aMethod)
       
    67     {
       
    68     CSIPRAckHeader* self = new (ELeave) CSIPRAckHeader(aSeq, aCSeqNum);
       
    69     CleanupStack::PushL(self);
       
    70     self->ConstructL(aMethod);
       
    71     return self;
       
    72     }
       
    73 
       
    74 // -----------------------------------------------------------------------------
       
    75 // CSIPRAckHeader::CSIPRAckHeader
       
    76 // -----------------------------------------------------------------------------
       
    77 //
       
    78 CSIPRAckHeader::CSIPRAckHeader()
       
    79 	{
       
    80 	}
       
    81 
       
    82 // ----------------------------------------------------------------------------
       
    83 // CSIPRAckHeader::CSIPRAckHeader
       
    84 // ----------------------------------------------------------------------------
       
    85 //
       
    86 CSIPRAckHeader::CSIPRAckHeader(TUint aSeq, TUint aCSeqNum)
       
    87     {
       
    88     SetSeq(aSeq);
       
    89     SetCSeqNum(aCSeqNum);
       
    90     }
       
    91 
       
    92 // ----------------------------------------------------------------------------
       
    93 // CSIPRAckHeader::~CSIPRAckHeader
       
    94 // ----------------------------------------------------------------------------
       
    95 //
       
    96 EXPORT_C CSIPRAckHeader::~CSIPRAckHeader()
       
    97     {
       
    98     iMethod.Close();
       
    99     }
       
   100 
       
   101 // ----------------------------------------------------------------------------
       
   102 // CSIPRAckHeader::ConstructL
       
   103 // ----------------------------------------------------------------------------
       
   104 //
       
   105 void CSIPRAckHeader::ConstructL(RStringF aMethod)
       
   106     {
       
   107     SetMethodL(aMethod);
       
   108     }
       
   109 
       
   110 // ----------------------------------------------------------------------------
       
   111 // CSIPRAckHeader::ConstructL
       
   112 // ----------------------------------------------------------------------------
       
   113 //
       
   114 void CSIPRAckHeader::ConstructL(const CSIPRAckHeader& aRAckHeader)
       
   115     {
       
   116     SetSeq(aRAckHeader.Seq());
       
   117     SetCSeqNum(aRAckHeader.CSeqNum());
       
   118     SetMethodL(aRAckHeader.Method());
       
   119     }
       
   120 
       
   121 // ----------------------------------------------------------------------------
       
   122 // CSIPRAckHeader::Seq
       
   123 // ----------------------------------------------------------------------------
       
   124 //
       
   125 EXPORT_C TUint CSIPRAckHeader::Seq() const
       
   126     {
       
   127     return iSeq;
       
   128     }
       
   129 
       
   130 // ----------------------------------------------------------------------------
       
   131 // CSIPRAckHeader::SetSeq
       
   132 // ----------------------------------------------------------------------------
       
   133 //
       
   134 EXPORT_C void CSIPRAckHeader::SetSeq(TUint aSeq)
       
   135     {
       
   136     iSeq = aSeq;
       
   137     }
       
   138 
       
   139 // ----------------------------------------------------------------------------
       
   140 // CSIPRAckHeader::CSeqNum
       
   141 // ----------------------------------------------------------------------------
       
   142 //
       
   143 EXPORT_C TUint CSIPRAckHeader::CSeqNum() const
       
   144     {
       
   145     return iCSeqNum;
       
   146     }
       
   147 
       
   148 // ----------------------------------------------------------------------------
       
   149 // CSIPRAckHeader::SetCSeqNum
       
   150 // ----------------------------------------------------------------------------
       
   151 //
       
   152 EXPORT_C void CSIPRAckHeader::SetCSeqNum(TUint aCSeqNum)
       
   153     {
       
   154     iCSeqNum = aCSeqNum;
       
   155     }
       
   156 
       
   157 // ----------------------------------------------------------------------------
       
   158 // CSIPRAckHeader::Method
       
   159 // ----------------------------------------------------------------------------
       
   160 //
       
   161 EXPORT_C RStringF CSIPRAckHeader::Method() const
       
   162     {
       
   163     return iMethod;
       
   164     }
       
   165 
       
   166 // ----------------------------------------------------------------------------
       
   167 // CSIPRAckHeader::SetMethodL
       
   168 // ----------------------------------------------------------------------------
       
   169 //
       
   170 EXPORT_C void CSIPRAckHeader::SetMethodL(RStringF aMethod)
       
   171     {
       
   172     SetMethodL(aMethod.DesC());
       
   173     }
       
   174 
       
   175 // ----------------------------------------------------------------------------
       
   176 // CSIPRAckHeader::SetMethodL
       
   177 // ----------------------------------------------------------------------------
       
   178 //
       
   179 void CSIPRAckHeader::SetMethodL(const TDesC8& aMethod)
       
   180     {
       
   181     RStringF tmpString = 
       
   182         SIPCodecUtils::CheckAndCreateTokenL(aMethod, KErrSipCodecSIPMethod);
       
   183 	iMethod.Close();
       
   184 	iMethod = tmpString;
       
   185     }
       
   186 
       
   187 // ----------------------------------------------------------------------------
       
   188 // CSIPRAckHeader::InternalizeValueL
       
   189 // ----------------------------------------------------------------------------
       
   190 //
       
   191 EXPORT_C CSIPHeaderBase* 
       
   192 CSIPRAckHeader::InternalizeValueL(RReadStream& aReadStream)
       
   193     {
       
   194     CSIPRAckHeader* self = new(ELeave) CSIPRAckHeader;
       
   195     CleanupStack::PushL(self);
       
   196     self->DoInternalizeValueL(aReadStream);
       
   197     CleanupStack::Pop(self);
       
   198     return self;
       
   199     }
       
   200 
       
   201 // ----------------------------------------------------------------------------
       
   202 // CSIPRAckHeader::CloneL
       
   203 // ----------------------------------------------------------------------------
       
   204 //
       
   205 EXPORT_C CSIPHeaderBase* CSIPRAckHeader::CloneL() const
       
   206     {
       
   207     CSIPRAckHeader* clone = new(ELeave) CSIPRAckHeader;
       
   208     CleanupStack::PushL(clone);
       
   209     clone->ConstructL(*this);
       
   210     CleanupStack::Pop(clone);
       
   211     return clone;
       
   212     }
       
   213 
       
   214 // ----------------------------------------------------------------------------
       
   215 // CSIPRAckHeader::Name
       
   216 // ----------------------------------------------------------------------------
       
   217 //
       
   218 EXPORT_C RStringF CSIPRAckHeader::Name() const
       
   219     {
       
   220     return SIPStrings::StringF(SipStrConsts::ERAckHeader);
       
   221     }
       
   222 
       
   223 // ----------------------------------------------------------------------------
       
   224 // CSIPRAckHeader::ToTextValueL
       
   225 // ----------------------------------------------------------------------------
       
   226 //
       
   227 EXPORT_C HBufC8* CSIPRAckHeader::ToTextValueL() const
       
   228     {
       
   229 	TBuf8<KMaxTRealLength> seqAsText;
       
   230 	seqAsText.Format(KTUintFormat, iSeq);
       
   231 
       
   232     TBuf8<KMaxTRealLength> cSeqAsText;
       
   233     cSeqAsText.Format(KTUintFormat, iCSeqNum);
       
   234 
       
   235     // seq+SP+cseq+SP
       
   236 	TUint encodedLength = seqAsText.Length() + 1 + cSeqAsText.Length() + 1;
       
   237 	TPtrC8 method(iMethod.DesC());
       
   238 	encodedLength += method.Length(); 
       
   239 
       
   240 	HBufC8* encodingResult = HBufC8::NewL (encodedLength);
       
   241 	TPtr8 encodingResultPtr = encodingResult->Des();
       
   242 
       
   243 	encodingResultPtr.Append(seqAsText);
       
   244 	encodingResultPtr.Append(KSpace);
       
   245     encodingResultPtr.Append(cSeqAsText);
       
   246     encodingResultPtr.Append(KSpace);
       
   247 	encodingResultPtr.Append(method);
       
   248 
       
   249 	return encodingResult;
       
   250     }
       
   251 
       
   252 // ----------------------------------------------------------------------------
       
   253 // CSIPRAckHeader::PreferredPlaceInMessage
       
   254 // ----------------------------------------------------------------------------
       
   255 //
       
   256 CSIPHeaderBase::TPreferredPlace CSIPRAckHeader::PreferredPlaceInMessage() const
       
   257     {
       
   258     return CSIPHeaderBase::EMiddle;
       
   259     }
       
   260 
       
   261 // ----------------------------------------------------------------------------
       
   262 // CSIPRAckHeader::BaseDecodeL
       
   263 // ----------------------------------------------------------------------------
       
   264 //
       
   265 RPointerArray<CSIPHeaderBase> 
       
   266 CSIPRAckHeader::BaseDecodeL(const TDesC8& aValue)
       
   267     {
       
   268 	CSIPRAckHeader* header = DecodeL(aValue);
       
   269 	CleanupStack::PushL(header);
       
   270 	RPointerArray<CSIPHeaderBase> headers;
       
   271 	User::LeaveIfError (headers.Append(header));
       
   272 	CleanupStack::Pop(header);
       
   273 	return headers;
       
   274     }
       
   275 
       
   276 // ----------------------------------------------------------------------------
       
   277 // CSIPRAckHeader::ExternalizeValueL
       
   278 // ----------------------------------------------------------------------------
       
   279 //
       
   280 void CSIPRAckHeader::ExternalizeValueL (RWriteStream& aWriteStream) const
       
   281     {
       
   282 	aWriteStream.WriteUint32L(this->Seq());
       
   283     aWriteStream.WriteUint32L(this->CSeqNum());
       
   284 	TPtrC8 method(iMethod.DesC());
       
   285 	aWriteStream.WriteUint32L(method.Length());
       
   286 	if (method.Length() > 0)
       
   287 		{
       
   288 		aWriteStream.WriteL(method);
       
   289 		}
       
   290     }
       
   291 
       
   292 // ----------------------------------------------------------------------------
       
   293 // CSIPRAckHeader::DoInternalizeValueL
       
   294 // ----------------------------------------------------------------------------
       
   295 //
       
   296 void CSIPRAckHeader::DoInternalizeValueL(RReadStream& aReadStream)
       
   297     {
       
   298 	iSeq = aReadStream.ReadUint32L();
       
   299     iCSeqNum = aReadStream.ReadUint32L();
       
   300 
       
   301     HBufC8* method = SIPCodecUtils::ReadDescFromStreamL(aReadStream);
       
   302     CleanupStack::PushL(method);
       
   303     iMethod = SIPStrings::Pool().OpenFStringL(*method);
       
   304     CleanupStack::PopAndDestroy(method);
       
   305     }
       
   306 
       
   307 // ----------------------------------------------------------------------------
       
   308 // CSIPRAckHeader::ParseL
       
   309 // ----------------------------------------------------------------------------
       
   310 //
       
   311 void CSIPRAckHeader::ParseL(const TDesC8& aValue)
       
   312     {
       
   313     __ASSERT_ALWAYS(aValue.Length() > 0,
       
   314         User::Leave(KErrSipCodecRAckHeader));
       
   315 
       
   316 	TLex8 lex(aValue);
       
   317 	if (!SIPSyntaxCheck::UInt(lex.NextToken(),iSeq))
       
   318 		{
       
   319 		User::Leave (KErrSipCodecRAckHeader);
       
   320 		}
       
   321 	lex.SkipSpace();
       
   322     if (!SIPSyntaxCheck::UInt(lex.NextToken(), iCSeqNum))
       
   323         {
       
   324         User::Leave (KErrSipCodecRAckHeader);
       
   325         }
       
   326     lex.SkipSpace();
       
   327 	TPtrC8 method(lex.Remainder());
       
   328 	SetMethodL(method);
       
   329     }