diff -r a36b1e19a461 -r 989d2f495d90 serviceproviders/sapi_sysinfo/sysinfoservice/src/sysaccessoryrequest.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/serviceproviders/sapi_sysinfo/sysinfoservice/src/sysaccessoryrequest.cpp Fri Jul 03 15:51:24 2009 +0100 @@ -0,0 +1,207 @@ +/* +* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: class implementation +* +*/ + +#include + +#include "sysinfoservice.h" +#include "sysaccessoryrequest.h" +#include "entitykeys.h" +#include "sysrequest.h" + +using namespace SysInfo; + +// -------------------------------------------------------------------- +// CAccessory::CAccessory() +// C++ default constructor. +// -------------------------------------------------------------------- +// +CAccessory::CAccessory( TSysRequest::TRequestType aReqType, TInt32 aTransID, + ISystemObserver* aObsrvr ): CActiveRequest( + aReqType, aTransID, aObsrvr), iAccCountOld(0), + iAccState(CAccessoryInfo::EDisconnected) + { + } + +// -------------------------------------------------------------------- +// CAccessory::~CAccessory() +// destructor. +// -------------------------------------------------------------------- +// +CAccessory::~CAccessory() + { + Cancel(); + iAccessoryConnection.CloseSubSession(); + iAccSrv.Disconnect(); + } + +// -------------------------------------------------------------------- +// CAccessory::NewL() +// Two-phased constructor, returns instance of this class. +// -------------------------------------------------------------------- +// +CAccessory* CAccessory::NewL(const TSysRequest& aRequest) + { + CAccessory* self; + self = new (ELeave) CAccessory(aRequest.RequestType(), + aRequest.TransactionID(), aRequest.Observer()); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +// -------------------------------------------------------------------- +// CAccessory::ConstructL() +// 2nd Phase constructor to allocate required resources for this obj. +// -------------------------------------------------------------------- +// +void CAccessory::ConstructL() + { + //Supportes Only Notifications. + if( TSysRequest::ENotification != RequestType()) + User::Leave(KErrNotSupported); + + User::LeaveIfError(iAccSrv.Connect()); + TInt err = iAccessoryConnection.CreateSubSession(iAccSrv); + if( err ) + { + iAccSrv.Disconnect(); + User::Leave(err); + } + } + +// -------------------------------------------------------------------- +// CAccessory::Request() +// Issues accesssory request. +// -------------------------------------------------------------------- +// +TInt CAccessory::Request() + { + if(!iAccCountOld) + { + // get all connected accessories into iGenIdArrayOld. + iAccessoryConnection.GetAccessoryConnectionStatus(iGenIdArrayOld); + //Store Connection Count. + iAccCountOld = iGenIdArrayOld.Count(); + } + + //Issue request. + if( !IsActive() ) + { + iAccessoryConnection.NotifyAccessoryConnectionStatusChanged(iStatus, + iGenIdArrayCur); + SetActive (); + } + return KErrNone; + } + +// -------------------------------------------------------------------- +// CAccessory::RunL() +// Gets called in event of request completion or error situation. +// -------------------------------------------------------------------- +// +void CAccessory::RunL() + { + TSysRequest::TRequestType ReqType = RequestType(); + TInt32 transId = this->TransactionID(); + + // get accessory count. + iAccCountCur = iGenIdArrayCur.Count(); + iAccCountOld = iGenIdArrayOld.Count(); + + // Check if it a was a connect or a disconnect + if( iAccCountCur > iAccCountOld ) + iAccState = CAccessoryInfo::EConnected; + else + iAccState = CAccessoryInfo::EDisconnected; + + TInt error(iStatus.Int()); + + if(error == KErrNone) + { + CAccessoryInfo* accInfo = NULL; + //newly connected accessory will be at index '0'. + if(iAccState == CAccessoryInfo::EConnected) + { + TAccPolGenericID ConnectedID; + ConnectedID = iGenIdArrayCur.GetGenericIDL(0); + accInfo = CAccessoryInfo::NewL(ConnectedID,iAccState); + } + else + { + TAccPolGenericID DisConnectedID; + //get DisConnected accessory ID. + DisConnectedAccessoryL(DisConnectedID); + accInfo = CAccessoryInfo::NewL(DisConnectedID,iAccState); + } + + CleanupStack::PushL(accInfo); + TRAP_IGNORE(SystemObserver()->HandleResponseL(KGeneral, KAccessoryStatus, + accInfo, transId, RequestType(), error)); + CleanupStack::Pop(accInfo); + //Re-Issue request + Request(); + } + else + { + TRAP_IGNORE(SystemObserver()->HandleResponseL(KGeneral, KAccessoryStatus, + NULL, transId, RequestType(), error)); + } + //copy current list to old list. + iGenIdArrayOld = iGenIdArrayCur; + } + +// -------------------------------------------------------------------- +// CAccessory::DoCancel() +// Gets called in event of request completion or error situation. +// -------------------------------------------------------------------- +// +void CAccessory::DoCancel() + { + if(IsActive()) + iAccessoryConnection.CancelNotifyAccessoryConnectionStatusChanged(); + } + +// -------------------------------------------------------------------- +// CAccessory::DisConnectedAccessoryL() +// retruns disconnected accessory GenericID. +// -------------------------------------------------------------------- +// +void CAccessory::DisConnectedAccessoryL(TAccPolGenericID& aGenId) + { + for(TInt i=0; i