webservices/wscore/src/senxmldao.cpp
changeset 0 62f9d29f7211
child 20 32ab7ae9ec94
equal deleted inserted replaced
-1:000000000000 0:62f9d29f7211
       
     1 /*
       
     2 * Copyright (c) 2002-2005 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:           
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 
       
    23 
       
    24 
       
    25 
       
    26 
       
    27 // INCLUDE FILES
       
    28 #include <f32file.h>
       
    29 #include <s32file.h>
       
    30 #include <s32strm.h>
       
    31 #include <e32std.h>
       
    32 #include <sysutil.h>
       
    33 #include <eikenv.h>
       
    34 #include <s32mem.h>
       
    35 
       
    36 #include <SenServiceConnection.h> // error codes and framework ids
       
    37 #include <MSenServiceDescription.h>
       
    38 #include "senwsdescription.h"
       
    39 #include <SenXmlUtils.h>          // static attribute value getter
       
    40 #include <SenXmlReader.h>
       
    41 
       
    42 #include "senprovider.h"
       
    43 #include "senxmldao.h"
       
    44 #include "msencoreservicemanager.h"
       
    45 
       
    46 #include "senservicemanagerdefines.h" // KMaxTicks (1209600000)
       
    47                                       // 1 tick = 1 millisec
       
    48                                       // 86400 sec = 1 day
       
    49                                       // 86400*1000 millisec = 1 day
       
    50                                       // 86400*14*1000 = 1209600000 millisec = 2 weeks
       
    51 
       
    52 #include "senlogger.h"
       
    53 #include "sendebug.h"                       // internal Utils\inc
       
    54 #include "msenserviceinvocationframework.h" // internal Framework\inc
       
    55 #include "senserviceinvocationframework.h"  // internal Framework\inc
       
    56 #include "sensecuritymechanism.h"           // internal Framework\inc
       
    57 #include "senservicesession.h"              // internal Framework\inc
       
    58 
       
    59 #include "senprovider.h"
       
    60 
       
    61 #include "senlogger.h" 
       
    62 
       
    63 
       
    64 // CONSTANTS
       
    65 namespace
       
    66     {
       
    67     const TInt KFlatBufSize = 128;
       
    68 
       
    69 #if !defined( EKA2 ) && !defined( RD_SECURE_PRIV_DATA )
       
    70      _LIT(KSenXMLDAOFile,        "C:\\system\\data\\sensessions.xml");
       
    71      // since CoreSM & XMLDAO are singleton, single temp file is ok:
       
    72      _LIT(KSenXMLDAOTempFile,    "C:\\system\\data\\sensessions.temp.xml");
       
    73 #else
       
    74     _LIT(KSenXMLDAOFile,        "sensessions.xml");
       
    75     // since CoreSM & XMLDAO are singleton, single temp file is ok:
       
    76     _LIT(KSenXMLDAOTempFile,    "sensessions.temp.xml");
       
    77 #endif   
       
    78 
       
    79     //_LIT(KSenXmlDaoPanic, "SenXmlDao");
       
    80 
       
    81     _LIT8(KDefaultFrameworkCue1,
       
    82                 "com.nokia.Sen.idwsf.IdentityBasedWebServicesFramework");
       
    83     _LIT8(KDefaultFrameworkCue2,
       
    84                 "com.nokia.Sen.wsi.WSIBasicFramework");
       
    85     _LIT8(KDefaultFrameworkCue3,
       
    86                 "com.nokia.Sen.rest.RestServiceFramework");
       
    87     _LIT8(KDefaultFrameworkCue4,
       
    88                 "com.nokia.ws.wsstar.WSStarFramework");
       
    89     _LIT8(KDefaultFrameworkCue5,
       
    90                 "com.nokia.ws.atompub.AtomPubFramework");
       
    91     _LIT8(KDefaultFrameworkCue6,
       
    92                 "com.nokia.ws.ovi.OviFramework");
       
    93 
       
    94     _LIT8(KEqual, "=");
       
    95     _LIT8(KQuote, "\"");
       
    96     _LIT8(KCloseTag, ">");
       
    97     _LIT8(KEmptySpace, " ");
       
    98 
       
    99     _LIT8(KServiceDescription, "ServiceDescription");
       
   100     _LIT8(KFramework, "Framework");
       
   101     _LIT8(KClass, "class");
       
   102     _LIT8(KProxyHost, "proxyHost");
       
   103     _LIT8(KProxyPort, "proxyPort");
       
   104 
       
   105 
       
   106     _LIT8(KLocalName, "SenConfiguration");
       
   107     _LIT8(KTransport,   "Transport");
       
   108     _LIT8(KEndTag, "</SenConfiguration>");
       
   109     _LIT8(KStartTag,
       
   110             "<SenConfiguration xmlns=\"urn:com.nokia.Sen.config.1.0\">");
       
   111     _LIT8(KStartTagEndless,
       
   112             "<SenConfiguration xmlns=\"urn:com.nokia.Sen.config.1.0\"");
       
   113     _LIT8(KNamespaceName, "urn:com.nokia.Sen.config.1.0");
       
   114 
       
   115     _LIT8(KSpace, " ");
       
   116     _LIT8(KTouch, "touch");
       
   117 
       
   118     // Transport plug-in spesific constants:
       
   119     _LIT8(KLocalTransportScheme,                "local");
       
   120     _LIT8(KDefaultLocalTransportPluginCue,      "com.nokia.wsf.transport.plugin.local");
       
   121 
       
   122     _LIT8(KTcpTransportScheme,                   "tcp");
       
   123     _LIT8(KDefaultVirtualTcpTransportPluginCue,  "com.nokia.wsf.transport.plugin.virtualtcp");
       
   124     }
       
   125 
       
   126 CSenXMLDAO* CSenXMLDAO::NewL(MSenCoreServiceManager& aManager)
       
   127     {
       
   128     CSenXMLDAO* pNew = CSenXMLDAO::NewLC(aManager);
       
   129     CleanupStack::Pop();
       
   130     return pNew;
       
   131     }
       
   132 
       
   133 CSenXMLDAO* CSenXMLDAO::NewLC(MSenCoreServiceManager& aManager)
       
   134     {
       
   135     CSenXMLDAO* pNew = new (ELeave) CSenXMLDAO(aManager);
       
   136     CleanupStack::PushL(pNew);
       
   137 
       
   138     // SenConfiguration xmlns="urn:com.nokia.Sen.config.1.0">
       
   139     pNew->ConstructL();
       
   140     return pNew;
       
   141     }
       
   142 
       
   143 CSenXMLDAO::CSenXMLDAO(MSenCoreServiceManager& aManager)
       
   144     :iManager(aManager),
       
   145     iReadingConfig(ESenIdle),
       
   146     iErrorState(KErrNone),
       
   147     iFileName(KSenXMLDAOFile),
       
   148     iSessions(2),
       
   149     iFrameworks(2),                     
       
   150     iServiceDescription(NULL),
       
   151     iFrameworkConfigParser(NULL),
       
   152     iDefaultFrameworkCheckedToExist(EFalse),
       
   153     iProxyHost(NULL),
       
   154     iProxyPort(0),
       
   155     iTransportMap(ETrue, ETrue),
       
   156     iDefaultTransportMapChecked(EFalse),
       
   157     iSharableProviders(2),              
       
   158     iUnsharableProviders(ETrue, ETrue) 
       
   159     {
       
   160     }
       
   161 
       
   162 void CSenXMLDAO::ConstructL()
       
   163     {
       
   164     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO ConstructL()")));
       
   165     BaseConstructL(KNamespaceName(), KLocalName());
       
   166     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO Base done")));
       
   167 
       
   168 
       
   169     SetReader(*iManager.XMLReader());
       
   170 
       
   171     //Data caging 2 implementation
       
   172 #if defined( EKA2 ) || defined( RD_SECURE_PRIV_DATA )
       
   173     TBuf<KMaxPath> privatePath;
       
   174     RFs fss;
       
   175         User::LeaveIfError(fss.Connect());
       
   176         CleanupClosePushL(fss);
       
   177     fss.CreatePrivatePath(EDriveC);
       
   178     fss.PrivatePath(privatePath);
       
   179     iFileName.Insert(0,privatePath);
       
   180     CleanupStack::PopAndDestroy(1);
       
   181 #endif
       
   182     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO ConstructL() done")));
       
   183     iCriticalSection.CreateLocal();
       
   184     }
       
   185 
       
   186 CSenXMLDAO::~CSenXMLDAO()
       
   187     {
       
   188     // Save the XML
       
   189     CSenXMLDAO::Save();
       
   190 
       
   191     if(iServiceDescription)
       
   192         {
       
   193         TInt index = iSessions.Find(iServiceDescription);
       
   194         if(index==KErrNotFound)
       
   195             {
       
   196             // would otherwise NOT be taken care by:
       
   197             //             iSessions.ResetAndDestroy()
       
   198             delete iServiceDescription;
       
   199             }
       
   200         }
       
   201 
       
   202     iSessions.ResetAndDestroy();
       
   203 
       
   204 
       
   205     if(iFrameworkConfigParser)
       
   206         {
       
   207         CSIF* pSIF = (CSIF*) iFrameworkConfigParser;
       
   208 
       
   209         TInt index = iFrameworks.Find(pSIF);
       
   210         if(index==KErrNotFound)
       
   211             {
       
   212             // otherwise deleted in ResetAndDestroy() below
       
   213             delete iFrameworkConfigParser;
       
   214             }
       
   215         }
       
   216     iFrameworks.ResetAndDestroy();
       
   217 
       
   218     if ( iProxyHost )
       
   219         {
       
   220         delete iProxyHost;
       
   221         iProxyHost = NULL;
       
   222         }
       
   223 
       
   224     iTransportMap.Reset();
       
   225 
       
   226     iSharableProviders.ResetAndDestroy();
       
   227     iUnsharableProviders.Reset(); // destroys any unloaded / unreleased providers..
       
   228     iCriticalSection.Close();
       
   229 
       
   230     if( ipTransportDelegate )
       
   231         {
       
   232         ipTransportDelegate->ExtractElement();
       
   233         }
       
   234     delete ipTransportDelegate;    
       
   235     }
       
   236 
       
   237 CSenXmlReader* CSenXMLDAO::XMLReader()
       
   238     {
       
   239     return iManager.XMLReader();
       
   240     }
       
   241 
       
   242 void CSenXMLDAO::Load()
       
   243     {
       
   244     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::Load()")));
       
   245     TInt leaveCode(KErrNone);
       
   246     TRAP(leaveCode, ReadL());
       
   247 
       
   248 #ifdef _SENDEBUG
       
   249     if(leaveCode!=KErrNone)
       
   250         {
       
   251         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - ReadL() leaved: %d"), leaveCode));
       
   252         }
       
   253 #else
       
   254     leaveCode = 0; 
       
   255 #endif
       
   256 
       
   257 
       
   258     // Default frameworks are checked (and loaded)after all the frameworks have
       
   259     // been parsed in the MIDDLE of PARSING, to PREVENT possibility of orphan
       
   260     // SD, if no ID-WSF plug-in was found, for example because ECOM cue
       
   261     // (default_data) was wrong. MOVED the installation of default
       
   262     // frameworks to be in StartElementL() instead(!)
       
   263 
       
   264     // Handle the case where no frameworks or service descriptions were found 
       
   265     // from sensessions.xml
       
   266     if(!iDefaultFrameworkCheckedToExist)
       
   267         {
       
   268         TInt retVal = CheckDefaultFrameworks();
       
   269         retVal = 0; // not used currently
       
   270         iDefaultFrameworkCheckedToExist=ETrue;
       
   271         }
       
   272 
       
   273     if(!iDefaultTransportMapChecked)
       
   274         {
       
   275         TInt retCode = CheckDefaultTransports();
       
   276         iDefaultTransportMapChecked=ETrue;
       
   277         retCode=0; // not used currently
       
   278         }
       
   279 
       
   280     iReadingConfig = ESenIdle;
       
   281 
       
   282     // This way the sensessions.xml -file is validated,
       
   283     // and expired sessions will be deleted, etc..
       
   284     TInt saveRetVal = Save();
       
   285     saveRetVal = 0; // not used currently
       
   286     }
       
   287 
       
   288 TInt CSenXMLDAO::Save()
       
   289     {
       
   290     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::SaveSessions()")));
       
   291     TInt notifyLeaveCode(KErrNone);
       
   292     TRAP(notifyLeaveCode, NotifyFrameworksL(KNullDesC8, KSenEventSessionsDbWriteBegin, NULL));
       
   293     TInt leaveCode(KErrNone);
       
   294     TRAP(leaveCode, WriteL());
       
   295     TRAP(notifyLeaveCode, NotifyFrameworksL(KNullDesC8, KSenEventSessionsDbWriteComplete, NULL));
       
   296     
       
   297     iManager.SaveCredentialDB();
       
   298     
       
   299     notifyLeaveCode = 0; // not used
       
   300     return leaveCode;
       
   301     }
       
   302 
       
   303 MSIF* CSenXMLDAO::Framework(const TDesC8& aFrameworkId)
       
   304     {
       
   305     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::Framework");
       
   306     CSIF* pFramework = NULL;
       
   307 
       
   308     TInt count(iFrameworks.Count());
       
   309     for (TInt i=0; i<count; i++)
       
   310         {
       
   311         if(iFrameworks[i])
       
   312             {
       
   313             const TDesC8& frameworkId = iFrameworks[i]->Id();
       
   314 
       
   315             if(frameworkId == aFrameworkId)
       
   316                 {
       
   317                 pFramework = iFrameworks[i];
       
   318                 break;
       
   319                 }
       
   320             }
       
   321         }
       
   322     if(pFramework)  TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"  framework found:");//LOG_WRITE_L("  framework found:");
       
   323     else TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"  could not find:");        //   LOG_WRITE_L("  could not find:");
       
   324     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aFrameworkId));
       
   325 
       
   326     return pFramework;
       
   327     }
       
   328 
       
   329 MSIF* CSenXMLDAO::DefaultFrameworkL(const TDesC8& aFrameworkID, 
       
   330                                     const TDesC8& aCue)
       
   331     {
       
   332     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::DefaultFramework()")));
       
   333 
       
   334     MSIF* pFramework = Framework(aFrameworkID);
       
   335 
       
   336     if(!pFramework)
       
   337         {
       
   338         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::DefaultFramework() is not installed:")));
       
   339         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aFrameworkID));
       
   340         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aCue));
       
   341 
       
   342         TRAPD(leaveCode, iManager.InstallFrameworkL(aCue));
       
   343         if(leaveCode==KErrNone)
       
   344             {
       
   345             pFramework = Framework(aFrameworkID);
       
   346             if(pFramework)
       
   347                 {
       
   348                 TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(_L("CSenXMLDAO::DefaultFramework() - now installed.")));
       
   349                 }
       
   350             }
       
   351 #ifdef _SENDEBUG
       
   352         else
       
   353             {
       
   354             // install framework failed!
       
   355             TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::DefaultFramework() - install failed:")));
       
   356             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"FATAL!");
       
   357             TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(aCue));
       
   358             }
       
   359 #endif //_SENDEBUG
       
   360         }
       
   361 #ifdef _SENDEBUG
       
   362     else
       
   363         {
       
   364         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(_L("CSenXMLDAO::DefaultFramework() - was already installed:")));
       
   365         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aFrameworkID));
       
   366         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aCue));
       
   367                    
       
   368         }
       
   369 #endif //_SENDEBUG
       
   370 
       
   371     return pFramework;
       
   372     }
       
   373 
       
   374 RFileLogger* CSenXMLDAO::Log() const
       
   375     {
       
   376     return iManager.Log();
       
   377     }
       
   378 
       
   379 TInt CSenXMLDAO::SizeOfSessionsXmlInBytesL()
       
   380     {
       
   381     TInt size(0);
       
   382 
       
   383     TInt count = iSessions.Count();
       
   384     CBufFlat* pBuf = NULL;
       
   385     for(TInt i = 0; i < count; i++)
       
   386         {
       
   387         pBuf = CBufFlat::NewL(KFlatBufSize);
       
   388         CleanupStack::PushL(pBuf);
       
   389         RBufWriteStream bufWs(*pBuf);
       
   390         CleanupClosePushL(bufWs);
       
   391 #ifdef _SENDEBUG
       
   392         TPtrC8 e = iSessions[i]->Endpoint();
       
   393         TPtrC8 c = iSessions[i]->Contract();
       
   394         TPtrC8 fid = iSessions[i]->FrameworkId();
       
   395         TInt leaveCode(KErrNone);
       
   396         TRAP( leaveCode, iSessions[i]->WriteAsXMLToL(bufWs); )
       
   397         if( leaveCode )
       
   398             {
       
   399             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("FATAL: CSenXMLDAO::SizeOfSessionsXmlInBytesL leaved:   %d"), leaveCode));
       
   400             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("     : endpoint: '%S', contract: '%S', frameworkID: '%S'"), &e, &c, &fid));
       
   401             
       
   402             }
       
   403         User::LeaveIfError(leaveCode);
       
   404         
       
   405 #else // release builds
       
   406         iSessions[i]->WriteAsXMLToL(bufWs);
       
   407 #endif // _SENDEBUG        
       
   408         TPtr8 p8 = pBuf->Ptr(0);
       
   409         size += p8.Length();
       
   410         CleanupStack::PopAndDestroy(2); // bufWs (close), pBuf
       
   411         pBuf = NULL;
       
   412         }
       
   413     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::SizeOfSessionsXmlInBytesL:   %d"), size));
       
   414 
       
   415     return size;
       
   416     }
       
   417 
       
   418 TInt CSenXMLDAO::SizeOfFrameworksXmlInBytesL()
       
   419     {
       
   420     TInt size(0);
       
   421 
       
   422     HBufC8* pTemp = NULL;
       
   423 
       
   424     TInt frameworks = iFrameworks.Count();
       
   425 
       
   426     for (TInt j = 0; j < frameworks; j++)
       
   427         {
       
   428         pTemp = iFrameworks[j]->AsXmlL();
       
   429         if(pTemp)
       
   430             {
       
   431             CleanupStack::PushL(pTemp);
       
   432             size += pTemp->Length();
       
   433             
       
   434             CleanupStack::PopAndDestroy(); // pTemp
       
   435             pTemp = NULL;
       
   436             }
       
   437         }
       
   438     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::SizeOfFrameworksXmlInBytesL: %d"), size));
       
   439     return size;
       
   440     }
       
   441 
       
   442 
       
   443 void CSenXMLDAO::WriteL()
       
   444     {
       
   445     if (iReadingConfig != ESenIdle)
       
   446         {
       
   447         iReadingConfig = ESenSaveNeeded;
       
   448         return;
       
   449         }
       
   450     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::WriteL()")));
       
   451 
       
   452 
       
   453     CBufFlat *pBuf = CBufFlat::NewL(KFlatBufSize);
       
   454     CleanupStack::PushL(pBuf);
       
   455     RBufWriteStream bufWs(*pBuf);
       
   456     CleanupClosePushL(bufWs);
       
   457 
       
   458 
       
   459     if ( !iProxyHost )
       
   460         {
       
   461         bufWs.WriteL(KStartTag);
       
   462         }
       
   463     else
       
   464         {
       
   465         bufWs.WriteL( KStartTagEndless );
       
   466 
       
   467         bufWs.WriteL( KEmptySpace );
       
   468         bufWs.WriteL( KProxyHost );
       
   469         bufWs.WriteL( KEqual );
       
   470         bufWs.WriteL( KQuote );
       
   471 
       
   472         bufWs.WriteL(*iProxyHost);
       
   473         bufWs.WriteL( KQuote );
       
   474 
       
   475         bufWs.WriteL( KEmptySpace );
       
   476         bufWs.WriteL( KProxyPort );
       
   477         bufWs.WriteL( KEqual );
       
   478         bufWs.WriteL( KQuote );
       
   479 
       
   480         HBufC8* pPort = HBufC8::NewLC(5);
       
   481         TPtr8 pPtrPort = pPort->Des();
       
   482         pPtrPort.AppendNum( iProxyPort );
       
   483         bufWs.WriteL( *pPort );
       
   484 
       
   485         CleanupStack::PopAndDestroy( pPort );
       
   486 
       
   487         bufWs.WriteL( KQuote );
       
   488         bufWs.WriteL( KCloseTag );
       
   489 
       
   490         }
       
   491 
       
   492     // Now ensure that we have enough disk space for
       
   493     // new configuration file!
       
   494 
       
   495     TInt configFileSize(0);
       
   496 
       
   497     TPtr8 p8 = pBuf->Ptr(0);
       
   498 
       
   499     // calculate and add required space for sessions as XML (in bytes)
       
   500     configFileSize += SizeOfSessionsXmlInBytesL(); 
       
   501 
       
   502     // calculate and add required space for frameworks as XML (in bytes)
       
   503     configFileSize += SizeOfFrameworksXmlInBytesL(); 
       
   504 
       
   505     // add size of root element start tag (in bytes)
       
   506     configFileSize += p8.Length();
       
   507     // add size of root element close tag (in bytes)
       
   508     configFileSize += KEndTag().Length();
       
   509     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::WriteL() - Base config size: %d bytes"), p8.Length()));
       
   510 
       
   511     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::WriteL() - Config file size: %d bytes"),  configFileSize));
       
   512 
       
   513 
       
   514     // Now use SysUtils to ensure that we have room for temp file(!)
       
   515     RFs fss;
       
   516     User::LeaveIfError(fss.Connect());
       
   517     CleanupClosePushL(fss);
       
   518 
       
   519     // Create and open write stream to temp file
       
   520     TFileName tempFile(KSenXMLDAOTempFile);
       
   521 
       
   522     // this will create the file or replace and zero-length any existing file
       
   523     // and might free some space, if write failed last time..
       
   524     RFileWriteStream tempFileWriteStream;
       
   525     CleanupClosePushL(tempFileWriteStream);
       
   526     tempFileWriteStream.Replace(fss, tempFile, EFileWrite);
       
   527 
       
   528     
       
   529     TInt retVal(SysUtil::FFSSpaceBelowCriticalLevelL(&fss, configFileSize));
       
   530     if(retVal == KErrNone)
       
   531         {
       
   532         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, "File system check: OK, there is enough space available.");
       
   533         }
       
   534     else
       
   535         {
       
   536         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"File system check: FAILED, NOT enough space available.");
       
   537         // release the root configuration XML buffer:
       
   538         // tempFileWriteStream.Close(), fss.Close(), bufWs.Close(), delete pBuf
       
   539         CleanupStack::PopAndDestroy(4); 
       
   540         User::Leave(retVal);
       
   541         }
       
   542 
       
   543 
       
   544     HBufC8* pTemp = NULL;
       
   545 
       
   546     // Write root level configuration XML into temp file
       
   547     tempFileWriteStream.WriteL(p8);
       
   548 
       
   549     // Write frameworks directly into temp file
       
   550     TInt frameworks = iFrameworks.Count();
       
   551     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8(" - Framework count: (%d)"),  frameworks));
       
   552 
       
   553     for (TInt j = 0; j < frameworks; j++)
       
   554         {
       
   555         pTemp = iFrameworks[j]->AsXmlL();
       
   556         if(pTemp)
       
   557             {
       
   558             CleanupStack::PushL(pTemp);
       
   559             TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(*pTemp));
       
   560             tempFileWriteStream.WriteL(*pTemp);
       
   561             CleanupStack::PopAndDestroy(); // pTemp
       
   562             pTemp = NULL;
       
   563             }
       
   564         }
       
   565 
       
   566     // Write sessions directly into temp file
       
   567     TInt count = iSessions.Count();
       
   568     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8(" - Description/Session count: (%d)"), count));
       
   569     for(TInt i = 0; i < count; i++)
       
   570         {
       
   571         iSessions[i]->WriteAsXMLToL(tempFileWriteStream);
       
   572         }
       
   573 
       
   574     // Write root level configuration element's end tag into temp file
       
   575     tempFileWriteStream.WriteL(KEndTag);
       
   576 
       
   577     // close the temp file write stream:
       
   578     CleanupStack::PopAndDestroy(); // tempFileWriteStream.Close()
       
   579 
       
   580     // create file manager to replace original database file
       
   581     CFileMan* pFileMan = CFileMan::NewL(fss);
       
   582     CleanupStack::PushL(pFileMan);
       
   583 
       
   584     // Now copy temp file over the real database. EOverWrite is default
       
   585     User::LeaveIfError(pFileMan->Move(KSenXMLDAOTempFile, KSenXMLDAOFile));
       
   586 
       
   587     // destroy file manager instance and close the fss
       
   588     CleanupStack::PopAndDestroy(2); // delete pFileMan, fss.Close()
       
   589 
       
   590     // release the root configuration XML buffer
       
   591     CleanupStack::PopAndDestroy(2); // bufWs.Close(), delete pBuf
       
   592     }
       
   593 
       
   594 
       
   595     /*
       
   596     Snippet from deprecated WriteL() version:
       
   597 
       
   598     TPtr8 p8 = pBuf->Ptr(0);
       
   599 
       
   600     HBufC8* pFileContentAsUtf8 = p8.AllocL();
       
   601 
       
   602     CleanupStack::PushL(pFileContentAsUtf8);
       
   603 
       
   604     // Everything in MEMORY ok, prepare to write into file
       
   605 
       
   606 
       
   607     RFileWriteStream fileOutStream;
       
   608     CleanupClosePushL(fileOutStream);
       
   609 
       
   610 
       
   611     if(!SysUtil::FFSSpaceBelowCriticalLevelL(&fss,
       
   612                             pFileContentAsUtf8->Length()) )
       
   613         {
       
   614         // note, this will zero-length the file(!) 
       
   615         fileOutStream.Replace(fss, iFileName, EFileWrite);
       
   616 
       
   617         // finally write the UTF-8 into the file.
       
   618         fileOutStream.WriteL(*pFileContentAsUtf8);
       
   619         }
       
   620     // else { User::Leave("KFSSpaceBelowCriticalLevel"); }
       
   621 
       
   622     */
       
   623 void CSenXMLDAO::ReadL()
       
   624     {
       
   625     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::ReadL()")));
       
   626 
       
   627     NotifyFrameworksL(KNullDesC8, KSenEventSessionsDbReadBegin, NULL);
       
   628 
       
   629 
       
   630     RFs fss;
       
   631         User::LeaveIfError(fss.Connect());
       
   632         CleanupClosePushL(fss);
       
   633 
       
   634     iReadingConfig = ESenReading;
       
   635 
       
   636     XMLReader()->SetContentHandler(*this);
       
   637     TInt leaveCode(KErrNone);
       
   638     TRAP(leaveCode, XMLReader()->ParseL(fss, iFileName));
       
   639     iReadingConfig = ESenIdle;
       
   640 
       
   641     CleanupStack::PopAndDestroy(1); // fss
       
   642     NotifyFrameworksL(KNullDesC8, KSenEventSessionsDbReadComplete, NULL);
       
   643     leaveCode = 0; // not used currently
       
   644     }
       
   645 
       
   646 TInt CSenXMLDAO::Add(CSenWSDescription& aSD)
       
   647     {
       
   648     // Try to take ownership:
       
   649     TInt retVal(iSessions.Append(&aSD));
       
   650     if(retVal==KErrNone)
       
   651         {
       
   652         // Must be set so that it can be saved as XML fragment which 
       
   653         // has an owner. This prevents empty namespace to be written.
       
   654         aSD.SetOwner(*(MSenFragment*)this);
       
   655     TInt retValSave = Save();
       
   656     TInt notifyLeaveCode(KErrNone);
       
   657     TRAP(notifyLeaveCode, NotifyFrameworksL(KNullDesC8,
       
   658     		KSenEventRegisterNewServiceDescription, NULL));
       
   659         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::Add(SD), Save() returned: %d"), retValSave));
       
   660         retValSave = 0; // not in use in release builds
       
   661         }
       
   662     return retVal;
       
   663     }
       
   664 
       
   665 // return an error code (Append might leave!)
       
   666 TInt CSenXMLDAO::Add(CSIF& aFramework)
       
   667     {
       
   668     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::Add(SIF)");
       
   669     TBool alreadyExists(EFalse);
       
   670     TInt sifCount = iFrameworks.Count();
       
   671     for (TInt i=0; i<sifCount; i++)
       
   672         {
       
   673         if (iFrameworks[i]->Id() == aFramework.Id())
       
   674             {
       
   675             alreadyExists = ETrue;
       
   676             break;
       
   677             }
       
   678         }
       
   679     TInt retCode(KErrNone);
       
   680     if (!alreadyExists)
       
   681         {
       
   682         retCode = iFrameworks.Append(&aFramework);
       
   683         if(retCode==KErrNone)
       
   684             {
       
   685             TInt saveRetVal = Save();
       
   686             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::Add(SIF), Save() returned: %d"), saveRetVal));
       
   687             saveRetVal = 0; // not used in release builds
       
   688             }
       
   689         }
       
   690     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::Add(CSIF&) - complete.");
       
   691     return retCode;
       
   692     }
       
   693 
       
   694 TBool CSenXMLDAO::Remove(CSenWSDescription& aSD)
       
   695     {
       
   696     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::Remove(SD)")));
       
   697     TInt index(KErrNotFound);
       
   698     TInt count(iSessions.Count());
       
   699 
       
   700     // Due architectural change
       
   701     // REMOVE COMMENTED 3.0 CODE BELOW in 5.0:
       
   702     //TPtrC8 contract = aSD.Contract();
       
   703     //TPtrC8 endpoint = aSD.Endpoint();
       
   704 
       
   705     //if(contract.Length()>0)
       
   706     //    {
       
   707 
       
   708     TInt leaveCode(KErrNone);
       
   709     for(TInt i=0; i<count; i++)
       
   710         {
       
   711         // Due architectural change
       
   712         // REMOVE COMMENTED 3.0 CODE BELOW in 5.0:
       
   713         //TPtrC8 sessContract = iSessions[i]->Contract();
       
   714         //TPtrC8 sessEndpoint = iSessions[i]->Endpoint();
       
   715 
       
   716         //if ( sessContract == contract && sessEndpoint == endpoint )
       
   717         CSenWSDescription* pSD = iSessions[i];
       
   718         TBool equals(EFalse);
       
   719         TRAP(leaveCode, equals = pSD->HasEqualPrimaryKeysL(aSD));
       
   720 #ifdef _SENDEBUG
       
   721         if(leaveCode!=KErrNone)
       
   722             {
       
   723             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Remove - HasEqualPrimaryKeysL leaved: %d"), leaveCode));
       
   724             }
       
   725 #endif
       
   726         if(leaveCode==KErrNone && equals)
       
   727             {
       
   728                 index = i;
       
   729                 break;
       
   730             }
       
   731         leaveCode = KErrNone;
       
   732         }
       
   733     //    }
       
   734 
       
   735     if(index != KErrNotFound)
       
   736         {
       
   737 
       
   738 #ifdef _SENDEBUG
       
   739         TRAP_IGNORE
       
   740             (
       
   741         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"Removing service description from DAO: ");
       
   742             CBufFlat *pBuf = CBufFlat::NewL(KFlatBufSize);
       
   743             CleanupStack::PushL(pBuf);
       
   744             RBufWriteStream bufWs(*pBuf);
       
   745             CleanupClosePushL(bufWs);
       
   746             iSessions[index]->WriteAsXMLToL(bufWs);
       
   747         TLSLOG_ALL(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(pBuf->Ptr(0)));
       
   748             CleanupStack::PopAndDestroy(2); // bufWs, pBuf
       
   749             )
       
   750 #endif // _SENDEBUG
       
   751 
       
   752         delete iSessions[index];
       
   753         iSessions.Remove(index);
       
   754         TInt saveRetVal = Save();
       
   755         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::Remove(SD), Save() returned: %d"), saveRetVal));
       
   756         saveRetVal = 0; // not used in release builds
       
   757         return ETrue;
       
   758         }
       
   759 #ifdef _SENDEBUG
       
   760     else
       
   761         {
       
   762         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::Remove(SD): description not found.");
       
   763         }
       
   764 #endif
       
   765     return EFalse;
       
   766     }
       
   767 
       
   768 
       
   769 void CSenXMLDAO::Remove(CSIF& aFramework)
       
   770     {
       
   771     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::Remove(SIF)")));
       
   772     TInt index(-1);
       
   773     TInt count(iFrameworks.Count());
       
   774     for(TInt i=0; i<count; i++)
       
   775         {
       
   776         if((iFrameworks[i])->Id() == aFramework.Id())
       
   777             {
       
   778             index = i;
       
   779             break;
       
   780             }
       
   781         }
       
   782 
       
   783     if(index != KErrNotFound)
       
   784         {
       
   785         delete iFrameworks[index];
       
   786         iFrameworks.Remove(index);
       
   787         TInt retValSave = Save();
       
   788         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::Remove(SIF), Save() returned: %d"), retValSave));
       
   789         retValSave = 0; // not in use in release builds
       
   790         }
       
   791 #ifdef _SENDEBUG
       
   792     else
       
   793         {
       
   794         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::Remove(SIF): plugin not found.");
       
   795         }
       
   796 #endif
       
   797     }
       
   798 
       
   799 
       
   800 
       
   801 void CSenXMLDAO::StartElementL(const TDesC8& /* aNsURI */,
       
   802                               const TDesC8& aLocalName,
       
   803                               const TDesC8& /* aQName */,
       
   804                               const RAttributeArray& aAttributes)
       
   805     {
       
   806     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("Entering CSenXMLDAO::StartElementL")));
       
   807     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aLocalName));
       
   808     //LOG_WRITEFORMAT((_L8("Namespace: %S"), &aNsURI));
       
   809 
       
   810     if(aLocalName == KServiceDescription)
       
   811         {
       
   812         TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("Found a ServiceDescription")));
       
   813 
       
   814         // Default framework is checked after all the frameworks have been
       
   815         // parsed in the MIDDLE of PARSING, to PREVENT orphanizing the SD(s),
       
   816         // if no ID-WSF plugin was found; for example because ECOM cue
       
   817         // (default_data) was wrong. MOVED the installation of default
       
   818         // frameworks to be in here instead of LoadL()
       
   819 
       
   820         // NOTE: expect, that when first SD is encountered, all of
       
   821         // the frameworks have been parsed and installed properly
       
   822         // if such (plugins) exist.
       
   823 
       
   824         // No need to store the SIF* anywhere, just doing this to ensure the
       
   825         // installation of the ID-WSF framework
       
   826         if(!iDefaultFrameworkCheckedToExist)
       
   827             {
       
   828             // do only once per read configuration
       
   829 
       
   830             TInt retCode = CheckDefaultFrameworks();
       
   831             iDefaultFrameworkCheckedToExist=ETrue;
       
   832             retCode = 0; // not used currently
       
   833             }
       
   834 
       
   835         // Alike frameworks, default transport (scheme-to-cue) mapping
       
   836         // is ensured when first service description is recognized.
       
   837         // The list for scheme-cue mappings is expected to be found
       
   838         // before service descriptions (in the beginning of sensessions.xml)
       
   839         if(!iDefaultTransportMapChecked)
       
   840             {
       
   841             TInt retCode = CheckDefaultTransports();
       
   842             iDefaultTransportMapChecked=ETrue;
       
   843             retCode=0; // not used currently
       
   844             }
       
   845 
       
   846 
       
   847         // check, if for some reason the iServiceDescription
       
   848         // was NOT added to iSessions. If so, delete the
       
   849         // orphan SD
       
   850         if(iServiceDescription)
       
   851             {
       
   852             TInt index = iSessions.Find(iServiceDescription);
       
   853             if(index==KErrNotFound)
       
   854                 {
       
   855                 // would otherwise NOT be taken care by:
       
   856                 //             iSessions.ResetAndDestroy()
       
   857                 delete iServiceDescription;
       
   858                 }
       
   859             iServiceDescription=NULL;
       
   860             }
       
   861         
       
   862         
       
   863         iServiceDescription = CSenWSDescription::NewL(
       
   864                             AsElement().NamespaceURI() );
       
   865         iServiceDescription->SetAttributesL(aAttributes);
       
   866         iServiceDescription->SetReader(*Reader());
       
   867 
       
   868 #ifdef _SENDEBUG
       
   869         TPtrC8 frameworkID = iServiceDescription->FrameworkId();
       
   870         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::StartElementL");
       
   871         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8(" - %S service description now parsed by delegate."), &frameworkID));
       
   872 #endif
       
   873 
       
   874         iState = KStateParsingServiceDescription;
       
   875 
       
   876         DelegateParsingL(*iServiceDescription);
       
   877         }
       
   878     else if(aLocalName == KFramework)
       
   879         {
       
   880         iFrameworkConfigParser = NULL;
       
   881         // we can take the framework id from attribute list,
       
   882         // no need to wait for end element...
       
   883         TPtrC8 fwId = SenXmlUtils::AttrValue(aAttributes, KClass);
       
   884         iFrameworkConfigParser = iManager.InstallFrameworkL(fwId);
       
   885         if(iFrameworkConfigParser)
       
   886             {
       
   887             iFrameworkConfigParser->SetOwner((MSenFragment&)*this);
       
   888             iFrameworkConfigParser->SetAttributesL(aAttributes);
       
   889             iFrameworkConfigParser->SetReader(*Reader());
       
   890 
       
   891             iState = KStateParsingFramework;
       
   892 
       
   893             DelegateParsingL(*iFrameworkConfigParser);
       
   894             }
       
   895         // Expect, that frameworks are first in the XML. Set boolean
       
   896         // "check-done" flag to EFalse, so that check will be issued
       
   897         // when first SD is encountered.
       
   898         iDefaultFrameworkCheckedToExist=EFalse;
       
   899         }
       
   900     else if (aLocalName == KLocalName)  // SenConfiguration starting tag
       
   901         {
       
   902         // check if HTTP proxy HOST -param was set:
       
   903         TPtrC8 host = SenXmlUtils::AttrValue(aAttributes, KProxyHost);
       
   904         if ( host.Length() > 0 &&  host != KSpace)
       
   905             {
       
   906             delete iProxyHost;
       
   907             iProxyHost = NULL; 
       
   908             iProxyHost = host.AllocL();
       
   909             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("HTTP proxy HOST read: '%S'"), iProxyHost));
       
   910             }
       
   911 
       
   912         // check if HTTP proxy PORT -param was set:
       
   913         TPtrC8 port = SenXmlUtils::AttrValue(aAttributes, KProxyPort);
       
   914         if (port.Length() > 0 && port != KSpace)
       
   915             {
       
   916             TLex8 lex;
       
   917             lex.Assign(port);
       
   918             lex.Val( iProxyPort );
       
   919             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("HTTP proxy PORT read: '%d'"), iProxyPort));
       
   920             }
       
   921         }
       
   922         /*
       
   923     else if ( aLocalName == KTransport && aNsURI == KNamespaceName )  // Transport starting tag
       
   924         {
       
   925         if ( ipTransportDelegate )
       
   926             {
       
   927             ipTransportDelegate->ExtractElement();
       
   928             delete ipTransportDelegate;
       
   929             ipTransportDelegate = NULL;
       
   930             }
       
   931         ipTransportDelegate = CSenDomFragment::NewL(KTransport);
       
   932         CSenElement& element = ipTransportDelegate->AsElement();
       
   933         this->AsElement().AddElementL(element);        
       
   934         iState = KStateParsingTransport;
       
   935         DelegateParsingL(*ipTransportDelegate); 
       
   936         }
       
   937         */
       
   938     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("Leaving CSenXMLDAO::StartElementL")));
       
   939 
       
   940     }
       
   941 
       
   942 void CSenXMLDAO::EndElementL(const TDesC8& aUri,
       
   943                              const TDesC8& aLocalName,
       
   944                              const TDesC8& aName)
       
   945     {
       
   946     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::EndElementL()")));
       
   947     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Namespace URI: %S"), &aUri));
       
   948     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Local name URI: %S"), &aLocalName));
       
   949 
       
   950 
       
   951     switch(iState)
       
   952         {
       
   953         case KStateParsingServiceDescription:
       
   954             {
       
   955             TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::EndElementL() - EParsingServiceDescription")));
       
   956             if(aLocalName == KServiceDescription)
       
   957                 {
       
   958 #ifdef _SENDEBUG
       
   959                 HBufC8* pAsXmlUtf8 = iServiceDescription->AsXmlL();
       
   960                 if(pAsXmlUtf8)
       
   961                     {
       
   962                     CleanupStack::PushL(pAsXmlUtf8);
       
   963                     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("SD as XML:")));
       
   964                     TLSLOG_ALL(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(*pAsXmlUtf8));
       
   965                     CleanupStack::PopAndDestroy(1); // pAsXmlUtf8
       
   966                     }
       
   967 #endif
       
   968 
       
   969                 // transfer ownership
       
   970                 iManager.RegisterServiceDescriptionL(iServiceDescription);
       
   971                 iServiceDescription = NULL; // now owned elsewhere
       
   972                 }
       
   973             break;
       
   974             }
       
   975         case KStateParsingFramework:
       
   976             {
       
   977             if (aLocalName == KFramework)
       
   978                 {
       
   979                 iState = KStateIgnore;
       
   980                 }
       
   981             break;
       
   982             }
       
   983         case KStateParsingTransport:
       
   984             {
       
   985             if ( aLocalName == KTransport && aUri == KNamespaceName ) 
       
   986                 {
       
   987                  // Transport ending tag
       
   988                 iState = KStateIgnore;
       
   989                 }
       
   990             break;
       
   991             }
       
   992         default:
       
   993             {
       
   994             CSenBaseFragment::EndElementL(aUri,aLocalName,aName);
       
   995             break;
       
   996             }
       
   997         }
       
   998     }
       
   999 
       
  1000 
       
  1001 TBool CSenXMLDAO::Owns(CSenWSDescription* aSD)
       
  1002     {
       
  1003     TInt count(iSessions.Count());
       
  1004     for(TInt i=0; i<count; i++)
       
  1005         {
       
  1006         if(iSessions[i]==aSD)
       
  1007             {
       
  1008             return ETrue;
       
  1009             }
       
  1010         }
       
  1011     return EFalse;
       
  1012     }
       
  1013 
       
  1014 TInt CSenXMLDAO::ProxyPort()
       
  1015     {
       
  1016     return iProxyPort;
       
  1017     }
       
  1018 
       
  1019 const TDesC8& CSenXMLDAO::ProxyHost()
       
  1020     {
       
  1021     if ( iProxyHost )
       
  1022         {
       
  1023         return *iProxyHost;
       
  1024         }
       
  1025     else
       
  1026         {
       
  1027         return KNullDesC8;
       
  1028         }
       
  1029     }
       
  1030 CSenWSDescription* CSenXMLDAO::FindExactServiceDescriptionL(
       
  1031                                                 CSenWSDescription& aSd)
       
  1032     {
       
  1033     TInt sessCount = iSessions.Count();
       
  1034     for (TInt i=0; i<sessCount; i++)
       
  1035         {
       
  1036         CSenWSDescription* pCandidate = iSessions[i];
       
  1037 
       
  1038         // The concrete session implementation of framework "X" decides
       
  1039         // what are the primary keys (unique) in a service description
       
  1040         if(pCandidate && pCandidate->HasEqualPrimaryKeysL(aSd))
       
  1041             {
       
  1042             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindExactServiceDescriptionL:");
       
  1043             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel," - exact match found.");
       
  1044             return pCandidate;
       
  1045             }
       
  1046 
       
  1047         // It is better to let framework sessions classes to define the
       
  1048         // "primary keys" of this comparison(!). That is more extensible.
       
  1049         // SO: REMOVE BELOW COMMENTED CODE in 5.0:
       
  1050         //if(pCandidate)
       
  1051         //    {
       
  1052         //    if (pCandidate->Endpoint() == aSd.Endpoint() &&
       
  1053         //            pCandidate->Contract() == aSd.Contract() )
       
  1054         //        {
       
  1055         //
       
  1056         //
       
  1057         //        LOG_WRITE_L("CSenXMLDAO::FindExactServiceDescriptionL:");
       
  1058         //        LOG_WRITE_L(" - exact match found.");
       
  1059         //        return pCandidate;
       
  1060         //        }
       
  1061         //    }
       
  1062 
       
  1063         }
       
  1064     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindMatchingServiceDescription: no match found.");
       
  1065     return NULL;
       
  1066     }
       
  1067 
       
  1068 CSenWSDescription* CSenXMLDAO::FindMatchingServiceDescriptionL(
       
  1069                                                 CSenWSDescription& aSd)
       
  1070     {
       
  1071     TInt sessCount = iSessions.Count();
       
  1072     for (TInt i=0; i<sessCount; i++)
       
  1073         {
       
  1074         CSenWSDescription* pCandidate = iSessions[i];
       
  1075         if(pCandidate)
       
  1076             {
       
  1077             if(pCandidate->Matches(aSd))
       
  1078                 {
       
  1079                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindMatchingServiceDescription:");
       
  1080                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel," - matching SD found.");
       
  1081                 return pCandidate;
       
  1082                 }
       
  1083             }
       
  1084         }
       
  1085     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindMatchingServiceDescription: no match found.");
       
  1086     return NULL;
       
  1087     }
       
  1088     
       
  1089 CSenWSDescription* CSenXMLDAO::FindMatchingSDAndBestScoreL(
       
  1090                                             CSenWSDescription& aSd,
       
  1091                                             TInt &aBestScore)	//CodeScannerWarnings
       
  1092     {
       
  1093     CSenWSDescription* pMatchingSD = NULL;
       
  1094     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"***************************************************************");
       
  1095     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::FindMatchingSDAndBestScore");
       
  1096     TPtrC8 sdendpoint = aSd.Endpoint();
       
  1097     TPtrC8 sdcontract = aSd.Contract();
       
  1098     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Endpoint URI: %S"), &sdendpoint ));
       
  1099     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Contract: %S"), &sdcontract ));
       
  1100     
       
  1101     TInt score( 0 );
       
  1102     // Make sure that at least endpoint or contract should match
       
  1103     aBestScore = 1;
       
  1104     TInt sessCount = iSessions.Count();
       
  1105     for (TInt i=0; i<sessCount; i++)
       
  1106         {
       
  1107         CSenWSDescription* pCandidate = iSessions[i];
       
  1108         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"----------------------------------------------");
       
  1109         TPtrC8 endpoint = pCandidate->Endpoint();
       
  1110         TPtrC8 contract = pCandidate->Contract();
       
  1111         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Endpoint URI: %S"), &endpoint ));
       
  1112         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Contract: %S"), &contract ));
       
  1113         if(pCandidate)
       
  1114             {
       
  1115 			score = pCandidate->ScoreMatchL(aSd);
       
  1116 			if (score > aBestScore) 
       
  1117 			    {
       
  1118 			    if ( pCandidate->Matches(aSd) )
       
  1119 			        {
       
  1120 			        TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"-> Selected");
       
  1121     				TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("[score: %d]"), score ));
       
  1122 			        pMatchingSD = pCandidate;
       
  1123 			        }
       
  1124     			aBestScore = score;
       
  1125 			    }
       
  1126 
       
  1127             if ( !pMatchingSD && pCandidate->Matches(aSd) )
       
  1128                 {
       
  1129                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"-> Selected");
       
  1130                 pMatchingSD = pCandidate;
       
  1131                 }
       
  1132             }
       
  1133         }
       
  1134         
       
  1135 #ifdef _SENDEBUG
       
  1136     if ( !pMatchingSD )
       
  1137         {
       
  1138         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::FindMatchingSDAndBestScore: no match found.");
       
  1139         }
       
  1140 #endif
       
  1141     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Best score: %d"), aBestScore ));
       
  1142     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"***************************************************************");
       
  1143     
       
  1144     return pMatchingSD;
       
  1145     }
       
  1146 
       
  1147 CSenWSDescription* CSenXMLDAO::FindScoreMatchingServiceDescriptionL(
       
  1148                                             CSenWSDescription& aSd,
       
  1149                                             TInt aBestScore)
       
  1150     {
       
  1151 	/* We should now try the primary search again.
       
  1152 	 * Note that we try to pick a service that matches 
       
  1153 	 * at least as good as the given aBestScore
       
  1154 	 * but at least the contract or endpoint should
       
  1155 	 * match.
       
  1156 	 */ 
       
  1157 	TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
       
  1158     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::FindScoreMatchingServiceDescription");
       
  1159     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Best score: %d"), aBestScore ));
       
  1160     TPtrC8 sdendpoint = aSd.Endpoint();
       
  1161     TPtrC8 sdcontract = aSd.Contract();
       
  1162     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Endpoint URI: %S"), &sdendpoint ));
       
  1163     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Contract: %S"), &sdcontract ));
       
  1164 	 
       
  1165 	TInt score( 0 );
       
  1166 	// Make sure that at least endpoint or contract should match
       
  1167 	if (aBestScore < 1) aBestScore = 1; 
       
  1168 	
       
  1169     TInt sessCount = iSessions.Count();
       
  1170     for (TInt i=sessCount-1 ; i>=0 ; i--)
       
  1171         {
       
  1172         CSenWSDescription* pCandidate = iSessions[i];
       
  1173         if(pCandidate)
       
  1174             {
       
  1175             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"----------------------------------------------");
       
  1176             TPtrC8 endpoint = pCandidate->Endpoint();
       
  1177             TPtrC8 contract = pCandidate->Contract();
       
  1178             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Endpoint URI: %S"), &endpoint ));
       
  1179             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("Contract: %S"), &contract ));
       
  1180 			score = pCandidate->ScoreMatchL(aSd);
       
  1181 			TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("score: %d"), score ));
       
  1182 			if (score >= aBestScore)
       
  1183                 {
       
  1184                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::FindScoreMatchingServiceDescription:");
       
  1185                 TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8(" - Scorematching SD found. Score : %d"),
       
  1186                                 score));
       
  1187                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
       
  1188                 return pCandidate;
       
  1189                 }
       
  1190             }
       
  1191         }
       
  1192     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::FindScoreMatchingServiceDescription: no scorematch found.");
       
  1193     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
       
  1194     
       
  1195     return NULL;
       
  1196     }
       
  1197 
       
  1198 TInt CSenXMLDAO::FindAllMatchingServiceDescriptions(RWSDescriptionArray& aMatches,
       
  1199                                                     const TDesC8& aContract)
       
  1200     {
       
  1201     TInt retVal(KErrNone);
       
  1202     TInt sessCount(iSessions.Count());
       
  1203 
       
  1204     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindAllMatchingServiceDescriptions(contract)");
       
  1205 
       
  1206     for(TInt i=0; i<sessCount; i++)
       
  1207         {
       
  1208         TPtrC8 sessContract = iSessions[i]->Contract();
       
  1209 
       
  1210         if ( sessContract.Length()>0 && aContract == sessContract
       
  1211             ||
       
  1212             aContract == KNullDesC8 // if no contract given, all match
       
  1213             )
       
  1214             {
       
  1215             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel," - match found, appending to array.");
       
  1216             TInt appendRetVal(aMatches.Append(iSessions[i]));
       
  1217             if(appendRetVal!=KErrNone)
       
  1218                 {
       
  1219                 retVal = appendRetVal; // note: last error is retuned
       
  1220                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel," - FATAL: due OOM Append(SD) failed!");
       
  1221                 TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8(" - error code: %d"), appendRetVal));
       
  1222 
       
  1223                 // Attempt to append other hits/matching SDs
       
  1224                 }
       
  1225             }
       
  1226         }
       
  1227     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8(" - total of %d matches found."), 
       
  1228                         aMatches.Count()));
       
  1229 
       
  1230     return retVal; // last error from Append() is returned atm
       
  1231     }
       
  1232 
       
  1233 TInt CSenXMLDAO::FindAllMatchingServiceDescriptions(RWSDescriptionArray& aMatches,
       
  1234                                                     MSenServiceDescription& aPattern)
       
  1235     {
       
  1236     TInt sessCount(iSessions.Count());
       
  1237     TInt retVal(KErrNone);
       
  1238     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::FindAllMatchingServiceDescriptions(pattern)");
       
  1239     for (TInt i=0; i<sessCount; i++)
       
  1240         {
       
  1241         if (iSessions[i]->Matches(aPattern))
       
  1242             {
       
  1243             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel," -> matching service description found");
       
  1244 
       
  1245             TInt appendRetVal(aMatches.Append(iSessions[i]));
       
  1246             if(appendRetVal!=KErrNone)
       
  1247                 {
       
  1248                 retVal = appendRetVal; // note: last error is retuned
       
  1249                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel," - FATAL: due OOM Append(SD) failed!");
       
  1250                 TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8(" - error code: %d"), appendRetVal));
       
  1251 
       
  1252                 // Attempt to append other hits/matching SDs
       
  1253                 }
       
  1254             }
       
  1255         }
       
  1256      TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8(" - total of %d matches found."), 
       
  1257                         aMatches.Count()));
       
  1258 
       
  1259     return retVal; // last error from Append() is returned atm
       
  1260     }
       
  1261 
       
  1262 
       
  1263 TInt CSenXMLDAO::AddServiceDescriptionToFrameworksL( CSenWSDescription& aPattern,
       
  1264                                                      MSenRemoteServiceConsumer& aRemoteConsumer,
       
  1265                                                      HBufC8*& aErrorMsg )
       
  1266     {
       
  1267     CSLOG_L(aRemoteConsumer.ConnectionId()  , KMinLogLevel,"CSenXMLDAO::AddServiceDescriptionToFrameworksL");
       
  1268 
       
  1269     TInt fwCount = iFrameworks.Count();
       
  1270     CSLOG_FORMAT((aRemoteConsumer.ConnectionId() , KNormalLogLevel, _L8("Adding SD to (%d) SIF plug-ins."), fwCount));
       
  1271     TInt retVal;
       
  1272     TInt error(KErrNone);
       
  1273     TInt sdCount(0);
       
  1274     TPtrC8 patternFwId = aPattern.FrameworkId();
       
  1275     HBufC8* pLastErrorMsg = NULL;
       
  1276     for (TInt i=0; i<fwCount; i++ )
       
  1277         {
       
  1278         // altered the SIF inteface to return the count or leave
       
  1279         // (no ref to int as argument)
       
  1280         retVal = iFrameworks[i]->AddServiceDescriptionL( aPattern, aRemoteConsumer, pLastErrorMsg);
       
  1281         if ( retVal > 0 )
       
  1282             {
       
  1283             sdCount += retVal;
       
  1284             }
       
  1285         
       
  1286         TPtrC8 frameworkID = iFrameworks[i]->Id();
       
  1287         
       
  1288         // Store the latest error, in case that no match has yet been found(!)
       
  1289         if ( (sdCount == 0) && 
       
  1290              (retVal < 0 || (pLastErrorMsg && pLastErrorMsg->Length() > 0) )
       
  1291            )
       
  1292             {
       
  1293             if( patternFwId.Length() == 0 || frameworkID == patternFwId )
       
  1294                 {
       
  1295                 // if pattern provides NO framework ID, or if it provides
       
  1296                 // mathing framework ID, then collect error message from
       
  1297                 // last SIF plugin in the array:
       
  1298                 if ( pLastErrorMsg )
       
  1299                     {
       
  1300                     delete aErrorMsg;
       
  1301                     aErrorMsg = pLastErrorMsg;
       
  1302                     pLastErrorMsg = NULL;
       
  1303                     }
       
  1304                 if ( retVal < 0 )
       
  1305                     {
       
  1306                     error = retVal;
       
  1307                     }
       
  1308                 }
       
  1309             }
       
  1310         CSLOG_L(aRemoteConsumer.ConnectionId()  , KNormalLogLevel,"CSenXMLDAO::AddServiceDescriptionToFrameworksL:");
       
  1311         CSLOG_FORMAT((aRemoteConsumer.ConnectionId()  , KNormalLogLevel, _L8("- After %S SIF, the add count is [%d]"), &frameworkID, sdCount));
       
  1312         }
       
  1313     
       
  1314     if ( pLastErrorMsg )
       
  1315         {
       
  1316         delete pLastErrorMsg;
       
  1317         }
       
  1318         
       
  1319     if ( sdCount > 0 )
       
  1320         {
       
  1321         retVal = sdCount;
       
  1322         delete aErrorMsg;
       
  1323         aErrorMsg = NULL;
       
  1324         }
       
  1325     else
       
  1326         {
       
  1327         retVal = error;
       
  1328         }
       
  1329         
       
  1330     return retVal;
       
  1331     }
       
  1332 
       
  1333 
       
  1334 TInt CSenXMLDAO::NotifyFrameworksL(const TDesC8& aFrameworkID,
       
  1335                                    const TInt aEvent,
       
  1336                                     TAny* aArgument)
       
  1337     {
       
  1338     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"CSenXMLDAO::NotifyFrameworksL");
       
  1339     TInt fwCount = iFrameworks.Count();
       
  1340     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("There are %d loaded SIF plug-in(s)."), fwCount));
       
  1341     TInt retVal(KErrNone);
       
  1342     for (TInt i=0; i<fwCount; i++ )
       
  1343         {
       
  1344         TPtrC8 fwID = iFrameworks[i]->Id();
       
  1345         if(aFrameworkID.Length()==0 || aFrameworkID == fwID)
       
  1346             {
       
  1347             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("+ Notified '%S' SIF. Event (%d)"),
       
  1348                             &fwID,
       
  1349                             aEvent));
       
  1350             
       
  1351             TInt pluginRetVal = iFrameworks[i]->OnEvent(aEvent, aArgument);
       
  1352             if(retVal==KErrNone && pluginRetVal!=KErrNone)
       
  1353                 {
       
  1354                 retVal = pluginRetVal;
       
  1355                 }
       
  1356             }   
       
  1357 #ifdef _SENDEBUG
       
  1358         else
       
  1359             {
       
  1360             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("-Not notifying '%S' SIF [framework ID does not match]"),
       
  1361                 &fwID));
       
  1362             }
       
  1363 #endif // _SENDEBUG
       
  1364         }
       
  1365     return retVal;
       
  1366     }
       
  1367 
       
  1368 
       
  1369 TInt CSenXMLDAO::SaveL(const CSenServiceSession& /* aServiceSession */ )
       
  1370     {
       
  1371     Save(); //This implementation does not save single objects (yet).
       
  1372     return KErrNone;
       
  1373     }
       
  1374 
       
  1375 TInt CSenXMLDAO::SaveL(const CSIF& /* aServiceInvocationFramework */)
       
  1376     {
       
  1377     Save(); //This implementation does not save single objects (yet).
       
  1378     return KErrNone;
       
  1379     }
       
  1380 
       
  1381 CDesC8Array& CSenXMLDAO::SupportedFrameworksL()
       
  1382     {
       
  1383     TInt fwCount(iFrameworks.Count());
       
  1384     CDesC8Array* retVal = new (ELeave) CDesC8ArraySeg(fwCount);
       
  1385     for (TInt i=0; i<fwCount; i++)
       
  1386         {
       
  1387         retVal->AppendL(*iFrameworks[i]->Id().AllocL());
       
  1388         }
       
  1389     TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::SupportedFrameworksL(): Count: (%d)"),
       
  1390                         retVal->Count()));
       
  1391     return *retVal;
       
  1392     }
       
  1393 
       
  1394 TInt CSenXMLDAO::ContainsServiceDescriptionL(TBool& aContains,
       
  1395                                              CSenWSDescription& aPattern)
       
  1396     {
       
  1397     aContains = EFalse;
       
  1398     TInt sessCount = iSessions.Count();
       
  1399     for (TInt i=0; i<sessCount && !aContains; i++)
       
  1400         {
       
  1401         CBufFlat *pBuf = CBufFlat::NewL(KFlatBufSize);
       
  1402         CleanupStack::PushL(pBuf);
       
  1403         RBufWriteStream bufWs(*pBuf);
       
  1404         CleanupClosePushL(bufWs);
       
  1405         iSessions[i]->WriteAsXMLToL(bufWs);
       
  1406         CSenWSDescription* pSd = CSenWSDescription::NewLC();
       
  1407         pSd->SetReader(*Reader());
       
  1408         pSd->ParseL(pBuf->Ptr(0));
       
  1409 
       
  1410         if (pSd->ConsistsOfL(aPattern))
       
  1411             {
       
  1412             TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,(_L("CSenXMLDAO::ContainsServiceDescriptionL(): matches given pattern:")));
       
  1413             aContains = ETrue;
       
  1414             }
       
  1415         CleanupStack::PopAndDestroy(3); // pSd, bufWs, pBuf
       
  1416         }
       
  1417     
       
  1418     return KErrNone;
       
  1419     }
       
  1420 
       
  1421 
       
  1422 TInt CSenXMLDAO::CheckDefaultFrameworks()
       
  1423     {
       
  1424     // Do only once per read-text being parsed..
       
  1425     TInt retCode(KErrNone);
       
  1426     TInt leaveCode(KErrNone);
       
  1427 
       
  1428     TRAP(leaveCode, DefaultFrameworkL(KDefaultIdWsfFrameworkID, 
       
  1429                                       KDefaultFrameworkCue1));
       
  1430 #ifdef _SENDEBUG
       
  1431     if(leaveCode!=KErrNone)
       
  1432         {
       
  1433         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1434             leaveCode));
       
  1435         }
       
  1436 #else
       
  1437     if(leaveCode!=KErrNone)
       
  1438         {
       
  1439         retCode = leaveCode;
       
  1440         }
       
  1441 #endif
       
  1442 
       
  1443     leaveCode = KErrNone;
       
  1444     TRAP(leaveCode, DefaultFrameworkL(KDefaultBasicWebServicesFrameworkID, 
       
  1445                                       KDefaultFrameworkCue2));
       
  1446 #ifdef _SENDEBUG
       
  1447     if(leaveCode!=KErrNone)
       
  1448         {
       
  1449         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1450             leaveCode));
       
  1451         }
       
  1452 #else
       
  1453     if(leaveCode!=KErrNone)
       
  1454         {
       
  1455         retCode = leaveCode; // overrides possible leave from ID-WSF ECOM loading..
       
  1456         }
       
  1457 #endif
       
  1458 
       
  1459     leaveCode = KErrNone;
       
  1460     TRAP(leaveCode, DefaultFrameworkL(KDefaultRestServicesFrameworkID, 
       
  1461                                       KDefaultFrameworkCue3));
       
  1462 
       
  1463 #ifdef _SENDEBUG
       
  1464     if(leaveCode!=KErrNone)
       
  1465         {
       
  1466         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1467             leaveCode));
       
  1468         }
       
  1469 #else
       
  1470     if(leaveCode!=KErrNone)
       
  1471         {
       
  1472         retCode = leaveCode; // overrides possible leave from ID-WSF & WS-I ECOMs loading..
       
  1473         }
       
  1474 #endif
       
  1475 
       
  1476     leaveCode = KErrNone;
       
  1477     TRAP(leaveCode, DefaultFrameworkL(KDefaultWSStarFrameworkID, 
       
  1478                                       KDefaultFrameworkCue4));
       
  1479 
       
  1480 #ifdef _SENDEBUG
       
  1481     if(leaveCode!=KErrNone)
       
  1482         {
       
  1483         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1484             leaveCode));
       
  1485         }
       
  1486 #else
       
  1487     if(leaveCode!=KErrNone)
       
  1488         {
       
  1489         retCode = leaveCode; // overrides possible leave from ID-WSF & WS-I & REST ECOMs loading..
       
  1490         }
       
  1491 #endif
       
  1492 
       
  1493     leaveCode = KErrNone;
       
  1494     TRAP(leaveCode, DefaultFrameworkL(KDefaultAtomPubFrameworkID, 
       
  1495                                       KDefaultFrameworkCue5));
       
  1496 
       
  1497 #ifdef _SENDEBUG
       
  1498     if(leaveCode!=KErrNone)
       
  1499         {
       
  1500 		TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1501             leaveCode));
       
  1502         }
       
  1503 #else
       
  1504     if(leaveCode!=KErrNone)
       
  1505         {
       
  1506         retCode = leaveCode; // overrides possible leave from ID-WSF & WS-I & REST ECOMs loading..
       
  1507         }
       
  1508 #endif
       
  1509 
       
  1510 //################OVI PLUGIN
       
  1511     leaveCode = KErrNone;
       
  1512     TRAP(leaveCode, DefaultFrameworkL(KDefaultOviFrameworkID, 
       
  1513                                       KDefaultFrameworkCue6));
       
  1514 
       
  1515 #ifdef _SENDEBUG
       
  1516     if(leaveCode!=KErrNone)
       
  1517         {
       
  1518         LOG_WRITEFORMAT((_L8("CSenXMLDAO::Load() - DefaultFrameworkL() leaved: %d"),
       
  1519             leaveCode));
       
  1520         }
       
  1521 #else
       
  1522     if(leaveCode!=KErrNone)
       
  1523         {
       
  1524         retCode = leaveCode; // overrides possible leave from ID-WSF & WS-I & REST ECOMs loading..
       
  1525         }
       
  1526 #endif
       
  1527     return retCode;
       
  1528     }
       
  1529 
       
  1530 
       
  1531 
       
  1532 TPtrC8 CSenXMLDAO::TransportPluginCueBySchemeL(const TPtrC8& aScheme)
       
  1533     {
       
  1534     TPtrC8 cue = KNullDesC8();
       
  1535 
       
  1536     TInt index = iTransportMap.Find(aScheme);
       
  1537     if(index!=KErrNotFound)
       
  1538         {
       
  1539         const HBufC8* pCue = iTransportMap.ValueAt(index);
       
  1540         if(pCue)
       
  1541             {
       
  1542             cue.Set(*pCue);
       
  1543             }
       
  1544         }
       
  1545     return cue;
       
  1546     }
       
  1547 
       
  1548 TInt CSenXMLDAO::CheckDefaultTransports()
       
  1549     {
       
  1550     // Note: HTTP Channel is the highest priority default, also in case
       
  1551     // that scheme is not provided, so it does not need to be
       
  1552     // added as default (CSenTransport::NewL() without cue returns the
       
  1553     // default version HTTP Channel Transport plug-in).
       
  1554 
       
  1555     // Check whether local scheme default has been overridden by 
       
  1556     // configuration file (sensessions.xml). The configuration file
       
  1557     // has now been loaded, so one should not discard any changes to
       
  1558     // default scheme-cue mappings that were read from that file.
       
  1559 
       
  1560     TInt retVal(KErrNone);
       
  1561     TInt index = iTransportMap.Find(KLocalTransportScheme);
       
  1562     if(index==KErrNotFound)
       
  1563         {
       
  1564         // apply & map the default local transport ECOM cue with its scheme
       
  1565         HBufC8* pScheme = KLocalTransportScheme().Alloc();
       
  1566         HBufC8* pCue = KDefaultLocalTransportPluginCue().Alloc();
       
  1567 
       
  1568         if(pScheme && pCue)
       
  1569             {
       
  1570             TInt retCode = iTransportMap.Append(pScheme, pCue);
       
  1571             if(retCode!=KErrNone)
       
  1572                 {
       
  1573                 retVal = retCode;
       
  1574                 }
       
  1575             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::CheckDefaultTransportsL - Append(local) returned: %d"), 
       
  1576                 retVal));
       
  1577             }
       
  1578         }
       
  1579 
       
  1580     index = iTransportMap.Find(KTcpTransportScheme);
       
  1581     if(index==KErrNotFound)
       
  1582         {
       
  1583         // apply & map the default local transport ECOM cue with its scheme
       
  1584         HBufC8* pScheme = KTcpTransportScheme().Alloc();
       
  1585         HBufC8* pCue = KDefaultVirtualTcpTransportPluginCue().Alloc();
       
  1586         if(pScheme && pCue)
       
  1587             {
       
  1588             TInt retCode = iTransportMap.Append(pScheme, pCue);
       
  1589             if(retCode!=KErrNone)
       
  1590                 {
       
  1591                 retVal = retCode;
       
  1592                 }
       
  1593               TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("CSenXMLDAO::CheckDefaultTransportsL - Append(tcp) returned: %d"), 
       
  1594                 retVal));
       
  1595             }
       
  1596         }
       
  1597     return retVal; // returns the last error code
       
  1598     }
       
  1599 
       
  1600 MSenProvider& CSenXMLDAO::LookupHostletForL(const TDesC8& aHostletEndpoint,
       
  1601                                             const TDesC& aReqThreadId,
       
  1602                                             const TDesC8& aReqConsumerId)
       
  1603     {
       
  1604     // This method needs to be wrapped inside critical section 
       
  1605     // NOTE: do *NOT* file log before this line(!):
       
  1606 
       
  1607     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::LookupHostletForL:");
       
  1608     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aReqThreadId));
       
  1609     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aReqConsumerId));
       
  1610 
       
  1611     
       
  1612     // LIST OF SHARABLE PROVIDERS IS USED TO LOOKUP A MATCHING,
       
  1613     // SHARABLE PROVIDER, which is accessed by multiple requests,
       
  1614     // possibly even by multiple threads at the same time (if
       
  1615     // provider's type is non-threadsafe, meaning that it 
       
  1616     // itself implements mutex for incoming ServiceL calls etc.
       
  1617     TInt sharableCount(iSharableProviders.Count());
       
  1618     CSenProvider* pHostlet = NULL;
       
  1619 
       
  1620     for(TInt s=0; s<sharableCount; s++)
       
  1621         {
       
  1622         pHostlet = iSharableProviders[s];
       
  1623         if(pHostlet)
       
  1624             {
       
  1625             if(pHostlet->Endpoint()==aHostletEndpoint)
       
  1626                 {
       
  1627                 TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- Matching sharable hostlet found from cache: 0x%X"), &pHostlet));
       
  1628                 return *pHostlet;
       
  1629                 }
       
  1630             }
       
  1631         }
       
  1632 
       
  1633     
       
  1634     // Lookup unsharable providers, which EITHER are non-threadsafe
       
  1635     // (shared between several simultaneous requests from same consumer)
       
  1636     // OR which wish to stay on background and support reinitialization.
       
  1637     CSenHostletLookupInfo* pLookupInfo = 
       
  1638         CSenHostletLookupInfo::NewLC(aReqThreadId, aReqConsumerId);
       
  1639 
       
  1640     // It is not actually possible to get match with any threadsafe, 
       
  1641     // cached provider from this find:
       
  1642     TInt index = iUnsharableProviders.Find(*pLookupInfo);
       
  1643     CleanupStack::PopAndDestroy(); // pLookupInfo
       
  1644     pLookupInfo = NULL;
       
  1645 
       
  1646     if(index!=KErrNotFound)
       
  1647         {
       
  1648         pHostlet = (CSenProvider*) iUnsharableProviders.ValueAt(index);
       
  1649         pLookupInfo = iUnsharableProviders.KeyAt(index);
       
  1650         if(pHostlet && pLookupInfo && !pHostlet->Threadsafe()) // sanity check
       
  1651             {
       
  1652             // Next line is critical; when count goes to zero,
       
  1653             // provider can be de-allocated from memory!
       
  1654             pLookupInfo->IncrementLookupCount();
       
  1655             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- A non-threadsafe, unsharable local provider (hostlet) was found: 0x%X - lookup info: 0x%X, lookup count: %d"), pHostlet, pLookupInfo, pLookupInfo->LookupCount()));
       
  1656             if(pHostlet->Reinitializable())
       
  1657                 {
       
  1658                 pHostlet->ReinitL();
       
  1659                 TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"- Provider was also reinitialized.");
       
  1660                 }
       
  1661             return *pHostlet;
       
  1662             }
       
  1663         }
       
  1664 #ifdef _SENDEBUG
       
  1665     else
       
  1666         {
       
  1667         TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"- Matching unsharable provider was NOT found from the cache.");
       
  1668         }
       
  1669 #endif
       
  1670 
       
  1671     
       
  1672     // The provider has not yet been cached into memory, so load it:
       
  1673     // This method call *can leave*, if ECOM lookup fails!
       
  1674     // In case of leave Propagate meaningful error code to Remote Service Consumer 
       
  1675     TInt leaveCode(KErrNone); 
       
  1676     TRAP( leaveCode, pHostlet = CSenProvider::NewL(aHostletEndpoint) );
       
  1677     if( !pHostlet )
       
  1678     	{
       
  1679     	if( leaveCode )
       
  1680     		{
       
  1681     		TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMinLogLevel, _L8("- Could not load Local Provider plugin, leave: %d"), leaveCode));	
       
  1682     		User::Leave( KErrSenHostNotAvailable ); // throw forward : meaningful errcode to consumer
       
  1683     		}
       
  1684     	}
       
  1685     	
       
  1686     CleanupStack::PushL(pHostlet);
       
  1687 
       
  1688     TInt append(KErrNone);
       
  1689 	if (pHostlet)
       
  1690 	{
       
  1691     if(pHostlet->Sharable())
       
  1692         {
       
  1693         append = iSharableProviders.Append(pHostlet);
       
  1694         if(append==KErrNone)
       
  1695             {
       
  1696             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- Loaded new sharable hostlet instance: 0x%X"), &pHostlet));
       
  1697             CleanupStack::Pop(); // pHostlet
       
  1698             }
       
  1699         else
       
  1700             {
       
  1701             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"- iSharableProviders.Append failed."); // OOM case
       
  1702             CleanupStack::PopAndDestroy(); // pHostlet
       
  1703             }
       
  1704         }
       
  1705     else // unsharable provider
       
  1706         {
       
  1707         // LIST OF UNSHARABLE PROVIDERS IS USED MAINLY TO MAKE IT
       
  1708         // POSSIBLE TO DE-ALLOCATE LOADED ECOM PLUG-IN INSTANCIES.
       
  1709         // In MCoreServiceManager there ReleaseHostletL() method gets
       
  1710         // called, which means that such provider may be removed from
       
  1711         // the map and destroyed. Otherwise, such hostlets are destroyed,
       
  1712         // when server (main thread) goes down.
       
  1713         
       
  1714         pLookupInfo = NULL;
       
  1715         if(pHostlet->Threadsafe())
       
  1716             {
       
  1717             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"- Adding new threadsafe, unsharable provider into cache.");
       
  1718             pLookupInfo = CSenHostletLookupInfo::NewLC(aReqThreadId, aReqConsumerId);
       
  1719             }
       
  1720         else
       
  1721             {
       
  1722             // Any non-threadsafe provider should compare whether consumer ID
       
  1723             // is equal. The thread ID is irrelevant in the matching.
       
  1724             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"- Adding new non-threadsafe, unsharable provider into cache.");
       
  1725             pLookupInfo = CSenHostletLookupInfo::NewLC(KNullDesC, aReqConsumerId);
       
  1726             }
       
  1727 
       
  1728         pLookupInfo->IncrementLookupCount();
       
  1729         append = iUnsharableProviders.Append(pLookupInfo, pHostlet);
       
  1730         if(append==KErrNone)
       
  1731             {
       
  1732             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- Loaded new unsharable hostlet instance: 0x%X, lookup info: 0x%X, lookup count: %d"), pHostlet, pLookupInfo, pLookupInfo->LookupCount()));
       
  1733             CleanupStack::Pop(2); // pLookupInfo, pHostlet
       
  1734             }
       
  1735         else
       
  1736             {
       
  1737             TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMinLogLevel,"- iUnsharableProviders.Append failed."); // OOM case
       
  1738             CleanupStack::PopAndDestroy(2); // pLookupInfo, pHostlet
       
  1739             }
       
  1740         }
       
  1741 	}
       
  1742     User::LeaveIfError(append); // KErrNoMemory
       
  1743     return *pHostlet;
       
  1744     }
       
  1745 
       
  1746 TInt CSenXMLDAO::ReleaseHostletL(const MSenProvider* aHostlet,
       
  1747                                  const TDesC& aReqThreadId,
       
  1748                                  const TDesC8& aReqConsumerId)
       
  1749     {
       
  1750     // This method needs to be wrapped inside critical section 
       
  1751     TLSLOG_L(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,"CSenXMLDAO::ReleaseHostletL:");
       
  1752     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aHostlet->Endpoint()));
       
  1753     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aHostlet->Contract()));
       
  1754     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aReqThreadId));
       
  1755     TLSLOG(KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel,(aReqConsumerId));
       
  1756 
       
  1757 
       
  1758     // Currently, sharable hostlets cannot be released
       
  1759     if(aHostlet->Sharable())
       
  1760         {
       
  1761         return KErrNotSupported;
       
  1762         }
       
  1763 
       
  1764     // This method simple looks for any unsharable providers, which
       
  1765     TInt unsharableCount(iUnsharableProviders.Count());
       
  1766     TInt retVal(KErrNotFound);
       
  1767     for(TInt u=0; u<unsharableCount; u++)
       
  1768         {
       
  1769         CSenHostletLookupInfo* pLookupInfo = iUnsharableProviders.KeyAt(u);
       
  1770         MSenProvider* pHostlet = (MSenProvider*)iUnsharableProviders.ValueAt(u);
       
  1771         // Check whether the hostlet instances match
       
  1772         if(pHostlet && aHostlet != pHostlet)
       
  1773             {
       
  1774             continue; // no match
       
  1775             }
       
  1776         else if(aHostlet->Threadsafe())
       
  1777             {
       
  1778             if(!(pLookupInfo && pLookupInfo->ThreadId() == aReqThreadId
       
  1779                            && pLookupInfo->ConsumerId() == aReqConsumerId))
       
  1780                 {
       
  1781                 // mismatch either in thread or consumer id, or both; so
       
  1782                 // check next one from the cache (map)
       
  1783                 continue; // no match
       
  1784                 }
       
  1785             }
       
  1786         else if(!(pLookupInfo && pLookupInfo->ConsumerId() == aReqConsumerId))
       
  1787             {
       
  1788             // even though thread (requester) is allowed to be change, the 
       
  1789             // hostlet still needs to be invoked using same consumer id,
       
  1790             // Since this is *not* the case, check next one from the cache (map)
       
  1791             continue; // no match
       
  1792             }
       
  1793             
       
  1794         // match: decrement lookup count
       
  1795         pLookupInfo->DecrementLookupCount();
       
  1796         TInt lookupCount = pLookupInfo->LookupCount();
       
  1797         TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KNormalLogLevel, _L8("- LookupInfo: 0x%X, lookup count after decrement: %d"), pLookupInfo, lookupCount));
       
  1798         if(pHostlet && pHostlet->StayOnBackground())
       
  1799             {
       
  1800             if(pHostlet->Reinitializable() && lookupCount==0)
       
  1801                 {
       
  1802                 // no-one is consuming the service, 
       
  1803                 // so re-init this hostlet instance:
       
  1804                 TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- Reinitializing unsharable hostlet instance: 0x%x"), pHostlet));
       
  1805                 retVal = pHostlet->ReinitL();
       
  1806                 }
       
  1807             }
       
  1808         else if(lookupCount==0) // this is the last consumer
       
  1809             {
       
  1810             // no need to keep this instance on background
       
  1811             // and no-one is consuming it's service
       
  1812             // destroy the ECOM plug-in instance:
       
  1813             TLSLOG_FORMAT((KSenCoreServiceManagerLogChannelBase  , KMaxLogLevel, _L8("- Deleting unsharable hostlet instance: 0x%x"), pHostlet));
       
  1814             retVal = iUnsharableProviders.RemoveByKey(*pLookupInfo); 
       
  1815             }
       
  1816         break; // release complete
       
  1817         } // for each map item..
       
  1818     return retVal; // KErrNone or KErrNotFound, or some error from ReinitL()
       
  1819   }
       
  1820 void CSenXMLDAO::UpdateTouchSessionDBL(MSenServiceDescription& asd)
       
  1821 	{
       
  1822 	TInt count(0);
       
  1823 	
       
  1824 	RWSDescriptionArray matches;
       
  1825 	CleanupClosePushL(matches);
       
  1826 	
       
  1827 	FindAllMatchingServiceDescriptions(matches, asd);
       
  1828 	count = matches.Count();
       
  1829 	
       
  1830 	for(TInt i=0; i < count; i++)
       
  1831 		{
       
  1832 		TUint current_tick(0);
       
  1833 		TBuf8<32> tickBuf;
       
  1834 		
       
  1835 		CSenWSDescription* sd = matches[i];
       
  1836 		CSenElement& sdElem = sd->AsElement();
       
  1837 		
       
  1838 		current_tick = User::NTickCount();
       
  1839 		tickBuf.Num(current_tick);
       
  1840 		sdElem.AddAttrL(KTouch(), tickBuf);
       
  1841 		}
       
  1842 	
       
  1843 	CleanupStack::PopAndDestroy(&matches);
       
  1844 	// CleanupUnusedSessionDBL(); 
       
  1845                                   // (don't de-serialize old items). Serialized 
       
  1846 	                              // objects cannot be de-allocated on the fly.
       
  1847 	}
       
  1848 	
       
  1849 void CSenXMLDAO::CleanupUnusedSessionDBL()
       
  1850 	{
       
  1851 	TInt count(0);
       
  1852 	
       
  1853 	RPointerArray<CSenElement> sdElemList;
       
  1854 	CleanupClosePushL(sdElemList);
       
  1855 	
       
  1856 	count = iSessions.Count();
       
  1857 	
       
  1858 	TUint32 current_tick(0);
       
  1859 	TUint32 db_ticks(0);
       
  1860 	TUint32 diff_ticks(0);
       
  1861 	
       
  1862 	for(TInt i=0; i < count; i++)
       
  1863 		{
       
  1864 				
       
  1865 		CSenXmlServiceDescription* sd = iSessions[i];
       
  1866 		CSenElement& sdElem = sd->AsElement();
       
  1867 		TPtrC8 localName = sdElem.LocalName();
       
  1868 		const TDesC8* val = sdElem.AttrValue(KTouch());
       
  1869 		if(val != NULL)
       
  1870 			{
       
  1871 			TLex8 lex;
       
  1872             lex.Assign(*val);
       
  1873             lex.Val(db_ticks, EDecimal);
       
  1874             
       
  1875             current_tick = User::NTickCount();
       
  1876             diff_ticks = current_tick - db_ticks;
       
  1877                         	
       
  1878 			if(KMaxTicks <= diff_ticks || current_tick < db_ticks)
       
  1879 				{
       
  1880 				delete iSessions[i];
       
  1881         		iSessions.Remove(i);
       
  1882         		
       
  1883         		i--;
       
  1884         		count--;
       
  1885 				}
       
  1886 			}
       
  1887 		}
       
  1888 	
       
  1889 	CleanupStack::PopAndDestroy(&sdElemList);	
       
  1890 	}	
       
  1891 
       
  1892 CSenHostletLookupInfo* CSenHostletLookupInfo::NewL(const TDesC& aThreadIdFullName,
       
  1893                                                    const TDesC8& aConsumerIdUrn)
       
  1894     {
       
  1895     CSenHostletLookupInfo* pNew = CSenHostletLookupInfo::NewLC(aThreadIdFullName,
       
  1896                                                                aConsumerIdUrn);
       
  1897     CleanupStack::Pop();
       
  1898     return pNew;
       
  1899     }
       
  1900 
       
  1901 CSenHostletLookupInfo* CSenHostletLookupInfo::NewLC(const TDesC& aThreadIdFullName,
       
  1902                                                   const TDesC8& aConsumerIdUrn)
       
  1903     {
       
  1904     CSenHostletLookupInfo* pNew = new (ELeave) CSenHostletLookupInfo;
       
  1905     CleanupStack::PushL(pNew);
       
  1906     pNew->ConstructL(aThreadIdFullName, aConsumerIdUrn);
       
  1907     return pNew;
       
  1908     }
       
  1909 
       
  1910 void CSenHostletLookupInfo::ConstructL(const TDesC& aThreadIdFullName,
       
  1911                                       const TDesC8& aConsumerIdUrn)
       
  1912     {
       
  1913     ipFullThreadName = aThreadIdFullName.AllocL();
       
  1914     ipUniqueConsumerId = aConsumerIdUrn.AllocL();
       
  1915     ipLookupCount = new (ELeave) TInt(0);
       
  1916     }
       
  1917 
       
  1918 
       
  1919 CSenHostletLookupInfo::CSenHostletLookupInfo()
       
  1920 : ipFullThreadName(NULL),
       
  1921   ipUniqueConsumerId(NULL),
       
  1922   ipLookupCount(NULL)
       
  1923     {
       
  1924     }
       
  1925 
       
  1926 CSenHostletLookupInfo::~CSenHostletLookupInfo()
       
  1927     {
       
  1928     delete ipFullThreadName;
       
  1929     delete ipUniqueConsumerId;
       
  1930     delete ipLookupCount;
       
  1931     }
       
  1932 
       
  1933 TPtrC CSenHostletLookupInfo::ThreadId() const
       
  1934     {
       
  1935     return *ipFullThreadName;
       
  1936     }
       
  1937 
       
  1938 TPtrC8 CSenHostletLookupInfo::ConsumerId() const
       
  1939     {
       
  1940     return *ipUniqueConsumerId;
       
  1941     }
       
  1942 
       
  1943 
       
  1944 TInt CSenHostletLookupInfo::LookupCount() const
       
  1945     {
       
  1946     return *ipLookupCount;
       
  1947     }
       
  1948 
       
  1949 void CSenHostletLookupInfo::IncrementLookupCount()
       
  1950     {
       
  1951     (*ipLookupCount)++;
       
  1952     }
       
  1953 
       
  1954 void CSenHostletLookupInfo::DecrementLookupCount()
       
  1955     {
       
  1956     (*ipLookupCount)--;
       
  1957     }
       
  1958 
       
  1959 
       
  1960 TBool CSenHostletLookupInfo::operator==(const CSenHostletLookupInfo& aHostletRequestor)
       
  1961     {
       
  1962     return((ipFullThreadName->Length()==0 || aHostletRequestor.ThreadId() == *ipFullThreadName)
       
  1963             && aHostletRequestor.ConsumerId() == *ipUniqueConsumerId);
       
  1964     
       
  1965     //    return (aHostletRequestor.ThreadId() == *ipFullThreadName
       
  1966 //            && aHostletRequestor.ConsumerId() == *ipUniqueConsumerId);
       
  1967     }
       
  1968 
       
  1969 
       
  1970 // END OF FILE
       
  1971