ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtjobchannel.cpp
branchRCL_3
changeset 20 159fc2f68139
parent 17 26673e532f65
child 21 d59c248c9d36
equal deleted inserted replaced
17:26673e532f65 20:159fc2f68139
     1 /*
       
     2 * Copyright (c) 2004-2007 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 /**
       
    20  *  @file CBtJobChannel.h
       
    21  *	@brief	Defines the CBtJobChannel class.
       
    22  */
       
    23 
       
    24 #include <obex.h>
       
    25 
       
    26 #include "crsbtdevice.h"
       
    27 #include "cbtjobchannel.h"
       
    28 #include "cbtsoapcodec.h"
       
    29 #include "clog.h"
       
    30 #include "tbtmapper.h"
       
    31 #include "cbtdiscover.h"
       
    32 #include "printmessagecodes.h"
       
    33 #include "cbtstatuschannel.h"
       
    34 #include "rsutils.h"
       
    35 #include "cbttimer.h"
       
    36 #include "btprotocolconsts.h"
       
    37 
       
    38 //--------------------------------------------------------------------------------------------
       
    39 //
       
    40 // CBtJobChannel::NewL
       
    41 //
       
    42 //--------------------------------------------------------------------------------------------
       
    43 CBtJobChannel* CBtJobChannel::NewL(MBtPCObserver& aObs)
       
    44 {
       
    45 		CBtJobChannel *self = NewLC(aObs);
       
    46 		CleanupStack::Pop(); // self
       
    47 
       
    48 		return self;
       
    49 }
       
    50 
       
    51 //--------------------------------------------------------------------------------------------
       
    52 //
       
    53 // CBtJobChannel::NewLC
       
    54 //
       
    55 //--------------------------------------------------------------------------------------------
       
    56 CBtJobChannel* CBtJobChannel::NewLC(MBtPCObserver& aObs)
       
    57 {
       
    58 		CBtJobChannel *self = new (ELeave) CBtJobChannel(aObs);
       
    59 		CleanupStack::PushL(self);
       
    60 		self->ConstructL();
       
    61 		return self;
       
    62 }
       
    63 
       
    64 //--------------------------------------------------------------------------------------------
       
    65 //
       
    66 // CBtJobChannel::CBtJobChannel
       
    67 //
       
    68 //--------------------------------------------------------------------------------------------
       
    69 CBtJobChannel::CBtJobChannel(MBtPCObserver& aObs):
       
    70 	CBtChannelBase(aObs),
       
    71 	iJobFile(KNullDesC8()),
       
    72 	iJobFileNum(0),
       
    73 	iImageCount(0),
       
    74 	iFileObjectSize(0),
       
    75 	iObexFileObject(NULL),
       
    76 	iPercents(0),
       
    77 	iTimer(NULL),
       
    78 	iStatusChannel(NULL)
       
    79 {
       
    80 	LOG("[CBtJobChannel::CBtJobChannel]\t");
       
    81 }
       
    82 
       
    83 //--------------------------------------------------------------------------------------------
       
    84 //
       
    85 // CBtJobChannel::~CBtJobChannel
       
    86 //
       
    87 //--------------------------------------------------------------------------------------------
       
    88 CBtJobChannel::~CBtJobChannel()
       
    89 {
       
    90 	LOG("[CBtJobChannel::~CBtJobChannel]\t");
       
    91 	Stop();
       
    92 
       
    93 	// ignore leave: if cleaning fails, no can do.
       
    94 	TRAP_IGNORE(CleanXhtmlDirL())
       
    95 	
       
    96 	if(iObexFileObject)
       
    97 		delete iObexFileObject;
       
    98 	
       
    99 	if(iTimer)
       
   100 		delete iTimer;
       
   101 	
       
   102 	if(iStatusChannel)
       
   103 	{
       
   104 		delete iStatusChannel;
       
   105 		iStatusChannel = NULL;
       
   106 	}
       
   107 	
       
   108 	// deleting iChannel here because review-x report error.
       
   109 	if(iChannel)
       
   110 	{
       
   111 		delete iChannel;
       
   112 		iChannel = NULL;
       
   113 	}
       
   114 
       
   115 	iImageList.Reset();
       
   116 	iImageList.Close();
       
   117 	
       
   118 	if (iUpdateProgress)
       
   119 		{
       
   120 		delete iUpdateProgress;
       
   121 		iUpdateProgress = NULL;
       
   122 		}
       
   123 
       
   124 	LOG("[CBtJobChannel::~CBtJobChannel]\t out");
       
   125 }
       
   126 
       
   127 //--------------------------------------------------------------------------------------------
       
   128 //
       
   129 // CBtJobChannel::ConstructL
       
   130 //
       
   131 //--------------------------------------------------------------------------------------------
       
   132 void CBtJobChannel::ConstructL()
       
   133 {
       
   134 	LOG("[CBtJobChannel::ConstructL]\t begin");
       
   135 
       
   136 	CBtChannelBase::ConstructL();
       
   137 
       
   138 	iObexFileObject = CObexFileObject::NewL();
       
   139 	iStatusChannel = CBtStatusChannel::NewL(iObs);
       
   140 
       
   141 	iState = EStateNone;
       
   142 	iPercents = 0;
       
   143 	iImageCount = 0;
       
   144 	
       
   145 	// Create periodic timer to update progress of printing. 
       
   146 	iUpdateProgress = CPeriodic::NewL( CActive::EPriorityStandard );
       
   147 }
       
   148 
       
   149 //--------------------------------------------------------------------------------------------
       
   150 //
       
   151 // CBtJobChannel::RunL
       
   152 //
       
   153 //--------------------------------------------------------------------------------------------
       
   154 void CBtJobChannel::RunL()
       
   155 {
       
   156 	LOG2("[CBtJobChannel::RunL]\t BEGIN iStatus %d at state %d", iStatus.Int(), iState);
       
   157 
       
   158 	 //Finish if required
       
   159 	if( EStateFinish == iState )
       
   160 	{
       
   161 		ClearConnection();
       
   162 		return;
       
   163 	}
       
   164 
       
   165 	// leave if "not allowed" error
       
   166 	DoLeaveL( iStatus.Int() );
       
   167 
       
   168 	switch( iState )
       
   169 	{ 
       
   170 		case EStateConnecting:
       
   171 			RemoveObexCmdTimeOut();
       
   172 			iObexNullObject->Reset();
       
   173 			LOG("[CBtJobChannel::RunL]\t EStateConnecting");
       
   174 			StopWaiting();
       
   175 			break;
       
   176         case EStateDisconnecting:
       
   177 			StopWaiting();
       
   178 			// Go to disconnection again in case it is not finished yet...
       
   179 			Disconnect();
       
   180 			break;
       
   181 		case EStateGettingCapabilities:
       
   182 			GetSoapResponseL();
       
   183 			GetPrinterCapabilitiesResponseL();
       
   184 
       
   185 			StopWaiting();
       
   186 
       
   187 			iState = EStateNone;
       
   188 			break;
       
   189 		case EStateGettingPrinterState:
       
   190 			GetSoapResponseL();
       
   191 			GetPrinterStateResponseL();
       
   192 
       
   193 			iState = EStateNone;
       
   194 			break;
       
   195 		case EStateCreatingJob:
       
   196 		{
       
   197 			GetSoapResponseL();
       
   198 			TInt res = CreateJobResponseL();
       
   199 			StopWaiting();
       
   200 			// No reason to send doc in error case
       
   201 			if(KErrNone == res)
       
   202 			{
       
   203 				LOG("[CBtJobChannel::RunL]\t CreateJobResponseL() returns %d");
       
   204 				SendXhtmlDocumentL();
       
   205 			}
       
   206 		}
       
   207 			break;
       
   208 		case EStateCancellingJob:
       
   209 			GetSoapResponseL();
       
   210 			CancelJobResponseL();
       
   211 
       
   212 			iDevice = NULL;
       
   213 			iState = EStateNone;
       
   214 			break;
       
   215 		case EStateGettingJobAttributes:
       
   216 			GetSoapResponseL();
       
   217 			GetJobAttributesResponseL();
       
   218 
       
   219 			iState = EStateNone;
       
   220 			break;
       
   221 		case EStateSendingXhtml:
       
   222 			iState = EStateNone;
       
   223 			iObexBufObject->Reset();
       
   224 			iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, ENoMessage, iStatus.Int());
       
   225 			break;
       
   226 		case EStateSendingOPP:						
       
   227 			SendOPPL();
       
   228 			break;
       
   229 		default:
       
   230 			break;		
       
   231 	}
       
   232 	LOG("[CBtJobChannel::RunL]\t out");
       
   233 }
       
   234 
       
   235 //--------------------------------------------------------------------------------------------
       
   236 //
       
   237 // CBtJobChannel::RunError
       
   238 //
       
   239 //--------------------------------------------------------------------------------------------
       
   240 TInt CBtJobChannel::RunError(TInt aError)
       
   241 	{
       
   242 	LOG1("[CBtJobChannel::RunError]\t state %d", iState);
       
   243 	LOG2("[CBtJobChannel::RunError]\t error %d, iStatus %d", aError, iStatus.Int() );
       
   244 
       
   245 	TInt id = KErrNotFound;
       
   246 
       
   247 	StopWaiting();
       
   248 
       
   249 	switch ( iState )
       
   250 		{
       
   251 		case EStateGettingPrinterState:
       
   252 			if(iDevice)
       
   253 				id = iDevice->DeviceId();
       
   254 
       
   255 			iState = EStateFinish;
       
   256 			iObs.GetPrinterStateResponse(EBtStateIdle, ENoMessage, aError, id);
       
   257 			break;
       
   258 		case EStateCreatingJob:
       
   259 			iState = EStateFinish;
       
   260 			iObs.CreateJobResponse(KErrNotFound, aError);
       
   261 			break;
       
   262 		case EStateCancellingJob:
       
   263 			iState = EStateFinish;
       
   264 			iObs.CancelJobResponse(aError);
       
   265 			break;
       
   266 		case EStateGettingJobAttributes:
       
   267 			iState = EStateFinish;
       
   268 			iObs.GetJobAttributesResponse(iJobId, KNullDesC8(), KNullDesC8(), KErrNotFound, KErrNotFound, aError);
       
   269 			break;
       
   270 		case EStateSendingXhtml:
       
   271 		case EStateSendingOPP:
       
   272 		default:
       
   273 			iState = EStateFinish;
       
   274 			iObs.GetEventResponse(KErrNotFound, KErrNotFound, KErrNotFound, KErrNotFound, aError);
       
   275 			LOG("[CBtJobChannel::RunError]\t GetEventResponse sent" );
       
   276 			break;
       
   277 		}
       
   278 
       
   279 	iResponseError = aError;
       
   280 	return KErrNone; // othervise error returns to CActive: that's what we don't want.
       
   281 	}
       
   282 
       
   283 //--------------------------------------------------------------------------------------------
       
   284 //
       
   285 // CBtJobChannel::DoCancel
       
   286 //
       
   287 //--------------------------------------------------------------------------------------------
       
   288 void CBtJobChannel::DoCancel()
       
   289 {
       
   290 	LOG2("[CBtJobChannel::DoCancel]\t at state %d, iStatus 0x%X", iState, iStatus.Int());
       
   291 
       
   292 	StopWaiting();
       
   293 
       
   294 	iState = EStateNone;
       
   295 	
       
   296 	CBtChannelBase::DoCancel();
       
   297 	iStatusChannel->Cancel();
       
   298 	LOG1("[CBtJobChannel::DoCancel]\t out iStatus 0x%X", iStatus.Int());
       
   299 }
       
   300 
       
   301 //------------------------------
       
   302 // InCalls
       
   303 //------------------------------
       
   304 
       
   305 
       
   306 //--------------------------------------------------------------------------------------------
       
   307 //
       
   308 // CBtJobChannel::HandleTimeoutL
       
   309 //
       
   310 //--------------------------------------------------------------------------------------------
       
   311 void CBtJobChannel::HandleTimeoutL()
       
   312 {
       
   313 	LOG1("[CBtJobChannel::HandleTimeoutL]\t at state %d", iState);
       
   314 
       
   315 	if(EStateSendingOPP != iState)
       
   316 		return;
       
   317 	
       
   318 	TInt state(EBtStateSending);
       
   319 	if( 100 == iPercents )
       
   320 	{
       
   321 		state = EBtStateCompleted;
       
   322 	}
       
   323 	else if(iTimer)
       
   324 		iTimer->Start(KSentPercentsDelay);
       
   325 
       
   326 	iObs.GetEventResponse(iJobId, state, EBtStatePrinting, KErrNone, KErrNone);
       
   327 }
       
   328 
       
   329 //--------------------------------------------------------------------------------------------
       
   330 //
       
   331 // CBtJobChannel::GetPercentSent
       
   332 //
       
   333 //--------------------------------------------------------------------------------------------
       
   334 TInt CBtJobChannel::GetPercentSent()
       
   335 {
       
   336 	LOG1("[CBtJobChannel::GetPercentSent]\t at state %d", iState);
       
   337 
       
   338 	iPercents = 100;
       
   339 	
       
   340 	if(EStateSendingOPP == iState)
       
   341 	{	
       
   342 		// Store current bytes sent. 
       
   343 		TReal32 bytesSent = iObexFileObject->BytesSent();
       
   344 	
       
   345 		TInt temp = iProgressOfFullImages - iFileObjectSize;
       
   346 		iPercents = ( 100 * ( ( temp + bytesSent ) / iJobSize) );
       
   347 
       
   348 		LOG2("[CBtJobChannel::GetPercentSent]\t iJobId %d, iImageCount: %d", iJobId, iImageCount);
       
   349 		LOG2("[CBtJobChannel::GetPercentSent]\t BytesSent %d, iFileObjectSize %d", iObexFileObject->BytesSent(), iFileObjectSize);
       
   350 	}
       
   351 	
       
   352 	LOG1("[CBtJobChannel::GetPercentSent]\t at state %d", iPercents);
       
   353 	return iPercents;	
       
   354 }
       
   355 
       
   356 //--------------------------------------------------------------------------------------------
       
   357 //
       
   358 // CBtJobChannel::CreateJobL
       
   359 //
       
   360 //--------------------------------------------------------------------------------------------
       
   361 void CBtJobChannel::CreateJobL(CPrintJob& aJob)
       
   362 	{
       
   363 	LOG("[CBtJobChannel::CreateJob]\t begin");
       
   364 
       
   365 	if(!IsConnected())
       
   366 		User::Leave( KErrDisconnected );
       
   367 
       
   368 	Cancel();
       
   369 
       
   370 	iProgressOfFullImages = 0;
       
   371 
       
   372 	++iJobFileNum;
       
   373 	iJobFile.Format(KXHTMLFileName8(), iJobFileNum);
       
   374 	aJob.GetPrintFileL(iJobFile);
       
   375 
       
   376 	iImageList.Reset();
       
   377 	aJob.Images(iImageList);
       
   378 
       
   379 	iJobSize = CalculateJobSizeL();
       
   380 
       
   381 	iImageCount = iImageList.Count();
       
   382 	LOG1("[CBtJobChannel::CreateJob]\t iImageList.Count(): %d", iImageList.Count());
       
   383 
       
   384 	iJobId = KErrNotFound;
       
   385 	iResponseError = KErrNone;
       
   386 
       
   387 	LOG1("[CBtJobChannel::CreateJob]\t aDevice.UsedProtocol() %d", iDevice->UsedProtocol());
       
   388 	if(KImagePrint_PrinterProtocol_BPP == iDevice->UsedProtocol())
       
   389 		{
       
   390 		iState = EStateCreatingJob;
       
   391 		SendSoapRequestL(EBtCreateJob, iJobFileNum);
       
   392 		// do asynchronously to indicate to start the object server
       
   393 		WaitL();
       
   394 	}
       
   395 	else
       
   396 	{
       
   397 		iState = EStateSendingOPP;
       
   398 		iJobId = 1;
       
   399 		SendOPPL();
       
   400 		Activate();
       
   401 	}
       
   402 
       
   403 	LOG1("[CBtJobChannel::CreateJob]\t Request sent. iResponseError: %d", iResponseError);
       
   404 	if( KErrNone != iResponseError )
       
   405 		{
       
   406 		User::Leave( iResponseError );
       
   407 		}
       
   408 	LOG("[CBtJobChannel::CreateJob]\t out");
       
   409 	}
       
   410 
       
   411 
       
   412 //--------------------------------------------------------------------------------------------
       
   413 //
       
   414 // CBtJobChannel::GetCapabilitiesL
       
   415 //
       
   416 // Fully independent and synchronous method. Does not require any existing 
       
   417 // connections and all connections will be deleted after execution.
       
   418 //
       
   419 //--------------------------------------------------------------------------------------------
       
   420 void CBtJobChannel::GetCapabilitiesL(CRsBtDevice& aDevice)
       
   421 {
       
   422 	LOG("[CBtJobChannel::GetCapabilitiesL]\t");
       
   423 	Cancel();
       
   424 
       
   425 	if( KImagePrint_PrinterProtocol_BPP != aDevice.UsedProtocol() )
       
   426 		User::Leave(KErrNotSupported);
       
   427 
       
   428 	if( !RsUtils::IsBluetoothOn() )
       
   429 		User::Leave(KErrCancel);
       
   430 	
       
   431 	CRsBtDevice* tmpDevice = iDevice;
       
   432 	iDevice = &aDevice;
       
   433 	TBool connected = IsConnected();
       
   434 	iResponseError = KErrNone;
       
   435 
       
   436 	ConnectL();
       
   437 	WaitL();
       
   438 		
       
   439 	LOG1("[CBtJobChannel::GetCapabilitiesL]\t ConnectL done: %d", IsConnected());
       
   440 
       
   441 	iState = EStateGettingCapabilities;
       
   442 	SendSoapRequestL(EBtGetPrinterAttributes);
       
   443 	LOG1("[CBtJobChannel::GetCapabilitiesL]\t SendSoapRequestL done: %d", IsConnected());
       
   444 
       
   445 	WaitL();
       
   446 	
       
   447 	if(!connected)
       
   448 	{
       
   449 		ClearConnection();
       
   450 	}
       
   451 	iDevice = tmpDevice;
       
   452 	tmpDevice = NULL;
       
   453 
       
   454 	LOG("[CBtJobChannel::GetCapabilitiesL]\t OUT");
       
   455 	User::LeaveIfError(iResponseError);
       
   456 }
       
   457 
       
   458 //--------------------------------------------------------------------------------------------
       
   459 //
       
   460 // CBtJobChannel::GetPrinterStateL
       
   461 //
       
   462 //--------------------------------------------------------------------------------------------
       
   463 void CBtJobChannel::GetPrinterStateL()
       
   464 {
       
   465 	LOG1("[CBtJobChannel::GetPrinterStateL]\t begin for protocol %d", iDevice->UsedProtocol());
       
   466 	if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
       
   467 	{
       
   468 		iObs.GetPrinterStateResponse(EBtStatePrinting, ENoMessage, KErrNone, iDevice->DeviceId());
       
   469 		return;
       
   470 	}
       
   471 	
       
   472 	if(!IsConnected())
       
   473 		User::Leave(KErrDisconnected);
       
   474 	
       
   475 	iStatusChannel->StartL(*iDevice);
       
   476 	iStatusChannel->GetPrinterStateL();
       
   477 }
       
   478 
       
   479 //--------------------------------------------------------------------------------------------
       
   480 //
       
   481 // CBtJobChannel::GetJobAttributesL
       
   482 //
       
   483 //--------------------------------------------------------------------------------------------
       
   484 void CBtJobChannel::GetJobAttributesL(TInt aJobId)
       
   485 {
       
   486 	LOG("[CBtJobChannel::GetJobAttributesL]\t begin");
       
   487 	
       
   488 	if(!iDevice)
       
   489 	{
       
   490 	    User::Leave(KErrDisconnected);   
       
   491 	}
       
   492 	
       
   493 	LOG1("[CBtJobChannel::GetJobAttributesL]\t begin for protocol %d", iDevice->UsedProtocol());
       
   494 	if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
       
   495 	{
       
   496 		TInt state(EBtStateSending), completed(0);
       
   497 		if(100 == iPercents)
       
   498 		{
       
   499 			state = EBtStateCompleted;
       
   500 			completed = iImageCount;
       
   501 		}
       
   502 			
       
   503 		iObs.GetJobAttributesResponse(state, KNullDesC8(), KNullDesC8(), completed, 0, KErrNone);
       
   504 		return;
       
   505 	}
       
   506 	
       
   507 	if(!IsConnected())
       
   508 		User::Leave(KErrDisconnected);
       
   509 	
       
   510 	LOG("[CBtJobChannel::GetJobAttributesL]\t start status channel if required");
       
   511 	if(!iStatusChannel->IsConnected())
       
   512 		iStatusChannel->StartL(*iDevice);
       
   513 
       
   514 	LOG1("[CBtJobChannel::GetJobAttributesL]\t iStatusChannel->GetJobAttributesL(%d)", iJobId);
       
   515 	iStatusChannel->GetJobAttributesL(aJobId);
       
   516 }
       
   517 
       
   518 //--------------------------------------------------------------------------------------------
       
   519 //
       
   520 // CBtJobChannel::GetEventL
       
   521 //
       
   522 //--------------------------------------------------------------------------------------------
       
   523 void CBtJobChannel::GetEventL(TInt aJobId)
       
   524 {
       
   525 	LOG("[CBtJobChannel::GetJobAttributesL]\t begin");
       
   526 	if(KImagePrint_PrinterProtocol_BPP != iDevice->UsedProtocol())
       
   527 	{
       
   528 		TInt state(EBtStateSending);
       
   529 		if(100 == iPercents)
       
   530 		{
       
   531 			state = EBtStateCompleted;
       
   532 		}
       
   533 			
       
   534 		iObs.GetEventResponse(iJobId, state, EBtStatePrinting, KErrNone, KErrNone);
       
   535 		return;
       
   536 	}
       
   537 	
       
   538 	if(!IsConnected())
       
   539 		User::Leave(KErrDisconnected);
       
   540 	
       
   541 	iStatusChannel->StartL(*iDevice);
       
   542 	iStatusChannel->GetEventL(aJobId);
       
   543 }
       
   544 
       
   545 //--------------------------------------------------------------------------------------------
       
   546 //
       
   547 // CBtJobChannel::CancelJobL
       
   548 //
       
   549 //--------------------------------------------------------------------------------------------
       
   550 void CBtJobChannel::CancelJobL(TInt aJobId)
       
   551 {
       
   552 	LOG("[CBtJobChannel::CancelJob(TInt)]\t begin");
       
   553 
       
   554 	if(!IsConnected())
       
   555 		User::Leave(KErrDisconnected);
       
   556 	
       
   557 	Cancel();
       
   558 
       
   559 	iJobId = aJobId;
       
   560 
       
   561 	iState = EStateCancellingJob;
       
   562 	SendSoapRequestL(EBtCancelJob, iJobId);
       
   563 }
       
   564 
       
   565 //--------------------------------------------------------------------------------------------
       
   566 //
       
   567 // CBtJobChannel::SendOPPL
       
   568 //
       
   569 //--------------------------------------------------------------------------------------------
       
   570 void CBtJobChannel::SendOPPL()
       
   571 	{
       
   572 	LOG("[CBtJobChannel::SendOPPL]\t begin");
       
   573 	TInt tmpNumberOfCopies(0);
       
   574 	// Delete file object
       
   575 	iObexFileObject->Reset();
       
   576 
       
   577 	if(iTimer)
       
   578 		iTimer->Cancel();
       
   579 
       
   580 	// all sent
       
   581 	if(0 >= iImageList.Count())
       
   582 		{
       
   583 		LOG1("[CBtJobChannel::SendOPPL]\t Finishing... iImageList.Count(): %d", iImageList.Count());
       
   584 
       
   585 		iJobFile.Zero();
       
   586 		iImageList.Reset();
       
   587 
       
   588 		iState = EStateNone;
       
   589 
       
   590 		ClearConnection();
       
   591 
       
   592 		iObs.GetEventResponse(iJobId, EBtStateCompleted, EBtStateIdle, KErrNone, KErrNone);
       
   593 		iJobId = KErrNotFound;
       
   594 
       
   595 		if(iTimer)
       
   596 			delete iTimer;
       
   597 		iTimer = NULL;
       
   598 
       
   599 		return;
       
   600 		}
       
   601 
       
   602 	LOG2("[CBtJobChannel::SendOPPL]\t iChannel: %d, iChannel->IsConnected(): %d", iChannel, iChannel->IsConnected());
       
   603 	if(!IsConnected())
       
   604 		User::Leave(KErrDisconnected);
       
   605 
       
   606 	iState = EStateSendingOPP;
       
   607 
       
   608 	TFileName fn;
       
   609 	iImageList[0].GetFilePathL(fn);
       
   610 	tmpNumberOfCopies = iImageList[0].Copies();
       
   611 
       
   612 	LOG1("[CBtJobChannel::SendOPPL]\t init file object with \"%S\"", &fn);
       
   613 	iObexFileObject->InitFromFileL(fn);
       
   614 	// check that does user wants print more than one copy of the currently printing picture.
       
   615 	if(tmpNumberOfCopies > 1)
       
   616 		{
       
   617 		tmpNumberOfCopies--;
       
   618 		iImageList[0].SetCopies(tmpNumberOfCopies);
       
   619 		}
       
   620 	else
       
   621 		{
       
   622 		iImageList.Remove(0);
       
   623 		}
       
   624 
       
   625 	LOG81("[CBtJobChannel::SendOPPL]\t set type \"%S\"...", &KBtMimeTypeJpeg());
       
   626 	iObexFileObject->SetTypeL(KBtMimeTypeJpeg());
       
   627 
       
   628 	LOG1("[CBtJobChannel::SendOPPL]\t ...and name \"%S\"", &fn);
       
   629 	iObexFileObject->SetNameL(fn);
       
   630 
       
   631 	iFileObjectSize = iObexFileObject->Length();
       
   632 
       
   633 	if(!iTimer)
       
   634 		iTimer = CBtTimer::NewL(*this);
       
   635 
       
   636 	iTimer->Start(KSentPercentsDelay);
       
   637 
       
   638 	LOG("[CBtJobChannel::SendOPPL]\t put");
       
   639 	iChannel->Put(*iObexFileObject, iStatus);
       
   640 
       
   641 	iProgressOfFullImages = iProgressOfFullImages + iFileObjectSize;
       
   642 	
       
   643 	if (iUpdateProgress)
       
   644 		{
       
   645 			iUpdateProgress->Cancel();
       
   646 		}
       
   647 	
       
   648 	// Start periodic timer to track data transfer process.
       
   649 	// Event interval is setup to 1 second.
       
   650 	iUpdateProgress->Start(5000, KProgressUpdateInterval, TCallBack( CheckProgress, this ));	
       
   651 	
       
   652 	iObs.GetEventResponse(iJobId, EBtStateSending, EBtStatePrinting, KErrNone, KErrNone);
       
   653 
       
   654 	Activate();
       
   655 }
       
   656 
       
   657 //--------------------------------------------------------------------------------------------
       
   658 //
       
   659 // CBtJobChannel::CheckProgress
       
   660 //
       
   661 //--------------------------------------------------------------------------------------------
       
   662 TInt CBtJobChannel::CheckProgress( TAny *aObj )
       
   663 	{
       
   664 	CBtJobChannel* obj = (CBtJobChannel*)aObj;
       
   665 	obj->UpdateProgress();
       
   666 	return 1;
       
   667 	}
       
   668 //--------------------------------------------------------------------------------------------
       
   669 //
       
   670 // CBtJobChannel::UpdateProgress
       
   671 //
       
   672 //--------------------------------------------------------------------------------------------
       
   673 void CBtJobChannel::UpdateProgress()
       
   674 	{
       
   675 	TInt percentBuffer = GetPercentSent();	
       
   676 	
       
   677 	// If all data has been sent, it's OK to stop timer 
       
   678 	if ( percentBuffer == 100 )
       
   679 		{
       
   680 			iUpdateProgress->Cancel();
       
   681 		}
       
   682 	
       
   683 	// Update progress bar using MBtPCObserver. 
       
   684 	iObs.OPPSendProgress(percentBuffer);
       
   685 	}
       
   686 
       
   687 //--------------------------------------------------------------------------------------------
       
   688 //
       
   689 // CBtJobChannel::SendXhtmlDocumentL
       
   690 //
       
   691 //--------------------------------------------------------------------------------------------
       
   692 void CBtJobChannel::SendXhtmlDocumentL()
       
   693 	{
       
   694 	LOG("[CBtJobChannel::SendXhtmlDocumentL]\t begin");
       
   695 
       
   696 	if( !iDevice || !iChannel || !iChannel->IsConnected() )
       
   697 		User::Leave( EObexConnectError );
       
   698 
       
   699 	iState = EStateSendingXhtml;
       
   700 
       
   701 	TFileName fn;
       
   702 	fn.Copy( iJobFile );
       
   703 
       
   704 	iObexFileObject->Reset();
       
   705 
       
   706 	LOG("[CBtJobChannel::SendXhtmlDocumentL]\t fill in iObexBufObject");
       
   707 	iObexFileObject->InitFromFileL( fn );
       
   708 
       
   709 	TBuf8<50> mime;
       
   710 	mime.Copy( KBtMimeTypeXhtml() );
       
   711 	mime.ZeroTerminate();
       
   712 	iObexFileObject->SetTypeL( mime );
       
   713 
       
   714 	// name initialized automatically...
       
   715 
       
   716 	// Job ID (application parameters)
       
   717 	TUint32 jobId = iJobId;
       
   718 	TBuf8<20> triplet;
       
   719 
       
   720 	triplet.Zero();
       
   721 	triplet.Append((TChar)KBtObexTagJobId);
       
   722 	triplet.Append((TChar)KBtDataLength4);
       
   723 	//append value
       
   724 	triplet.Append((TChar) ((jobId & 0xFF000000) >> 24) );
       
   725 	triplet.Append((TChar) ((jobId & 0xFF0000) >> 16) );
       
   726 	triplet.Append((TChar) ((jobId & 0xFF00) >> 8) );
       
   727 	triplet.Append((TChar) (jobId & 0xFF) );
       
   728 	triplet.ZeroTerminate();
       
   729 
       
   730 #ifdef _DEBUG
       
   731 	const TUint8* aPtr = triplet.Ptr();
       
   732 	_LIT(KBTHexFormatString,"%02x");
       
   733 	TBuf<50> line;
       
   734 	for (TInt j=0; j<triplet.Length(); j++)
       
   735 		line.AppendFormat(KBTHexFormatString,aPtr[j]);
       
   736 	LOG1("[CBtJobChannel::SendXhtmlDocumentL]\t line: %S", &line);
       
   737 #endif
       
   738 
       
   739 	iObexFileObject->SetAppParamL(triplet);
       
   740 
       
   741 	LOG("[CBtJobChannel::SendXhtmlDocumentL]\t putting...");
       
   742 
       
   743 	iChannel->Put(*iObexFileObject, iStatus);
       
   744 
       
   745 	Activate();
       
   746 	LOG("[CBtJobChannel::SendXhtmlDocumentL]\t end");
       
   747 }
       
   748 
       
   749 //------------------------------
       
   750 // Responses
       
   751 //------------------------------
       
   752 TInt CBtJobChannel::CreateJobResponseL()
       
   753 {
       
   754 	LOG("[CBtJobChannel::CreateJobResponseL]\t ");
       
   755 	User::LeaveIfNull(iSoapCodec);
       
   756 
       
   757 	iJobId = KErrNotFound;
       
   758 	TInt err = KErrGeneral;
       
   759 
       
   760 	iSoapCodec->CreateJobResponseL(iJobId, err);
       
   761 	iResponseError = err;
       
   762 
       
   763 	iObs.CreateJobResponse(iJobId, err);
       
   764 	LOG("[CBtJobChannel::CreateJobResponseL]\t out");
       
   765 	return err;
       
   766 }
       
   767 
       
   768 //--------------------------------------------------------------------------------------------
       
   769 //
       
   770 // CBtJobChannel::GetPrinterStateResponseL
       
   771 //
       
   772 //--------------------------------------------------------------------------------------------
       
   773 TInt CBtJobChannel::GetPrinterStateResponseL()
       
   774 {
       
   775 	LOG("[CBtJobChannel::GetPrinterStateResponseL]\t");
       
   776 	User::LeaveIfNull(iSoapCodec);
       
   777 
       
   778 	TInt state = EBtStateUnknown;
       
   779 	TInt reasons = EPbCheckPrinter;
       
   780 	TInt opStatus = KErrGeneral;
       
   781 
       
   782 	iSoapCodec->GetPrinterStateResponseL(state, reasons, opStatus);
       
   783 	iObs.GetPrinterStateResponse(state, reasons, opStatus, iDevice->DeviceId());
       
   784 
       
   785 	LOG("[CBtJobChannel::GetPrinterAttributesResponseL]\t out");
       
   786 	return opStatus;
       
   787 }
       
   788 
       
   789 //--------------------------------------------------------------------------------------------
       
   790 //
       
   791 // CBtJobChannel::GetPrinterCapabilitiesResponseL
       
   792 //
       
   793 //--------------------------------------------------------------------------------------------
       
   794 TInt CBtJobChannel::GetPrinterCapabilitiesResponseL()
       
   795 {
       
   796 	LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t");
       
   797 	User::LeaveIfNull(iSoapCodec);
       
   798 
       
   799 	RArray<TPrintCapability> capab;
       
   800 	CleanupClosePushL(capab);
       
   801 	TInt opStatus = KErrGeneral;
       
   802 
       
   803 	iSoapCodec->GetPrinterCapabilitiesResponseL(capab, opStatus);
       
   804 
       
   805 	if(iDevice)
       
   806 	{
       
   807 		for(TInt i = 0; i < capab.Count(); ++i)
       
   808 		{
       
   809 			iDevice->AddCapability(capab[i]);
       
   810 		}
       
   811 		LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t returning to iObs...");
       
   812 	}
       
   813 	else
       
   814 	{
       
   815 		opStatus = KErrNotFound;
       
   816 	}
       
   817 
       
   818 	CleanupStack::PopAndDestroy(&capab);
       
   819 	LOG("[CBtJobChannel::GetPrinterCapabilitiesResponseL]\t out");
       
   820 	return opStatus;
       
   821 }
       
   822 
       
   823 //--------------------------------------------------------------------------------------------
       
   824 //
       
   825 // CBtJobChannel::GetJobAttributesResponseL
       
   826 //
       
   827 //--------------------------------------------------------------------------------------------
       
   828 TInt CBtJobChannel::GetJobAttributesResponseL()
       
   829 {
       
   830 	LOG("[CBtJobChannel::GetJobAttributesResponseL]\t");
       
   831 	User::LeaveIfNull(iSoapCodec);
       
   832 
       
   833 	TInt state, sheets, pendingJobs, opStatus;
       
   834 	TBtAttrString8 jobName;
       
   835 	TBtAttrString8 originator;
       
   836 
       
   837 	iSoapCodec->GetJobAttributesResponseL( iJobId, state, jobName, originator,sheets, pendingJobs, opStatus);
       
   838 	iObs.GetJobAttributesResponse(state, jobName, originator,sheets, pendingJobs, opStatus);
       
   839 
       
   840 	return opStatus;
       
   841 }
       
   842 
       
   843 //--------------------------------------------------------------------------------------------
       
   844 //
       
   845 // CBtJobChannel::CancelJobResponseL
       
   846 //
       
   847 //--------------------------------------------------------------------------------------------
       
   848 TInt CBtJobChannel::CancelJobResponseL()
       
   849 {
       
   850 	LOG("[CBtJobChannel::CancelJobResponseL]\t");
       
   851 	User::LeaveIfNull(iSoapCodec);
       
   852 
       
   853 	TInt err = KErrNotFound;
       
   854 	iSoapCodec->CancelJobResponseL(iJobId, err);
       
   855 
       
   856 	LOG1("[CBtJobChannel::CancelJobResponseL]\t err %d", err);
       
   857 	iObs.CancelJobResponse(err);
       
   858 
       
   859 	return err;
       
   860 }
       
   861 
       
   862 ///////////////////////////////
       
   863 // Private
       
   864 ///////////////////////////////
       
   865 //--------------------------------------------------------------------------------------------
       
   866 //
       
   867 // CBtJobChannel::ConnectL
       
   868 //
       
   869 //--------------------------------------------------------------------------------------------
       
   870 void CBtJobChannel::ConnectL()
       
   871 	{
       
   872 	LOG("[CBtJobChannel::ConnectL]\t");
       
   873 
       
   874 	User::LeaveIfNull( iDevice );
       
   875 
       
   876 	if( IsConnected() )
       
   877 		{
       
   878 		LOG1("[CBtJobChannel::ConnectL]\t return isConnected: %d", IsConnected());
       
   879     	return;
       
   880     }
       
   881 
       
   882 	// delete old if exists
       
   883     if ( iChannel )
       
   884 		{
       
   885 		delete iChannel;
       
   886 		iChannel = NULL;
       
   887 		}
       
   888 
       
   889 	iState = EStateConnecting;
       
   890 
       
   891 	// set common parts of protocol info
       
   892 	TObexBluetoothProtocolInfo protocolInfo;
       
   893 	protocolInfo.iTransport.Copy( KRFCOMMDesC );
       
   894 	protocolInfo.iAddr.SetBTAddr( iDevice->BDAddr() );//Address of server bt device
       
   895 
       
   896 	// connect profile specifically
       
   897 	LOG1("[CBtJobChannel::ConnectL]\t aDevice.UsedProtocol(): %d", iDevice->UsedProtocol());
       
   898 	if( KImagePrint_PrinterProtocol_BPP == iDevice->UsedProtocol() )
       
   899 		{
       
   900 		LOG("[CBtJobChannel::ConnectL]\t connect BPP");
       
   901 		protocolInfo.iAddr.SetPort( iDevice->BPPPort() );//Service channel of server rfcomm
       
   902 
       
   903 		TUUID uuid( KBTSDPDirectPrinting );
       
   904 		iObexNullObject->Reset();
       
   905 		iObexNullObject->SetTargetL( uuid.Des() );
       
   906 
       
   907 		// create channel
       
   908 		iChannel = CObexClient::NewL( protocolInfo );
       
   909 		iChannel->SetCallBack( *this );
       
   910 		iChannel->Connect( *iObexNullObject, iStatus );
       
   911 		}
       
   912 	else
       
   913 		{
       
   914 		LOG("[CBtJobChannel::ConnectL]\t connect OPP");
       
   915 		protocolInfo.iAddr.SetPort(iDevice->OPPPort());
       
   916 
       
   917 		// create channel
       
   918 		iChannel = CObexClient::NewL( protocolInfo );
       
   919 		iChannel->SetCallBack(*this);	
       
   920 		iChannel->SetCommandTimeOut(KObexCmdTimeOut);			
       
   921 		iChannel->Connect(iStatus);
       
   922 	}
       
   923 
       
   924    	Activate();
       
   925 
       
   926 	LOG("[CBtJobChannel::ConnectL]\t out.");
       
   927 	return;
       
   928 }
       
   929 
       
   930 //--------------------------------------------------------------------------------------------
       
   931 //
       
   932 // CBtJobChannel::IsError
       
   933 //
       
   934 //--------------------------------------------------------------------------------------------
       
   935 void CBtJobChannel::DoLeaveL(TInt aError)
       
   936 {
       
   937 	LOG2("[CBtJobChannel::DoLeaveL]\t aError %d at state %d", aError, iState); 
       
   938 
       
   939 	if(KErrNone == aError)
       
   940 		return;
       
   941 	
       
   942 	if(EStateDisconnecting == iState)
       
   943 		return;
       
   944 	
       
   945 	// obex connection objects returns 'KErrCompletion' at destructor. Ignore.
       
   946 	if(KErrCompletion == aError)
       
   947 		return;
       
   948 	
       
   949 	LOG("[CBtJobChannel::DoLeaveL]\t Leave"); 
       
   950 	User::Leave(aError);
       
   951 }
       
   952 
       
   953 //--------------------------------------------------------------------------------------------
       
   954 //
       
   955 // CBtJobChannel::ClearConnection
       
   956 //
       
   957 //--------------------------------------------------------------------------------------------
       
   958 void CBtJobChannel::ClearConnection()
       
   959 {
       
   960 	LOG1("[CBtJobChannel::ClearConnection]\t iState %d", iState);
       
   961 	
       
   962     if(iStatusChannel)
       
   963     {
       
   964 		LOG("[CBtJobChannel::ClearConnections]\t **** iStatusChannel stop");
       
   965 		iStatusChannel->Stop();
       
   966     }
       
   967 
       
   968 	CBtChannelBase::ClearConnection();
       
   969 
       
   970 	iObexFileObject->Reset();
       
   971 
       
   972 	iState = EStateNone;
       
   973 
       
   974 	iUpdateProgress->Cancel();
       
   975 	
       
   976 	iImageCount = 0;
       
   977 }
       
   978 
       
   979 //--------------------------------------------------------------------------------------------
       
   980 //
       
   981 // CBtJobChannel::CleanXhtmlDirL
       
   982 //
       
   983 //--------------------------------------------------------------------------------------------
       
   984 void CBtJobChannel::CleanXhtmlDirL()
       
   985 {
       
   986 	LOG1("[CBtJobChannel::CleanXhtmlDirL]\t iJobFileNum %d", iJobFileNum);
       
   987 	
       
   988 	RFs fs;
       
   989 	CleanupClosePushL(fs);
       
   990 	User::LeaveIfError(fs.Connect());
       
   991 
       
   992 	CFileMan* fm = CFileMan::NewL(fs);
       
   993 	CleanupStack::PushL(fm);
       
   994 	
       
   995 	while(0 < iJobFileNum)
       
   996 	{
       
   997 		TFileName fn;
       
   998 		fn.Format(KXHTMLFileName, iJobFileNum);
       
   999 		TInt err = fm->Delete(fn);
       
  1000 		LOG2("[CBtJobChannel::CleanXhtmlDirL]\t delete file %S, err %d", &fn, err);
       
  1001 		--iJobFileNum;
       
  1002 	}
       
  1003 
       
  1004 	CleanupStack::PopAndDestroy( 2 );	// fm, fs
       
  1005 }
       
  1006 
       
  1007 //--------------------------------------------------------------------------------------------
       
  1008 //
       
  1009 // CBtJobChannel::RemoveObexCmdTimeOut
       
  1010 //
       
  1011 //--------------------------------------------------------------------------------------------
       
  1012 void CBtJobChannel::RemoveObexCmdTimeOut()
       
  1013 {
       
  1014 	iChannel->SetCommandTimeOut(0);
       
  1015 }
       
  1016 
       
  1017 //--------------------------------------------------------------------------------------------
       
  1018 //
       
  1019 // CBtJobChannel::CalculateJobSizeL
       
  1020 //
       
  1021 //--------------------------------------------------------------------------------------------
       
  1022 TInt CBtJobChannel::CalculateJobSizeL()
       
  1023 	{
       
  1024 	
       
  1025 	TInt imgCount= iImageList.Count();	
       
  1026 	TInt size = 0;
       
  1027 	
       
  1028 	for (TInt i = 0; i<imgCount; i++)
       
  1029 		{	
       
  1030 		TFileName fn;
       
  1031 		iImageList[i].GetFilePathL(fn);
       
  1032 		iObexFileObject->InitFromFileL(fn);
       
  1033 		TInt tempSize = iObexFileObject->Length();
       
  1034 		iObexFileObject->Reset();	
       
  1035 		size = size + tempSize;
       
  1036 		}
       
  1037 	return size;
       
  1038 	}
       
  1039 
       
  1040 //  End of File