diff -r 000000000000 -r 29b1cd4cb562 bluetooth/btexample/testui/BTTextNotifiers/src/pbapTextNotifiers.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bluetooth/btexample/testui/BTTextNotifiers/src/pbapTextNotifiers.cpp Fri Jan 15 08:13:17 2010 +0200 @@ -0,0 +1,392 @@ +// Copyright (c) 2006-2009 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: +// + +#include +#include +#include "BTTextNotifiers.h" + +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ +//define password always returned by auth notifier +_LIT(KAutoPassword, "1234"); +#endif + +// +// PbapTextNotifiersConsole +// +CConsoleBase* PbapTextNotifiersConsole::AutoSizeNewL(const TDesC& aTitle, TSize aSize) + { + //try to create a console of our preferred size, otherwise we + //guess the screen is too small and use its entirety. + CConsoleBase* console = NULL; + TRAPD(err, console = Console::NewL(aTitle, aSize)); + if (err != KErrNone) + { + //if we leave now it is not because of offscreen drawing. + console = Console::NewL(aTitle, TSize(KConsFullScreen, KConsFullScreen)); + } + return console; + } + +// +// CPbapAuthNotifier +// +CPbapAuthNotifier* CPbapAuthNotifier::NewLC() + { + CPbapAuthNotifier* self = new (ELeave) CPbapAuthNotifier(); + CleanupStack::PushL(self); + self->ConstructL(); + return self; + } + +CPbapAuthNotifier::CPbapAuthNotifier() + { + } + +void CPbapAuthNotifier::ConstructL() + { + iEngine = CPbapAuthNotifierEngine::NewL(*this); + } + +void CPbapAuthNotifier::Release() + { + Cancel(); + delete this; + } + +void CPbapAuthNotifier::Cancel() + { + iEngine->Stop(); + + if (iNeedToCompleteMessage) + { + iMessage.Complete(KErrCancel); + iNeedToCompleteMessage = EFalse; + } + } + +CPbapAuthNotifier::~CPbapAuthNotifier() + { + delete iEngine; + } + +CPbapAuthNotifier::TNotifierInfo CPbapAuthNotifier::RegisterL() + { + iInfo.iUid=KPbapAuthNotifierUid; + iInfo.iChannel=KScreenOutputChannel; + iInfo.iPriority=ENotifierPriorityVHigh; + return iInfo; + } + +CPbapAuthNotifier::TNotifierInfo CPbapAuthNotifier::Info() const + { + return iInfo; + } + +TPtrC8 CPbapAuthNotifier::StartL(const TDesC8& /*aBuffer*/) + { + return KNullDesC8(); + } + +void CPbapAuthNotifier::StartL(const TDesC8& aBuffer, TInt aReplySlot, const RMessagePtr2& aMessage) + { + iReplySlot = aReplySlot; + iMessage = RMessage2(aMessage); + iNeedToCompleteMessage = ETrue; + + TRAPD(err, iEngine->StartPasswordEntryL(aBuffer)); + if (err) + { + aMessage.Complete(err); + iNeedToCompleteMessage = EFalse; + User::Leave(err); + } + } + +TPtrC8 CPbapAuthNotifier::UpdateL(const TDesC8& /*aBuffer*/) + { + return KNullDesC8(); + } + +void CPbapAuthNotifier::PasswordInputComplete(const TDesC& aPassword, TInt aReason) + { + if (aReason == KErrNone) + { + TPbapAuthNotifierResponsePckg pckg; + pckg().SetPassword(aPassword); + TInt err = iMessage.Write(iReplySlot, pckg); + iMessage.Complete(err); + } + else + { + iMessage.Complete(aReason); + } + iNeedToCompleteMessage = EFalse; + } + + +// +// CPbapAuthNotifierEngine +// +CPbapAuthNotifierEngine* CPbapAuthNotifierEngine::NewL(CPbapAuthNotifier& aParent) + { + CPbapAuthNotifierEngine* self = new (ELeave) CPbapAuthNotifierEngine(aParent); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; + } + +CPbapAuthNotifierEngine::CPbapAuthNotifierEngine(CPbapAuthNotifier& aParent) +: CActive(EPriorityStandard), iParent(aParent) + { + CActiveScheduler::Add(this); + } + +void CPbapAuthNotifierEngine::ConstructL() + { + } + +void CPbapAuthNotifierEngine::StartPasswordEntryL(const TDesC8& aBuffer) + { + iParamsPckg.Copy(aBuffer); + + delete iDevice; + iDevice = NULL; + iDevice = CBTDevice::NewL(iParamsPckg().RemoteAddr()); + + // get the device name from the registry + User::LeaveIfError(iRegistry.Connect()); + User::LeaveIfError(iRegistryView.Open(iRegistry)); + iRegistrySearch.FindAddress(iParamsPckg().RemoteAddr()); + iRegistryView.CreateView(iRegistrySearch, iStatus); + iRegistryState = EFinding; + SetActive(); + } + +void CPbapAuthNotifierEngine::RunL() + { + if (iStatus == KErrNotFound) + { + // name not found, need to store device address so it can be displayed in UI + iDevice->SetDeviceAddress(iParamsPckg().RemoteAddr()); + iAuthConsole = CPbapAuthNotifierConsole::NewL(this, *iDevice, iParamsPckg().Realm(), iParamsPckg().RealmTruncated()); + iAuthConsole->GetPasswordL(); + } + else if (iStatus >= KErrNone) + { + switch (iRegistryState) + { + case EFinding: + { + iResponse = CBTRegistryResponse::NewL(iRegistryView); + iResponse->Start(iStatus); + SetActive(); + iRegistryState = EGetting; + } + break; + case EGetting: + { + iAuthConsole = CPbapAuthNotifierConsole::NewL(this, *(iResponse->Results()[0]), iParamsPckg().Realm(), iParamsPckg().RealmTruncated()); + iAuthConsole->GetPasswordL(); + } + break; + } + } + } + +void CPbapAuthNotifierEngine::DoCancel() + { + iRegistryView.CancelRequest(iStatus); + if (iResponse) + { + iResponse->Cancel(); + } + if (iAuthConsole) + { + iAuthConsole->Cancel(); + } + } + +CPbapAuthNotifierEngine::~CPbapAuthNotifierEngine() + { + Cancel(); + + delete iAuthConsole; + delete iDevice; + + iRegistryView.Close(); + iRegistry.Close(); + } + +void CPbapAuthNotifierEngine::Stop() + { + Cancel(); + + if (iAuthConsole) + { + iAuthConsole->Cancel(); + delete iAuthConsole; + iAuthConsole = NULL; + } + + //clean up device + delete iDevice; + iDevice = NULL; + } + +void CPbapAuthNotifierEngine::PasswordInputComplete(const TDesC& aPassword, TInt aReason) + { + iParent.PasswordInputComplete(aPassword, aReason); + delete iDevice; + iDevice = NULL; + delete iAuthConsole; + iAuthConsole = NULL; + } + + +// +// CPbapAuthNotifierConsole +// +CPbapAuthNotifierConsole* CPbapAuthNotifierConsole::NewL(CPbapAuthNotifierEngine* aParent, const CBTDevice& aDevice, const TDesC& aRealm, TBool aRealmTruncated) + { + CPbapAuthNotifierConsole* self = new(ELeave) CPbapAuthNotifierConsole(aParent, aRealm, aRealmTruncated); + CleanupStack::PushL(self); + self->ConstructL(aDevice); + CleanupStack::Pop(self); + return self; + } + +CPbapAuthNotifierConsole::CPbapAuthNotifierConsole(CPbapAuthNotifierEngine* aParent, const TDesC& aRealm, TBool aRealmTruncated) + : CActive(EPriorityStandard), iParent(aParent), iRealm(aRealm), iRealmTruncated(aRealmTruncated) + { + CActiveScheduler::Add(this); + } + +void CPbapAuthNotifierConsole::ConstructL(const CBTDevice& aDevice) + { + iConsole = PbapTextNotifiersConsole::AutoSizeNewL(_L("PBAP Password input"), TSize(KConsFullScreen,KConsFullScreen)); + iDevice = &aDevice; + +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ + TCallBack autoNotifierCB(AutoNotifierCallBack, this); + iAutoNotifierCallback = new (ELeave)CAsyncCallBack(autoNotifierCB, EPriorityStandard); +#endif // __PBAP_TEXT_NOTIFIERS_AUTO__ + } + +CPbapAuthNotifierConsole::~CPbapAuthNotifierConsole() + { + Cancel(); + delete iConsole; +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ + delete iAutoNotifierCallback; +#endif + } + +void CPbapAuthNotifierConsole::RunL() + { +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ + iParent->PasswordInputComplete(KAutoPassword(), KErrNone); +#else // __PBAP_TEXT_NOTIFIERS_AUTO__ + + TKeyCode key = iConsole->KeyCode(); + if (key == EKeyEnter) + { + iParent->PasswordInputComplete(iPassword, KErrNone); + } + else if (key == EKeyEscape) + { + iParent->PasswordInputComplete(iPassword, KErrCancel); + } + else + { + if (iPassword.Length() < KPbapAuthPasswordLength) + { + TBuf<1> b; + b.Append(key); + iPassword.Append(b); + iConsole->Printf(b); + IssueRequestL(); + } + else + { + iConsole->Printf(_L("\nToo many characters...\nPress any key to continue\n")); + TRequestStatus stat; + iConsole->Read(stat); + User::WaitForRequest(stat); + GetPasswordL(); + } + } +#endif // __PBAP_TEXT_NOTIFIERS_AUTO__ + } + +void CPbapAuthNotifierConsole::DoCancel() + { +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ + iConsole->ReadCancel(); +#endif + iConsole->Printf(_L("\nPin cancelled.\nPress any key to continue...\n")); + iPassword.Zero(); + } + +void CPbapAuthNotifierConsole::GetPasswordL() + { + iPassword.Zero(); + iConsole->ClearScreen(); + iConsole->Printf(_L("Please enter password for device:\nAddress: ")); + TBTDevAddr a = iDevice->BDAddr(); + iConsole->Printf(_L("0x%02x%02x%02x%02x%02x%02x"), a[0], a[1], a[2], a[3], a[4], a[5]); + if (iDevice->IsValidDeviceName()) + { + iConsole->Printf(_L("\nName: ")); + TBuf dispBuf; // BT allows device names upto 248 characters + dispBuf.Copy(iDevice->DeviceName()); + iConsole->Printf(dispBuf); + } + + iConsole->Printf(_L("\nRealm: ")); + iConsole->Printf(iRealm); + if (iRealmTruncated) + { + iConsole->Printf(_L(">>")); + } + + iConsole->Printf(_L("\nand press [return] to accept or [esc] to cancel\n")); + IssueRequestL(); + } + +void CPbapAuthNotifierConsole::IssueRequestL() + { +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ + iAutoNotifierCallback->CallBack(); + iStatus = KRequestPending; +#else //__PBAP_TEXT_NOTIFIERS_AUTO__ + iConsole->Read(iStatus); +#endif // __PBAP_TEXT_NOTIFIERS_AUTO__ + + SetActive(); + } + +#ifdef __PBAP_TEXT_NOTIFIERS_AUTO__ +/*static*/ TInt CPbapAuthNotifierConsole::AutoNotifierCallBack(TAny *aAuthConsole) + { + CPbapAuthNotifierConsole* authConsole = static_cast(aAuthConsole); + if(authConsole->IsActive()) + { + TRequestStatus* stat = &(authConsole->iStatus); + User::RequestComplete(stat, KErrNone); + } + return EFalse; + } +#endif // __PBAP_TEXT_NOTIFIERS_AUTO__