--- a/obex/obexprotocol/obex/src/obexobjectexpandedbaseobject.cpp Tue Sep 28 20:14:08 2010 +0800
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2361 +0,0 @@
-// Copyright (c) 1997-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:
-//
-
-/**
- @file
- @internalComponent
-*/
-
-#include <obex.h>
-#include <obex/internal/obexinternalheader.h>
-#include <obex/internal/obexpacket.h>
-#include "logger.h"
-#include "OBEXUTIL.H"
-#include "obexheaderutil.h"
-
-IF_FLOGGING(_LIT8(KLogComponent, "obex");)
-
-/**
-Default constructor for ObexObjects
-@internalComponent
-*/
-CObexBaseObject::CObexBaseObject()
- {
- ResetHeaders();
- }
-
-/**
-Destructor.
-*/
-CObexBaseObject::~CObexBaseObject()
- {
- FLOG(_L("CObexBaseObject Destructor\r\n"));
- ResetHeaders();
- if (iObexHeader)
- {
- delete iObexHeader;
- }
-
- delete iHeaderSet;
- }
-
-/**
-Sets header mask to 1's (include all), but valid mask to 0's (none valid).
-Also reset progress indicators to avoid any un-initialised transfer attempts
-@internalComponent
-*/
-void CObexBaseObject::ResetHeaders()
- {
- iHeaderMask = 0xFFFF;
- iValidHeaders = 0x0000;
- iSendProgress = EError;
- iRecvProgress = EError;
- iRecvBytes = 0;
-
- if (iHttp)
- {
- iHttp->ResetAndDestroy();
- delete iHttp;
- iHttp = NULL;
- }
-
- // Here iHeaderSet can be NULL. This method is called in
- // CObexBaseObject::CObexBaseObject() that is called before the
- // derived class ConstructL() method. iHeaderSet is constructed in
- // CreateHeaderStorageDataL() called from ConstructL().
- // So, in the constructor it is always NULL.
- // This method is also called in CObexBaseObject::Reset() where iHeaderSet
- // will be valid.
-
- if (iHeaderSet)
- {
- iHeaderSet->SetMask(NULL);
- while (iHeaderSet->Count())
- {
- iHeaderSet->DeleteCurrentHeader();
- }
- }
- }
-
-/**
-@internalComponent
-*/
-void CObexBaseObject::CreateHeaderStorageDataL()
- {
- __ASSERT_DEBUG(!iHeaderSet, IrOBEXUtil::Panic(ENotNullPointer));
- iHeaderSet = CObexHeaderSet::NewL();
-
- if (iObexHeader == NULL)
- {
- iObexHeader = CObexHeader::NewL();
- }
- }
-
-/**
-Set the connection id.
-This method will check the headerset for a connectionId header. If one if located,
-then this will be modified for the new HV value. If not, a new connectionId header
-will be added.
-
-@param aFourByte The connectionID to be set
-@internalComponent
-*/
-void CObexBaseObject::SetConnectionIdL(TUint32 aFourByte)
- {
- FLOG(_L(">>CObexBaseObject::SetConnectionIdL"));
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EConnectionID, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetFourByte(TObexInternalHeader::EConnectionID, aFourByte);
-
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrConnectionID;
- iHeaderMask |= KObexHdrConnectionID;
-
- FLOG(_L("<<CObexBaseObject::SetConnectionIdL"));
- }
-
-/**
-Returns the connection ID.
-
-@return Returns KConnIDInvalid if no connectionID is set.
-@internalComponent
-*/
-TUint32 CObexBaseObject::ConnectionID()
- {
- if (iValidHeaders & KObexHdrConnectionID)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EConnectionID, *iObexHeader) == KErrNone)
- {
- return (iObexHeader->AsFourByte());
- }
- else
- {
- return KConnIDInvalid;
- }
- }
- else
- {
- return KConnIDInvalid;
- }
- }
-
-/**
-Sets the Name attribute of the object.
-
-The Name is used to identify the object to the remote machine (or to identify
-a received object). Note that in general, this is quite distinct from the
-CObexFileObject::DataFile() attribute, which specifies where the body of the
-object is stored.
-
-@param aDesc Name attribute
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetNameL (const TDesC& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EName, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetUnicodeL(TObexInternalHeader::EName, aDesc);
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrName;
- }
-
-/**
-Sets the Type attribute of the object.
-
-This should be in the form of a valid IANA media type (see http://www.iana.org/assignments/media-types/index.html).
-
-@param aDesc Type attribute
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetTypeL (const TDesC8& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- TInt len = aDesc.Length();
- // make sure length does not include any null terms
- while(len && aDesc[len - 1] == 0)
- {
- --len;
- };
- TPtrC8 src = aDesc.Left(len);
-
- //leave room for exactly one null term
- HBufC8* buf = HBufC8::NewL(src.Length() + 1);
- CleanupStack::PushL(buf);
- TPtr8 type(buf->Des());
- type.Copy(src);
- type.Append(0);
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EType, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetByteSeqL(TObexInternalHeader::EType, type);
-
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- CleanupStack::PopAndDestroy(buf);
-
- iValidHeaders |= KObexHdrType;
-
- }
-
-/**
-Sets the Length attribute of the object, in bytes.
-
-Note that this does not necessarily have to match the exact size of the body
-data, but is used to give an indication of the size to the receiving end.
-
-@param aLength Length attribute of the object
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetLengthL (const TUint32 aLength)
- {
- LOG_LINE
- LOG_FUNC
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ELength, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetFourByte(TObexInternalHeader::ELength, aLength);
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrLength;
- }
-
-/**
-Sets the Time attribute of the object (stored in UTC).
-
-@param aLocalTime Time attribute in local time
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetTimeL (const TTime aLocalTime)
- {
- LOG_LINE
- LOG_FUNC
-
- // Convert local time to UTC
- TTime utcTime(aLocalTime);
- utcTime -= User::UTCOffset();
- SetUtcTimeL(utcTime);
- }
-
-/**
-Sets the Time attribute of the object (stored in UTC).
-
-@param aUtcTime Time attribute in local time
-*/
-void CObexBaseObject::SetUtcTimeL (const TTime aUtcTime)
- {
- LOG_LINE
- LOG_FUNC
-
- TBuf<16> timebuf;
- aUtcTime.FormatL(timebuf, _L("%F%Y%M%DT%H%T%SZ"));
- TBuf8<16> narrowBuf;
- narrowBuf.Copy(timebuf);
- SetTimeHeaderL(narrowBuf);
-
- iValidHeaders |= KObexHdrTime;
- }
-
-/**
-Add a descriptor as the one and only Time header in an object.
-
-@param aTimeDes A narrow descriptor which will be stored in the object.
-*/
-void CObexBaseObject::SetTimeHeaderL(const TDesC8& aTimeDes)
- {
- LOG_LINE
- LOG_FUNC
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ETime, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetByteSeqL(TObexInternalHeader::ETime, aTimeDes);
-
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
- }
-
-/**
-Sets the Description attribute of the object.
-
-This is currently the easiest way to send proprietary information along with
-an object.
-
-@param aDesc Description attribute
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetDescriptionL (const TDesC& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EDescription, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetUnicodeL(TObexInternalHeader::EDescription, aDesc);
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrDescription;
- }
-
-/**
-Sets the Application Parameters attribute of the object.
-
- This is expected to be of the format Tag-Length-Value, but this is not enforced.
-
-@param aDesc Application Parameters attribute
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetAppParamL (const TDesC8& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- FLOG(_L("CObexBaseObject::SetAppParamL"));
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EAppParam, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetByteSeqL(TObexInternalHeader::EAppParam, aDesc);
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrAppParam;
- }
-
-/**
-Sets the Target attribute of the object.
-
-Generally, this will only have any useful meaning if the session Who attribute
-of the remote machine is recognised, and particularly, when connected to a
-strict peer (see CObex::IsStrictPeer()).
-
-@param aDesc Target attribute
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::SetTargetL (const TDesC8& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ETarget, *iObexHeader) == KErrNone)
- {
- iHeaderSet->DeleteCurrentHeader();
- }
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetByteSeqL(TObexInternalHeader::ETarget, aDesc);
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- iValidHeaders |= KObexHdrTarget;
- }
-
-/**
-Add an Http header.
-
-@param aDesc HTTP header to be added to the object's collection of HTTP headers
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::AddHttpL (const TDesC8& aDesc)
- {
- LOG_LINE
- LOG_FUNC
-
- CObexHeader* header = CObexHeader::NewL();
- CleanupStack::PushL(header);
- header->SetByteSeqL(TObexInternalHeader::EHttp, aDesc);
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(header));
- CleanupStack::Pop(header);
-
- if (!iHttp)
- {
- iHttp = new(ELeave) RPointerArray<HBufC8>(2);
- }
-
- HBufC8* buf = aDesc.AllocLC();
- LEAVEIFERRORL(iHttp->Append(buf));
- CleanupStack::Pop(buf);
-
- iValidHeaders |= KObexHdrHttp;
- }
-
-/**
-Adds a CObexHeader into the CObexHeaderSet
-
-@param aHeader A Pointer to a CObexHeader to be added to the CObexHeaderSet
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::AddHeaderL(CObexHeader& aHeader)
- {
- LOG_LINE
- LOG_FUNC
-
- if (aHeader.HI() == TObexInternalHeader::EHttp)
- {
- // Add the HTTP header into the iHttp array to keep old and new
- // http header storage consistent.
- //
- if (!iHttp)
- {
- iHttp = new(ELeave) RPointerArray<HBufC8>(2);
- }
-
- HBufC8* buf = (aHeader.AsByteSeq()).AllocLC();
- LEAVEIFERRORL(iHttp->Append(buf));
- CleanupStack::Pop();
-
- iValidHeaders |= KObexHdrHttp;
- }
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //Transfer ownership of pointer to CObexHeaderSet
- LEAVEIFERRORL(iHeaderSet->AddHeader(&aHeader));
-
- switch (aHeader.HI())
- {
- case (TObexInternalHeader::EName) :
- {
- iValidHeaders |= KObexHdrName;
- break;
- }
- case (TObexInternalHeader::EType) :
- {
- iValidHeaders |= KObexHdrType;
- break;
- }
- case (TObexInternalHeader::ETime) :
- {
- iValidHeaders |= KObexHdrTime;
- break;
- }
- case (TObexInternalHeader::EConnectionID) :
- {
- iValidHeaders |= KObexHdrConnectionID;
- break;
- }
- case (TObexInternalHeader::ELength) :
- {
- iValidHeaders |= KObexHdrLength;
- break;
- }
- case (TObexInternalHeader::EDescription) :
- {
- iValidHeaders |= KObexHdrDescription;
- break;
- }
- case (TObexInternalHeader::ECount) :
- {
- iValidHeaders |= KObexHdrCount;
- break;
- }
- case (TObexInternalHeader::EAppParam) :
- {
- iValidHeaders |= KObexHdrAppParam;
- break;
- }
- case (TObexInternalHeader::ETarget) :
- {
- iValidHeaders |= KObexHdrTarget;
- break;
- }
- case (TObexInternalHeader::ECreatorID) :
- {
- iValidHeaders |= KObexHdrCreatorID;
- break;
- }
- case (TObexInternalHeader::EWanUUID) :
- {
- iValidHeaders |= KObexHdrWanUUID;
- break;
- }
- case (TObexInternalHeader::EObjectClass) :
- {
- iValidHeaders |= KObexHdrObjectClass;
- break;
- }
- case (TObexInternalHeader::EEndOfBody) :
- {
- __ASSERT_ALWAYS(DataSize() == 0, IrOBEXUtil::Panic(EAddingInvalidEoBHeader));
- iValidHeaders |= KObexHdrEndOfBody;
- break;
- }
- default :
- {
- if ((aHeader.HI() & 0x30) != 0)
- {
- iValidHeaders |= KObexHdrUserDefined;
- }
- break;
- }
- }
- }
-
-/**
-Resets the object, to make it represent nothing.
-
-Call this before setting a CObexObject to represent a new object.
-
-@publishedAll
-@released
-*/
-EXPORT_C void CObexBaseObject::Reset()
- {
- LOG_LINE
- LOG_FUNC
-
- ResetHeaders();
- ResetData();
- }
-
-/**
-Makes a first level guess at setting the mime type from the
-file extension.
-
-This API is deprecated and may be removed at any time. For any production
-applications, the versit and the Application architecture (see
-RApaLsSession::RecognizeData) provide far more flexibilty and robustness.
-
-@deprecated 6.1
-@internalComponent
-*/
-void CObexBaseObject::GuessTypeFromExtL(const TDesC& aExt)
- {
- _LIT(KVcfType, ".vcf");
- _LIT(KVcsType, ".vcs");
- _LIT(KTxtType, ".txt");
- _LIT8(KVcard, "text/x-vCard");
- _LIT8(KVcalendar, "text/x-vCalendar");
- _LIT8(KTextPlain, "text/plain");
-
- iValidHeaders &= ~KObexHdrType; // Default, if no others match
- if(!aExt.CompareC(KVcfType))
- {
- SetTypeL(KVcard);
- return;
- }
- if(!aExt.CompareC(KVcsType))
- {
- SetTypeL(KVcalendar);
- return;
- }
- if(!aExt.CompareC(KTxtType))
- {
- SetTypeL(KTextPlain);
- return;
- }
- }
-
-/**
-Gets the object's Name attribute.
-
-@return Object's Name attribute or KNullDesC if it has not been set
-
-@publishedAll
-@released
-*/
-EXPORT_C const TDesC& CObexBaseObject::Name()
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrName)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a Name header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::EName, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as Unicode
- return (iObexHeader->AsUnicode());
- }
- else
- {
- return (KNullDesC);
- }
- }
- else
- {
- return (KNullDesC);
- }
- }
-
-/**
-Gets the object's Type attribute.
-
-@return Object's Type attribute or KNullDesC8 if it has not been set
-
-@publishedAll
-@released
-*/
-EXPORT_C const TDesC8& CObexBaseObject::Type()
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrType)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a Type header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::EType, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as ByteSequence
- return (iObexHeader->AsByteSeq());
- }
- else
- {
- return (KNullDesC8);
- }
- }
- else
- {
- return (KNullDesC8);
- }
- }
-
-/**
-Gets the object's Length attribute.
-
-Note this might not match the size of the file (if any) to transfer.
-
-@return Object's Length attribute or 0 if it has not been set
-
-@publishedAll
-@released
-*/
-EXPORT_C TUint32 CObexBaseObject::Length()
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrLength)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a Length header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::ELength, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as FourByte
- return (iObexHeader->AsFourByte());
- }
- else
- {
- return (0);
- }
- }
- else
- {
- return (0);
- }
- }
-
-/**
-Firstly updates the iHttp list, ensuring that the entries are
-the same as those HTTP headers within the header set.
-(The iHttp list could have contained old headers that were removed from
-the headerset using the DeleteMasked operation)
-Returns a pointer to the Http header array or null if no headers defined.
-@return A pointer to the Http header array or null if no headers defined
-
-@publishedAll
-@released
-**/
-EXPORT_C const RPointerArray<HBufC8>* CObexBaseObject::Http() const
- {
- LOG_LINE
- LOG_FUNC
-
- // if there are headers in the iHttp list
- if (iHttp && (iHttp->Count()))
- {
-
- TInt httpCount = 0;
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- TInt err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
- while (err == KErrNone)
- {
- httpCount++;
- err = iHeaderSet->Next();
- if (!err)
- {
- err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
- }
- }
-
- // check if number of HTTP in iHttp equals number in header set
- // NB. if equal then they must be the same headers due to the way that the
- // addition of HTTP headers has been implemented (ie. both AddHttpL and
- // AddHeader for Http, will update the iHTTP list, as well as HeaderSet)
- //
- if (httpCount != (iHttp->Count()))
- {
- // reset the header iterator to the start of the headerset
- iHeaderSet->First();
-
- TInt arrayIndex = 0;
-
- // search for an Http header in the headerset
- err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
-
- while (err == KErrNone)
- {
- //delete items from the iHttp list until an HTTP header with the same HV value
- //as the HTTP header in the headerset has been located.
- while ((iObexHeader->AsByteSeq()) != (((*iHttp)[arrayIndex])->Des()))
- {
- delete (*iHttp)[arrayIndex];
- (*iHttp).Remove(arrayIndex);
- }
-
- arrayIndex++;
-
- // search for an Http header in the headerset
- iHeaderSet->Next();
- err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
- }
-
- // if the number of HTTP headers in the headerset is different to the iHTTP count
- // then there must be some remaining headers at the end of the list, so remove
- // them
- while (httpCount < (iHttp->Count()))
- {
- delete (*iHttp)[arrayIndex];
- (*iHttp).Remove(arrayIndex);
- }
- }
-
- // if there are no elements in the iHttp list, delete the list and return NULL
- if (iHttp->Count() == 0)
- {
- if (iHttp)
- {
- iHttp->ResetAndDestroy();
- delete iHttp;
- iHttp = NULL;
- }
-
- return NULL;
- }
- else
- {
- //return the iHttp pointer
- return iHttp;
- }
- }
- else //iHttp && iHttp->Count
- {
- return NULL;
- }
- }
-
-/**
-Take time string specified in ISO8601 format and convert to a TTime
-@param aTime Time descriptor in ISO8601 format
-@param aResult Object to place resultant local time. Set to 0 if conversion fails.
-*/
-void ParseISO8601Time(const TDesC& aTimeDes, TTime& aResult)
- {
- LOG_STATIC_FUNC_ENTRY
- FLOG(_L8("Parsing ISO 8601 format time"));
-
- TInt yr, mn, dy, hr, mi, sc;
- TLex lex(aTimeDes);
- aResult = 0; // return TTime(0) by default
-
- // Get date components
- TUint num;
- if (lex.Val(num) != KErrNone)
- {
- FLOG(_L8("Date not found"));
- return;
- }
-
- dy = num % 100;
- num /= 100;
- mn = num % 100;
- num /= 100;
- yr = num;
-
- if (lex.Get() != 'T')
- {
- FLOG(_L8("Char 'T' not found"));
- return;
- }
-
- // Get time components
- if (lex.Val(num) != KErrNone)
- {
- FLOG(_L8("Time not found"));
- return;
- }
- sc = num % 100;
- num /= 100;
- mi = num % 100;
- num /= 100;
- hr = num;
-
- // Convert components into a TTime
- TDateTime dt;
- if (dt.Set(yr,TMonth(mn-1),(dy-1),hr,mi,sc,0) != KErrNone) // day and month are zero based in TDateTime::Set
- {
- FLOG(_L8("Failed to convert time"));
- return;
- }
- aResult = dt;
-
- // If time is in UTC, convert to local time
- if (lex.Get() == 'Z')
- {
- aResult += User::UTCOffset(); // includes any daylight saving correction
- }
- }
-
-/**
-Returns the time attribute of the object in local time.
-Returns TTime (0) if no valid time has been set.
-
-@return Object's Time attribute in local time or TTime(0) if it has not been set
-
-@publishedAll
-@released
-**/
-EXPORT_C const TTime CObexBaseObject::Time()
- {
- LOG_LINE
- LOG_FUNC
-
- TTime newTime = TTime(0);
-
- if (iValidHeaders & KObexHdrTime)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ETime, *iObexHeader) == KErrNone)
- {
- TBuf16<16> localbuf;
- localbuf.Copy(iObexHeader->AsByteSeq());
-
- ParseISO8601Time(localbuf, newTime);
- }
- }
- return newTime;
- }
-
-/**
-Gets the object's Description attribute.
-
-@return Object's Name attribute or KNullDesC if it has not been set
-
-@publishedAll
-@released
-*/
-EXPORT_C const TDesC& CObexBaseObject::Description()
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrDescription)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a Description header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::EDescription, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as Unicode
- return (iObexHeader->AsUnicode());
- }
- else
- {
- return (KNullDesC);
- }
- }
- else
- {
- return (KNullDesC);
- }
- }
-
-/**
-Gets the object's Application Parameters attribute
-
-This function does not parse the Application Parameters attribute into the
-expected Tag-Length-Value format.
-
-@return Object's Application Parameters attribute, or KNullDesC8 if none has been set
-
-@publishedAll
-@released
-*/
-EXPORT_C const TDesC8& CObexBaseObject::AppParam() const
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrAppParam)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a AppParam header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::EAppParam, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as ByteSeq
- return (iObexHeader->AsByteSeq());
- }
- else
- {
- return (KNullDesC8);
- }
- }
- else
- {
- return (KNullDesC8);
- }
- }
-
-/**
-Gets the object's Target attribute.
-
-@return Object's Target attribute or KNullDesC8 if it has not been set
-
-@publishedAll
-@released
-*/
-EXPORT_C const TDesC8& CObexBaseObject::Target()
- {
- LOG_LINE
- LOG_FUNC
-
- if (iValidHeaders & KObexHdrTarget)
- {
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- // search for a Target header in the headerset
- if (iHeaderSet->Find(TObexInternalHeader::ETarget, *iObexHeader) == KErrNone)
- {
- //header is found so return the HV as ByteSeq
- return (iObexHeader->AsByteSeq());
- }
- else
- {
- return (KNullDesC8);
- }
- }
- else
- {
- return (KNullDesC8);
- }
- }
-
-/**
-@publishedAll
-@released
-@return A const reference to the HeaderSet object used by this object.
-@see CObexHeaderSet
-*/
-EXPORT_C const CObexHeaderSet& CObexBaseObject::HeaderSet() const
- {
- LOG_LINE
- LOG_FUNC
-
- return *iHeaderSet;
- }
-
-/**
-@publishedAll
-@released
-@return A reference to the HeaderSet object used by this object.
-@see CObexHeaderSet
-*/
-EXPORT_C CObexHeaderSet& CObexBaseObject::HeaderSet()
- {
- LOG_LINE
- LOG_FUNC
-
- return *iHeaderSet;
- }
-
-/**
-Prepare the object for sending. Each packet sent will contain aOpcode.
-
-@param aOpcode
-@return KErrNone
-@internalComponent
-*/
-TInt CObexBaseObject::InitSend(TObexOpcode aOpcode)
- {
- FLOG(_L("CObexBaseObject::InitSend"));
-
- iSendHeaders = 0;
- iSendBytes = 0;
- iSendOpcode = aOpcode;
- iSendProgress = EContinue;
-
- return KErrNone;
- }
-
-/**
-Fill up the Connect command with the appropriate headers.
-
-@param aPacket The packet to be filled
-@internalComponent
-*/
-void CObexBaseObject::PrepareConnectionHeader(CObexPacket &aPacket)
- {
- FLOG(_L("CObexBaseObject::PrepareConnectionHeader\r\n"));
- TObexInternalHeader header;
-
- TObexHeaderMask remaininghdr = static_cast<TObexHeaderMask>(iValidHeaders & iHeaderMask);
- if(remaininghdr)
- {// ...there are some valid, unsent headers left to send.
- //the Target header should be sent first
- if(remaininghdr & KObexHdrTarget)
- {
- FLOG(_L("PrepareConnectionHeader - Preparing Target Header\r\n"));
-
- if ( Target() != KNullDesC8 )
- {
- header.Set(TObexInternalHeader::ETarget, (const_cast<TUint8*>(Target().Ptr())), Target().Size());
-
- if(aPacket.InsertData(header))
- {
- iSendHeaders |= KObexHdrTarget;
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- }
- }
- }
- }
- }
-
-/**
-Fill up aPacket with whatever is left to be sent of the object.
-Trys to get attribute headers out asap,
-and tacks as much of the data part of the object onto the end of each
-packet as will fit. Returned value goes to EComplete on the call *after*
-the final packet has been written(i.e. indicates nothing left to do).
-
-@param aPacket The packet to be filled
-@return Progress in writing out the object
-@internalComponent
-*/
-CObexBaseObject::TProgress CObexBaseObject::PrepareNextSendPacket(CObexPacket &aPacket)
- {
- FLOG(_L("CObexBaseObject::PrepareNextSendPacket\r\n"));
-
- // iHeaderSet is often dereferenced in this method. So it worth to check it
- // at the beginning
-
- __ASSERT_DEBUG(iHeaderSet, IrOBEXUtil::Panic(ENullPointer));
-
- if(iSendProgress == ELastPacket)
- {
- /*
- If the state was 'ELastPacket' as a result of the
- last call to this method, then the last packet will
- now have been sent!
- */
- iSendProgress = EComplete;
- }
-
- if(iSendProgress != EContinue)
- {
- FLOG(_L("PrepareNextSendPacket - immediate exit\r\n"));
- return(iSendProgress);
- }
-
- TObexInternalHeader header;
- aPacket.Init(iSendOpcode);
- TInt startspace = aPacket.RemainingInsertSpace();
-
- TObexHeaderMask remaininghdr = static_cast<TObexHeaderMask>(~iSendHeaders & iValidHeaders & iHeaderMask);
- TBool suppressDataHeader = EFalse;
- TBool firstHeader = ETrue;
- if(remaininghdr)
- {// ...there are some valid, unsent headers left to send.
- if(remaininghdr & KObexHdrTarget)
- {
- FLOG(_L("PrepareConnectionHeader - Preparing Target Header\r\n"));
-
- header.Set(TObexInternalHeader::ETarget, (const_cast<TUint8*> (Target().Ptr())), Target().Size());
- if(aPacket.InsertData(header))
- {
- iSendHeaders |= KObexHdrTarget;
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
-
- if (remaininghdr & KObexHdrConnectionID)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EConnectionID header\r\n"));
-
- TUint32 connID = ConnectionID();
- if ( connID != KConnIDInvalid )
- {
-
- TUint32 newConnectionID = connID;
- header.Set(TObexInternalHeader::EConnectionID, newConnectionID);
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrConnectionID;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrConnectionID;
- }
- }
-
- if(remaininghdr & KObexHdrName)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EName header\r\n"));
-
- header.Set(TObexInternalHeader::EName, Name());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrName;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
-
- if(remaininghdr & KObexHdrLength)
- {
- FLOG(_L("PrepareNextSendPacket - preparing ELength header\r\n"));
-
- header.Set(TObexInternalHeader::ELength, Length());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrLength;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- if(remaininghdr & KObexHdrType)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EType header\r\n"));
-
- header.Set(TObexInternalHeader::EType, (const_cast<TUint8*> (Type().Ptr())), Type().Size());
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrType;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
-
- if(remaininghdr & KObexHdrDescription)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EDescription header\r\n"));
-
- header.Set(TObexInternalHeader::EDescription, Description());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrDescription;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- if(remaininghdr & KObexHdrCount)
- {
- FLOG(_L("PrepareNextSendPacket - preparing ECount header\r\n"));
-
- if (iValidHeaders & KObexHdrCount)
- {
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ECount, *iObexHeader) == KErrNone)
- {
-
- TUint32 newCount = iObexHeader->AsFourByte();
- header.Set(TObexInternalHeader::ECount, newCount);
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrCount;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrCount;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrCount;
- }
- }
- if (remaininghdr & KObexHdrAppParam)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EAppParam header\r\n"));
-
- header.Set(TObexInternalHeader::EAppParam, (const_cast<TUint8*> (AppParam().Ptr())), AppParam().Size());
-
- if (aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrAppParam;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
-
- if (remaininghdr & KObexHdrHttp)
- {
- //no need to check iValidHeaders as if it is false then remaininghdr would be too.
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- TBool headerFound = EFalse;
- TUint headerFoundCount = 0;
- TUint headerHandledCount = 0;
-
- TInt err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
-
- while (err == KErrNone)
- {
- headerFoundCount++;
-
- if ( (!(iObexHeader->Attributes() & CObexHeader::ESent)) &&
- (!(iObexHeader->Attributes() & CObexHeader::ESuppressed)) )
- {
- //Unsent and Unsuppressed Http header had been found
- headerFound = ETrue;
-
- header.Set(TObexInternalHeader::EHttp, (const_cast<TUint8*> ((iObexHeader->AsByteSeq()).Ptr())), (iObexHeader->AsByteSeq()).Size());
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
- headerHandledCount++;
-
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- else if (firstHeader)
- {
- // Had problems inserting the first HTTP header, Set it to suppressed.
- // (this is also the first header in the packet, so we had the full
- // packet size available)
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESuppressed));
- headerHandledCount++;
- }
- }
- else
- {
- //Header has previously been sent/suppressed
- headerHandledCount++;
- }
-
- iHeaderSet->Next();
- err = iHeaderSet->Find(TObexInternalHeader::EHttp, *iObexHeader);
- }
-
- if (headerFoundCount == headerHandledCount)
- {
- //All HTTP headers have been sent (or suppressed)
- iSendHeaders |= KObexHdrHttp;
- }
-
- // an unsent http header cannot be found in headerset so set flag to invalid
- if (headerFound == EFalse)
- {
- iValidHeaders &= ~KObexHdrHttp;
- }
- }
-
- if(remaininghdr & KObexHdrCreatorID)
- {
- FLOG(_L("PrepareNextSendPacket - preparing ECreatorID header\r\n"));
-
- if (iValidHeaders & KObexHdrCreatorID)
- {
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ECreatorID, *iObexHeader) == KErrNone)
- {
- header.Set(TObexInternalHeader::ECreatorID, iObexHeader->AsFourByte());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
- iSendHeaders |= KObexHdrCreatorID;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrCreatorID;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrCreatorID;
- }
- }
-
- if(remaininghdr & KObexHdrWanUUID)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EWanUUID header\r\n"));
- if (iValidHeaders & KObexHdrWanUUID)
- {
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EWanUUID, *iObexHeader) == KErrNone)
- {
- header.Set(TObexInternalHeader::EWanUUID, (const_cast<TUint8*> ((iObexHeader->AsByteSeq()).Ptr())), (iObexHeader->AsByteSeq()).Size());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
- iSendHeaders |= KObexHdrWanUUID;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrWanUUID;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrWanUUID;
- }
- }
-
- if(remaininghdr & KObexHdrObjectClass)
- {
- FLOG(_L("PrepareNextSendPacket - preparing EObjectClass header\r\n"));
- if (iValidHeaders & KObexHdrObjectClass)
- {
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::EObjectClass, *iObexHeader) == KErrNone)
- {
- header.Set(TObexInternalHeader::EObjectClass, (const_cast<TUint8*> ((iObexHeader->AsByteSeq()).Ptr())), (iObexHeader->AsByteSeq()).Size());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrObjectClass;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrObjectClass;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrObjectClass;
- }
- }
- if (remaininghdr & KObexHdrUserDefined)
- {
- TBool headerFound = EFalse;
- TUint headerFoundCount = 0;
- TUint headerSentCount = 0;
- TInt err = 0;
-
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- for (TUint8 headerTypeIndex = TObexInternalHeader::EUnicode;
- headerTypeIndex <= TObexInternalHeader::E4Byte;)
- // NB. iterative step not included in this for loop, this is done at the end
- //of the for loop: moves headerTypeIndex to the next type
- {
-
- for (TUint8 headerNameIndex = KObexUserDefinedHdrAddrMin;
- headerNameIndex <= KObexUserDefinedHdrAddrMax; headerNameIndex++)
- {
- TUint8 localHI = static_cast<TUint8>(headerTypeIndex | headerNameIndex);
-
- iHeaderSet->First();
-
- err = iHeaderSet->Find(localHI, *iObexHeader);
-
- if (err == KErrNone)
- {
- headerFoundCount++;
-
- if ((iObexHeader->Attributes() & CObexHeader::ESent) == 0)
- {
- headerFound = ETrue;
-
- switch (headerTypeIndex)
- {
- case (TObexInternalHeader::EUnicode) :
- {
- header.Set(localHI, iObexHeader->AsUnicode());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- headerSentCount++;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
-
- break;
- }
- case (TObexInternalHeader::EByteSeq) :
- {
- header.Set(localHI, (const_cast<TUint8*> ((iObexHeader->AsByteSeq()).Ptr())), (iObexHeader->AsByteSeq()).Size());
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- headerSentCount++;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- break;
- }
- case (TObexInternalHeader::E1Byte) :
- {
- header.Set(localHI, iObexHeader->AsByte());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- headerSentCount++;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- break;
- }
- case (TObexInternalHeader::E4Byte) :
- {
- header.Set(localHI, iObexHeader->AsFourByte());
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- headerSentCount++;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- break;
- }
- default :
- {
- break;
- }
- }
- }
- else
- {
- //header has been previously sent.
- headerSentCount++;
- }
- }// header not found in headerset
-
- } //for loop: user defined header 'name' addresses
-
- // set the header type to the next
- //
- switch (headerTypeIndex)
- {
- case (TObexInternalHeader::EUnicode) :
- {
- headerTypeIndex = TObexInternalHeader::EByteSeq;
- break;
- }
- case (TObexInternalHeader::EByteSeq) :
- {
- headerTypeIndex = TObexInternalHeader::E1Byte;
- break;
- }
- case (TObexInternalHeader::E1Byte) :
- {
- headerTypeIndex = TObexInternalHeader::E4Byte;
- break;
- }
- case (TObexInternalHeader::E4Byte) :
- {
- headerTypeIndex++; // incrementing this past E4Byte will cause for loop to exit
- break;
- }
- default : {break;}
- }
- }//for loop: user defined header 'type' addresses
-
- if (headerFoundCount == headerSentCount)
- {
- //All User defined headers have been sent
- iSendHeaders |= KObexHdrUserDefined;
- }
-
- // an unsent user defined header cannot be found in headerset so set flag to invalid
- if (headerFound == EFalse)
- {
- iValidHeaders &= ~KObexHdrUserDefined;
- }
- }
-
- if(remaininghdr & KObexHdrTime)
- {// Must be last, due to Windows 2000 parse bug (see defect v3 EDNJKIN-4N4G7K)
- if (iValidHeaders & KObexHdrTime)
- {
- FLOG(_L("PrepareNextSendPacket - preparing ETime header\r\n"));
- //reset the mask so all headers are searched
- //NB. SetMask sets the iterator at the start of the headerset
- iHeaderSet->SetMask(NULL);
-
- if (iHeaderSet->Find(TObexInternalHeader::ETime, *iObexHeader) == KErrNone)
- {
- header.Set(TObexInternalHeader::ETime, (const_cast<TUint8*> ((iObexHeader->AsByteSeq()).Ptr())), (iObexHeader->AsByteSeq()).Size());
- if(aPacket.InsertData(header))
- {
- //set that a header has been added to this current packet
- iSendHeaders |= KObexHdrTime;
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- suppressDataHeader = ETrue; // Win2000 Bug work-aroung
- firstHeader = EFalse;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrTime;
- }
- }
- else
- {
- iValidHeaders &= ~KObexHdrTime;
- }
- }
-
- remaininghdr = STATIC_CAST(TObexHeaderMask, ~iSendHeaders & iValidHeaders & iHeaderMask);
-
- // Only add EoB if there is no other remaining headers
- if (remaininghdr == KObexHdrEndOfBody)
- {
- //EoB can only be added in Empty objects.
- __ASSERT_ALWAYS(DataSize() == 0, IrOBEXUtil::Panic(EAddingInvalidEoBHeader));
- header.SetHI(TObexInternalHeader::EEndOfBody);
-
- if(aPacket.InsertData(header))
- {
- iObexHeader->SetAttributes(static_cast<TUint16>(iObexHeader->Attributes() | CObexHeader::ESent));
-
- iSendHeaders |= KObexHdrEndOfBody;
- //set that a header has been added to this current packet
- firstHeader = EFalse;
- }
- else if(aPacket.RemainingInsertSpace() != startspace) //something has been added
- {
- //There is no enough space for EOB this round, try again next time
- return EContinue;
- }
- //else if nothing has been added, EError will be returned
- remaininghdr = STATIC_CAST(TObexHeaderMask, ~iSendHeaders & iValidHeaders & iHeaderMask);
- }
- }
-
- TInt dataspace = aPacket.RemainingInsertSpace() - KObexHeaderHILongSize;
- TInt remainingdata = DataSize() - iSendBytes;
- if(dataspace > 0 && remainingdata > 0 && !suppressDataHeader)
- {// ...there's some room for data and we haven't sent it all, and we're allowed to add some
- FLOG(_L("PrepareNextSendPacket - preparing some additional data\r\n"));
- TPtr8 bufptr(NULL, 0);
- if(remainingdata <= dataspace)
- {
- header.SetDeferred(TObexInternalHeader::EEndOfBody, &bufptr, remainingdata, remainingdata);
- }
- else
- {
- header.SetDeferred(TObexInternalHeader::EBody, &bufptr, 1, remainingdata - 1);
- }
- if(!aPacket.InsertData(header))
- {
- return(iSendProgress = EError);
- }
- else
- {// Data header inserted, now load it up with data...
- GetData(iSendBytes, bufptr);
- if(bufptr.Length() < bufptr.MaxLength())
- return(iSendProgress = EError);
- iSendBytes += bufptr.Length();
- remainingdata -= bufptr.Length();
- }
- }
-
- if(!(remaininghdr || remainingdata > 0))
- {// Check whether all(valid) headers and data will have been sent
- iSendProgress = ELastPacket;
-
- FLOG(_L("PrepareNextSendPacket - All headers packaged setting Final Bit\r\n"));
- aPacket.SetFinal();
- }
- else if(aPacket.RemainingInsertSpace() == startspace)
- {
- // There are pending header or data but we inserted nothing!
- // Some header isn't fitting into the packets provided.
- FLOG(_L("PrepareNextSendPacket - nothing was actually inserted\r\n"));
- iSendProgress = EError;
- }
-
- return(iSendProgress);
- }
-
-/**
-Prepare the object for receiving into.
-@internalComponent
-*/
-TInt CObexBaseObject::InitReceive()
- {
- FLOG(_L("CObexBaseObject::InitReceive\r\n"));
-
- // Always clear the object out before allowing it to receive anything
- Reset();
- iRecvBytes = 0;
- iRecvProgress = EContinue;
- return(KErrNone);
- }
-
-/**
-Parse the passed packet, consuming headers into this object as appropriate.
-The returned progress can not be relied upon to indicate completion, because
-that is actually signalled at a diferent level, depending on the source of
-the packet(final bit or server complete response). Returning EComplete
-simply indicates that all of the object body has been received.
-
-@param aPacket The packet to extract the headers from
-
-@return The progress of header extraction
-@internalComponent
-*/
-CObexBaseObject::TProgress CObexBaseObject::ParseNextReceivePacket(CObexPacket &aPacket)
- {
- iLastError = ERespInternalError;
- FLOG(_L("CObexBaseObject::ParseNextReceivePacket\r\n"));
-
- if(iRecvProgress != EContinue && iRecvProgress != EComplete)
- {
- FLOG(_L("CObexBaseObject::ParseNextReceivePacket Error!!! Exiting\r\n"));
- return(iSendProgress);
- }
- TObexInternalHeader header;
-
- while(aPacket.ExtractData(header))
- {
- switch(header.HI())
- {
- case TObexInternalHeader::EConnectionID:
- {
- if ( iHeaderMask & KObexHdrConnectionID )
- {
- FLOG(_L("ParseNextReceivePacket extracting CONNECTIONID\r\n"));
-
- iValidHeaders &= ~KObexHdrConnectionID;
-
- TRAPD(err, SetConnectionIdL(header.HVInt()));
-
- if (err)
- {
- return EError;
- }
- }
- }
- break;
- case TObexInternalHeader::EAppParam:
- {
- if ( iHeaderMask & KObexHdrAppParam )
- {
- FLOG(_L("ParseNextReceivePacket extracting APPPARAM\r\n"));
- iValidHeaders &= ~KObexHdrAppParam;
-
-
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
- TRAPD(err, SetAppParamL(src));
- if (err)
- {
- return EError;
- }
-
- iValidHeaders |= KObexHdrAppParam;
- }
- }
- break;
- case TObexInternalHeader::EHttp:
- {
- FLOG(_L("ParseNextReceivePacket extracting Http\r\n"));
-
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
-
- TRAPD(err, AddHttpL(src));
-
- if (err)
- {
- return EError;
- }
- }
- break;
- case TObexInternalHeader::EName:
- {
- if(iHeaderMask & KObexHdrName)
- {
- FLOG(_L("ParseNextReceivePacket Extracting NAME"));
- iValidHeaders &= ~KObexHdrName;
-
- HBufC* newHeader = HBufC::New(header.HVSize());
- if (!newHeader)
- {
- return EError;
- }
- //else
- TPtr ptr(newHeader->Des());
-
- TInt err = KErrNone;
-
- if(header.GetHVText(ptr) == KErrNone)
- {
- TRAP(err, SetNameL(*newHeader));
- }
- delete newHeader;
- newHeader = NULL;
-
- if (err)
- {
- return EError;
- }
- }
-
- }
- break;
- case TObexInternalHeader::EType:
- {
- if(iHeaderMask & KObexHdrType)
- {
- FLOG(_L("ParseNextReceivePacket extracting TYPE\r\n"));
- iValidHeaders &= ~KObexHdrType;
-
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
- // use SetTypeL(), to ensure null terms are handled correctly
- TRAPD(err, SetTypeL(src));
- if (err)
- {
- return EError;
- }
-
- FLOG(_L("ParseNextReceivePacket extracting TYPE\r\n"));
- }
- }
- break;
- case TObexInternalHeader::ELength:
- {
- if(iHeaderMask & KObexHdrLength)
- {
- FLOG(_L("ParseNextReceivePacket extracting LENGTH\r\n"));
- TRAPD(err, SetLengthL(header.HVInt()));
-
- if (err)
- {
- return EError;
- }
-
- iValidHeaders |= KObexHdrLength;
- }
- }
- break;
- case TObexInternalHeader::ETime:// Time is ISO 8601 format byte sequence.
- {
- if(iHeaderMask & KObexHdrTime)
- {
- FLOG(_L("ParseNextReceivePacket extracting TIME in ISO 8601 format\r\n"));
- TInt err = KErrGeneral;
- TTime time;
-
- // Use Win2k's incorrect TIME format header to calculate the size required.
- // 2k inserts incorrect padding and uses Unicode format. Allow a little extra
- // just in case. (Currently this should be 48 bytes)
- static const TInt KMaxTIMESize = sizeof("yyyy.mm.ddThh:mm:ssZ") * 2 + 6;
- TBuf<KMaxTIMESize> timebuf;
-
- if(header.GetHVText(timebuf) == KErrNone && timebuf.LocateF('t') >= 0)
- {
- // Win2k sends an invalid TIME header, inserting unicode into a ByteSeq
- // header, and inserting . and : characters between fields. So copy char
- // by char, ignoring invalid characters.
- TBuf8<16> narrowTime;
-#ifdef _DEBUG
- TBool changed = EFalse;
-#endif
- for (TInt copyByte = 0; copyByte <= timebuf.Length()-1; copyByte++)
- {
- TChar chr(timebuf[copyByte]);
- if (chr && (chr != 0x2e /* . */) && (chr != 0x3a /* : */))
- {
- if (narrowTime.Length() < narrowTime.MaxLength())
- {
- narrowTime.Append(chr);
- }
- }
-#ifdef _DEBUG
- else
- {
- changed = ETrue;
- }
-#endif
- }
-
- // As we've mangled the header, output a log entry just in case...
- FTRACE(if (changed) FLOG(_L(" - Windows non-compliant time header detected and converted")));
-
- TRAP(err, SetTimeHeaderL(narrowTime));
- }
-
- if(err)
- {
- // Adding TIME header to object failed (out of memory?).
- FLOG(_L("ParseNextReceivePacket extracting TIME in ISO 8601 format failed"));
-
- // if adding TIME header to object failed, the header is ignored and the packet accepted
- iValidHeaders &= ~KObexHdrTime;
- }
- else
- {
- // Adding TIME header succeeded, make a note.
- iValidHeaders |= KObexHdrTime;
- }
- }
- }
- break;
- case KFourByteTimeHeaderAddress : // Time is no. of secs since 1/1/1970
- if (iHeaderMask & KObexHdrTime)
- {
- FLOG(_L("ParseNextReceivePacket extracting TIME in secs since 1/1/1970"));
- TTimeIntervalSeconds secs = header.HVInt();
- TRAPD(err, SetTimeL(TTime(TDateTime(1970, EJanuary, 0, 0, 0, 0, 0)) + secs));
-
- if(err)
- {
- return EError;
- }
-
- iValidHeaders |= KObexHdrTime;
- }
- break;
- case TObexInternalHeader::EDescription:
- {
- if(iHeaderMask & KObexHdrDescription)
- {
- FLOG(_L("ParseNextReceivePacket extracting DESCRIPTION\r\n"));
- iValidHeaders &= ~KObexHdrDescription;
-
- HBufC* newHeader = HBufC::New(header.HVSize());
- if (!newHeader)
- {
- return EError;
- }
- //else
- TPtr ptr(newHeader->Des());
-
- TInt err = KErrNone;
-
- if(header.GetHVText(ptr) == KErrNone)
- {
- TRAP(err, SetDescriptionL(*newHeader));
- }
- delete newHeader;
- newHeader = NULL;
-
- if (err)
- {
- return EError;
- }
- }
- }
- break;
- case TObexInternalHeader::ECount:
- {
- if(iHeaderMask & KObexHdrCount)
- {
- FLOG(_L("ParseNextReceivePacket extracting Count\r\n"));
-
- CObexHeader* newHeader = NULL;
- TRAPD( err, newHeader = CObexHeader::NewL());
- if (err)
- {
- return EError;
- }
- newHeader->SetFourByte(TObexInternalHeader::ECount, header.HVInt());
-
- //Transfer ownership of pointer to CObexHeaderSet
- err = iHeaderSet->AddHeader(newHeader);
- if (err)
- {
- delete newHeader;
- newHeader = NULL;
- return EError;
- }
- iValidHeaders |= KObexHdrCount;
- }
- }
- break;
- case TObexInternalHeader::ETarget:
- {
- if(iHeaderMask & KObexHdrTarget)
- {
- FLOG(_L("ParseNextReceivePacket extracting TARGET\r\n"));
- iValidHeaders &= ~KObexHdrTarget;
-
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
- TRAPD(err, SetTargetL(src));
- if (err)
- {
- return EError;
- }
- }
- }
- break;
- case TObexInternalHeader::ECreatorID:
- {
- if(iHeaderMask & KObexHdrCreatorID)
- {
- FLOG(_L("ParseNextReceivePacket Extracting CreatorID header"));
-
- CObexHeader* fourByteHeader = NULL;
- TRAPD( err, fourByteHeader = CObexHeader::NewL());
- if (err)
- {
- return EError;
- }
- fourByteHeader->SetFourByte(TObexInternalHeader::ECreatorID, header.HVInt());
- //Transfer ownership of pointer to CObexHeaderSet
- err = iHeaderSet->AddHeader(fourByteHeader);
- if (err)
- {
- delete fourByteHeader;
- fourByteHeader = NULL;
- return EError;
- }
- iValidHeaders |= KObexHdrCreatorID;
- }
- }
- break;
- case TObexInternalHeader::EWanUUID:
- {
- if(iHeaderMask & KObexHdrWanUUID)
- {
- FLOG(_L("ParseNextReceivePacket Extracting WanUUID header"));
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
-
- CObexHeader* byteseqHeader = NULL;
-
- byteseqHeader = IrOBEXHeaderUtil::CreateAndSetByteSeqHeader(TObexInternalHeader::EWanUUID, src);
- if (!byteseqHeader)
- {
- return EError;
- }
-
- //Transfer ownership of pointer to CObexHeaderSet
- TInt err = iHeaderSet->AddHeader(byteseqHeader);
- if (err)
- {
- delete byteseqHeader;
- byteseqHeader = NULL;
- return EError;
- }
-
- iValidHeaders |= KObexHdrWanUUID;
- }
- }
- break;
- case TObexInternalHeader::EObjectClass:
- {
- if(iHeaderMask & KObexHdrObjectClass)
- {
- FLOG(_L("ParseNextReceivePacket Extracting WanUUID header"));
- TPtrC8 src(header.HVByteSeq(), header.HVSize());
-
- CObexHeader* byteseqHeader = NULL;
-
- byteseqHeader = IrOBEXHeaderUtil::CreateAndSetByteSeqHeader(TObexInternalHeader::EObjectClass, src);
- if (!byteseqHeader)
- {
- return EError;
- }
-
- //Transfer ownership of pointer to CObexHeaderSet
- TInt err = iHeaderSet->AddHeader(byteseqHeader);
- if (err)
- {
- delete byteseqHeader;
- byteseqHeader = NULL;
- return EError;
- }
-
- iValidHeaders |= KObexHdrObjectClass;
- }
- }
- break;
- case TObexInternalHeader::EBody:
- iValidHeaders |= KObexHdrBody;
- //Fall-through
- case TObexInternalHeader::EEndOfBody:
- {
- FLOG(_L("ParseNextReceivePacket extracting BODY\r\n"));
- TPtr8 ptr(header.HVByteSeq(), header.HVSize(), header.HVSize());
-
- if(header.HI() == TObexInternalHeader::EEndOfBody)
- {// Body finished, there _could_ still be more headers, however...
- iValidHeaders |= KObexHdrEndOfBody;
- FLOG(_L("ParseNextReceivePacket extracting ENDOFBODY\r\n"));
- iRecvProgress = EComplete;
- }
-
- NewData(iRecvBytes, ptr);
- if(ptr.Length() < header.HVSize())
- {
- return(iRecvProgress = EError);
- }
- iRecvBytes += ptr.Length();
- }
- break;
- case TObexInternalHeader::EAuthChallenge:
- {
- iLastError = ERespUnauthorized;
- return EError;
- }
- default:
- {
- // Non Standard header received so check for user defined header
- // NB. All user defined headers are in range 0x30..0x3F
-
- if ((iHeaderMask & KObexHdrUserDefined) &&
- ((header.HI() & 0x30) != 0))
- {
- FLOG(_L("ParseNextReceivePacket Extracting User Defined Unicode header"));
- if( IrOBEXHeaderUtil::ParseHeader(header, *iHeaderSet) == KErrNone)
- {
- iValidHeaders |= KObexHdrUserDefined;
- }
- else
- {
- return EError;
- }
- }
-
- } // End of default
-
- } // End of header type switch
- } // End of while
-
- return(iRecvProgress);
- }
-
-/**
-Returns the Obex Error response code from the last call to CObexBaseObject::ParseNextReceivePacket
-
-@return The Obex Response code
-@internalComponent
-*/
-
-TObexResponse CObexBaseObject::GetLastError() const
- {
- return iLastError;
- }
-
-/**
-Sets the header mask. aHeaderMask is built up by bit-wise ‘or’ing any of
-the KObexHdr... constants.
-For example, if it is set to KObexHdrName | KObexHdrLength, only
-these two headers will be specified in transfer operations with the remote
-machine, even if there are other valid attributes which could be used. In
-effect, this mask is bit-wise ‘and’ed with the "valid headers" mask when
-determining which headers are valid for the purposes of transfers.
-
-@param aHeaderMask: the header mask to be set
-
-@publishedAll
-@released
-**/
-EXPORT_C void CObexBaseObject::SetHeaderMask(const TObexHeaderMask aHeaderMask)
- {
- LOG_LINE
- LOG_FUNC
-
- iHeaderMask=aHeaderMask;
- }
-
-/**
-Returns the number of bytes of the body of the object transferred so far
-while sending this object.
-
-@return The number of bytes sent
-
-@publishedAll
-@released
-**/
-EXPORT_C TInt CObexBaseObject::BytesSent()
- {
- LOG_LINE
- LOG_FUNC
-
- return(iSendBytes);
- }
-
-/**
-Returns the number of bytes of the body of the object transferred while
-receiving an object.
-
-@return The number of bytes received
-@publishedAll
-@released
-*/
-EXPORT_C TInt CObexBaseObject::BytesReceived()
- {
- LOG_LINE
- LOG_FUNC
-
- return(iRecvBytes);
- }
-
-/**
-Returns the currently set header mask. This defaults to 0xFF (i.e. allow
-everything) when Reset () or InitFromFileL is called. This does not specify
-which headers currently contain valid data--merely which headers will be
-transferred if they do contain valid data.
-
-@return The currently set header mask
-@publishedAll
-@released
-*/
-EXPORT_C TObexHeaderMask CObexBaseObject::HeaderMask()
- {
- LOG_LINE
- LOG_FUNC
-
- return iHeaderMask;
- }
-
-/**
-Returns the current valid header mask. This allows inspection of the current
-set of valid headers, particularly useful for determining whether a put
-object contained a body header (important for deleting files as part of file
-transfer).
-
-@return The current valid header mask
-@publishedAll
-@released
-*/
-EXPORT_C TObexHeaderMask CObexBaseObject::ValidHeaders()
- {
- LOG_LINE
- LOG_FUNC
-
- return iValidHeaders;
- }