--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/ImagePrint/ImagePrintEngine/DeviceProtocols/btprotocol/src/cbtstatuschannel.cpp Thu Dec 17 08:45:53 2009 +0200
@@ -0,0 +1,465 @@
+/*
+* Copyright (c) 2004-2007 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Defines the CBtStatusChannel class.
+*
+*/
+
+
+#include <obex.h>
+
+#include "crsbtdevice.h"
+#include "cbtstatuschannel.h"
+#include "cbtsoapcodec.h"
+#include "clog.h"
+#include "tbtmapper.h"
+#include "cbtdiscover.h"
+#include "printmessagecodes.h"
+
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::NewL
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel* CBtStatusChannel::NewL(MBtPCObserver& aObs)
+{
+ CBtStatusChannel *self = NewLC(aObs);
+ CleanupStack::Pop(); // self
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::NewLC
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel* CBtStatusChannel::NewLC(MBtPCObserver& aObs)
+{
+ CBtStatusChannel *self = new (ELeave) CBtStatusChannel(aObs);
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::CBtStatusChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel::CBtStatusChannel(MBtPCObserver& aObs):
+ CBtChannelBase( aObs )
+{
+ LOG("[CBtStatusChannel::CBtStatusChannel]\t");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::~CBtStatusChannel
+//
+//--------------------------------------------------------------------------------------------
+CBtStatusChannel::~CBtStatusChannel()
+{
+ LOG("[CBtStatusChannel::~CBtStatusChannel]\t");
+ Cancel();
+ ClearConnection();
+
+ // iChannel have to delete here or otherwise Review-x report critical error.
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::ConstructL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::ConstructL()
+{
+ LOG("[CBtStatusChannel::ConstructL]\t begin");
+ CBtChannelBase::ConstructL();
+ LOG("[CBtStatusChannel::ConstructL]\t end");
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::RunL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::RunL()
+{
+ LOG2("[CBtStatusChannel::RunL]\t BEGIN iStatus %d at state %d", iStatus.Int(), iState);
+
+ //Finish if required
+ if( EStateFinish == iState )
+ {
+ Disconnect();
+ return;
+ }
+
+ DoLeaveL( iStatus.Int() );
+
+ switch( iState )
+ {
+ case EStateConnecting:
+ iObexNullObject->Reset();
+ StopWaiting();
+ break;
+ case EStateDisconnecting:
+ Disconnect();
+ StopWaiting();
+ break;
+ case EStateGettingPrinterState:
+ GetSoapResponseL();
+ GetPrinterStateResponseL();
+ iState = EStateNone;
+ break;
+ case EStateCancellingJob:
+ GetSoapResponseL();
+ CancelJobResponseL();
+ iDevice = NULL;
+ iState = EStateNone;
+ break;
+ case EStateGettingJobAttributes:
+ GetSoapResponseL();
+ GetJobAttributesResponseL();
+ break;
+ case EStateNone:
+ User::Leave( KErrCancel );
+ break;
+ case EStateGetEvent:
+ iState = EStateGettingEvent;
+ SendSoapRequestL(EBtGetEvent, iJobId);
+ WaitL();
+ break;
+ case EStateGettingEvent:
+ GetSoapResponseL();
+ GetEventResponseL();
+ StopWaiting();
+ break;
+ default:
+ break;
+ }
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::RunError
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::RunError(TInt aError)
+{
+ LOG1("[CBtStatusChannel::RunError]\t state %d", iState);
+ LOG2("[CBtStatusChannel::RunError]\t error %d, iStatus %d", aError, iStatus.Int() );
+
+ TInt id = KErrNotFound;
+
+ StopWaiting();
+
+ switch( iState )
+ {
+ case EStateGettingPrinterState:
+ if(iDevice)
+ id = iDevice->DeviceId();
+
+ iState = EStateFinish;
+ iObs.GetPrinterStateResponse(EBtStateIdle, ENoMessage, aError, id);
+ break;
+ case EStateCancellingJob:
+ iState = EStateFinish;
+ iObs.CancelJobResponse(aError);
+ break;
+ case EStateGettingJobAttributes:
+ iState = EStateFinish;
+ iObs.GetJobAttributesResponse(EBtStateUnknown, KNullDesC8(), KNullDesC8(), KErrNotFound, KErrNotFound, aError);
+ break;
+ case EStateGetEvent:
+ case EStateGettingEvent:
+ iObs.GetEventResponse(iJobId, EBtStateUnknown, EBtStateIdle, KErrNone, aError);
+ break;
+ default:
+ iState = EStateFinish;
+ iObs.GetEventResponse(KErrNotFound, KErrNotFound, KErrNotFound, KErrNotFound, aError);
+ LOG("[CBtPrinterController::RunError]\t GetEventResponse sent" );
+ break;
+ }
+ iResponseError = aError;
+ return KErrNone; // othervise error returns to CActive: that's what we don't want.
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::DoCancel
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::DoCancel()
+{
+ LOG2("[CBtStatusChannel::DoCancel]\t at state %d, iStatus 0x%X", iState, iStatus.Int());
+
+ StopWaiting();
+
+ iState = EStateNone;
+
+ CBtChannelBase::DoCancel();
+ LOG1("[CBtStatusChannel::DoCancel]\t out iStatus 0x%X", iStatus.Int());
+}
+
+//------------------------------
+// InCalls
+//------------------------------
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetPrinterAttributesL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::GetPrinterStateL()
+{
+ LOG("[CBtStatusChannel::GetPrinterStateL]\t begin");
+ if(iStop)
+ return KErrNone;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ Cancel();
+
+ iState = EStateGettingPrinterState;
+ SendSoapRequestL(EBtGetPrinterState);
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetJobAttributesL
+//
+//--------------------------------------------------------------------------------------------
+TInt CBtStatusChannel::GetJobAttributesL(TInt aJobId)
+{
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t begin with id %d", aJobId);
+ if(iStop)
+ return KErrNone;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ if( KErrNotFound == aJobId)
+ User::Leave(KErrInvalidData);
+
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t wait connection? %d", iStatus.Int());
+ WaitL();
+
+ iJobId = aJobId;
+ LOG1("[CBtStatusChannel::GetJobAttributesL]\t iJobId %d", iJobId);
+
+ iState = EStateGettingJobAttributes;
+ SendSoapRequestL(EBtGetJobAttributes, iJobId);
+
+ return KErrNone;
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetEventL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetEventL(TInt aJobId)
+{
+ LOG("[CBtStatusChannel::GetEvent]\t begin");
+ if(iStop)
+ return;
+
+ if(!IsConnected())
+ User::Leave(KErrDisconnected);
+
+ if( 0 > aJobId)
+ User::Leave(KErrInvalidData);
+
+ if(EStateGetEvent == iState || EStateGettingEvent == iState)
+ return;
+
+ Cancel();
+
+ iJobId = aJobId;
+
+ iState = EStateGetEvent;
+ Activate();
+}
+
+//----------------------------------
+
+//------------------------------
+// Responses
+//------------------------------
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetPrinterStateResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetPrinterStateResponseL()
+{
+ LOG("[CBtStatusChannel::GetPrinterStateResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt state = EBtStateUnknown;
+ TInt reasons = EPbCheckPrinter;
+ TInt opStatus = KErrGeneral;
+
+ iSoapCodec->GetPrinterStateResponseL(state, reasons, opStatus);
+
+ TInt id = KErrNotFound;
+ if(iDevice)
+ id = iDevice->DeviceId();
+
+ iObs.GetPrinterStateResponse(state, reasons, opStatus, id);
+
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetJobAttributesResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetJobAttributesResponseL()
+{
+ LOG("[CBtStatusChannel::GetJobAttributesResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt jobState = EBtStateUnknown;
+ TBtAttrString8 jobName(KNullDesC8());
+ TBtAttrString8 originator(KNullDesC8());
+ TInt sheetsCompleted = KErrNotFound;
+ TInt pendingJobs = KErrNotFound;
+ TInt opStatus = KErrNotSupported;
+
+ iSoapCodec->GetJobAttributesResponseL(iJobId, jobState, jobName, originator,
+ sheetsCompleted, pendingJobs, opStatus);
+
+ iObs.GetJobAttributesResponse(jobState, jobName, originator,
+ sheetsCompleted, pendingJobs, opStatus);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::CancelJobResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::CancelJobResponseL()
+{
+ LOG("[CBtStatusChannel::CancelJobResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt err = KErrNotFound;
+ iSoapCodec->CancelJobResponseL(iJobId, err);
+
+ LOG1("[CBtStatusChannel::CancelJobResponseL]\t err %d", err);
+ iObs.CancelJobResponse(err);
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::GetEventResponseL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::GetEventResponseL()
+{
+ LOG("[CBtStatusChannel::GetEventResponseL]\t");
+ User::LeaveIfNull(iSoapCodec);
+ iState = EStateNone;
+
+ TInt jobState, printerState, stateReasons, operationStatus;
+
+ iSoapCodec->GetEventResponseL(iJobId, jobState, printerState, stateReasons, operationStatus);
+ iObs.GetEventResponse(iJobId, jobState, printerState, stateReasons, operationStatus);
+}
+///////////////////////////////
+// Private
+///////////////////////////////
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::ConnectL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::ConnectL()
+{
+ LOG2("[CBtStatusChannel::ConnectL]\t isConnected: %d, iDevice %d", IsConnected(), iDevice);
+
+ User::LeaveIfNull(iDevice);
+
+ LOG1("[CBtStatusChannel::ConnectedL]\t aDevice.UsedProtocols(): %d", iDevice->UsedProtocol());
+ if( !(KImagePrint_PrinterProtocol_BPP & iDevice->UsedProtocol()) )
+ User::Leave(KErrNotSupported);
+
+ if(IsConnected())
+ {
+ LOG1("[CBtStatusChannel::ConnectL]\t isConnected: %d", IsConnected());
+ return;
+ }
+
+ if(iChannel)
+ {
+ delete iChannel;
+ iChannel = NULL;
+ }
+
+ TObexBluetoothProtocolInfo protocolInfo;
+ protocolInfo.iTransport.Copy( KRFCOMMDesC );
+ protocolInfo.iAddr.SetBTAddr(iDevice->BDAddr() );//Address of server bt device
+ protocolInfo.iAddr.SetPort(iDevice->STSPort() );//Service channel of server rfcomm
+
+ TUUID uuid(KBTSDPPrintingStatus);
+ iObexNullObject->Reset();
+ iObexNullObject->SetTargetL(uuid.Des());
+
+ // create channel
+ iChannel = CObexClient::NewL( protocolInfo );
+ iChannel->SetCallBack(*this);
+ iChannel->Connect(*iObexNullObject, iStatus);
+
+ iState = EStateConnecting;
+ Activate();
+}
+
+//--------------------------------------------------------------------------------------------
+//
+// CBtStatusChannel::DoLeaveL
+//
+//--------------------------------------------------------------------------------------------
+void CBtStatusChannel::DoLeaveL(TInt aError)
+{
+ LOG2("[CBtStatusChannel::DoLeaveL]\t aError %d at state %d", aError, iState);
+
+ if(KErrNone == aError)
+ return;
+
+ if(EStateDisconnecting == iState)
+ return;
+
+ if(KErrCancel == aError)
+ return;
+
+ if(KErrCompletion == aError)
+ return;
+
+ LOG("[CBtStatusChannel::DoLeaveL]\t Leave");
+ User::Leave(aError);
+}
+
+// End of File