epoc32/include/obexsendop.h
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
// Copyright (c) 2001-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@2
     2
// All rights reserved.
williamr@2
     3
// This component and the accompanying materials are made available
williamr@2
     4
// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
williamr@2
     5
// which accompanies this distribution, and is available
williamr@2
     6
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
williamr@2
     7
//
williamr@2
     8
// Initial Contributors:
williamr@2
     9
// Nokia Corporation - initial contribution.
williamr@2
    10
//
williamr@2
    11
// Contributors:
williamr@2
    12
//
williamr@2
    13
// Description:
williamr@2
    14
//
williamr@2
    15
williamr@2
    16
williamr@2
    17
#ifndef __OBEXSENDOP_H__
williamr@2
    18
#define __OBEXSENDOP_H__
williamr@2
    19
williamr@2
    20
williamr@2
    21
williamr@2
    22
//#define __OBEX_SEND_OP_FILE_DEBUG_MODE__
williamr@2
    23
williamr@2
    24
#include <msvapi.h>
williamr@2
    25
#include <badesca.h> // CDesCArray
williamr@2
    26
#include <obex.h>
williamr@2
    27
#include <obexclientmtm.h>	//TObexMtmProgress
williamr@2
    28
williamr@2
    29
williamr@2
    30
class CObexHeaderList;
williamr@2
    31
williamr@2
    32
williamr@2
    33
///////////////////////////////////////////////////////////////////////////////////
williamr@2
    34
// Panic Code
williamr@2
    35
///////////////////////////////////////////////////////////////////////////////////
williamr@2
    36
williamr@2
    37
///Obex Send Operation Panics
williamr@2
    38
enum TObexSendOperationPanic
williamr@2
    39
	{
williamr@2
    40
	EObexSendOperationAlreadyActive, ///< The current Obex send operation is already active
williamr@2
    41
	EObexSendOperationUnknownJob, ///<
williamr@2
    42
	EObexSendOperationUnknownSendState, ///< The current value of the Obex send state of the send operation is not found in TObexMtmProgress::TSendState
williamr@2
    43
	EObexSendOperationUnexpectedTimeout ///< Panic if send has timeout unexpectedly
williamr@2
    44
	};
williamr@2
    45
williamr@2
    46
GLDEF_C void Panic(TObexSendOperationPanic aPanic);
williamr@2
    47
williamr@2
    48
williamr@2
    49
williamr@2
    50
///////////////////////////////////////////////////////////////////////////////////
williamr@2
    51
// CObexServerSendOperation 
williamr@2
    52
///////////////////////////////////////////////////////////////////////////////////
williamr@2
    53
class CObexSendOpTimeout;
williamr@2
    54
class CObexPasswordGetter;
williamr@2
    55
williamr@2
    56
class CObexServerSendOperation : public CActive, public MObexAuthChallengeHandler
williamr@2
    57
