S60 3rd Edition SDK for Symbian OS
Example Applications Guide

AddressBookEngine.cpp

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

Back to top