diff -r 9f5ae1728557 -r db3f5fa34ec7 messagingfw/wappushfw/pushutils/src/PushMessage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/messagingfw/wappushfw/pushutils/src/PushMessage.cpp Wed Nov 03 22:41:46 2010 +0530 @@ -0,0 +1,477 @@ +// Copyright (c) 2000-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: +// + +// System Include +#include +#include "wapdecoder.h" + +// User Include +#include "chttpresponse.h" + +/** +Allocates and constructs a new WAP Push message object. + +CPushMessage takes ownership of aHeader and aBody. aHeader and aBody must be put on +the cleanup stack before calling CPushMessage::NewL(), and the arguments must be poped +off the cleanupstack after CPushMessage has been constructed. For example: +@code + CleanupStack::PushL(header); + CleanupStack::PushL(body); + CPushMessagemessage = CPushMessage::NewL(header, body); + CleanupStack::Pop(2); //header, body + CleanupStack::PushL(message); + message->FunctionL(); +@endcode + +If the arguments are data members, than they must be set to null after CPushMessage +has been constructed. For example: +@code + iMessage = CPushMessage::NewL(iHeader, iBody); + iHeader = NULL; + iBody = NULL; +@endcode + +CPushMessage::NewLC can not be implemented as the arguments must be poped of the cleanupstack +or set to NULL before pushing CPushMessage object on the cleanupstack. + +@param aHeader +Pointer to message header. Ownership passes to CPushMessage. + +@param aBody +Pointer to message body. Ownership passes to CPushMessage. + +@return +New WAP Push message object. +*/ +EXPORT_C CPushMessage* CPushMessage::NewL(HBufC8* aHeader, HBufC8* aBody) + { + __ASSERT_DEBUG(aHeader!=NULL,User::Invariant()); + CPushMessage* self = new (ELeave) CPushMessage(aHeader); + CleanupStack::PushL(self); + self->ConstructL(aHeader, aBody, NULL); + CleanupStack::Pop(); + return self; + } + + +/** +Allocates and constructs a new WAP Push message object. + +It takes ownership of aHeader, aBody and aServerAddress. These must be put +on the cleanup stack before calling NewL(), and popped off after the call +returns. + +@param aHeader +Pointer to message header. Ownership passes to CPushMessage. + +@param aBody +Pointer to message body. Ownership passes to CPushMessage. + +@param aPushID +Message push ID. + +@param aRemoteAddress +Pointer to remote server address. Ownership passes to CPushMessage. + +@return +New WAP Push message object. +*/ +EXPORT_C CPushMessage* CPushMessage::NewL(HBufC8* aHeader, HBufC8* aBody, + TUint8 aPushID, HBufC8* aRemoteAddress) + { + __ASSERT_DEBUG(aHeader!=NULL,User::Invariant()); + CPushMessage* self = new (ELeave) CPushMessage(aHeader, aPushID); + CleanupStack::PushL(self); + self->ConstructL(aHeader, aBody, aRemoteAddress); + CleanupStack::Pop(); + return self; + } + + +/** +Constructor. + +@param aHeader +Pointer to the push message header. + +@param aPushID +Push Message ID +*/ +CPushMessage::CPushMessage(HBufC8* aHeader, TUint8 aPushID) : iPushID(aPushID) + { + iPushHeader.Set(*aHeader); + } + + +/** +Constructor. +Ownership of aHeader is passed to the CHTTPResponse member. + +@param aHeader +Pointer to 8 bit descriptor with the header data. + +@param aBody +Pointer to 8 bit body data. + +@param aRemoteAddress +Pointer to 8 bit remote server address. +*/ +void CPushMessage::ConstructL(HBufC8* aHeader, HBufC8* aBody, HBufC8* aRemoteAddress) + { + iHttpResponse = CHTTPResponse::NewL(); + iHttpResponse->AddResponse(aHeader);// Passes over ownership to iResponse + iPushBody = aBody;// It is now safe to take ownership of aBody. CPushMessage::NewL can't fail after this point. + iServerAddress = aRemoteAddress; + } + + +/** +Destructor. +*/ +EXPORT_C CPushMessage::~CPushMessage() + { + delete iHttpResponse; + delete iPushBody; + delete iServerAddress; + delete iContentType; + } + + +/** +Gets the X-Wap-Application-Id field in the WSP header. + +As the App Id can be either an integer or a URI string, the function handles +both of these data types. + +@param aAppURI +On return, App Id URI (if present). + +@param aAppID +On return, App Id integer (if present). + +@param aIsAnInt +On return, ETrue if the App ID is an integer, EFalse if it's a URI. + +@return +True if the field was found, false if not. + +@deprecated +Use the new CPushMessage::GetAppIdL function. +*/ +EXPORT_C TBool CPushMessage::GetAppID(TPtrC8& aAppURI, TInt& aAppID, TBool& aIsAnInt) + { + TInt index = iHttpResponse->LocateField(EHttpXWapApplicationID); + + if (index == KErrNotFound) //Field isn't present in the header + return EFalse; + + // Use our friendship to take a peek at the first byte + // of the next field - is it a text character? + TInt nextByte = iHttpResponse->iResponse->Des()[index]; + + if (nextByte > 0x1F && nextByte < 0x80) // call FindField as it's a string + { + iHttpResponse->FindField(EHttpXWapApplicationID, aAppURI); + aIsAnInt = EFalse; + } + else + { + if (nextByte >=0x80) // Bit 7 set - encoded short integer value <=127 + aAppID = (nextByte & 0x7F); // AND away Bit7 to get the integer value + else + { + TPtrC8 sourceBuffer = iHttpResponse->iResponse->Des().Mid(index); + TWapBinCodex::ExtractMultiOctetInteger(sourceBuffer, aAppID); + } + aIsAnInt = ETrue; + } + + return ETrue; + } + +/** +Gets the X-Wap-Application-Id field in the WSP header. + +The App Id can be in either an integer or a URI string format - this function +handles both of these formats. + +@param aAppURI +An output argument with the App ID, URI string format. Only valid if aIsInt is +true and the function returns a value of true. + +@param aAppID +An output argument with the App ID, integer format. Only valid if aIsInt is true +and the function returns a value of true. + +@param aIsInt +An output argument indicating if the App ID is in integer format. Only valid if +the function returns a value of true. + +@return +A value of true if the X-Wap-Application-Id field was found, false if not. + +@leave KErrCorrupt +The App ID could not be parsed as the binary data was corrupted. +*/ +EXPORT_C TBool CPushMessage::GetAppIdL(TPtrC8& aAppURI, TInt& aAppID, TBool& aIsInt) + { + TInt index = iHttpResponse->LocateField(EHttpXWapApplicationID); + + if (index == KErrNotFound) // X-Wap-Application-Id field isn't present + return EFalse; + + User::LeaveIfError(index); + + // Use our friendship to take a peek at the first byte + // of the next field - is it a text character? + TInt nextByte = iHttpResponse->iResponse->Des()[index]; + + if (nextByte > 0x1F && nextByte < 0x80) + { + // The AppId is given in Uri-value format - a string. Use FindField + // to get the AppId. + iHttpResponse->FindField(EHttpXWapApplicationID, aAppURI); + aIsInt = EFalse; + } + else + { + // The AppId is in either Short-integer or Long-integer format... + if (nextByte >=0x80) + { + // The AppId is in Short-integer format - + // Short-integer = OCTET + // ; encoded as 7-nit data - 1xxx xxxx + // + // Using AND function to mask 7th bit and get the AppId. + aAppID = (nextByte & 0x7F); + } + else + { + // The AppId is in Long-integer format. + TPtrC8 sourceBuffer = iHttpResponse->iResponse->Des().Mid(index); + User::LeaveIfError(TWapBinCodex::ParseMultiOctetInteger(sourceBuffer, aAppID)); + } + aIsInt = ETrue; + } + + return ETrue; + } + + +/** +Gets the Content-Type header. + +If the content type is not found or not recognised, a default of "application/octet-stream" +is returned. + +@param aContentType +On return, Content-Type header value. An empty descriptor (zero-length) indicates an +allocation error occured. +*/ +EXPORT_C void CPushMessage::GetContentType(TPtrC& aContentType) const + { + if (iPushHeader.Length()) + { + // Get content type from HTTPResponse + TPtrC8 type; + iHttpResponse->ContentType(type); + + // Copy content-type to local unicode buffer + delete iContentType; + iContentType = NULL; + iContentType = HBufC::New(type.Length()); + if(iContentType) + { + TPtr typeBuffer(iContentType->Des()); + typeBuffer.Copy(type); + aContentType.Set(*iContentType); + } + else // Buffer could not be created so set to null descriptor + aContentType.Set(KNullDesC()); + } + } + + +/** +Gets a specified header field. + +@param aField +Header field identifier. + +@param aFieldValue +On return, the header field text. + +@return +True if the field was found, false if not. +*/ +EXPORT_C TBool CPushMessage::GetHeaderField(THttpHeaderField aField, TPtrC8& aFieldValue) const + { + return iHttpResponse->FindField(aField, aFieldValue); + } + + +/** +Gets a specified header field as an 8-bit octet data. + +@param aField +Header field identifier. + +@param aFieldValue +On return, the header field value in binary form. + +@return +True if the field was found, false if not. +*/ +EXPORT_C TBool CPushMessage::GetBinaryHeaderField(THttpHeaderField aField, TPtrC8& aFieldValue) const + { + return iHttpResponse->FindBinaryDescField(aField, aFieldValue); + } + + +/** +Gets a specified header field as a date/time value. + +@param aField +Header field identifier. + +@param aTime +On return, the header field value in date/time form. + +@return +True if the field was found, false if not. +*/ +EXPORT_C TBool CPushMessage::GetHeaderField(THttpHeaderField aField, TTime& aTime) const + { + return iHttpResponse->FindField(aField, aTime); + } + + +/** +Gets the message body. + +@param aMessageBodyPtr +On return, the message body. KNullDesC8 if no body was found. + +@return +True if a message body was found, false if it was empty. +*/ +EXPORT_C TBool CPushMessage::GetMessageBody(TPtrC8& aMessageBodyPtr) const + { + if (iPushBody == NULL) + { + aMessageBodyPtr.Set(KNullDesC8); + return EFalse; + } + else + { + aMessageBodyPtr.Set(*iPushBody); + return ETrue; + } + } + + +/** +Gets the complete message header. + +@param aMessageHeaderPtr +On return, the complete message header. KNullDesC8 if no header was found. + +@return +True if a message header was found, false if it was empty. +*/ +EXPORT_C TBool CPushMessage::GetHeader(TPtrC8& aMessageHeaderPtr) const + { + aMessageHeaderPtr.Set(iPushHeader); + return ETrue; + } + + +/** +Gets the remote server address. + +@param aServerAddress +On return, the remote server address (if present). + +@return +True if the remote server address was found, false if not. +*/ +EXPORT_C TBool CPushMessage::GetServerAddress(TPtrC8& aServerAddress) const + { + if (iServerAddress) + { + aServerAddress.Set(*iServerAddress); + return ETrue; + } + return EFalse; + } + + +/** +Gets the Push ID. + +@param aPushID +On return, the ID value. + +@return +Indicates if the ID has been returned: EFalse if the ID was not set. +*/ +EXPORT_C TBool CPushMessage::GetPushId(TUint8& aPushID) const + { + if (iPushID) + { + aPushID=iPushID; + return ETrue; + } + return EFalse; + } + + +/** +Sets the PDU source allowed flag. + +@param aAllowed ETrue - push PDU source address is present in whitelist. + EFalse - push PDU is from an unknown origin. +*/ +EXPORT_C void CPushMessage::SetMessageAllowed(TBool aAllowed) + { + iAllowed = aAllowed; + } + + +/** +Gets the PDU source allowed flag. + +@return ETrue - push PDU source address is present in whitelist. + EFalse - push PDU is from an unknown origin. +*/ +EXPORT_C TBool CPushMessage::MessageAllowed() const + { + return iAllowed; + } + + + + + + + + + + + + + + +