/**
williamr@2
    58
class CObexServerSendOperation
williamr@2
    59
williamr@2
    60
Obex Server Send Operation:
williamr@2
    61
williamr@2
    62
Base class for Send operations using Obex protocol.
williamr@2
    63
williamr@2
    64
Implements a state machine with the following states:
williamr@2
    65
Initialise-->Connect-->ConnectAttemptComplete-->SendObject-->(SendNextObject-->)SendComplete-->MovedToSent-->Disconnected
williamr@2
    66
williamr@2
    67
The pure virtual function InitialiseObexClientL() must be overridden in the base class to initialise the
williamr@2
    68
iObexClient member to use the desired Obex transport mechanism (e.g. infrared, Bluetooth).
williamr@2
    69
williamr@2
    70
In order to allow asynchronous transport initialisations (for example BT's SDP Query)
williamr@2
    71
implementations of this function must set iAsyncInit and provide a mechanism to 
williamr@2
    72
complete a request.  See the bluetooth server mtm code for implementation details.
williamr@2
    73
 
williamr@2
    74
@internalTechnology
williamr@2
    75
@released
williamr@2
    76
*/
williamr@2
    77
	{
williamr@2
    78
public:
williamr@2
    79
	
williamr@2
    80
	/**
williamr@2
    81
	 * Destructor. Cancel()s, deletes owned objects and Close()s the connection to the FileServer.
williamr@2
    82
	 */
williamr@2
    83
	
williamr@2
    84
	virtual IMPORT_C ~CObexServerSendOperation();
williamr@2
    85
	
williamr@2
    86
	/// Must be implemented in the derived class to initialise the iObexClient member to use the desired Obex transport mechanism
williamr@2
    87
	virtual void InitialiseObexClientL() =0;
williamr@2
    88
	
williamr@2
    89
	/**
williamr@2
    90
	 * This is not required to do anything in the base implementation.
williamr@2
    91
	 */
williamr@2
    92
		
williamr@2
    93
	IMPORT_C virtual void SecondPhaseObexClientInitL();		// may be overridden to do anything required in a second phase.  default implementation is blank.
williamr@2
    94
williamr@2
    95
	/**
williamr@2
    96
	 * Operations to perform before attempting a connection.
williamr@2
    97
	 * As multiple connection attempts can be made, it is necessary for this
williamr@2
    98
	 * routine to ensure it can handle being called multiple times.
williamr@2
    99
	 * May be overridden. Default implementation is blank.
williamr@2
   100
	 */
williamr@2
   101
	IMPORT_C virtual void PreConnectOperations();
williamr@2
   102
williamr@2
   103
	/**
williamr@2
   104
	 * Operations to perform after attempting a connection.
williamr@2
   105
	 * As multiple connection attempts can be made, it is necessary for this
williamr@2
   106
	 * routine to ensure it can handle being called multiple times.
williamr@2
   107
	 * May be overridden. Default implementation is blank.
williamr@2
   108
	 */
williamr@2
   109
	IMPORT_C virtual void PostConnectOperations();
williamr@2
   110
williamr@2
   111
	/**
williamr@2
   112
	 * Operations to perform before attempting to send a set of objects.
williamr@2
   113
	 * May be overridden. Default implementation is blank.
williamr@2
   114
	 */
williamr@2
   115
	IMPORT_C virtual void PreSendOperations();
williamr@2
   116
williamr@2
   117
	/**
williamr@2
   118
	 * Operations to perform after attempting to send a set of objects.
williamr@2
   119
	 * May be overridden. Default implementation is blank.
williamr@2
   120
	 */
williamr@2
   121
	IMPORT_C virtual void PostSendOperations();
williamr@2
   122
williamr@2
   123
williamr@2
   124
protected: // for use by derived classes
williamr@2
   125
	/**
williamr@2
   126
	 * Constructor.
williamr@2
   127
	 *
williamr@2
   128
	 * @param aMsgTypeUid UID of message type
williamr@2
   129
	 * @param aSendObj Reference to the object to send.
williamr@2
   130
	 * @param aConnectTimeoutMicroSeconds Timeout period for Connect operation in microseconds.
williamr@2
   131
	 * @param aPutTimeoutMicroseconds Timeout period for Put operation in microseconds.
williamr@2
   132
	 * @param aObserverRequestStatus TRequestStatus of owning active object.
williamr@2
   133
	 */
williamr@2
   134
	
williamr@2
   135
	IMPORT_C CObexServerSendOperation(TUid aMsgTypeUid, CMsvServerEntry& aSendObj, TInt aConnectTimeoutMicroSeconds, TInt aPutTimeoutMicroSeconds, TRequestStatus& aObserverRequestStatus);
williamr@2
   136
	
williamr@2
   137
	/**
williamr@2
   138
	 * Second phase constructor. Sets up connection to the FileServer, initialises attachments or filename list then 
williamr@2
   139
	 * starts sending process by initialising.
williamr@2
   140
	 *
williamr@2
   141
	 * @param aConnectPassword Pointer to the password to be used for authentication.
williamr@2
   142
	 * @leave Leaves if insufficient memory.
williamr@2
   143
	 * @leave Leaves if cannot connect to FileServer.
williamr@2
   144
	 */
williamr@2
   145
	
williamr@2
   146
	IMPORT_C void ConstructL(const TDesC* aConnectPassword);
williamr@2
   147
williamr@2
   148
	/**
williamr@2
   149
	 * Cancels the current operation, deletes the client and Cancel()s the timeout timer. Only completes the observer
williamr@2
   150
	 * (by a call to CompleteObserver) if an external entity (i.e. the owner) has called Cancel().
williamr@2
   151
	 * Otherwise the observer is not completed.
williamr@2
   152
	 */
williamr@2
   153
	
williamr@2
   154
	IMPORT_C virtual void DoCancel();
williamr@2
   155
williamr@2
   156
	 /* Constructor, Alternative version
williamr@2
   157
	 *
williamr@2
   158
	 * @param aMsgTypeUid UID of message type
williamr@2
   159
	 * @param aSendObj Reference to the object to send.
williamr@2
   160
	 * @param aConnectTimeoutMicroSeconds Timeout period for Connect operation in microseconds.
williamr@2
   161
	 * @param aPutTimeoutMicroseconds Timeout period for Put operation in microseconds.
williamr@2
   162
	 * @param aObserverRequestStatus TRequestStatus of owning active object.
williamr@2
   163
	 * @param aLastSendAttempt TBool flag to check for the second send attempt and also control header sending.  EFalse sends full headers, ETrue only sends name and size.
williamr@2
   164
	 */
williamr@2
   165
	
williamr@2
   166
	IMPORT_C CObexServerSendOperation(TUid aMsgTypeUid, CMsvServerEntry& aSendObj, TInt aConnectTimeoutMicroSeconds,
williamr@2
   167
	                                  TInt aPutTimeoutMicroSeconds, TRequestStatus& aObserverRequestStatus, 
williamr@2
   168
	                                  TBool aLastSendAttempt);
williamr@2
   169
	
williamr@2
   170
	/**
williamr@2
   171
	* Tells the derived class that the base class is about to complete the observer.
williamr@2
   172
	* This is the first thing called when CompleteObserver is called.
williamr@2
   173
	* Since the behaviour of CompleteObserver is to clean up the message that it was trying to send,
williamr@2
   174
	* this calls gives the derived class an opportunity to either stop this deletion or recover any information
williamr@2
   175
	* synchronously from the message.
williamr@2
   176
	* If the derived class has no need to use this functionality, the default implementation allows deletion.
williamr@2
   177
	* @param aErrorCode The last error code encountered
williamr@2
   178
	* @return TBool True delete the message
williamr@2
   179
	* @return TBool False DO NOT delete the message
williamr@2
   180
	*/
williamr@2
   181
	IMPORT_C virtual TBool CompletingObserver(TInt aErrorCode);
williamr@2
   182
williamr@2
   183
public: // called by CObexSendOpTimeout
williamr@2
   184
	
williamr@2
   185
	/**
williamr@2
   186
	 * Called when the current operation times out. Causes the current operation to be cancelled, then reactivates with
williamr@2
   187
	 * the appropriate error code (KErrIrObexClientNoDevicesFound or KErrIrObexClientPutPeerAborted).
williamr@2
   188
	 */
williamr@2
   189
	
williamr@2
   190
	void TimeOut();
williamr@2
   191
williamr@2
   192
public:
williamr@2
   193
	
williamr@2
   194
	/**
williamr@2
   195
	 * Returns current progress information.
williamr@2
   196
	 *
williamr@2
   197
	 * @return A reference to a TPckgC<TObexMtmProgress> package pointer descriptor containing progress information on this send operation.
williamr@2
   198
	 * @leave KErrXXX system wide error codes
williamr@2
   199
	 */
williamr@2
   200
	IMPORT_C const TDesC8& ProgressL();
williamr@2
   201
	
williamr@2
   202
	TBool iAsyncInit;
williamr@2
   203
williamr@2
   204
private: // From MObexAuthChallengeHandler
williamr@2
   205
williamr@2
   206
	/**
williamr@2
   207
	 * Called by the Obex Client when authentication is requested to pass the password back. If the password is invalid, this
williamr@2
   208
	 * call should succeed but the send operation as a whole will inevitably fail.
williamr@2
   209
	 *
williamr@2
   210
	 * @param aRelm ignored, but could be used to indicate which password to use.
williamr@2
   211
	 * @leave KErrXXX system wide error codes. Shouldn't leave just because the password is invalid.
williamr@2
   212
	 */
williamr@2
   213
	
williamr@2
   214
	IMPORT_C virtual void GetUserPasswordL(const TDesC& aUserID);
williamr@2
   215
williamr@2
   216
private: // From CActive
williamr@2
   217
	
williamr@2
   218
	
williamr@2
   219
	/**
williamr@2
   220
	 * Calls RealRunL(), and traps errors
williamr@2
   221
	 *
williamr@2
   222
	 * @leave Leaves with errors from RealRunL()
williamr@2
   223
	 */
williamr@2
   224
	
williamr@2
   225
	IMPORT_C virtual void RunL();
williamr@2
   226
williamr@2
   227
private:
williamr@2
   228
williamr@2
   229
	/**
williamr@2
   230
	 * Destructor. Cancel()s, deletes owned objects and Close()s the connection to the FileServer.
williamr@2
   231
	 */
williamr@2
   232
	
williamr@2
   233
	void BuildSpecificDestructor();
williamr@2
   234
	
williamr@2
   235
	/**
williamr@2
   236
	 * Normal second phase constructor.
williamr@2
   237
	 */
williamr@2
   238
	
williamr@2
   239
	void BuildSpecificConstructL();
williamr@2
   240
	
williamr@2
   241
	/**
williamr@2
   242
	 * Cancels the current operation, then reactivates with the given error code.
williamr@2
   243
	 *
williamr@2
   244
	 * @param aError Error code to be passed to CompleteSelf.
williamr@2
   245
	 */
williamr@2
   246
	
williamr@2
   247
	void ActivateRunLWithError(TInt aError);
williamr@2
   248
	
williamr@2
   249
	/**
williamr@2
   250
	 * Cancel any pending obex operation without completing the observer. 
williamr@2
   251
	 */
williamr@2
   252
williamr@2
   253
	void ExplicitCancel();  // Must call this instead of just Cancel(), otherwise the owner of this op will be completed.
williamr@2
   254
	
williamr@2
   255
	/**
williamr@2
   256
	 * Complete the observer, reporting any error via the progress. THIS METHOD MUST BE CALLED ONCE ONLY.
williamr@2
   257
	 *
williamr@2
   258
	 */
williamr@2
   259
	
williamr@2
   260
	void CompleteObserverL();
williamr@2
   261
	
williamr@2
   262
	/**
williamr@2
   263
	 * This causes this active object's request to complete which means
williamr@2
   264
	 * RunL() will be called again if we are active (immediately if there 
williamr@2
   265
	 * are no higher priority active objects in the active scheduler).
williamr@2
   266
	 *
williamr@2
   267
	 * @param aError Error to be passed forward to the next step of the state machine
williamr@2
   268
	 */
williamr@2
   269
	
williamr@2
   270
	void CompleteSelf(TInt aError);
williamr@2
   271
williamr@2
   272
	/**
williamr@2
   273
	 * Implementation of the send operation state machine. Progresses as:
williamr@2
   274
	 * Initialise-->Connect-->ConnectAttemptComplete-->SendObject-->(SendNextObject-->)SendComplete-->Disconnected
williamr@2
   275
	 * The SendNextObject state is repeated for each attachment in excess of one. 
williamr@2
   276
	 * Also handles UserCancelled and SendError states by CompleteObserver()ing with appropriate error codes.
williamr@2
   277
	 * Leaves will be passed back to RunL and handled there. 
williamr@2
   278
	 *
williamr@2
   279
	 * @leave KErrXXX system wide error codes
williamr@2
   280
	 */
williamr@2
   281
	
williamr@2
   282
	void RealRunL();
williamr@2
   283
	
williamr@2
   284
	/**
williamr@2
   285
	 * Delete the outbox entry as operation has 'completed'.
williamr@2
   286
	 * Will be invisible&InPreparation anyway (MS delete will delete it the next 
williamr@2
   287
	 * time it starts).
williamr@2
   288
	 */
williamr@2
   289
	
williamr@2
   290
	TInt SynchronousEntryDelete();
williamr@2
   291
	
williamr@2
   292
	/**
williamr@2
   293
	 * Load an attachment into the obex sending buffer, and create a new Obex object of name TMsvEntry::iDetails.
williamr@2
   294
	 *
williamr@2
   295
	 * @param aParent Reference to CMsvServerEntry to be sent.
williamr@2
   296
	 * @param aWhichAttachment Zero-based index of attachment to send.
williamr@2
   297
	 * @leave KErrXXX system wide error codes
williamr@2
   298
	 */
williamr@2
   299
	
williamr@2
   300
	void InitialiseAttachmentL(CMsvServerEntry& aParent, TInt aWhichAttachment);
williamr@2
   301
	
williamr@2
   302
	void LoadFileIntoObjectL(const TDesC& aFileName, const TDesC& aObexName, const TDesC8& aMimeType);
williamr@2
   303
williamr@2
   304
williamr@2
   305
	/**
williamr@2
   306
	 * Checks the last object was sent correctly, and tries to action appropriate error feedback if not. Only to be called
williamr@2
   307
	 * from ESendObject/ESendNextObject or ESendComplete states. 
williamr@2
   308
	 *
williamr@2
   309
	 * @param aStatus Status of last object
williamr@2
   310
	 * @return ETrue if message was OK--EFalse if message failed and this function has taken the necessary action
williamr@2
   311
	 */
williamr@2
   312
williamr@2
   313
	TBool CheckStatusOfLastObject(TInt aStatus, TObexMtmProgress::TSendState aSendState);
williamr@2
   314
	
williamr@2
   315
	/**
williamr@2
   316
	 * Loads the next object to be sent, whether an attachment or a file in the file list.
williamr@2
   317
	 *
williamr@2
   318
	 * @return KErrXXX standard error code
williamr@2
   319
	 * @return KErrNotFound if there were neither attachments nor files in the file list
williamr@2
   320
	 * @leave KErrXXX system wide error codes
williamr@2
   321
	 */
williamr@2
   322
	
williamr@2
   323
	TInt PrepareCurrentObjectAndSetStateL();
williamr@2
   324
	
williamr@2
   325
	/**
williamr@2
   326
	 * Moves the newly sent message to the global sent items folder, and sets active ready for its completion.
williamr@2
   327
	 *
williamr@2
   328
	 * @leave KErrXXX system wide error codes
williamr@2
   329
	 */
williamr@2
   330
	
williamr@2
   331
	void MoveToSentAndSetActiveL();
williamr@2
   332
	
williamr@2
   333
	/**
williamr@2
   334
	 * Restores after the message has been moved to the inbox, and marks the message as visible.
williamr@2
   335
	 */
williamr@2
   336
williamr@2
   337
	void CleanupAfterMovedToSent();
williamr@2
   338
	
williamr@2
   339
	/**
williamr@2
   340
	 * Returns a reference to the file session (RFs) of the message
williamr@2
   341
	 *
williamr@2
   342
	 * @return A reference to the file session of the the message 
williamr@2
   343
	 */
williamr@2
   344
williamr@2
   345
	RFs& FileSession();
williamr@2
   346
williamr@2
   347
williamr@2
   348
#ifdef __OBEX_SEND_OP_FILE_DEBUG_MODE__
williamr@2
   349
	/**
williamr@2
   350
	 * Output the obex object to a file in the service folder
williamr@2
   351
	 *
williamr@2
   352
	 * @leave KErrXXX system wide error codes
williamr@2
   353
	 */
williamr@2
   354
	
williamr@2
   355
	TInt PutObexObjectToServiceFileL();
williamr@2
   356
#endif	//__OBEX_SEND_OP_FILE_DEBUG_MODE__
williamr@2
   357
williamr@2
   358
protected: 
williamr@2
   359
	CObexClient* iObexClient; ///<The Obex client memeber
williamr@2
   360
	TBool        iLastSendAttempt;	// check for second send attempt and also to control header sending
williamr@2
   361
williamr@2
   362
private:
williamr@2
   363
	//From member initialisation list
williamr@2
   364
	TRequestStatus&					iObserverRequestStatus;		///<TRequestStatus for notifying observer (eventually  ClientMTM) of completion
williamr@2
   365
	CMsvServerEntry&				iMsvSendParent;				///<The message being sent (i.e. the parent of any attachments being sent)
williamr@2
   366
	const TInt						iConnectTimeout;			///<Connection attempt timeout in microseconds
williamr@2
   367
	const TInt						iPutTimeout;				///<Put attempt timeout in microseconds
williamr@2
   368
	TBool							iCancelWithoutCompleting;	///<Flag to allow cancellation without completing observer
williamr@2
   369
	TPckgBuf<TObexMtmProgress>		iProgressPckg;				///<Progress package buffer
williamr@2
   370
	const TUid						iMtm;						///<UID of this MTM
williamr@2
   371
williamr@2
   372
williamr@2
   373
	TInt							iNextAttachment;			///<Index of next attachment to be sent
williamr@2
   374
	CObexFileObject*				iObexObject;				///<Obex object currently being sent
williamr@2
   375
	TFileName						iSendFile;					///<Filename of the object to be sent--necessary since CObexFileObject does not export its copy
williamr@2
   376
	CObexSendOpTimeout*				iTimeoutTimer;				///<Timeout timer used for various operations
williamr@2
   377
	HBufC*							iConnectPassword;			///<Authentication password 
williamr@2
   378
	TObexMtmProgress::TSendState	iSendState;					///<State machine state
williamr@2
   379
	TInt							iAttachmentEntryCount;		///<Number of attachments to send (==0 if iFileNameEntryCount!=0)
williamr@2
   380
williamr@2
   381
williamr@2
   382
	CMsvOperation*					iMoveOperation;				///<Operation to govern the movement of the sccessfully sent message to the sent folder
williamr@2
   383
	CMsvEntrySelection*				iMoveEntrySelection;		///<Entry selection containing the entry to rename
williamr@2
   384
williamr@2
   385
	TFileName						iServicePath;				///<Path of service folder
williamr@2
   386
	};
