btobexprofiles/obexsendservices/obexservicesendutils/src/BTSBPPObjectRequest.cpp
author hgs
Fri, 28 May 2010 17:03:06 +0300
changeset 32 19bd632b5100
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* Description:  GetReferencedObjects -operation implementation
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
hgs
parents:
diff changeset
    18
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// INCLUDE FILES
hgs
parents:
diff changeset
    21
#include "BTServiceUtils.h"
hgs
parents:
diff changeset
    22
#include "BTSBPPObjectRequest.h"
hgs
parents:
diff changeset
    23
#include "BTSUDataConverter.h"
hgs
parents:
diff changeset
    24
#include "BTSUImageConverter.h"
hgs
parents:
diff changeset
    25
#include "BTSUDebug.h"
hgs
parents:
diff changeset
    26
hgs
parents:
diff changeset
    27
#include <f32file.h>    // RFile
hgs
parents:
diff changeset
    28
#include <s32mem.h>     // RBufWriteStream
hgs
parents:
diff changeset
    29
#include <s32file.h>    // RFileReadStream
hgs
parents:
diff changeset
    30
hgs
parents:
diff changeset
    31
// CONSTANTS
hgs
parents:
diff changeset
    32
const TInt KBTSBPPFileSizeNotSet         = 0;
hgs
parents:
diff changeset
    33
const TInt KBTSBPPFileSizeRequested      = 1;
hgs
parents:
diff changeset
    34
const TInt KBTSBPPFileSizeUnknown        = -1;
hgs
parents:
diff changeset
    35
const TInt KBTSBPPRestOfTheFileRequested = -1;
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// The field lengths of Application Parameters -header in bytes
hgs
parents:
diff changeset
    38
//
hgs
parents:
diff changeset
    39
const TInt KBTSBPPFieldTag       = 1;
hgs
parents:
diff changeset
    40
const TInt KBTSBPPFieldLength    = 1;
hgs
parents:
diff changeset
    41
const TInt KBTSBPPValue          = 4;
hgs
parents:
diff changeset
    42
const TInt KBTSBPPAppParamLength = KBTSBPPFieldTag + KBTSBPPFieldLength + KBTSBPPValue;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
_LIT8(KBTSBPPRefObjectOper, "x-obex/referencedobject\0");
hgs
parents:
diff changeset
    45
hgs
parents:
diff changeset
    46
static const TUint8 KBTSBPPFileSizeTag = 0x04;
hgs
parents:
diff changeset
    47
static const TUint8 KBTSBPPFileSizeLength = 0x04;
hgs
parents:
diff changeset
    48
hgs
parents:
diff changeset
    49
// MODULE DATA STRUCTURES
hgs
parents:
diff changeset
    50
enum KBTSBPPAppParamTags
hgs
parents:
diff changeset
    51
    {
hgs
parents:
diff changeset
    52
    KBTSBPPTagOffset = 1,
hgs
parents:
diff changeset
    53
    KBTSBPPTagCount,
hgs
parents:
diff changeset
    54
    KBTSBPPTagJobId, // used only in JobBased-printing
hgs
parents:
diff changeset
    55
    KBTSBPPTagFileSize
hgs
parents:
diff changeset
    56
    };
hgs
parents:
diff changeset
    57
hgs
parents:
diff changeset
    58
// ============================ MEMBER FUNCTIONS ===============================
hgs
parents:
diff changeset
    59
hgs
parents:
diff changeset
    60
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    61
// CBTSBPPObjectRequest::CBTSBPPObjectRequest
hgs
parents:
diff changeset
    62
// C++ default constructor can NOT contain any code, that
hgs
parents:
diff changeset
    63
// might leave.
hgs
parents:
diff changeset
    64
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
//
hgs
parents:
diff changeset
    66
CBTSBPPObjectRequest::CBTSBPPObjectRequest( CObexBaseObject* aGetOperation,
hgs
parents:
diff changeset
    67
    const CDesCArray* aRefObjectList ) : iRequest( aGetOperation ), 
