--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dcmofw/dcmoserver/src/AMSmlHelper.cpp Thu Aug 19 10:44:50 2010 +0300
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2000 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description: Implementation of applicationmanagement components
+ *
+ */
+
+#include "amsmlhelper.h"
+#include <SyncMLClientDM.h>
+#include <rconnmon.h>
+#include <es_sock.h>
+#include <es_enum_internal.h>
+#include <es_sock_partner.h>
+#include <es_enum.h>
+#include "lawmodebug.h"
+
+const TUid KUidNSmlMediumTypeInternet =
+ {
+ 0x101F99F0
+ };
+const TUid KSosServerUid =
+ {
+ 0x101F99FB
+ };
+
+const TInt KBufSize32 = 32;
+
+void SmlHelper::GetDefaultIAPFromDMProfileL(TInt& aDefaultIAP)
+ {
+ RLDEBUG("ApplicationManagementServer::GetDefaultIAPFromDMProfileL() - start");
+
+ // first try to obtain the current profile id
+ RSyncMLSession ses;
+ ses.OpenL();
+ RLDEBUG(" 1/8");
+ CleanupClosePushL(ses);
+
+ TSmlJobId jid;
+ TSmlUsageType jtype;
+ ses.CurrentJobL(jid, jtype);
+ RLDEBUG(" 2/8");
+ RSyncMLDevManJob job;
+ job.OpenL(ses, jid);
+ RLDEBUG(" 3/8");
+ CleanupClosePushL(job);
+ // get profile id
+ TSmlProfileId pid(job.Profile() );
+ CleanupStack::PopAndDestroy( &job);
+
+ TBuf8<KBufSize32> key;
+ TBuf<KBufSize32> value;
+ TInt num = KErrNotFound;
+
+ // get connection property name first
+ GetConnectionPropertyNameL(ses, key, EPropertyIntenetAccessPoint);
+ RLDEBUG(" 4/8");
+ // we need to open sync profile in ordere to open the RSyncMLConnection
+ RSyncMLDevManProfile syncProfile;
+ syncProfile.OpenL(ses, pid);
+ RLDEBUG(" 5/8");
+ CleanupClosePushL(syncProfile);
+
+ TSmlTransportId transport;
+ RArray<TSmlTransportId> connections;
+ _LIT8( KNSmlIAPId, "NSmlIapId" );
+
+ // now open the syncML connection
+ RSyncMLConnection syncConnection;
+ syncProfile.ListConnectionsL(connections);
+
+ transport = connections[0];
+ syncConnection.OpenL(syncProfile, transport);
+ RLDEBUG(" 6/8");
+ CleanupClosePushL(syncConnection);
+
+ const TDesC8& source(syncConnection.GetPropertyL(KNSmlIAPId) );
+ RLDEBUG(" 7/8");
+ value.Copy(source.Left(value.MaxLength() ) );
+ User::LeaveIfError(StrToInt(value, num) );
+ RLDEBUG(" 8/8");
+
+ aDefaultIAP = num;
+
+ // If there is no default Access point in DM profile then use
+ // currently used access point by DM session
+
+ if (aDefaultIAP == -1)
+ {
+ RLDEBUG("adefault iap -1");
+ TInt sockIapid = -1;
+
+ RSocketServ serv;
+ CleanupClosePushL(serv);
+ User::LeaveIfError(serv.Connect() );
+
+ RConnection conn;
+ CleanupClosePushL(conn);
+ User::LeaveIfError(conn.Open(serv) );
+ RLDEBUG("RConnection opened");
+
+ TUint count( 0);
+ User::LeaveIfError(conn.EnumerateConnections(count) );
+ RLDEBUG_2("RConnection count %d",count);
+ // enumerate connections
+ for (TUint idx=1; idx<=count; ++idx)
+ {
+ TConnectionInfo connectionInfo;
+ TConnectionInfoBuf connInfo(connectionInfo);
+ RLDEBUG("RConnection loop");
+ TInt err = conn.GetConnectionInfo(idx, connInfo); // iapid
+ RLDEBUG("RConnection get conn info");
+ if (err != KErrNone)
+ {
+ CleanupStack::PopAndDestroy( 2); // conn, serv
+ User::Leave(err);
+ }
+ // enumerate connectionclients
+ TConnectionEnumArg conArg;
+ conArg.iIndex = idx;
+ TConnEnumArgBuf conArgBuf(conArg);
+ RLDEBUG("RConnection control");
+ err=conn.Control(KCOLConnection, KCoEnumerateConnectionClients,
+ conArgBuf);
+ if (err != KErrNone)
+ {
+ CleanupStack::PopAndDestroy( 2); // conn, serv
+ User::Leave(err);
+ }
+ TInt cliCount = conArgBuf().iCount;
+ RLDEBUG("RConnection second loop");
+ for (TUint j=1; j<=cliCount; ++j)
+ {
+ TConnectionGetClientInfoArg conCliInfo;
+ conCliInfo.iIndex = j;
+ TConnGetClientInfoArgBuf conCliInfoBuf(conCliInfo);
+ RLDEBUG("RConnection another control");
+ err=conn.Control(KCOLConnection, KCoGetConnectionClientInfo,
+ conCliInfoBuf);
+
+ if (err != KErrNone)
+ {
+ CleanupStack::PopAndDestroy( 2); // conn, serv
+ User::Leave(err);
+ }
+ TConnectionClientInfo conCliInf = conCliInfoBuf().iClientInfo;
+ TUid uid = conCliInf.iUid;
+ RLDEBUG_2("RConnection check uid %d", uid.iUid);
+ if (uid == KSosServerUid)
+ {
+ sockIapid = connInfo().iIapId;
+ RLDEBUG("RConnection uid matched");
+ }
+
+ }
+ }
+ CleanupStack::PopAndDestroy( 2); // conn, serv
+
+ aDefaultIAP = sockIapid;
+ RLDEBUG("RConnection out");
+ }
+ // get profile's server id
+ //aServerId = syncProfile.ServerId().AllocL();
+ RLDEBUG("RConnection total out");
+
+ CleanupStack::PopAndDestroy( &syncConnection);
+ CleanupStack::PopAndDestroy( &syncProfile);
+
+ CleanupStack::PopAndDestroy( &ses);
+ connections.Close();
+ RLDEBUG("ApplicationManagementServer::GetDefaultIAPFromDMProfileL() - end");
+ }
+
+void SmlHelper::GetConnectionPropertyNameL(RSyncMLSession& aSyncSession,
+ TDes8& aText, TInt aPropertyPos)
+ {
+ RLDEBUG("ApplicationManagementServer::GetConnectionPropertyNameL() - start");
+
+ // at the moment RSyncMLTransport is only needed
+ // for internet connection settings
+ RSyncMLTransport transport;
+ CleanupClosePushL(transport);
+ transport.OpenL(aSyncSession, KUidNSmlMediumTypeInternet.iUid);
+
+ const CSyncMLTransportPropertiesArray& arr = transport.Properties();
+ RLDEBUG("GetConnectionPropertyNameL interior");
+ __ASSERT_DEBUG( arr.Count()> aPropertyPos, User::Panic(_L("invalid count"), KErrGeneral) );
+
+ const TSyncMLTransportPropertyInfo& info = arr.At(aPropertyPos);
+ aText = info.iName;
+ CleanupStack::PopAndDestroy( &transport);
+
+ RLDEBUG("ApplicationManagementServer::GetConnectionPropertyNameL() - end");
+ }
+
+TInt SmlHelper::StrToInt(const TDesC& aText, TInt& aNum)
+ {
+ TLex lex(aText);
+ TInt err = lex.Val(aNum);
+ return err;
+ }
+
+// End of File