williamr@2
   387
williamr@2
   388
williamr@2
   389
williamr@2
   390
///////////////////////////////////////////////////////////////////////////////////
williamr@2
   391
// CObexSendOpTimeout 
williamr@2
   392
///////////////////////////////////////////////////////////////////////////////////
williamr@2
   393
williamr@2
   394
class CObexSendOpTimeout : public CTimer
williamr@2
   395
/**
williamr@2
   396
class CObexSendOpTimeout
williamr@2
   397
williamr@2
   398
Obex Send Operation Timeout active object:
williamr@2
   399
williamr@2
   400
Straightforward active object used for timeout operations by CObexServerSendOperation.
williamr@2
   401
williamr@2
   402
@internalComponent
williamr@2
   403
@released
williamr@2
   404
*/
williamr@2
   405
  	{
williamr@2
   406
public:
williamr@2
   407
	
williamr@2
   408
	/**
williamr@2
   409
	 *Canonical NewL function, which also sets the owner operation.
williamr@2
   410
	 *
williamr@2
   411
	 *@param aSendOperation Obex send operation which will be "timed out" when the timer expires
williamr@2
   412
	 */
williamr@2
   413
williamr@2
   414
	static CObexSendOpTimeout* NewL(CObexServerSendOperation* aSendOperation);
williamr@2
   415
private:
williamr@2
   416
	
williamr@2
   417
	/**
williamr@2
   418
	 * Constructor. Calls CTimer's constructor with priority EPriorityStandard
williamr@2
   419
	 */
williamr@2
   420
williamr@2
   421
	CObexSendOpTimeout();
williamr@2
   422
	
williamr@2
   423
	/**
williamr@2
   424
	 * Second phase constructor. Calls CTimer::ConstructL(), and adds itself to the active scheduler
williamr@2
   425
	 *
williamr@2
   426
	 * @leave KErrXXX system wide error codes
williamr@2
   427
	 */
williamr@2
   428
	
williamr@2
   429
	void ConstructL();
williamr@2
   430
	
williamr@2
   431
	/**
williamr@2
   432
	 * Calls the TimeOut method of the associated CObexServerSendOperation when the timer expires
williamr@2
   433
	 *
williamr@2
   434
	 * @leave KErrXXX system wide error codes
williamr@2
   435
	 */
williamr@2
   436
	
williamr@2
   437
	void RunL();
williamr@2
   438
private:
williamr@2
   439
	CObexServerSendOperation* iSendOperation; ///<The Obex server send operation
williamr@2
   440
	};
williamr@2
   441
williamr@2
   442
williamr@2
   443
#endif // __OBEXSENDOP_H__