hgs
parents:
diff changeset
    68
                                         iObjectList( aRefObjectList )
hgs
parents:
diff changeset
    69
    {
hgs
parents:
diff changeset
    70
    }
hgs
parents:
diff changeset
    71
hgs
parents:
diff changeset
    72
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    73
// CBTSBPPObjectRequest::ConstructL
hgs
parents:
diff changeset
    74
// Symbian 2nd phase constructor can leave.
hgs
parents:
diff changeset
    75
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    76
//
hgs
parents:
diff changeset
    77
void CBTSBPPObjectRequest::ConstructL()
hgs
parents:
diff changeset
    78
    {
hgs
parents:
diff changeset
    79
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ConstructL()"));
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    User::LeaveIfError( iFileSession.Connect() );
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    // Check the validity of the operation and it's paramters.
hgs
parents:
diff changeset
    84
    //
hgs
parents:
diff changeset
    85
    CheckGetRequestL();
hgs
parents:
diff changeset
    86
hgs
parents:
diff changeset
    87
    // Execute any tasks needed and create the requested object.
hgs
parents:
diff changeset
    88
    //
hgs
parents:
diff changeset
    89
    ExecuteGetRequestL();
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ConstructL() completed"));
hgs
parents:
diff changeset
    92
    }
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    95
// CBTSBPPObjectRequest::NewL
hgs
parents:
diff changeset
    96
// Two-phased constructor.
hgs
parents:
diff changeset
    97
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
    98
//
hgs
parents:
diff changeset
    99
CBTSBPPObjectRequest* CBTSBPPObjectRequest::NewL( CObexBaseObject* aGetOperation,
hgs
parents:
diff changeset
   100
                                              const CDesCArray* aRefObjectList )
hgs
parents:
diff changeset
   101
    {
hgs
parents:
diff changeset
   102
    CBTSBPPObjectRequest* self = new( ELeave ) CBTSBPPObjectRequest( aGetOperation,
hgs
parents:
diff changeset
   103
                                                                 aRefObjectList );
hgs
parents:
diff changeset
   104
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
   105
    self->ConstructL();
hgs
parents:
diff changeset
   106
    CleanupStack::Pop();
hgs
parents:
diff changeset
   107
    return self;
hgs
parents:
diff changeset
   108
    }
hgs
parents:
diff changeset
   109
hgs
parents:
diff changeset
   110
    
hgs
parents:
diff changeset
   111
// Destructor
hgs
parents:
diff changeset
   112
CBTSBPPObjectRequest::~CBTSBPPObjectRequest()
hgs
parents:
diff changeset
   113
    {
hgs
parents:
diff changeset
   114
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::~CBTSBPPObjectRequest()"));
hgs
parents:
diff changeset
   115
    iFileSession.Close();
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
    delete iResponse;
hgs
parents:
diff changeset
   118
    delete iResponseBuffer;
hgs
parents:
diff changeset
   119
hgs
parents:
diff changeset
   120
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::~CBTSBPPObjectRequest() completed"));
hgs
parents:
diff changeset
   121
    }
hgs
parents:
diff changeset
   122
hgs
parents:
diff changeset
   123
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   124
// CBTSBPPObjectRequest::GetResponse
hgs
parents:
diff changeset
   125
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   126
//
hgs
parents:
diff changeset
   127
