// 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:
//
#include "TOBEXCON.H"
#include "obexconstantsinternal.h"
//reference object constants
_LIT8(KAlphabet, "abcdefghijklmnopqrstuvwxyz");
_LIT8(KRefType, "text/plain");
_LIT8(KRefRichTextType, "text/richtext");
_LIT8(KRefImageJpegType, "image/jpeg");
_LIT8(KRefIrMCTarget, "IRMC-SYNC");
_LIT8(KRefSyncMLTarget, "SYNCML-SYNC");
CReferenceHandler* CReferenceHandler::NewL()
{
CReferenceHandler* self = new (ELeave) CReferenceHandler();
return self;
}
CReferenceHandler::CReferenceHandler()
{
}
CReferenceHandler::~CReferenceHandler()
{
}
void CReferenceHandler::CreateReferenceL(CObexBufObject& aObject, CBufFlat& aObjectBuf, TInt aReferenceId, TTransport aTransport)
{
switch (aReferenceId)
{
case (1) :
CreateReferenceObject1L(aObject,aObjectBuf,aTransport);
break;
case (2) :
CreateReferenceObject2L(aObject,aObjectBuf,aTransport);
break;
case (3) :
CreateReferenceObject3L(aObject,aObjectBuf,aTransport);
break;
case (4) :
CreateReferenceObject4L(aObject,aObjectBuf,aTransport);
break;
case (5) :
CreateReferenceObject5L(aObject,aObjectBuf,aTransport);
break;
case (6) :
CreateReferenceObject6L(aObject,aObjectBuf,aTransport);
break;
case (7) :
CreateReferenceObject7L(aObject,aObjectBuf,aTransport);
break;
case (8) :
CreateReferenceObject8L(aObject,aObjectBuf,aTransport);
break;
case (9) :
CreateReferenceObject9L(aObject,aObjectBuf,aTransport);
break;
case (10) :
CreateReferenceObject10L(aObject,aObjectBuf,aTransport);
break;
default :
CreateReferenceObject1L(aObject,aObjectBuf,aTransport);
break;
}
}
void CReferenceHandler::CreateReferenceObject1L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 2;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef2Name); // check the deletecurrentheader method
aObject.SetNameL(KRef1Name);
_LIT8(KRef1HTTP, "Accept: text/*");
_LIT8(KRef2HTTP, "Location: http://www.w3.org");
_LIT8(KRef3HTTP, "Date: Tue, 10 Nov 2002 09:17:21 GMT");
// add Http header using old API
//
/* aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
// USE THE HEADER MASK TO REMOVE HTTP HEADERS FROM HEADERSET
// THIS DOES NOT REMOVE THE ITEMS FROM iHttp LIST - this tests
// the Http() function which should remove items from iHttp list
//
TObexMatchHeader* headerMask = new(ELeave) TObexMatchHeader;
headerMask->SetHeader(TObexInternalHeader::EName);
aObject.HeaderSet().SetMask(headerMask);
aObject.HeaderSet().DeleteMasked();
aObject.HeaderSet().SetMask(NULL);
delete headerMask;
*/
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
/* if (aObject.Http())
{
NULL;
}
*/
// add a Count header using new API
//
CObexHeader* tempheader = CObexHeader::NewL();
CleanupStack::PushL(tempheader);
tempheader->SetFourByte(TObexInternalHeader::ECount, 0xFE22FF54);
aObject.AddHeaderL(*tempheader);
CleanupStack::Pop(tempheader);
// add an Http header using new API
//
tempheader = CObexHeader::NewL();
CleanupStack::PushL(tempheader);
tempheader->SetByteSeqL(TObexInternalHeader::EHttp, KRef1HTTP);
aObject.AddHeaderL(*tempheader);
CleanupStack::Pop(tempheader);
aObject.SetTypeL(KRefType);
// set again to check header update functionality
aObject.SetTypeL(KRefType);
aObject.SetLengthL(aObjectBuf.Size());
// set again to check header update functionality
aObject.SetLengthL(aObjectBuf.Size());
TBuf8<40> param;
param.Copy(_L("\x04"));
param.Append(_L("\x03"));
param.Append(_L("App params 123"));
aObject.SetAppParamL(param);
// set again to check header update functionality
aObject.SetAppParamL(param);
const TTime KRef1Time = TDateTime(2003, EApril, 29, 10, 10, 10, 0);
aObject.SetTimeL(KRef1Time);
// set again to check header update functionality
aObject.SetTimeL(KRef1Time);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
// set again to check header update functionality
aObject.SetDescriptionL(ptr);
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefTarget);
// set again to check header update functionality
aObject.SetTargetL(KRefTarget);
CObexHeader* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x30, KRef1Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(TObexInternalHeader::ECreatorID, 0x5F3A2343);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x36, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByteSeqL(TObexInternalHeader::EWanUUID, KRefTarget);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x3F, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xB0, 0x03);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBF, 0x12);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBE, 0x12);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xF0, 0x54545454);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
// THIS NEXT HEADER IS A NEGATIVE TEST. It should cause a panic
// 0x2F header doesnt have a FourByte HI Type.
/* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0x2F, 0x54);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
*/
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xFF, 0x00111243);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByteSeqL(0x73, KRefTarget);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByteSeqL(TObexInternalHeader::EObjectClass, KRefTarget);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
aObject.SetHeaderMask(KObexHdrName |KObexHdrType | KObexHdrLength | KObexHdrTime | KObexHdrDescription | KObexHdrTarget | KObexHdrHttp | KObexHdrCount | KObexHdrAppParam | KObexHdrUserDefined | KObexHdrObjectClass | KObexHdrWanUUID | KObexHdrCreatorID);
}
void CReferenceHandler::CreateReferenceObject2L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfObjects = 2;
aObjectBuf.ResizeL(KNumOfObjects * 20);
//populate the buffer...
_LIT8(KRefDesc2, "*Reference Object 2*");
TUint i;
for (i=0; i<KNumOfObjects; i++)
{
aObjectBuf.Write(20*i, KRefDesc2);
}
//populate the object
aObject.SetNameL(KRef2Name);
aObject.SetTypeL(KRefType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef2Time = TDateTime(2002, EJanuary, 0, 0, 0, 0, 0);
aObject.SetTimeL(KRef2Time);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefIrMCTarget);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrLength | KObexHdrTime | KObexHdrDescription | KObexHdrTarget);
}
void CReferenceHandler::CreateReferenceObject3L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 1000;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef3Name);
aObject.SetTypeL(KRefRichTextType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef3Time = TDateTime(2002, EJanuary, 0, 0, 0, 0, 0);
aObject.SetTimeL(KRef3Time);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefTarget);
CObexHeader* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x30, KRef1Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x36, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x3F, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xB0, 0x03);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBF, 0x12);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xF0, 0x54);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
// THIS NEXT HEADER IS A NEGATIVE TEST. It should cause a panic
// 0x2F header doesnt have a FourByte HI Type.
/* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0x2F, 0x54);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
*/
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xFF, 0x43);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByteSeqL(0x73, KRefTarget);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrLength | KObexHdrTime | KObexHdrDescription | KObexHdrTarget | KObexHdrUserDefined);
}
void CReferenceHandler::CreateReferenceObject4L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 200;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef4Name);
aObject.SetLengthL(aObjectBuf.Size());
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefTarget);
TBuf8<40> param;
param.Copy(_L("\x04"));
param.Append(_L("\x03"));
param.Append(_L("App params 456"));
aObject.SetAppParamL(param);
aObject.SetHeaderMask(KObexHdrName | KObexHdrLength | KObexHdrDescription | KObexHdrTarget | KObexHdrAppParam);
}
void CReferenceHandler::CreateReferenceObject5L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 200;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef5Name);
aObject.SetTypeL(KRefImageJpegType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef5Time = TDateTime(2001, EFebruary, 14, 15, 38, 24, 0);//set time to 15:38:24.0 on 14th Feb 2001 - obex doesn't transfer microseconds!!
aObject.SetTimeL(KRef5Time);
_LIT8(KRef1HTTP, "Accept: text/*");
_LIT8(KRef2HTTP, "Location: http://www.w3.org");
_LIT8(KRef3HTTP, "Date: Tue, 10 Nov 2002 09:17:21 GMT");
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefTarget);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrTime | KObexHdrLength | KObexHdrTime | KObexHdrDescription | KObexHdrHttp | KObexHdrTarget);
}
void CReferenceHandler::CreateReferenceObject6L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 200;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef6Name);
aObject.SetTypeL(KRefImageJpegType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef5Time = TDateTime(2001, EFebruary, 14, 15, 38, 24, 0);//set time to 15:38:24.0 on 14th Feb 2001 - obex doesn't transfer microseconds!!
aObject.SetTimeL(KRef5Time);
_LIT8(KRef1HTTP, "Accept: text/*");
_LIT8(KRef2HTTP, "Location: http://www.w3.org");
_LIT8(KRef3HTTP, "Date: Tue, 10 Nov 2002 09:17:21 GMT");
/*
TObexMatchHeader* headerMask = new(ELeave) TObexMatchHeader;
headerMask->SetHeader(TObexInternalHeader::EName);
aObject.HeaderSet().SetMask(headerMask);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef3HTTP);
if (aObject.Http())
{
NULL;
}
aObject.HeaderSet().SetMask(headerMask);
aObject.HeaderSet().DeleteMasked();
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef3HTTP);
if (aObject.Http())
{
NULL;
}
aObject.HeaderSet().SetMask(headerMask);
aObject.HeaderSet().DeleteMasked();
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef3HTTP);
if (aObject.Http())
{
NULL;
}
aObject.HeaderSet().SetMask(headerMask);
aObject.HeaderSet().DeleteMasked();
delete headerMask;
*/
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef2HTTP);
/*
if (aObject.Http())
{
NULL;
}
aObject.HeaderSet().SetMask(NULL);
*/
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
/* ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
*/ CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefTarget);
CObexHeader* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x30, KRef1Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x36, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetUnicodeL(0x3F, KRef5Name);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xB0, 0x03);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBF, 0x12);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xF0, 0x54);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
// THIS NEXT HEADER IS A NEGATIVE TEST. It should cause a panic
// 0x2F header doesnt have a FourByte HI Type.
/* header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0x2F, 0x54);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
*/
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetFourByte(0xFF, 0x43);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByteSeqL(0x73, KRefTarget);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrTime | KObexHdrLength | KObexHdrHttp | KObexHdrTarget | KObexHdrUserDefined );
}
void CReferenceHandler::CreateReferenceObject7L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 200;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef7Name);
aObject.SetTypeL(KRefImageJpegType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef5Time = TDateTime(2001, EFebruary, 14, 15, 38, 24, 0);//set time to 15:38:24.0 on 14th Feb 2001 - obex doesn't transfer microseconds!!
aObject.SetTimeL(KRef5Time);
_LIT8(KRef1HTTP, "Accept: text/*");
_LIT8(KRef2HTTP, "Location: http://www.w3.org");
_LIT8(KRef3HTTP, "Date: Tue, 10 Nov 2002 09:17:21 GMT");
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
/* ASSERT(descBuf);
TPtr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
*/
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefSyncMLTarget);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrTime | KObexHdrLength | KObexHdrHttp | KObexHdrTarget);
}
void CReferenceHandler::CreateReferenceObject8L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 200;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef8Name);
aObject.SetTypeL(KRefType);
const TTime KRef10Time = TDateTime(2005, EJanuary, 17, 14, 35, 30, 0);
aObject.SetTimeL(KRef10Time);
aObject.SetTargetL(KRefIrMCTarget);
TBuf8<40> param;
param.Copy(_L("\x04"));
param.Append(_L("\x03"));
param.Append(_L("PARAM 435"));
aObject.SetAppParamL(param);
_LIT8(KRef1HTTP, "Accept: text/*");
aObject.AddHttpL(KRef1HTTP);
CObexHeader* header = CObexHeader::NewL();
CleanupStack::PushL(header);
_LIT(KUserDefUnicode2, "UserDef2");
header->SetUnicodeL(0x34, KUserDefUnicode2);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBC, 0x23);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
/* ASSERT(descBuf);
Ptr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
*/
CleanupStack::PopAndDestroy(descBuf);
aObject.SetHeaderMask(KObexHdrName | KObexHdrType | KObexHdrTime | KObexHdrTarget | KObexHdrAppParam | KObexHdrHttp |KObexHdrUserDefined);
}
void CReferenceHandler::CreateReferenceObject9L(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
//Reset the object (also resets the buffer)
aObject.Reset();
const TUint KNumOfAlphabets = 1000;
aObjectBuf.ResizeL(KNumOfAlphabets * 30);
//populate the buffer...
TBuf8<4> buf;
TUint i;
for (i=0; i<KNumOfAlphabets; i++)
{
buf.Zero();
buf.AppendNumFixedWidth(i, EDecimal, 4);
aObjectBuf.Write(30*i, buf);
aObjectBuf.Write(30*i + 4, KAlphabet);
}
//populate the object
aObject.SetNameL(KRef9Name);
aObject.SetTypeL(KRefType);
aObject.SetLengthL(aObjectBuf.Size());
const TTime KRef3Time = TDateTime(2002, EJanuary, 0, 0, 0, 0, 0);
aObject.SetTimeL(KRef3Time);
_LIT8(KRef1HTTP, "Accept: text/*");
_LIT8(KRef2HTTP, "Location: http://www.bluetooth.com");
_LIT8(KRef3HTTP, "Date: Tue, 10 Nov 2002 09:17:21 GMT");
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
aObject.AddHttpL(KRef1HTTP);
aObject.AddHttpL(KRef2HTTP);
aObject.AddHttpL(KRef3HTTP);
// Set up the MF description header
const TUint KDescLength = ( (aTransport==EBluetooth?KObexPacketDefaultSize:2044) - KObexPacketHeaderSize - 5 - 5)/sizeof(TText); // Size in characters
HBufC* descBuf = HBufC::NewLC(KDescLength);
/* ASSERT(descBuf);
Ptr ptr(descBuf->Des());
ptr.Zero();
for (i=0; i<KDescLength; i++)
{
ptr.AppendNumFixedWidth(i%10, EDecimal, 1);
}
aObject.SetDescriptionL(ptr);
*/
CleanupStack::PopAndDestroy(descBuf);
aObject.SetTargetL(KRefSyncMLTarget);
aObject.SetHeaderMask(KObexHdrName | KObexHdrHttp | KObexHdrType | KObexHdrLength | KObexHdrTime | KObexHdrDescription | KObexHdrTarget);
}
//Empty object with EoB headder
void CReferenceHandler::CreateReferenceObject10L(CObexBufObject& aObject, CBufFlat& /*aObjectBuf*/, TTransport /*aTransport*/)
{
//Reset the object (also resets the buffer)
aObject.Reset();
aObject.SetNameL(KRef8Name);
aObject.SetTypeL(KRefType);
const TTime KRef10Time = TDateTime(2005, EJanuary, 17, 14, 35, 30, 0);
aObject.SetTimeL(KRef10Time);
aObject.SetTargetL(KRefIrMCTarget);
TBuf8<40> param;
param.Copy(_L("\x04"));
param.Append(_L("\x03"));
param.Append(_L("PARAM 435"));
aObject.SetAppParamL(param);
_LIT8(KRef1HTTP, "Accept: text/*");
aObject.AddHttpL(KRef1HTTP);
CObexHeader* header = CObexHeader::NewL();
CleanupStack::PushL(header);
_LIT(KUserDefUnicode2, "UserDef2");
header->SetUnicodeL(0x34, KUserDefUnicode2);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
header->SetByte(0xBC, 0x23);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
header = CObexHeader::NewL();
CleanupStack::PushL(header);
TBuf8<1000> dummy;
header->SetByteSeqL(TObexInternalHeader::EEndOfBody, dummy);
aObject.AddHeaderL(*header);
CleanupStack::Pop(header);
HBufC* descBuf = HBufC::NewLC(0);
CleanupStack::PopAndDestroy(descBuf);
}
TInt CReferenceHandler::CompareObjectToReferenceL(CObexBufObject& aObject, CBufFlat& aObjectBuf, TTransport aTransport)
{
CBufFlat* buf = CBufFlat::NewL(3000);
CleanupStack::PushL(buf);
CObexBufObject* obj = CObexBufObject::NewL(buf);
CleanupStack::PushL(obj);
if (aObject.Name() == KRef1Name)
CreateReferenceObject1L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef2Name)
CreateReferenceObject2L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef3Name)
CreateReferenceObject3L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef4Name)
CreateReferenceObject4L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef5Name)
CreateReferenceObject5L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef6Name)
CreateReferenceObject6L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef7Name)
CreateReferenceObject7L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef8Name)
CreateReferenceObject8L(*obj, *buf, aTransport);
else if (aObject.Name() == KRef9Name)
CreateReferenceObject9L(*obj, *buf, aTransport);
else //default
CreateReferenceObject1L(*obj, *buf, aTransport);
TInt res = 0;
if (aObject.Name() != obj->Name())
res |= EDifferentName;
if (aObject.Type() != obj->Type())
res |= EDifferentType;
if (aObject.Length() != obj->Length())
res |= EDifferentLength;
if (aObject.Time() != obj->Time())
res |= EDifferentTime;
if (aObject.Description() != obj->Description())
res |= EDifferentDescription;
if (aObject.Target() != obj->Target())
res |= EDifferentTarget;
if (aObjectBuf.Ptr(0) != buf->Ptr(0))
res |= EDifferentBuf;
if (aObject.AppParam() != obj->AppParam())
res |= EDifferentAppParam;
if (aObject.Http())
{
if ( ((aObject.Http())->Count()) == ((obj->Http())->Count()))
{
TInt arrayIndex = 0;
while (arrayIndex < ((aObject.Http())->Count()))
{
if ((((*aObject.Http())[arrayIndex])->Des()) != (((*obj->Http())[arrayIndex])->Des()))
{
res |= EDifferentHttp;
}
arrayIndex++;
}
}
else
{
res |= EDifferentHttp;
}
}
CObexHeader* firstHeader = CObexHeader::NewL();
CObexHeader* secondHeader = CObexHeader::NewL();
TInt err1 =0;
TInt err2 =0;
/*
TObexMatchHeader* headerMask = new(ELeave) TObexMatchHeader;
headerMask->SetHeader(TObexInternalHeader::EName);
aObject.HeaderSet().SetMask(headerMask);
err1 = aObject.HeaderSet().This(firstHeader);
obj->HeaderSet().SetMask(headerMask);
err2 = obj->HeaderSet().This(secondHeader);
if (err1 == err2)
{
if (firstHeader->AsUnicodeL() != secondHeader->AsUnicodeL())
{
res |= EDifferentName;
}
}
else
{
res |= EDifferentName;
}
aObject.HeaderSet().SetMask(NULL);
obj->HeaderSet().SetMask(NULL);
delete headerMask;
delete firstHeader;
delete secondHeader;
*/
if (aObject.Http())
{
if (obj->Http())
{
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::EHttp, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::EHttp, *secondHeader);
while (err1 == KErrNone && err2 == KErrNone)
{
if (firstHeader->AsByteSeq() != secondHeader->AsByteSeq())
{
res |= EDifferentHttp;
}
aObject.HeaderSet().Next();
obj->HeaderSet().Next();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::EHttp, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::EHttp, *secondHeader);
}
if (err1 != err2)
{
res |= EDifferentHttp;
}
}
else
{
res |= EDifferentHttp;
}
}
else
{
if (obj->Http())
{
res |= EDifferentHttp;
}
}
// delete firstHeader;
// delete secondHeader;
for (TUint8 headerNameIndex = KObexUserDefinedHdrAddrMin;
headerNameIndex <= KObexUserDefinedHdrAddrMax; headerNameIndex++)
{
TUint8 localHI = static_cast<TUint8>(headerNameIndex | TObexInternalHeader::EUnicode);
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(localHI, *firstHeader);
err2 = obj->HeaderSet().Find(localHI, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsUnicode() != secondHeader->AsUnicode())
{
res |= EDifferentUserDefined;
}
}
}
else
{
res |= EDifferentUserDefined;
}
localHI = static_cast<TUint8>(headerNameIndex | TObexInternalHeader::EByteSeq);
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(localHI, *firstHeader);
err2 = obj->HeaderSet().Find(localHI, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsByteSeq() != secondHeader->AsByteSeq())
{
res |= EDifferentUserDefined;
}
}
}
else
{
res |= EDifferentUserDefined;
}
localHI = static_cast<TUint8>(headerNameIndex | TObexInternalHeader::E1Byte);
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(localHI, *firstHeader);
err2 = obj->HeaderSet().Find(localHI, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsByte() != secondHeader->AsByte())
{
res |= EDifferentUserDefined;
}
}
}
else
{
res |= EDifferentUserDefined;
}
localHI = static_cast<TUint8>(headerNameIndex | TObexInternalHeader::E4Byte);
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(localHI, *firstHeader);
err2 = obj->HeaderSet().Find(localHI, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsFourByte() != secondHeader->AsFourByte())
{
res |= EDifferentUserDefined;
}
}
}
else
{
res |= EDifferentUserDefined;
}
}
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::ECount, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::ECount, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsFourByte() != secondHeader->AsFourByte())
{
res |= EDifferentCount;
}
}
}
else
{
res |= EDifferentCount;
}
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::ECreatorID, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::ECreatorID, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsFourByte() != secondHeader->AsFourByte())
{
res |= EDifferentCreatorID;
}
}
}
else
{
res |= EDifferentCreatorID;
}
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::EWanUUID, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::EWanUUID, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsByteSeq() != secondHeader->AsByteSeq())
{
res |= EDifferentWanUUID;
}
}
}
else
{
res |= EDifferentWanUUID;
}
aObject.HeaderSet().First();
obj->HeaderSet().First();
err1 = aObject.HeaderSet().Find(TObexInternalHeader::EObjectClass, *firstHeader);
err2 = obj->HeaderSet().Find(TObexInternalHeader::EObjectClass, *secondHeader);
if (err1 == err2)
{
if (err1 == KErrNone)
{
if (firstHeader->AsByteSeq() != secondHeader->AsByteSeq())
{
res |= EDifferentObjectClass;
}
}
}
else
{
res |= EDifferentObjectClass;
}
delete firstHeader;
delete secondHeader;
CleanupStack::PopAndDestroy(2); //obj, buf
return res;
}