|
S60 3rd Edition SDK for Symbian OS Example Applications Guide |
00001 /* 00002 * ============================================================================== 00003 * Name : AddressBookEngine.cpp 00004 * Part of : AddressBook 00005 * Interface : 00006 * Description : Application Engine class, CAddressBookEngine - 00007 * performs engine related operations 00008 * Version : 00009 * 00010 * Copyright (c) 2002-2006 Nokia Corporation. 00011 * This material, including documentation and any related 00012 * computer programs, is protected by copyright controlled by 00013 * Nokia Corporation. 00014 * ============================================================================== 00015 */ 00016 00017 // INCLUDES 00018 #include "AddressBookEngine.h" 00019 #include "AddressBookAppUi.h" 00020 #include "AddressBookConstants.h" 00021 00022 #include <SenServiceManager.h> 00023 #include <SenXmlServiceDescription.h> 00024 #include <SenXmlUtils.h> 00025 #include <SenIdentityProvider.h> 00026 00027 // ================= MEMBER FUNCTIONS ======================= 00028 00029 // ---------------------------------------------------------------------------- 00030 // CAddressBookEngine::CAddressBookEngine(MAddressBookEngineObserver& aObserver) 00031 // constructor 00032 // ---------------------------------------------------------------------------- 00033 // 00034 CAddressBookEngine::CAddressBookEngine(MAddressBookEngineObserver& aObserver) 00035 : iConnection(NULL), 00036 iSession(NULL), 00037 iXmlReader(NULL), 00038 iObserver(aObserver), 00039 iManager(NULL), 00040 iFaultDelegate(NULL), 00041 iErrorState(ENoError), 00042 iInitialized(EFalse) 00043 { 00044 } 00045 00046 // ---------------------------------------------------------------------------- 00047 // CAddressBookEngine::CAddressBookEngine() 00048 // destructor 00049 // ---------------------------------------------------------------------------- 00050 // 00051 CAddressBookEngine::~CAddressBookEngine() 00052 { 00053 _LIT( KLogFileClosed, "CAddressBookEngine::~CAddressBookEngine() - Log file closed."); 00054 LOG(KLogFileClosed); 00055 iContacts.ResetAndDestroy(); 00056 delete iXmlReader; 00057 delete iFaultDelegate; 00058 delete iManager; 00059 delete iConnection; 00060 delete iSession; 00061 delete iFaultDelegate; 00062 } 00063 00064 // ---------------------------------------------------------------------------- 00065 // CAddressBookEngine::NewL(MAddressBookEngineObserver& aObserver) 00066 // Two-phased constructor 00067 // ---------------------------------------------------------------------------- 00068 // 00069 CAddressBookEngine* CAddressBookEngine::NewL( 00070 MAddressBookEngineObserver& aObserver) 00071 { 00072 CAddressBookEngine* newEngine = new (ELeave) CAddressBookEngine(aObserver); 00073 CleanupStack::PushL(newEngine); 00074 newEngine->ConstructL(); 00075 CleanupStack::Pop(newEngine); 00076 return newEngine; 00077 } 00078 00079 // ---------------------------------------------------------------------------- 00080 // CAddressBookEngine::ConstructL() 00081 // EPOC default constructor can leave 00082 // ---------------------------------------------------------------------------- 00083 // 00084 void CAddressBookEngine::ConstructL() 00085 { 00086 LOG_OPEN(); 00087 _LIT( KConstructL, "CAddressBookEngine::ConstructL() ***"); 00088 LOG(KConstructL); 00089 CSenBaseFragment::BaseConstructL(KPpContract, KQueryResponseLocalName); 00090 iXmlReader = CSenXmlReader::NewL(); 00091 } 00092 00093 // ---------------------------------------------------------------------------- 00094 // CAddressBookEngine::HandleMessageL(const TDesC8& aMessage) 00095 // It is overridden from interface MSenServiceConsumer function 00096 // for receiving messages from the SendL()(CSenServiceConnection)function call 00097 // ---------------------------------------------------------------------------- 00098 // 00099 void CAddressBookEngine::HandleMessageL(const TDesC8& aMessage) 00100 { 00101 _LIT(KHandleMessageL, "CAddressBookEngine::HandleMessageL()"); 00102 LOG( KHandleMessageL); 00103 LOG_ALL(aMessage); 00104 iContacts.ResetAndDestroy(); 00105 SetReader(*iXmlReader); 00106 00107 // ------------------------------------------------------------------------ 00108 // Xmlparser calls CAddressBook::StartElementL every time a new element tag is found 00109 // and CAddressBookEngine::EndElementL every time a closing element tag is found. 00110 // ------------------------------------------------------------------------ 00111 // 00112 ParseL(aMessage); 00113 iObserver.SearchFinishedL(iContacts); 00114 } 00115 00116 // ---------------------------------------------------------------------------- 00117 // CAddressBookEngine::HandleErrorL(const TInt aErrorCode, const TDesC8& aError) 00118 // It is the overridden function from MSenServiceConsumer interface 00119 // for receiving errors about the connection to be initialized or from the 00120 // SendL() (CSenServiceConnection) function call. 00121 // ---------------------------------------------------------------------------- 00122 // 00123 void CAddressBookEngine::HandleErrorL(const TInt aErrorCode, const TDesC8& aError) 00124 { 00125 _LIT( KHandleErrorL, "CAddressBookEngine::HandleErrorL()"); 00126 LOG( KHandleErrorL); 00127 TBuf<24> code; 00128 code.AppendNum(aErrorCode); 00129 LOG(code); 00130 LOG_ALL(aError); 00131 iContacts.ResetAndDestroy(); 00132 00133 // ------------------------------------------------------------------------ 00134 // Every error reported here is not nested XML error, 00135 // probably SOAP error, so show general error. 00136 // More sophisticated applications could resolve service 00137 // specific info about failure by inspecting soap fault 00138 // received in here. 00139 // ------------------------------------------------------------------------ 00140 // 00141 iObserver.ErrorL(ESearchFailed); 00142 } 00143 00144 // ---------------------------------------------------------------------------- 00145 // CAddressBookEngine::SetStatus(const TInt aStatus) 00146 // It is overridden function from MSenServiceConsumer interface 00147 // for receiving status info about the connection to be initialized. 00148 // It is called by CSenServiceConnectionImpl::RunL() that is called by active 00149 // scheduler from CAddressBookAppUi::HandleCommandL(TInt aCommand) in case 00150 // "EAddressBookCmdAppConnect" 00151 // ---------------------------------------------------------------------------- 00152 // 00153 void CAddressBookEngine::SetStatus(const TInt aStatus) 00154 { 00155 _LIT( KSetStatus, "CAddressBookEngine::SetStatus()"); 00156 LOG( KSetStatus); 00157 iConnectionState = aStatus; 00158 switch(iConnectionState) 00159 { 00160 case KSenConnectionStatusNew: 00161 _LIT( KSenConnStatNew, "KSenConnectionStatusNew"); 00162 LOG( KSenConnStatNew); 00163 break; 00164 case KSenConnectionStatusReady: 00165 _LIT( KSenConnStatRdy, "KSenConnectionStatusReady"); 00166 LOG( KSenConnStatRdy); 00167 iInitialized = ETrue; 00168 iObserver.ConnectionReady(); 00169 break; 00170 case KSenConnectionStatusExpired: 00171 _LIT( KSenConnStatEx, "KSenConnectionStatusExpired"); 00172 LOG( KSenConnStatEx); 00173 break; 00174 default: 00175 TBuf<32> num; 00176 num.AppendNum(iConnectionState); 00177 _LIT( KUknStat, "UNKNOWN STATUS: (%S)"); 00178 LOG_FORMAT((KUknStat, num)); 00179 break; 00180 } 00181 if(!iInitialized) 00182 { 00183 TInt leaveCode(KErrNone); 00184 TRAP(leaveCode, iObserver.ErrorL(EConnectionNotReady)); 00185 leaveCode = 0; // not used 00186 } 00187 } 00188 00189 // --------------------------------------------------------------------------- 00190 // CAddressBookEngine::ResolveResourceIdL() 00191 // This helper function resolves the ResourceID from WSF using 00192 // ServiceDescriptionL() getter method. 00193 // return pointer to resolved ResourceID element, 00194 // which content indicates whether it is encrypted or not; 00195 // content of encrypted ResourceID includes "EncryptedData" element. 00196 //---------------------------------------------------------------------------- 00197 // 00198 CSenElement* CAddressBookEngine::ResolveResourceIdL() 00199 { 00200 _LIT( KResolveResourceIdL, "ResolveResourceIdL()"); 00201 LOG( KResolveResourceIdL); 00202 TInt parseLeaveCode(KErrNone); 00203 HBufC8* sd = NULL; 00204 CSenElement* resourceID = NULL; 00205 00206 if(iInitialized && iConnection) 00207 { 00208 TInt err0 = iConnection->ServiceDescriptionL(sd); 00209 if(err0 == KErrNone && sd) 00210 { 00211 _LIT( KServDescRet, "iConnection->ServiceDescriptionL(sd) returned:"); 00212 LOG( KServDescRet); 00213 CleanupStack::PushL(sd); 00214 LOG_ALL((*sd)); 00215 delete iSession; 00216 iSession = NULL; 00217 iSession = CSenXmlServiceDescription::NewL(); 00218 iSession->SetReader(*iXmlReader); 00219 iXmlReader->SetContentHandler(*iSession); 00220 TRAP(parseLeaveCode, iSession->ParseL(*sd)); 00221 CleanupStack::PopAndDestroy(sd); 00222 if(parseLeaveCode!=KErrNone) 00223 { 00224 _LIT( KParServDescFailed, "Parsing of service description (session) failed!"); 00225 LOG( KParServDescFailed); 00226 } 00227 else 00228 { 00229 _LIT8 (KResourceID, "ResourceID"); 00230 resourceID = iSession->AsElement().Element(KResourceID); 00231 if(resourceID) 00232 { 00233 _LIT( KResID, "ResourceID:"); 00234 LOG(KResID); 00235 LOG_ALL((resourceID->Content())); 00236 } 00237 else 00238 { 00239 _LIT( KResIdNotFound, "ResourceID not found from service description."); 00240 LOG( KResIdNotFound); 00241 } 00242 } 00243 } 00244 } 00245 return resourceID; 00246 } 00247 00248 // ---------------------------------------------------------------------------- 00249 // CAddressBookEngine::GenerateQueryRequestL(const TDesC& aSearchPattern) 00250 // gets the XML query based on the search parameter passed 00251 // SAMPLE XML Request is 00252 // 00253 // <ab:Query xmlns:ab=\"urn:nokia:test:addrbook:2004-09\"> 00254 // <ab:QueryItem> 00255 // <ab:Select> 00256 // ab:Card[contains(ab:N ab:FAMILY,"%S") or contains(ab:N ab:GIVEN, "%S") or contains(ab:TEL, "%S")] 00257 // </ab:Select> 00258 // </ab:QueryItem> 00259 // <ab:ResourceID> 00260 // XYZ 00261 // </ab:ResourceID> 00262 // </ab:Query> 00263 // 00264 // The %S will be replaced with the value entered by user as search string 00265 // ---------------------------------------------------------------------------- 00266 // 00267 HBufC8* CAddressBookEngine::GenerateQueryRequestL(const TDesC& aSearchPattern) 00268 { 00269 _LIT( KGenQueryReqL, "CAddressBookEngine::GenerateQueryRequestL(const TDesC& aSearchPattern)"); 00270 LOG( KGenQueryReqL); 00271 00272 // Create Query Tag 00273 _LIT8 (KElement, "Query"); 00274 CSenElement* element = CSenBaseElement::NewL(KElement); 00275 CleanupStack::PushL(element); 00276 element->SetNamespaceL(KQueryNS, KPpContract); 00277 00278 // Create QueryItem element 00279 _LIT8 (KQueryItem, "ab:QueryItem"); 00280 CSenElement* queryItem = CSenBaseElement::NewL(KQueryItem); 00281 CleanupStack::PushL(queryItem); 00282 00283 // Create Select element 00284 _LIT8 (KSelectElement, "ab:Select"); 00285 CSenBaseElement* selectElement=CSenBaseElement::NewL(KSelectElement); 00286 CleanupStack::PushL(selectElement); 00287 00288 //Create temporary buffer and perform UTF8 conversion for parameter passed 00289 HBufC8* tempBuffer = HBufC8::NewLC(512); 00290 TPtr8 ptrSelectQuery = tempBuffer->Des(); 00291 HBufC8* pattern = SenXmlUtils::ToUtf8LC(aSearchPattern); 00292 //Replace %S with pattern passed in parameter 00293 ptrSelectQuery.Format(KSelectQuery, pattern, pattern, pattern); 00294 00295 selectElement->SetContentL(ptrSelectQuery); 00296 // Add select element to QueryItem 00297 queryItem->AddElementL(*selectElement); 00298 00299 //Add QueryItemto Query 00300 element->AddElementL(*queryItem); 00301 00302 // Next phase is to create and add ResourceID element into the query. 00303 CSenElement* resourceID = ResolveResourceIdL(); 00304 CSenBaseElement* resourceElement = NULL; 00305 if(resourceID) 00306 { 00307 // (Encrypted)Resource was successfully resolved. Now check 00308 // whether plain ResourceID or EncryptedResourceID is 00309 // available and create according element into the query. 00310 if (resourceID->Content().Find(KEncrypted()) != KErrNotFound) 00311 { 00312 _LIT( KEncResID, "EncryptedResourceID exists."); 00313 LOG(KEncResID); 00314 _LIT8 (KResourceElement, "ab:EncryptedResourceID"); 00315 resourceElement = CSenBaseElement::NewL(KResourceElement); 00316 CleanupStack::PushL(resourceElement); 00317 // copy the actual resource id content 00318 resourceElement->CopyFromL(*resourceID); 00319 } 00320 else 00321 { 00322 _LIT( KOnlyPlainResID, "Only plain ResourceID should be used (not encrypted)."); 00323 LOG( KOnlyPlainResID); 00324 _LIT8 (KResourceElement, "ab:ResourceID"); 00325 resourceElement = CSenBaseElement::NewL(KResourceElement); 00326 CleanupStack::PushL(resourceElement); 00327 // Copy the actual resource id content 00328 resourceElement->CopyFromL(*resourceID); 00329 } 00330 } 00331 else 00332 { 00333 _LIT( KErrResID, "Error: could not resolve ResourceID!"); 00334 LOG( KErrResID); 00335 _LIT8 (KResourceElement, "ab:ResourceID"); 00336 resourceElement=CSenBaseElement::NewL(KResourceElement); 00337 CleanupStack::PushL(resourceElement); 00338 resourceElement->SetContentL(KResourceIDVal); // example content 00339 } 00340 element->AddElementL(*resourceElement); 00341 CleanupStack::Pop(resourceElement); 00342 00343 //Get the XML 00344 HBufC8* soapBuf = element->AsXmlL(); 00345 00346 // Log the XML request 00347 _LIT( KGenQuery, "Generated Query:"); 00348 LOG( KGenQuery); 00349 LOG_ALL(( soapBuf->Des() )); 00350 00351 //Destroy the objects pushed on cleanup stack 00352 CleanupStack::PopAndDestroy(pattern); 00353 CleanupStack::PopAndDestroy(tempBuffer); 00354 CleanupStack::Pop(selectElement); 00355 CleanupStack::Pop(queryItem); 00356 CleanupStack::PopAndDestroy(element); 00357 //return Pointer to Soap Request Buffer; 00358 return soapBuf; 00359 } 00360 00361 // ---------------------------------------------------------------------------- 00362 // CAddressBookEngine::SendSearchL(const TDesC& aSearchPattern) 00363 // function is called after an user has selected Search from the GUI 00364 // and typed a request. Function creates a search pattern from the descriptor 00365 // and send it to the WSP. The message from server is received through 00366 // HandleMessageL() or an error is received through HandleErrorL(). 00367 // ---------------------------------------------------------------------------- 00368 // 00369 void CAddressBookEngine::SendSearchL(const TDesC& aSearchPattern) 00370 { 00371 _LIT( KSendSearchL, "CAddressBookEngine::SendSearchL()"); 00372 LOG(KSendSearchL); 00373 iErrorState = ENoError; 00374 if (!iConnection) 00375 { 00376 _LIT( KConnNotReady, "Connection not ready."); 00377 LOG(KConnNotReady); 00378 iObserver.ErrorL(EConnectionNotReady); 00379 return; 00380 } 00381 00382 //Get the xml query to be sent to service 00383 HBufC8* stSearch= GenerateQueryRequestL(aSearchPattern); 00384 CleanupStack::PushL(stSearch); 00385 00386 //Send the query to service 00387 iConnection->SendL(*stSearch); 00388 00389 CleanupStack::PopAndDestroy(stSearch); 00390 } 00391 00392 // ---------------------------------------------------------------------------- 00393 // CAddressBookEngine::StartElementL(const TDesC8& aNsUri, 00394 // const TDesC8& aLocalName, 00395 // const TDesC8& aQName, 00396 // const RAttributeArray& aAttrs) 00397 // It is called from CAddressBookEngine::HandleMessageL (ParseL(aMessage)) 00398 // every time when XML parser finds a new element tag. 00399 // 00400 // Example server response: 00401 // <ab:QueryResponse xmlns:ab="urn:nokia:test:addrbook:2004-09"> 00402 // <ab:Status code="ab:OK"/> 00403 // <ab:Data> 00404 // <ab:Card> 00405 // <ab:N> 00406 // <ab:FAMILY>Smith</ab:FAMILY> 00407 // <ab:GIVEN>John</ab:GIVEN> 00408 // </ab:N> 00409 // <ab:ADR> 00410 // <ab:EXTADR>Room 123</ab:EXTADDR> 00411 // <ab:STREET>1st ST 123</ab:STREET> 00412 // <ab:PCODE>7698532</ab:PCODE> 00413 // </ab:ADR> 00414 // <ab:TEL>1234</ab:TEL> 00415 // <ab:TEL type="CELL">2122345</ab:TEL> 00416 // </ab:Card> 00417 // </ab:Data> 00418 // </ab:QueryResponse> 00419 // 00420 // In this case we are interested in the <Status> and <Card> elements. 00421 // When Status is found, we compare if attribute 'Code' is OK or not. 00422 // SenXmlUtils::LocalName() only extracts out a possible XML prefix 00423 // (i.e. 'ab:OK'). 00424 // When local name is 'Card', we have encountered a contact-object. 00425 // Then we make a new CAddressBookContact and delegate the parsing to it. 00426 // ---------------------------------------------------------------------------- 00427 // 00428 void CAddressBookEngine::StartElementL( const TDesC8& aNsUri, 00429 const TDesC8& aLocalName, 00430 const TDesC8& aQName, 00431 const RAttributeArray& aAttrs) 00432 { 00433 _LIT( KStartElementL, "CAddressBookEngine::StartElementL() ***"); 00434 _LIT( KNamespaceURI, "- namespace URI (%S)"); 00435 _LIT( KLocalname, "- localname (%S)"); 00436 _LIT( KQualName, "- qualified name (%S)"); 00437 00438 LOG( KStartElementL); 00439 LOG_FORMAT((KNamespaceURI, aNsUri)); 00440 LOG_FORMAT((KLocalname, aLocalName)); 00441 LOG_FORMAT((KQualName, aQName)); 00442 00443 if (aLocalName == KStatus) 00444 { 00445 00446 if (SenXmlUtils::LocalName(SenXmlUtils::AttrValue(aAttrs, KCode)) != KOk) 00447 { 00448 iErrorState = ENestedError; 00449 delete iFaultDelegate; 00450 iFaultDelegate = NULL; 00451 iFaultDelegate = CSenDomFragment::NewL(aNsUri, 00452 aLocalName, aQName, aAttrs); 00453 DelegateParsingL(*iFaultDelegate); 00454 return; 00455 } 00456 } 00457 else if (aLocalName == KCard) 00458 { 00459 iErrorState = ENoError; 00460 00461 CAddressBookContact* delegate = CAddressBookContact::NewL(); 00462 CleanupStack::PushL(delegate); 00463 iContacts.Append(delegate); 00464 DelegateParsingL(*delegate); 00465 CleanupStack::Pop(delegate); 00466 return; 00467 } 00468 } 00469 00470 // ---------------------------------------------------------------------------- 00471 // CAddressBookEngine::EndElementL(const TDesC8& aNsUri, 00472 // const TDesC8& aLocalName, 00473 // const TDesC8& aQName) 00474 // It is called from CAddressBookEngine::HandleMessageL (ParseL(aMessage)) 00475 // every time when XML parser finds a closing element tag. 00476 // 00477 // We are only interested about the </Status> element. 00478 // When the </Status> is found, we check for errors found in response, 00479 // and if so, notice the observer 00480 // ---------------------------------------------------------------------------- 00481 // 00482 void CAddressBookEngine::EndElementL( const TDesC8& aNsUri, 00483 const TDesC8& aLocalName, 00484 const TDesC8& aQName) 00485 { 00486 _LIT( KEndElementL, "CAddressBookEngine::EndElementL()"); 00487 _LIT( KNamespaceURI, "- namespace URI (%S)"); 00488 _LIT( KLocalname, "- localname (%S)"); 00489 _LIT( KQualName, "- qualified name (%S)"); 00490 00491 LOG( KEndElementL); 00492 LOG_FORMAT((KNamespaceURI, aNsUri)); 00493 LOG_FORMAT((KLocalname, aLocalName)); 00494 LOG_FORMAT((KQualName, aQName)); 00495 00496 if(aLocalName == KStatus) 00497 { 00498 if (iErrorState == ENestedError) 00499 { 00500 iErrorState = ENoError; 00501 CSenElement* statusElement = NULL; 00502 if (iFaultDelegate) 00503 { 00504 statusElement = 00505 iFaultDelegate->AsElement().Element(KStatus); 00506 } 00507 00508 if(statusElement) 00509 { 00510 const TDesC8* errorCode = statusElement->AttrValue(KCode); 00511 iContacts.ResetAndDestroy(); 00512 if (errorCode) 00513 { 00514 if (SenXmlUtils::LocalName(*errorCode) == KTooManyMatches) 00515 { 00516 iObserver.ErrorL(ETooManyMatches); 00517 } 00518 else 00519 { 00520 iObserver.ErrorL(ESearchFailed); // Default error 00521 } 00522 } 00523 } 00524 else 00525 { 00526 // could not find status element: 00527 iObserver.ErrorL(ESearchFailed); // Default error 00528 } 00529 } 00530 else if (iErrorState == ESoapError) 00531 { 00532 iErrorState = ENoError; 00533 delete iFaultDelegate; 00534 iFaultDelegate = NULL; 00535 iContacts.ResetAndDestroy(); 00536 iObserver.ErrorL(ESearchFailed); // Default error 00537 } 00538 } 00539 else 00540 { 00541 CSenBaseFragment::EndElementL(aNsUri, aLocalName, aQName); 00542 } 00543 } 00544 00545 // ---------------------------------------------------------------------------- 00546 // CAddressBookEngine::RegisterIdentityProviderL() 00547 // registers the IdentityProvider and associates the FN service to it. 00548 // Method creates the CSenServiceManager instance and uses it to register 00549 // Identity Provider ALSO as Authentication Service (AS) Description. 00550 // The actual Forum Nokia's Addressbook service is then associated to this 00551 // newly registered IdentityProvider. 00552 // ---------------------------------------------------------------------------- 00553 // 00554 TInt CAddressBookEngine::RegisterIdentityProviderL() 00555 { 00556 _LIT( KRegIdProvL, "CAddressBookEngine::RegisterIdentityProviderL()"); 00557 LOG( KRegIdProvL); 00558 TBuf<64> buf; // for logging 00559 00560 TInt retVal(KErrNone); 00561 00562 if (!iManager) 00563 { 00564 _LIT( KInsNewServMng, "Instantiating new service manager"); 00565 LOG( KInsNewServMng); 00566 iManager = CSenServiceManager::NewL(); 00567 } 00568 00569 CSenIdentityProvider* idp = CSenIdentityProvider::NewLC( 00570 KASEndPoint, KASContract); 00571 00572 // Set the Provider ID 00573 idp->SetProviderID(KASProviderID); 00574 00575 // Associate Forum Nokia's Addressbook service ID (contract) 00576 // to this Identity Provider 00577 idp->SetServiceID(KPpContract); 00578 00579 // Set Liberty ID-WSF framework ID 00580 idp->SetFrameworkIdL(KDefaultIdWsfFrameworkID); 00581 00582 // ------------------------------------------------------------------------ 00583 // The following username/password properties will be used for 00584 // authentication. Please note, that use advisory authentication 00585 // id "IMEI" would result device ID to be directly fetched from phone. 00586 // ------------------------------------------------------------------------ 00587 // 00588 idp->SetUserInfoL(KTestAuthzID, KNullDesC8, KTestPassword); 00589 00590 _LIT( KRegIdProv, "Registering identityprovider. User info provided."); 00591 LOG( KRegIdProv); 00592 retVal = iManager->RegisterIdentityProviderL(*idp); 00593 if(retVal != KErrNone) 00594 { 00595 // -------------------------------------------------------------------- 00596 // An error occurred. However, the rest of registration calls will 00597 // be attempted in order to provide any possible data that WSF needs. 00598 // -------------------------------------------------------------------- 00599 buf.AppendNum(retVal); 00600 _LIT( KErrRegIdProv, "Error registering Identity Provider: %S"); 00601 LOG_FORMAT((KErrRegIdProv, buf)); 00602 buf.Zero(); 00603 } 00604 _LIT( KRegAutServDesc, "Registering autentication service description."); 00605 LOG( KRegAutServDesc); 00606 retVal = iManager->RegisterServiceDescriptionL(*idp); 00607 if(retVal != KErrNone) 00608 { 00609 // -------------------------------------------------------------------- 00610 // An error occurred. However, the rest of registration calls will 00611 // be attempted in order to provide any possible data that WSF needs. 00612 // -------------------------------------------------------------------- 00613 buf.AppendNum(retVal); 00614 _LIT( KErrRegServDesc, "Error registering Service Description: %S"); 00615 LOG_FORMAT((KErrRegServDesc, buf)); 00616 buf.Zero(); 00617 } 00618 00619 // Note, that following API call could be used to associate more services 00620 // to some Identity Provider, which ProviderID is known. 00621 // 00622 // LIT( KAssocAddressbookServ, "Associating Addressbook service (WSP) to known Identity Provider."); 00623 // LOG( KAssocAddressbookServ); 00624 // retVal = iManager->AssociateServiceL(KPpContract, KASProviderID); 00625 // 00626 // if(retVal != KErrNone) 00627 // { 00628 // // -------------------------------------------------------------------- 00629 // // An error occurred. However, the rest of registration calls will 00630 // // be attempted in order to provide any possible data that WSF needs. 00631 // // -------------------------------------------------------------------- 00632 // buf.AppendNum(retVal); 00633 // _LIT( KErrAssFNServ, "Error associating the FN service to IDP %S"); 00634 // LOG_FORMAT( KErrAssFNServ, buf); 00635 // buf.Zero(); 00636 // } 00637 00638 CleanupStack::PopAndDestroy(idp); 00639 return retVal; 00640 } 00641 00642 // ---------------------------------------------------------------------------- 00643 // CAddressBookEngine::ConnectL() 00644 // Makes a connection to an ID-WSF service. 00645 // When ConnectL() is called the first time, authentication and 00646 // discovery services are connected and the user is therefore 00647 // authenticated and the service is connected. 00648 // When ConnectL() is called again and the credentials received from 00649 // authentication and discovery services are valid, there are no need to 00650 // connect to them again. This means that SetStatus() will be called 00651 // almost immediately with value CONNECTED, but in device GPRS or data 00652 // connection is not opened yet (but instead it is opened when search 00653 // occurs). 00654 // ---------------------------------------------------------------------------- 00655 // 00656 void CAddressBookEngine::ConnectL() 00657 { 00658 _LIT (KConnectL, "CAddressBookEngine::ConnectL()"); 00659 LOG( KConnectL); 00660 RegisterIdentityProviderL(); 00661 00662 CSenXmlServiceDescription* pattern = CSenXmlServiceDescription::NewLC(); 00663 pattern->SetContractL(KPpContract()); 00664 delete iConnection; 00665 iConnection = NULL; 00666 iConnection = CSenServiceConnection::NewL(*this, *pattern); 00667 CleanupStack::PopAndDestroy(pattern); 00668 } 00669 00670 // ---------------------------------------------------------------------------- 00671 // CAddressBookEngine::Connected() 00672 // sets a state of connection as KSenConnectionStatusReady 00673 // ---------------------------------------------------------------------------- 00674 // 00675 TBool CAddressBookEngine::Connected() 00676 { 00677 return (iConnectionState == KSenConnectionStatusReady); 00678 } 00679 00680 // ---------------------------------------------------------------------------- 00681 // CAddressBookEngine::GetContact(TInt aPosition, CAddressBookContact*& aContact) 00682 // This function need to get a current contact (CAddressBookView::CurrentContact()) 00683 // or to open an item (CAddressBookView::OpenItemL()) 00684 // ---------------------------------------------------------------------------- 00685 // 00686 TInt CAddressBookEngine::GetContact(TInt aPosition, CAddressBookContact*& aContact) 00687 { 00688 _LIT( KGetContact, "CAddressBookEngine::GetContact()"); 00689 LOG( KGetContact); 00690 TInt retVal(KErrNotFound); 00691 if (aPosition < iContacts.Count() && aPosition >= 0) 00692 { 00693 aContact = iContacts[aPosition]; 00694 retVal = KErrNone; 00695 } 00696 return retVal; 00697 } 00698 00699 // ---------------------------------------------------------------------------- 00700 // CAddressBookEngine::Cancel() 00701 // Close WebServices-connection if user canceled 00702 // ---------------------------------------------------------------------------- 00703 // 00704 void CAddressBookEngine::Cancel() 00705 { 00706 _LIT( KCancel, "CAddressBookEngine::Cancel()"); 00707 LOG( KCancel); 00708 delete iConnection; 00709 iConnectionState = 0; // not connected 00710 iConnection = NULL; 00711 } 00712 00713 // End of File 00714
|
© Nokia 2006 |