CObexBufObject* CBTSBPPObjectRequest::GetResponse()
hgs
parents:
diff changeset
   128
    {
hgs
parents:
diff changeset
   129
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::GetResponse()"));
hgs
parents:
diff changeset
   130
    return iResponse;
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
hgs
parents:
diff changeset
   133
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   134
// CBTSBPPObjectRequest::CheckGetRequestL
hgs
parents:
diff changeset
   135
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   136
//
hgs
parents:
diff changeset
   137
void CBTSBPPObjectRequest::CheckGetRequestL()
hgs
parents:
diff changeset
   138
    {
hgs
parents:
diff changeset
   139
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckGetRequestL()"));
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    CheckTypeHeaderL();
hgs
parents:
diff changeset
   142
    CheckNameHeaderL();
hgs
parents:
diff changeset
   143
    CheckAppParamsHeaderL();
hgs
parents:
diff changeset
   144
    }
hgs
parents:
diff changeset
   145
hgs
parents:
diff changeset
   146
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   147
// CBTSBPPObjectRequest::CheckTypeHeaderL
hgs
parents:
diff changeset
   148
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   149
//
hgs
parents:
diff changeset
   150
void CBTSBPPObjectRequest::CheckTypeHeaderL()
hgs
parents:
diff changeset
   151
    {
hgs
parents:
diff changeset
   152
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL()"));
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
    __ASSERT_DEBUG( iRequest, BTSUPanic( EBTSUPanicNullPointer ) );
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
    const TDesC8& typeHeader = iRequest->Type();
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
    if ( typeHeader.Length() == 0 )
hgs
parents:
diff changeset
   159
        {
hgs
parents:
diff changeset
   160
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL() ERROR, no type header"));
hgs
parents:
diff changeset
   161
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   162
        }
hgs
parents:
diff changeset
   163
    else if ( typeHeader.Length() > KBTSUMaxStringLength )
hgs
parents:
diff changeset
   164
        {
hgs
parents:
diff changeset
   165
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL() ERROR, type header too long"));
hgs
parents:
diff changeset
   166
        User::Leave( KErrTooBig );
hgs
parents:
diff changeset
   167
        }
hgs
parents:
diff changeset
   168
    else
hgs
parents:
diff changeset
   169
        {
hgs
parents:
diff changeset
   170
        FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL() type header '%S'"), &typeHeader ));
hgs
parents:
diff changeset
   171
        // The only supported operation is GetReferencedObjects
hgs
parents:
diff changeset
   172
        //
hgs
parents:
diff changeset
   173
        if ( typeHeader != KBTSBPPRefObjectOper() )
hgs
parents:
diff changeset
   174
            {
hgs
parents:
diff changeset
   175
            FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL() ERROR, unsupported operation"));
hgs
parents:
diff changeset
   176
            User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
   177
            }
hgs
parents:
diff changeset
   178
        }
hgs
parents:
diff changeset
   179
hgs
parents:
diff changeset
   180
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckTypeHeaderL() completed"));
hgs
parents:
diff changeset
   181
    }
hgs
parents:
diff changeset
   182
hgs
parents:
diff changeset
   183
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   184
// CBTSBPPObjectRequest::CheckNameHeaderL
hgs
parents:
diff changeset
   185
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   186
//
hgs
parents:
diff changeset
   187
void CBTSBPPObjectRequest::CheckNameHeaderL()
hgs
parents:
diff changeset
   188
    {
hgs
parents:
diff changeset
   189
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckNameHeaderL()"));
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
    __ASSERT_DEBUG( iRequest, BTSUPanic( EBTSUPanicNullPointer ) );
hgs
parents:
diff changeset
   192
hgs
parents:
diff changeset
   193
    const TDesC& nameHeader = iRequest->Name();
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    if ( nameHeader.Length() == 0 )
hgs
parents:
diff changeset
   196
        {
hgs
parents:
diff changeset
   197
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckNameHeaderL() ERROR, no name header"));
hgs
parents:
diff changeset
   198
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   199
        }
hgs
parents:
diff changeset
   200
    else
hgs
parents:
diff changeset
   201
        {
hgs
parents:
diff changeset
   202
        FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckNameHeaderL() filename '%S'"), &nameHeader ));
hgs
parents:
diff changeset
   203
hgs
parents:
diff changeset
   204
        // Check are we allowed to send this file
hgs
parents:
diff changeset
   205
        //
hgs
parents:
diff changeset
   206
        TInt dummy;
hgs
parents:
diff changeset
   207
        if ( iObjectList->Find( nameHeader, dummy ) != KBTSUEqualStrings )
hgs
parents:
diff changeset
   208
            {
hgs
parents:
diff changeset
   209
            FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckNameHeaderL() ERROR, the asked object is not referenced in the document"));
hgs
parents:
diff changeset
   210
            User::Leave( KErrPermissionDenied );
hgs
parents:
diff changeset
   211
            }
hgs
parents:
diff changeset
   212
hgs
parents:
diff changeset
   213
        iRequestParams.iName = &nameHeader;
hgs
parents:
diff changeset
   214
        }
hgs
parents:
diff changeset
   215
    }
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   218
// CBTSBPPObjectRequest::CheckAppParamsHeaderL
hgs
parents:
diff changeset
   219
//
hgs
parents:
diff changeset
   220
// This method expects a Tag-Length-Value format. The method is as defensive 
hgs
parents:
diff changeset
   221
// as possible, for example unknown or illegal values are discarded.
hgs
parents:
diff changeset
   222
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   223
//
hgs
parents:
diff changeset
   224
void CBTSBPPObjectRequest::CheckAppParamsHeaderL()
hgs
parents:
diff changeset
   225
    {
hgs
parents:
diff changeset
   226
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL()"));
hgs
parents:
diff changeset
   227
hgs
parents:
diff changeset
   228
    __ASSERT_DEBUG( iRequest, BTSUPanic( EBTSUPanicNullPointer ) );
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
    TPtrC8 header( iRequest->AppParam() );    
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
    if ( header.Length() == 0 )
hgs
parents:
diff changeset
   233
        {
hgs
parents:
diff changeset
   234
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() ERROR, no AppParam header"));
hgs
parents:
diff changeset
   235
        User::Leave( KErrNotFound );
hgs
parents:
diff changeset
   236
        }
hgs
parents:
diff changeset
   237
    else if ( header.Length() < KBTSBPPAppParamLength * 2)
hgs
parents:
diff changeset
   238
        {
hgs
parents:
diff changeset
   239
        // There has to be at least offset and count -parameters.
hgs
parents:
diff changeset
   240
        //
hgs
parents:
diff changeset
   241
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() ERROR, incomplete AppParam header"));
hgs
parents:
diff changeset
   242
        User::Leave( KErrArgument );
hgs
parents:
diff changeset
   243
        }
hgs
parents:
diff changeset
   244
    else
hgs
parents:
diff changeset
   245
        {
hgs
parents:
diff changeset
   246
        // Parse the header
hgs
parents:
diff changeset
   247
        //
hgs
parents:
diff changeset
   248
        while( header.Length() >= KBTSBPPAppParamLength )
hgs
parents:
diff changeset
   249
            {
hgs
parents:
diff changeset
   250
            // Extract tag number and remove it from the header
hgs
parents:
diff changeset
   251
            //
hgs
parents:
diff changeset
   252
            TInt tagNumber = TBTSUDataConverter::ConvertByteL(
hgs
parents:
diff changeset
   253
                header.Left( KBTSBPPFieldTag ) );
hgs
parents:
diff changeset
   254
            header.Set( header.Mid( KBTSBPPFieldTag ) );
hgs
parents:
diff changeset
   255
hgs
parents:
diff changeset
   256
            // Extract value length and remove it from the header
hgs
parents:
diff changeset
   257
            //
hgs
parents:
diff changeset
   258
            TInt valueLength = TBTSUDataConverter::ConvertByteL( 
hgs
parents:
diff changeset
   259
                header.Left( KBTSBPPFieldLength ) );
hgs
parents:
diff changeset
   260
            header.Set( header.Mid( KBTSBPPFieldLength ) );
hgs
parents:
diff changeset
   261
hgs
parents:
diff changeset
   262
            if ( valueLength != KBTSBPPValue )
hgs
parents:
diff changeset
   263
                {
hgs
parents:
diff changeset
   264
                FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() WARNING, illegal length %d"), valueLength ));
hgs
parents:
diff changeset
   265
                valueLength = KBTSBPPValue;
hgs
parents:
diff changeset
   266
                // This is an interesting choice of what to do, I would argue that for future compatibility you'll probably want to accept the length
hgs
parents:
diff changeset
   267
                // provided as it might be for a new tag that is not yet published.  (Checking of the size for known tags is handled by the conversion
hgs
parents:
diff changeset
   268
                // functions anyway).
hgs
parents:
diff changeset
   269
                // So, in summary I wouldn't change valueLength from what it is in the payload.  But I've left it in for now in case it was added for
hgs
parents:
diff changeset
   270
                // interoperability reasons with some existing device.
hgs
parents:
diff changeset
   271
                }
hgs
parents:
diff changeset
   272
hgs
parents:
diff changeset
   273
            // Extract value...
hgs
parents:
diff changeset
   274
            //
hgs
parents:
diff changeset
   275
            switch ( tagNumber )
hgs
parents:
diff changeset
   276
                {
hgs
parents:
diff changeset
   277
                case KBTSBPPTagOffset:
hgs
parents:
diff changeset
   278
                    {
hgs
parents:
diff changeset
   279
                    iRequestParams.iOffset = 
hgs
parents:
diff changeset
   280
                        TBTSUDataConverter::ConvertDataUnsignedL( 
hgs
parents:
diff changeset
   281
                        header.Left( valueLength ) );
hgs
parents:
diff changeset
   282
hgs
parents:
diff changeset
   283
                    FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() offset '%d'"), iRequestParams.iOffset ));
hgs
parents:
diff changeset
   284
                    break;
hgs
parents:
diff changeset
   285
                    }
hgs
parents:
diff changeset
   286
                case KBTSBPPTagCount:
hgs
parents:
diff changeset
   287
                    {
hgs
parents:
diff changeset
   288
                    iRequestParams.iCount = 
hgs
parents:
diff changeset
   289
                        TBTSUDataConverter::ConvertDataSignedL( 
hgs
parents:
diff changeset
   290
                        header.Left( valueLength ) );
hgs
parents:
diff changeset
   291
hgs
parents:
diff changeset
   292
                    FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() count '%d'"), iRequestParams.iCount ));
hgs
parents:
diff changeset
   293
                    break;
hgs
parents:
diff changeset
   294
                    }
hgs
parents:
diff changeset
   295
                case KBTSBPPTagFileSize:
hgs
parents:
diff changeset
   296
                    {
hgs
parents:
diff changeset
   297
                    // The value is not interesting, we just need to know whether 
hgs
parents:
diff changeset
   298
                    // the parameter was received (and thus requested)
hgs
parents:
diff changeset
   299
                    //
hgs
parents:
diff changeset
   300
                    iRequestParams.iOffset = KBTSBPPFileSizeRequested;
hgs
parents:
diff changeset
   301
                    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ParseHeadersL() fileSize parameter received"));
hgs
parents:
diff changeset
   302
                    break;
hgs
parents:
diff changeset
   303
                    }
hgs
parents:
diff changeset
   304
hgs
parents:
diff changeset
   305
                case KBTSBPPTagJobId:
hgs
parents:
diff changeset
   306
                default:
hgs
parents:
diff changeset
   307
                    {
hgs
parents:
diff changeset
   308
                    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() WARNING, illegal tag"));
hgs
parents:
diff changeset
   309
                    break;
hgs
parents:
diff changeset
   310
                    }
hgs
parents:
diff changeset
   311
                }
hgs
parents:
diff changeset
   312
hgs
parents:
diff changeset
   313
            // ...and remove it from the header
hgs
parents:
diff changeset
   314
            //
hgs
parents:
diff changeset
   315
            header.Set( header.Mid( valueLength ) );
hgs
parents:
diff changeset
   316
            }
hgs
parents:
diff changeset
   317
        }
hgs
parents:
diff changeset
   318
hgs
parents:
diff changeset
   319
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CheckAppParamsHeaderL() completed"));
hgs
parents:
diff changeset
   320
    }
hgs
parents:
diff changeset
   321
hgs
parents:
diff changeset
   322
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   323
// CBTSBPPObjectRequest::ExecuteGetRequestL
hgs
parents:
diff changeset
   324
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   325
//
hgs
parents:
diff changeset
   326
void CBTSBPPObjectRequest::ExecuteGetRequestL()
hgs
parents:
diff changeset
   327
    {
hgs
parents:
diff changeset
   328
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ExecuteGetRequestL()"));
hgs
parents:
diff changeset
   329
hgs
parents:
diff changeset
   330
    // If iCount is 0, an empty body will be sent
hgs
parents:
diff changeset
   331
    //
hgs
parents:
diff changeset
   332
    if ( iRequestParams.iCount != 0 )
hgs
parents:
diff changeset
   333
        {
hgs
parents:
diff changeset
   334
        ResolveGetRequestL();
hgs
parents:
diff changeset
   335
        ReadFileToBufferL();      
hgs
parents:
diff changeset
   336
        }
hgs
parents:
diff changeset
   337
hgs
parents:
diff changeset
   338
    CreateResponseObjectL();
hgs
parents:
diff changeset
   339
hgs
parents:
diff changeset
   340
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ExecuteGetRequestL() completed"));
hgs
parents:
diff changeset
   341
    }
hgs
parents:
diff changeset
   342
hgs
parents:
diff changeset
   343
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   344
// CBTSBPPObjectRequest::ResolveGetRequestL
hgs
parents:
diff changeset
   345
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   346
//
hgs
parents:
diff changeset
   347
void CBTSBPPObjectRequest::ResolveGetRequestL()
hgs
parents:
diff changeset
   348
    {
hgs
parents:
diff changeset
   349
    FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::ResolveGetRequestL()"));
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
    // Get the file size
hgs
parents:
diff changeset
   352
    //
hgs
parents:
diff changeset
   353
    RFile file;
hgs
parents:
diff changeset
   354
    TInt size = 0;
hgs
parents:
diff changeset
   355
    User::LeaveIfError( file.Open( iFileSession, *iRequestParams.iName, 
hgs
parents:
diff changeset
   356
                                   EFileShareReadersOnly | EFileStream ) );
hgs
parents:
diff changeset
   357
hgs
parents:
diff changeset
   358
    TInt error = file.Size( size );
hgs
parents:
diff changeset
   359
    
hgs
parents:
diff changeset
   360
    if ( error )
hgs
parents:
diff changeset
   361
        {
hgs
parents:
diff changeset
   362
        FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::ResolveGetRequestL() error %d in getting the size"), error ) );
hgs
parents:
diff changeset
   363
        size = KBTSBPPFileSizeUnknown;
hgs
parents:
diff changeset
   364
        }
hgs
parents:
diff changeset
   365
hgs
parents:
diff changeset
   366
    file.Close();
hgs
parents:
diff changeset
   367
hgs
parents:
diff changeset
   368
    // Store the file size if it was requested
hgs
parents:
diff changeset
   369
    //
hgs
parents:
diff changeset
   370
    if ( iRequestParams.iFileSize == KBTSBPPFileSizeRequested )
hgs
parents:
diff changeset
   371
        {
hgs
parents:
diff changeset
   372
        iRequestParams.iFileSize = size;
hgs
parents:
diff changeset
   373
        }
hgs
parents:
diff changeset
   374
hgs
parents:
diff changeset
   375
    // Resolve the actual amount of data that needs to be read.
hgs
parents:
diff changeset
   376
    // 
hgs
parents:
diff changeset
   377
    TInt dataLeft = size - iRequestParams.iOffset;
hgs
parents:
diff changeset
   378
hgs
parents:
diff changeset
   379
    if ( iRequestParams.iCount == KBTSBPPRestOfTheFileRequested )
hgs
parents:
diff changeset
   380
        {
hgs
parents:
diff changeset
   381
        if ( size == KBTSBPPFileSizeUnknown )
hgs
parents:
diff changeset
   382
            {
hgs
parents:
diff changeset
   383
            // The size of the file is unknown, so read as much 
hgs
parents:
diff changeset
   384
            // as would fit into the buffer
hgs
parents:
diff changeset
   385
            //
hgs
parents:
diff changeset
   386
            iRequestParams.iCount = KBTSUDataBufferMaxSize;
hgs
parents:
diff changeset
   387
            }        
hgs
parents:
diff changeset
   388
        else
hgs
parents:
diff changeset
   389
            {
hgs
parents:
diff changeset
   390
            // The rest of the file is requested, so correct the count
hgs
parents:
diff changeset
   391
            //
hgs
parents:
diff changeset
   392
            iRequestParams.iCount = dataLeft;
hgs
parents:
diff changeset
   393
            }
hgs
parents:
diff changeset
   394
        }
hgs
parents:
diff changeset
   395
    else if ( iRequestParams.iCount > dataLeft )
hgs
parents:
diff changeset
   396
        {
hgs
parents:
diff changeset
   397
        // There is less data left that was requested, so correct the count
hgs
parents:
diff changeset
   398
        //
hgs
parents:
diff changeset
   399
        iRequestParams.iCount = dataLeft;
hgs
parents:
diff changeset
   400
        }
hgs
parents:
diff changeset
   401
hgs
parents:
diff changeset
   402
    if ( iRequestParams.iCount > KBTSUDataBufferMaxSize )
hgs
parents:
diff changeset
   403
        {
hgs
parents:
diff changeset
   404
        // The requested count is too big
hgs
parents:
diff changeset
   405
        //
hgs
parents:
diff changeset
   406
        FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::ResolveGetRequestL() iCount too big %d"), iRequestParams.iCount ) );
hgs
parents:
diff changeset
   407
        User::Leave( KErrTooBig );
hgs
parents:
diff changeset
   408
        }
hgs
parents:
diff changeset
   409
hgs
parents:
diff changeset
   410
    FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::ResolveGetRequestL() completed, requested %d bytes"), iRequestParams.iCount ) );
hgs
parents:
diff changeset
   411
    }
hgs
parents:
diff changeset
   412
hgs
parents:
diff changeset
   413
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   414
// CBTSBPPObjectRequest::ReadFileToBufferL
hgs
parents:
diff changeset
   415
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   416
//
hgs
parents:
diff changeset
   417
void CBTSBPPObjectRequest::ReadFileToBufferL()
hgs
parents:
diff changeset
   418
    {
hgs
parents:
diff changeset
   419
    __ASSERT_DEBUG( !iResponseBuffer, BTSUPanic( EBTSUPanicExistingObject ) );
hgs
parents:
diff changeset
   420
hgs
parents:
diff changeset
   421
    // Create a buffer for the object and reserve space according to the request
hgs
parents:
diff changeset
   422
    //
hgs
parents:
diff changeset
   423
    iResponseBuffer = CBufFlat::NewL( KBTSUDataBufferExpandSize );
hgs
parents:
diff changeset
   424
    iResponseBuffer->SetReserveL( iRequestParams.iCount );
hgs
parents:
diff changeset
   425
    iResponseBuffer->ResizeL( iRequestParams.iCount );
hgs
parents:
diff changeset
   426
hgs
parents:
diff changeset
   427
    // Open the file
hgs
parents:
diff changeset
   428
    //
hgs
parents:
diff changeset
   429
    RFile file;
hgs
parents:
diff changeset
   430
    User::LeaveIfError( file.Open( iFileSession, *iRequestParams.iName, 
hgs
parents:
diff changeset
   431
                                   EFileShareReadersOnly | EFileStream ) );
hgs
parents:
diff changeset
   432
    CleanupClosePushL( file );
hgs
parents:
diff changeset
   433
hgs
parents:
diff changeset
   434
    // Create a stream for reading from the file
hgs
parents:
diff changeset
   435
    //
hgs
parents:
diff changeset
   436
    RFileReadStream readStream( file, iRequestParams.iOffset );
hgs
parents:
diff changeset
   437
hgs
parents:
diff changeset
   438
    // Create a stream for writing into the buffer
hgs
parents:
diff changeset
   439
    //
hgs
parents:
diff changeset
   440
    RBufWriteStream writeStream( *iResponseBuffer );
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
    // Read the data from file to the buffer
hgs
parents:
diff changeset
   443
    //
hgs
parents:
diff changeset
   444
    readStream.ReadL( writeStream, iRequestParams.iCount );
hgs
parents:
diff changeset
   445
hgs
parents:
diff changeset
   446
    FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::ReadFileToBufferL() space reserved '%d'"), iRequestParams.iCount ));
hgs
parents:
diff changeset
   447
    FTRACE(FPrint(_L("[BTSBPP]\t CBTSBPPObjectRequest::ReadFileToBufferL() data read '%d'"), iResponseBuffer->Size() ));
hgs
parents:
diff changeset
   448
hgs
parents:
diff changeset
   449
    CleanupStack::PopAndDestroy(&file);
hgs
parents:
diff changeset
   450
    }
hgs
parents:
diff changeset
   451
hgs
parents:
diff changeset
   452
hgs
parents:
diff changeset
   453
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   454
// CBTSBPPObjectRequest::CreateResponseObjectL
hgs
parents:
diff changeset
   455
// -----------------------------------------------------------------------------
hgs
parents:
diff changeset
   456
//
hgs
parents:
diff changeset
   457
void CBTSBPPObjectRequest::CreateResponseObjectL()
hgs
parents:
diff changeset
   458
    {
hgs
parents:
diff changeset
   459
    __ASSERT_DEBUG( iResponseBuffer || (iRequestParams.iCount == 0), BTSUPanic( EBTSUPanicNoBufferEvenThoughCountNotZero ) );
hgs
parents:
diff changeset
   460
    __ASSERT_DEBUG( !iResponse, BTSUPanic( EBTSUPanicResponseAlreadyPresent ) );
hgs
parents:
diff changeset
   461
    
hgs
parents:
diff changeset
   462
    // Create the OBEX response object using the buffer already created (or no buffer if appropriate)
hgs
parents:
diff changeset
   463
    //
hgs
parents:
diff changeset
   464
    iResponse = CObexBufObject::NewL( iResponseBuffer );
hgs
parents:
diff changeset
   465
    
hgs
parents:
diff changeset
   466
    // Generate FileSize parameter if requested
hgs
parents:
diff changeset
   467
    //
hgs
parents:
diff changeset
   468
    if ( iRequestParams.iFileSize != KBTSBPPFileSizeNotSet )
hgs
parents:
diff changeset
   469
        {
hgs
parents:
diff changeset
   470
        FLOG(_L("[BTSBPP]\t CBTSBPPObjectRequest::CreateResponseObjectL() generate file size param"));
hgs
parents:
diff changeset
   471
        TBuf8<KBTSBPPAppParamLength> params;
hgs
parents:
diff changeset
   472
        params.SetMax();
hgs
parents:
diff changeset
   473
        TUint8* ptr = const_cast<TUint8*>(params.Ptr());
hgs
parents:
diff changeset
   474
        *ptr++ = KBTSBPPFileSizeTag;
hgs
parents:
diff changeset
   475
        *ptr++ = KBTSBPPFileSizeLength;
hgs
parents:
diff changeset
   476
        BigEndian::Put32(ptr, *reinterpret_cast<TUint32*>(&iRequestParams.iFileSize)); // reinterpret cast to retain signed nature...
hgs
parents:
diff changeset
   477
        iResponse->SetAppParamL( params );
hgs
parents:
diff changeset
   478
        }
hgs
parents:
diff changeset
   479
    }
hgs
parents:
diff changeset
   480
hgs
parents:
diff changeset
   481
//  End of File