--- 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 <lawmoadaptercrkeys.h>
+#include <DevManInternalCRKeys.h>
+#include <e32property.h>
+#include <PSVariables.h> // Property values
+#include <lawmointerface.h>
_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<KBufferSize> 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<KBufferSize> 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<KBufferSize> 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<KBufferSize> 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<KBufferSize> 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();
+}
+
+