diff -r 4af31167ea77 -r 13d7c31c74e0 dcmofw/dcmoserver/src/dcmoserver.cpp --- a/dcmofw/dcmoserver/src/dcmoserver.cpp Thu Jul 15 19:36:11 2010 +0300 +++ b/dcmofw/dcmoserver/src/dcmoserver.cpp Thu Aug 19 10:44:50 2010 +0300 @@ -32,9 +32,18 @@ #include "dcmosession.h" #include "dcmogenericcontrol.h" #include "dcmodebug.h" +#include "lawmodebug.h" +#include "amsmlhelper.h" +#include +#include +#include +#include // Property values +#include _LIT( KdcmoResourceFileName, "z:dcmo.rsc" ); const TInt KBufferSize = 256; +const TInt KWipeSuccess = 1201; +const TInt KWipeFailure = 1405; TInt CDCMOServer::iSessionCount = 0; // Standard server startup code @@ -103,6 +112,9 @@ void CDCMOServer::ConstructL() { RDEBUG("CDCMOServer::ConstructL- begin"); + iwipeStatus = 0; + iSessionIap = KErrNotFound; + iCount = -1; StartL(KDCMOServerName); RDEBUG("CDCMOServer::ConstructL- end"); } @@ -124,7 +136,7 @@ { RDEBUG("CDCMOServer::~CDCMOServer- begin"); TInt count = idcmoArray.Count(); - RDEBUG_2("CDCMOServer::~CDCMOServer; %d", count ); + RDEBUG_2("~~CDCMOServer::~CDCMOServer; %d", count ); if(count) { for(TInt i=0; i< count; i++) @@ -133,15 +145,25 @@ delete iNotifier; iNotifier = NULL; } - else + + RLDEBUG("CDCMOServer::wipe done delete pluginuid()"); + TInt pluginObjectCount = ilawmoPlugins.Count(); + while(pluginObjectCount>0) { - //Kill the server - if( iSessionCount == 0) - CActiveScheduler::Stop(); + RLDEBUG("plugin to be deleted"); + delete ilawmoPlugins[pluginObjectCount-1]; + RLDEBUG("plugin deleted"); + pluginObjectCount--; } + RLDEBUG("CDCMOServer::close all RArrays()"); + ilawmoPluginUidToBeWiped.Close(); + RLDEBUG("CDCMOServer::closeD all RArrays()"); + ilawmoPlugins.Close(); + + RDEBUG("CDCMOServer::call FinalClose"); REComSession::FinalClose(); - RDEBUG("CDCMOServer::~CDCMOServer- end"); + RDEBUG("~~~CDCMOServer::~CDCMOServer- end"); } // ----------------------------------------------------------------------------- @@ -161,12 +183,20 @@ if( idcmoArray.Count() && ( iSessionCount == 0 )) { // A session is being destroyed + RDEBUG("CDCMOServer::DropSession- dofinalise ?"); TRAPD( err, DoFinalizeL()); + iCount = 0; if ( !err ) { RDEBUG_2("CDCMOServer::DropSession err = %d", err ); } } + if((iSessionCount == 0)&&(iCount== -1)) + { + RDEBUG("DropSession kill server, only when no session and no wipe pending"); + CActiveScheduler::Stop(); + RDEBUG("DropSession kill server"); + } RDEBUG("CDCMOServer::DropSession- end"); } @@ -207,21 +237,28 @@ // CDCMOServer::GetAdapterUidL // Gets the plug-in adapter implementation uid if it present. // ---------------------------------------------------------------------------------------- -TUid CDCMOServer::GetAdapterUidL(const TDesC& aCategory) +TUid CDCMOServer::GetAdapterUidL(const TDesC& aCategory, TBool aIsLawmo) { RDEBUG("CDCMOServer::GetDCMOAdapterUidL(): begin"); - + RLDEBUG("CDCMOServer::GetAdapterUidL(): begin"); TUid retUid = {0x0}; - + TEComResolverParams resolverParams; RImplInfoPtrArray infoArray; // Note that a special cleanup function is required to reset and destroy // all items in the array, and then close it. TCleanupItem cleanup(CleanupEComArray, &infoArray); CleanupStack::PushL(cleanup); + if(aIsLawmo) + { + REComSession::ListImplementationsL(KLAWMOPluginInterfaceUid, resolverParams, KRomOnlyResolverUid, infoArray); + RLDEBUG("CDCMOServer::GetAdapterUidL(): listImpl"); + } + else REComSession::ListImplementationsL(KDCMOInterfaceUid, infoArray); // Loop through each info for each implementation TBuf8 buf; + RLDEBUG("CDCMOServer::GetAdapterUidL(): for loop"); for (TInt i=0; i< infoArray.Count(); i++) { buf = infoArray[i]->OpaqueData(); @@ -230,12 +267,13 @@ if(category.Find(infoArray[i]->OpaqueData())!= KErrNotFound) { retUid = infoArray[i]->ImplementationUid(); + RLDEBUG("CDCMOServer::GetAdapterUidL(): matched"); break; } buf.Zero(); } CleanupStack::PopAndDestroy(); //cleanup - + RLDEBUG("CDCMOServer::GetAdapterUidL():end"); RDEBUG("CDCMOServer::GetDCMOAdapterUidL(): end"); return retUid; } @@ -609,6 +647,170 @@ } // ---------------------------------------------------------------------------------------- +// CDCMOServer::GetPluginUids +// Gets the plug-in adapter implementation uid if it present. +// ---------------------------------------------------------------------------------------- +void CDCMOServer::GetLawmoPluginUidsL() +{ + RDEBUG("CDCMOServer::GetPluginUids(): begin"); + ilawmoPluginUidToBeWiped.Reset(); + RImplInfoPtrArray infoArray; + TEComResolverParams resolverParams; + // Note that a special cleanup function is required to reset and destroy + // all items in the array, and then close it. + TCleanupItem cleanup(CleanupEComArray, &infoArray); + CleanupStack::PushL(cleanup); + REComSession::ListImplementationsL(KLAWMOPluginInterfaceUid, resolverParams, KRomOnlyResolverUid, infoArray); + RLDEBUG("CDCMOServer::GetPluginUids(): listImpl"); + // Loop through each info for each implementation + for (TInt i=0; i< infoArray.Count(); i++) + { + ilawmoPluginUidToBeWiped.Append(infoArray[i]->ImplementationUid()); + RLDEBUG("CDCMOServer::GetPluginUids(): for loop"); + } + CleanupStack::PopAndDestroy(); //cleanup + RLDEBUG("CDCMOServer::GetPluginUids():end"); + return; +} + +TLawMoStatus CDCMOServer::WipeAllItem() + { + //Update ilawmopluginUid, so that all Node items are wiped. + //WipeItem doesn only on Uid's in the RArray. + TRAPD(error,GetLawmoPluginUidsL()); + if(error == KErrNone) + return WipeItem(); + else + return ELawMoWipeNotPerformed; + } + +TLawMoStatus CDCMOServer::WipeItem(TInt aValue) + { + RLDEBUG("CDCMOServer::WipeItem(): begin"); + TLawMoStatus lawmostat(ELawMoAccepted); + iCount = 0; + if(ilawmoPluginUidToBeWiped.Count() > 0) + { + RLDEBUG_2("CDCMOServer::WipeItem got uid(): %d",ilawmoPluginUidToBeWiped[iCount]); + CLAWMOPluginInterface* obj; + RLDEBUG("CDCMOServer::WipeItem(): NewL"); + TRAPD(err,obj = CLAWMOPluginInterface::NewL(ilawmoPluginUidToBeWiped[iCount], this)); + if(err == KErrNone) + { + RLDEBUG("CDCMOServer::WipeItem(): obj created"); + RLDEBUG_2("CDCMOServer::WipeItem plugin count: %d",ilawmoPlugins.Count()); + TRAP(err,obj->WipeL()); + RLDEBUG_2("CDCMOServer::WipeItem(): wipe called %d",err); + ilawmoPlugins.Append(obj); + // Get the IAP being used in the current session + TRAP( err, SmlHelper::GetDefaultIAPFromDMProfileL( iSessionIap ) ); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted(): get iap %d",iSessionIap); + } + if(err!=KErrNone) + HandleWipeCompleted(KErrGeneral); + } + else + { + lawmostat = ELawMoWipeNotPerformed; + } + + RLDEBUG("CDCMOServer::WipeItem(): End"); + return lawmostat; + } + +TLawMoStatus CDCMOServer::GetListItemL(TDesC& item, TDes& strValue) +{ + RLDEBUG("CDCMOServer::GetListItem(): begin"); + TEComResolverParams resolverParams; + TLawMoStatus lawmostat(ELawMoSuccess); + TBuf itemName; + RImplInfoPtrArray infoArray; + TCleanupItem cleanup(CleanupEComArray, &infoArray); + CleanupStack::PushL(cleanup); + REComSession::ListImplementationsL(KLAWMOPluginInterfaceUid, resolverParams, KRomOnlyResolverUid, infoArray); + RLDEBUG("CDCMOServer::GetListItem(): listImpl"); + + for (TInt i=0; i< infoArray.Count(); i++) + { + RLDEBUG("CDCMOServer::GetListItem(): for loop"); + TBuf temp; + temp.Copy(infoArray[i]->OpaqueData()); + RLDEBUG_2("CDCMOServer::GetListItem opaque data to compare is %s", temp.PtrZ()); + if(item == temp) + { + itemName.Copy(infoArray[i]->DisplayName()); + RLDEBUG("CDCMOServer::GetListItem(): matched"); + break; + } + } + CleanupStack::PopAndDestroy(); //cleanup + RLDEBUG_2("CDCMOServer::GetListItem display name is %s", itemName.PtrZ()); + strValue.Zero(); + strValue.Append(itemName); + RLDEBUG("CDCMOServer::GetListItem(): End"); + return lawmostat; +} + + +TLawMoStatus CDCMOServer::GetToBeWipedL(TDesC& item, TDes& wipeValue) +{ + RLDEBUG("CDCMOServer::GetToBeWiped(): begin"); + TLawMoStatus lawmostat(ELawMoSuccess); + TInt wipeVal(0); + TUid impluid = GetAdapterUidL(item, ETrue); + RLDEBUG_2("CDCMOServer::GetToBeWiped for uid(): %d", impluid); + TInt afind = ilawmoPluginUidToBeWiped.Find(impluid); + if(afind!=KErrNotFound) + { + wipeVal = 1; + RLDEBUG("CDCMOServer::GetToBeWiped(): uid in Rarray"); + } + wipeValue.Zero(); + wipeValue.Num(wipeVal); + RLDEBUG("CDCMOServer::GetToBeWiped(): End"); + return lawmostat; +} + +TLawMoStatus CDCMOServer::SetToBeWipedL(TDesC& item, TInt wipeValue) +{ + RLDEBUG("CDCMOServer::SetToBeWiped(): begin"); + TLawMoStatus lawmostat(ELawMoSuccess); + TUid impluid = GetAdapterUidL(item, ETrue); + RLDEBUG_2("CDCMOServer::SetToBeWiped for uid(): %d", impluid); + TInt afind = ilawmoPluginUidToBeWiped.Find(impluid); + // Add Node's corresponding plugin uid to list so that it can be wiped + if(impluid.iUid) + { + if(wipeValue) + { + RLDEBUG("CDCMOServer::SetToBeWiped(): wipeVal true"); + if(afind==KErrNotFound) + ilawmoPluginUidToBeWiped.Append(impluid); + else + RLDEBUG("CDCMOServer::SetToBeWiped() tobewiped already set"); + } + else + { + RLDEBUG("CDCMOServer::SetToBeWiped(): wipeVal false"); + if(afind!=KErrNotFound) + { + ilawmoPluginUidToBeWiped.Remove(afind); + RLDEBUG("CDCMOServer::SetToBeWiped() tobewiped unset"); + } + else + RLDEBUG("CDCMOServer::SetToBeWiped() tobewiped notset atall"); + } + } + else + { + RLDEBUG("CDCMOServer::SetToBeWiped(): no such plugin found"); + lawmostat = ELawMoFail; + } + RLDEBUG("CDCMOServer::SetToBeWiped(): End"); + return lawmostat; +} + +// ---------------------------------------------------------------------------------------- // CDCMOServer::SetStarter // Sets the iStarter value // ---------------------------------------------------------------------------------------- @@ -618,3 +820,138 @@ iStarter = aValue; RDEBUG("CDCMOServer::SetStarter(): end"); } + +void CDCMOServer::HandleWipeCompleted(TInt status) +{ + RLDEBUG("CDCMOServer::HandleWipeCompleted(): begin"); + // whether wipe is performed or failed + iwipeStatus = (iwipeStatus && status); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted wipestate: %d",iwipeStatus); + iCount++; + if(ilawmoPluginUidToBeWiped.Count()>iCount) + { + RLDEBUG("CDCMOServer::HandleWipeCompleted(): create obj"); + CLAWMOPluginInterface* obj; + TRAPD(err, obj = CLAWMOPluginInterface::NewL(ilawmoPluginUidToBeWiped[iCount], this)); + if(err == KErrNone) + { + RLDEBUG("CDCMOServer::HandleWipeCompleted(): obj created"); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted plugin count: %d",ilawmoPlugins.Count()); + TRAP(err,obj->WipeL()); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted(): wipe called %d",err); + ilawmoPlugins.Append(obj); + } + if(err!=KErrNone) + HandleWipeCompleted(KErrGeneral); + } + else + { + // start DM session using the Monitor for generic alert + RLDEBUG("CDCMOServer::HandleWipeCompleted(): done"); + TInt err; + TBuf srvrid; + CRepository* crep; + TRAP(err, crep = CRepository::NewLC( KCRUidDeviceManagementInternalKeys ); + CleanupStack::Pop(crep)); + RLDEBUG("CDCMOServer::HandleWipeCompleted(): get srvrid"); + if(err == KErrNone) + err = crep->Get( KLAWMOfactoryDmServerID, srvrid ); + RDEBUG_2("CDCMOServer::GetCurrentServerId() %d",err); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted(): srvrid %s",srvrid.PtrZ()); + if (err == KErrNone) + { + RLDEBUG("CDCMOServer::startNwMonitor()"); + TRAP(err,StartDMNetworkMonitorL(srvrid, iSessionIap)); + } + + if(crep) + { + delete crep; //crep + crep = NULL; + } + + // Only when session is started successfully, Set wipestatus + if(err==KErrNone) + { + RLDEBUG("CDCMOServer::HandleWipeCompleted(): writing wipestatus to cenrep"); + CRepository* repository; + TRAP(err, repository = CRepository::NewLC ( KCRUidLawmoAdapter ); + CleanupStack::Pop(crep)); + + if(iwipeStatus==KErrNone) + iwipeStatus = KWipeSuccess; + else + iwipeStatus = KWipeFailure; + + repository->Set(KLawmoWipeStatus,iwipeStatus); + RLDEBUG_2("CDCMOServer::HandleWipeCompleted wipestate: %d",iwipeStatus); + if (repository) + { + delete repository; + repository = NULL; + } + } + + RLDEBUG_2("printing ilawmoPluginUidToBeWiped %d", ilawmoPluginUidToBeWiped.Count()); + RLDEBUG_2("printing ilawmoPlugins %d", ilawmoPlugins.Count()); + RLDEBUG_2("printing ilawmoPlugins %d", iCount); + iCount = -1; // To indicate all wipe is done + if( iSessionCount == 0) + { + CActiveScheduler::Stop(); + RLDEBUG("CDCMOServer::HandleWipeCompleted(): kill server"); + } + } + + RLDEBUG("CDCMOServer::HandleWipeCompleted(): end"); +} + +// ------------------------------------------------------------------------------------------------ +// CDCMOServer::StartDMNetworkMonitorL() +// ------------------------------------------------------------------------------------------------ +void CDCMOServer::StartDMNetworkMonitorL(TDesC& aServerId, TInt iapid) +{ + TInt retryenabled = 1; + _LIT( KNetMon,"\\dmnetworkmon.exe" ); + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL(): start"); + TBuf8 serverid; + serverid.Copy(aServerId); + // Enable DM Network Monitoring for retry of Generic alert in case of N/W loss + + CRepository *repository= CRepository::NewLC ( KCRUidDeviceManagementInternalKeys ); + repository->Set(KDevManEnableDMNetworkMon, retryenabled); + repository->Set(KDevManServerIdKey, serverid); + repository->Set(KDevManIapIdKey, iapid); + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL(): set rep keys"); + CleanupStack::PopAndDestroy(); + + // create NetMon EXE + RProcess rp; + TInt err = rp.Create(KNetMon,KNullDesC); + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL():create rprocess"); + User::LeaveIfError(err); + TRequestStatus stat; + rp.Rendezvous(stat); + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL():rendezvous"); + + if (stat!=KRequestPending) + { + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL():abort srvr"); + rp.Kill(0); // abort startup + } + else + { + RLDEBUG("CDCMOServer::StartDMNetworkMonitorL(): start server"); + rp.Resume(); // logon OK - start the server + } + User::WaitForRequest(stat); // wait for start or death + TInt r= rp.ExitType(); + TInt reqstat = stat.Int(); + //TExitType a; + RLDEBUG_2("CDCMOServer::StartDMNetworkMonitorL() exittype %d",r); + RLDEBUG_2("CDCMOServer::StartDMNetworkMonitorL() reqstatus %d",reqstat); + + rp.Close(); +} + +