applayerpluginsandutils/uripermissionservices/server/src/ineturilistserver.cpp
changeset 0 b16258d2340f
equal deleted inserted replaced
-1:000000000000 0:b16258d2340f
       
     1 // Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 //
       
    15 
       
    16 #include <s32mem.h>
       
    17 #include "ineturilistserver.h"
       
    18 #include "urilistinterface.h"
       
    19 #include "sqldbtransaction.h"
       
    20 
       
    21 
       
    22 const TUint KRangeCount = 4;
       
    23 const TUint8 KPolicyElementReadDeviceData =	0;
       
    24 const TUint8 KPolicyElementWriteDeviceData = 1;
       
    25 const TInt KOpCodeRanges [ KRangeCount ] =
       
    26 	{
       
    27 	CInetUriListServer::EListType, // AlwaysPass
       
    28 	CInetUriListServer::EQuery,	   // ReadDeviceData: CInetUriListServer::EQuery ... 
       
    29 	CInetUriListServer::EAddUri,  // WriteDeviceData: CInetUriListServer::EAddUri ... CInetUriListServer::EUpdateUri
       
    30 	CInetUriListServer::ENotSupported			
       
    31 	};
       
    32 
       
    33 const TUint8 KElementsIndex [ KRangeCount ] =
       
    34 	{	
       
    35 	CPolicyServer::EAlwaysPass,
       
    36 	KPolicyElementReadDeviceData,
       
    37 	KPolicyElementWriteDeviceData,
       
    38 	CPolicyServer::ENotSupported
       
    39 	};
       
    40 	
       
    41 const CPolicyServer::TPolicyElement KPolicyElements[] = 
       
    42 	{
       
    43 	{_INIT_SECURITY_POLICY_C1 ( ECapabilityReadDeviceData ), CPolicyServer::EFailClient }, 
       
    44 	{_INIT_SECURITY_POLICY_C1 ( ECapabilityWriteDeviceData ), CPolicyServer::EFailClient }, 
       
    45 	};
       
    46 
       
    47 const CPolicyServer::TPolicy KInetUriListServerPolicy = 
       
    48 	{
       
    49 	CPolicyServer::EAlwaysPass,
       
    50 	KRangeCount,
       
    51 	KOpCodeRanges,
       
    52 	KElementsIndex,
       
    53 	KPolicyElements
       
    54 	};
       
    55 
       
    56 CInetUriListServerSession::CInetUriListServerSession ()
       
    57 	{
       
    58 		
       
    59 	}
       
    60 
       
    61 CInetUriListServerSession::~CInetUriListServerSession ()
       
    62 	{	
       
    63 	iUriListStreams.Close ();
       
    64 	
       
    65 	( static_cast< const CInetUriListServer* >( Server() ) )->DecSessionCount();	
       
    66 	}
       
    67 
       
    68 CInetUriListServerSession* CInetUriListServerSession::NewL ()
       
    69 	{
       
    70 	CInetUriListServerSession* self = new ( ELeave ) CInetUriListServerSession;	
       
    71 	return self;
       
    72 	}
       
    73 
       
    74 void CInetUriListServerSession::ServiceL ( const RMessage2& aMessage )
       
    75 	{	
       
    76 	DispatchMessageL ( aMessage );
       
    77 	}
       
    78 
       
    79 void CInetUriListServerSession::ServiceError ( const RMessage2& aMessage, TInt aError )
       
    80 	{
       
    81 	aMessage.Complete( aError );
       
    82 	}	
       
    83 	
       
    84 CBufFlat* CInetUriListServerSession::ReadMessageLC ( TInt aParam, const RMessage2& aMessage )
       
    85 	{
       
    86 	TInt desMaxLen ( aMessage.GetDesMaxLengthL ( aParam ) ); // Maximum length of the descriptor
       
    87 	
       
    88 	// Read from client message buffer
       
    89 	CBufFlat* buffer = CBufFlat::NewL ( desMaxLen );
       
    90 	CleanupStack::PushL ( buffer );	
       
    91 	buffer->ExpandL ( 0, desMaxLen );
       
    92 	TPtr8 bufferPtr ( buffer->Ptr(0) );
       
    93 	aMessage.ReadL ( aParam, bufferPtr );
       
    94 	
       
    95 	return buffer;	
       
    96 	}
       
    97 
       
    98 CUriListStream* CInetUriListServerSession::GetListStreamL ( CUriQueryFilter* aQueryFilter )
       
    99 	{
       
   100 	CleanupStack::PushL ( aQueryFilter );
       
   101 	CUriListStream* listStream = CUriListStream::NewL ( aQueryFilter );
       
   102 	CleanupStack::Pop (); // aQueryFilter 
       
   103 	return listStream;	
       
   104 	}
       
   105 
       
   106 void CInetUriListServerSession::DispatchMessageL ( const RMessage2& aMessage )
       
   107 	{
       
   108 	TInt ret ( KErrNone );
       
   109 
       
   110 	switch ( aMessage.Function() )	
       
   111 		{	
       
   112 
       
   113 		case CInetUriListServer::EListType:
       
   114 		ret = GetListTypeL ( aMessage );
       
   115 		break;
       
   116 		
       
   117 		case CInetUriListServer::EQuery:
       
   118 		ret = QueryL ( aMessage );
       
   119 		break;
       
   120 		
       
   121 		case CInetUriListServer::EQueryWithUri:
       
   122 		ret = QueryWithUriL ( aMessage );
       
   123 		break;
       
   124 		
       
   125 		case CInetUriListServer::EReadQueryResults:
       
   126 		ret = ReadQueryResultsL ( aMessage );
       
   127 		break;
       
   128 		
       
   129 		case CInetUriListServer::ECloseSrvStream:
       
   130 		ret = CloseSrvStream ( aMessage );
       
   131 		break;
       
   132 		
       
   133 		case CInetUriListServer::EUriCount:
       
   134 		ret = UriCountL ( aMessage );
       
   135 		break;
       
   136 		
       
   137 		case CInetUriListServer::EAddUri:
       
   138 		ret = AddUriL ( aMessage );
       
   139 		break;
       
   140 		
       
   141 		case CInetUriListServer::ERemoveUri:
       
   142 		ret = RemoveUriL ( aMessage );
       
   143 		break;
       
   144 		
       
   145 		case CInetUriListServer::EUpdateUri:
       
   146 		ret = UpdateUriL ( aMessage );
       
   147 		break;
       
   148 
       
   149 		case CInetUriListServer::EQueryTldInfo:
       
   150 		ret = QueryTldInfoL ( aMessage );
       
   151 		break;
       
   152 	
       
   153 		case CInetUriListServer::ETldListType:
       
   154 		ret = GetHostTypeL(aMessage);
       
   155 		break;
       
   156 		
       
   157 		case CInetUriListServer::EPolicyLength:
       
   158 		ret = PolicyDataLengthL ( aMessage );
       
   159 		break;
       
   160 		
       
   161 		case CInetUriListServer::ENotSupported:
       
   162 		ret = KErrNotFound;	
       
   163 		break;				
       
   164 		
       
   165 		default:
       
   166 		ret = KErrNotSupported;
       
   167 		break;
       
   168 		}
       
   169 	
       
   170 	if ( ret != KRequestPending )
       
   171 		{
       
   172 		aMessage.Complete( ret );
       
   173 		}	
       
   174 	}
       
   175 
       
   176 
       
   177 TInt CInetUriListServerSession::AddUriL ( const RMessage2& aMessage )
       
   178 	{
       
   179 	CBufFlat* outBuffer = ReadMessageLC ( 0, aMessage );
       
   180 	
       
   181 	RBufReadStream readStream ( *outBuffer );
       
   182 	CleanupClosePushL ( readStream );
       
   183 	
       
   184 	TInt uriId = 0;
       
   185 	TInt propId = 0;
       
   186 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   187 	listInterface->AddUriL ( readStream, uriId, propId );
       
   188 	
       
   189 	// Write back the uri id and property id
       
   190 	TPckgBuf < TInt > uriIdBuffer ( uriId );
       
   191 	TPckgBuf < TInt > propIdBuffer ( propId );
       
   192 	aMessage.WriteL ( 1, uriIdBuffer );
       
   193 	aMessage.WriteL ( 2, propIdBuffer );
       
   194 	
       
   195 	CleanupStack::PopAndDestroy ( 2 ); // outBuffer, readStream
       
   196 	return KErrNone;		
       
   197 	}
       
   198 	
       
   199 TInt CInetUriListServerSession::RemoveUriL ( const RMessage2& aMessage )
       
   200 	{
       
   201 	TPckgBuf < TInt > uriIdBuffer;
       
   202 	aMessage.ReadL ( 0, uriIdBuffer );
       
   203 	TPckgBuf < TInt > propIdBuffer;
       
   204 	aMessage.ReadL ( 1, propIdBuffer );
       
   205 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   206 	
       
   207 	listInterface->RemoveUriL ( uriIdBuffer(), propIdBuffer() );
       
   208 	
       
   209 	return KErrNone;	
       
   210 	}
       
   211 
       
   212 TInt CInetUriListServerSession::UpdateUriL ( const RMessage2& aMessage )
       
   213 	{
       
   214 	TPckgBuf < TUint32 > idBuffer;
       
   215 	aMessage.ReadL ( 0, idBuffer );
       
   216 	TPckgBuf < InetUriList::TListType > listTypeBuffer;
       
   217 	aMessage.ReadL ( 1, listTypeBuffer );
       
   218 	
       
   219 	HBufC8* favouriteName = HBufC8::NewLC ( aMessage.GetDesLengthL ( 2 ) );
       
   220 	TPtr8 favouriteNamePtr ( favouriteName->Des () );
       
   221 	
       
   222 	aMessage.ReadL ( 2, favouriteNamePtr );
       
   223 	
       
   224 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   225 	
       
   226 	listInterface->UpdateUriL ( idBuffer(), listTypeBuffer(), favouriteNamePtr );
       
   227 	
       
   228 	CleanupStack::PopAndDestroy (); // favouriteName
       
   229 	return KErrNone;	
       
   230 	}
       
   231 
       
   232 TInt CInetUriListServerSession::UriCountL ( const RMessage2& aMessage )
       
   233 	{
       
   234 	TPckgBuf < InetUriList::TServiceType > stBuffer;
       
   235 	TPckgBuf < InetUriList::TListType > ltBuffer;	
       
   236 	aMessage.ReadL ( 0, stBuffer );
       
   237 	aMessage.ReadL ( 1, ltBuffer );
       
   238 	
       
   239 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   240 	return listInterface->CountUriL ( stBuffer(), ltBuffer() );	
       
   241 	}
       
   242 
       
   243 TInt CInetUriListServerSession::GetListTypeL ( const RMessage2& aMessage )
       
   244 	{
       
   245 	HBufC8* uri = HBufC8::NewLC ( aMessage.GetDesLengthL (0) );
       
   246 	TPtr8 uriPtr ( uri->Des() );
       
   247 	
       
   248 	aMessage.ReadL ( 0, uriPtr );
       
   249 	TPckgBuf < InetUriList::TServiceType > stBuffer;
       
   250 	aMessage.ReadL ( 1, stBuffer );
       
   251 	
       
   252 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   253 	
       
   254 	InetUriList::TListType listType = listInterface->GetListTypeL ( uriPtr, stBuffer() ); 
       
   255 	TPckgBuf < InetUriList::TListType > ltBuffer ( listType );
       
   256 	
       
   257 	aMessage.WriteL ( 2, ltBuffer );
       
   258 	
       
   259 	CleanupStack::PopAndDestroy (); // uri
       
   260 	
       
   261 	return KErrNone;
       
   262 	}
       
   263 
       
   264 TInt CInetUriListServerSession::QueryWithUriL ( const RMessage2& aMessage )
       
   265 	{
       
   266 	RBuf8 uri;
       
   267 	CleanupClosePushL ( uri );
       
   268 	uri.CreateL (aMessage.GetDesLengthL (0));
       
   269 	TPckgBuf < TQueryArgs > queryArgs;
       
   270 	aMessage.ReadL ( 0, uri );
       
   271 	aMessage.ReadL ( 1, queryArgs );
       
   272 
       
   273 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   274 	CUriListStream* listStream = GetListStreamL ( listInterface->QueryWithUriL ( uri, queryArgs() ) );		
       
   275 	CleanupStack::PopAndDestroy (); // uri
       
   276 	CleanupStack::PushL (listStream); 
       
   277 	iUriListStreams.AllocL ();
       
   278 	CleanupStack::Pop (); // listStream
       
   279 	return iUriListStreams.Add ( listStream );
       
   280 	}
       
   281 
       
   282 /**
       
   283 Fetches length of the Policy data
       
   284 */	
       
   285 TInt CInetUriListServerSession::PolicyDataLengthL ( const RMessage2& aMessage )
       
   286 	{
       
   287 	RBuf8 uri;
       
   288 	CleanupClosePushL ( uri );
       
   289 	uri.CreateL (aMessage.GetDesLengthL (0));
       
   290 	TPckgBuf < TPolicyQueryArgs > queryArgs;
       
   291 	aMessage.ReadL ( 0, uri );
       
   292 	aMessage.ReadL ( 1, queryArgs );
       
   293 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   294 	TInt length ( listInterface->PolicyDataLengthL( uri, queryArgs() ) );
       
   295 	CleanupStack::PopAndDestroy();//uri		
       
   296 	return length;
       
   297 	}
       
   298 
       
   299 /**
       
   300 Fetches Policy data
       
   301 */
       
   302 TInt CInetUriListServerSession::QueryTldInfoL ( const RMessage2& aMessage )
       
   303 	{
       
   304 	RBuf8 uri;
       
   305 	CleanupClosePushL ( uri );
       
   306 	uri.CreateL (aMessage.GetDesLengthL (0));
       
   307 	TPckgBuf < TPolicyQueryArgs > queryArgs;
       
   308 	aMessage.ReadL ( 0, uri );
       
   309 	aMessage.ReadL ( 1, queryArgs );
       
   310 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   311 	HBufC8* resultBuf = listInterface->QueryTldInfoL( uri, queryArgs() );
       
   312 	CleanupStack::PushL ( resultBuf );
       
   313 	TInt resultLength ( resultBuf->Length() ) ;
       
   314 	aMessage.Write(2,resultBuf->Des(),0);
       
   315 	CleanupStack::PopAndDestroy(2);//uri, resultBuf 
       
   316 	return resultLength;
       
   317 	}
       
   318 
       
   319 /**
       
   320 Identifies whther Hosttype is in Black List or White List
       
   321 */
       
   322 TInt CInetUriListServerSession::GetHostTypeL ( const RMessage2& aMessage )
       
   323 	{
       
   324 	RBuf8 uri;
       
   325 	CleanupClosePushL ( uri );
       
   326 	uri.CreateL (aMessage.GetDesLengthL (0));
       
   327 	aMessage.ReadL ( 0, uri );
       
   328 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   329 	TInt hostType ( listInterface->GetHostTypeL( uri ) ); 
       
   330 	CleanupStack::PopAndDestroy(); //uri
       
   331 	return hostType;
       
   332 	}
       
   333 
       
   334 TInt CInetUriListServerSession::QueryL ( const RMessage2& aMessage )
       
   335 	{
       
   336 	TPckgBuf < TQueryArgs > queryArgs;
       
   337 	aMessage.ReadL ( 0, queryArgs );
       
   338 	CUriListInterface* listInterface = ( static_cast < const CInetUriListServer* > ( Server() ) )->UriListInterface ();
       
   339 
       
   340 	CUriListStream* listStream = GetListStreamL ( listInterface->QueryL ( queryArgs() ) );	
       
   341 	CleanupStack::PushL (listStream); 
       
   342 	iUriListStreams.AllocL ();
       
   343 	CleanupStack::Pop ();	// listStream
       
   344 	return iUriListStreams.Add ( listStream );
       
   345 	}
       
   346 
       
   347 TInt CInetUriListServerSession::ReadQueryResultsL ( const RMessage2& aMessage )
       
   348 	{
       
   349 	TInt handle = aMessage.Int0 ();
       
   350 	TInt totalRecords = 0;
       
   351 	CUriListStream* listStream = iUriListStreams.Find ( handle );
       
   352 	if ( !listStream )
       
   353 		{
       
   354 		// Panic the client	
       
   355 		aMessage.Panic ( KInetUriListServerName(), InetUriList::KErrInvalidStreamHandle );
       
   356 		return totalRecords;
       
   357 		}
       
   358 	TPtrC8 dataPtr;
       
   359 	totalRecords = listStream->WriteUriListL ( dataPtr );
       
   360 	aMessage.WriteL ( 1, dataPtr );
       
   361 	return totalRecords;
       
   362 	}
       
   363 
       
   364 TInt CInetUriListServerSession::CloseSrvStream ( const RMessage2& aMessage )
       
   365 	{
       
   366 	TInt handle = aMessage.Int0 ();
       
   367 	iUriListStreams.Remove ( handle );
       
   368 	
       
   369 	return KErrNone;
       
   370 	}
       
   371 	
       
   372 // ----------------------------------------------------------------------
       
   373 
       
   374 
       
   375 CInetUriListServer::CInetUriListServer ()
       
   376 : CPolicyServer ( EPriorityStandard, KInetUriListServerPolicy, ESharableSessions ),
       
   377 	iSessionCount (0)
       
   378 	{
       
   379 		
       
   380 	}
       
   381 
       
   382 CInetUriListServer::~CInetUriListServer ()
       
   383 	{
       
   384 	delete iUriListInterface;
       
   385 	}
       
   386 
       
   387 CInetUriListServer* CInetUriListServer::NewL ()
       
   388 	{
       
   389 	CInetUriListServer* self = new ( ELeave ) CInetUriListServer;
       
   390 	CleanupStack::PushL ( self );
       
   391 	
       
   392 	self->ConstructL ();
       
   393 	
       
   394 	CleanupStack::Pop ( self );
       
   395 	return self;
       
   396 	}
       
   397 
       
   398 void CInetUriListServer::ConstructL ()
       
   399 	{	
       
   400 	StartL ( KInetUriListServerName );
       
   401 	
       
   402 	iUriListInterface = CUriListInterface::NewL ();
       
   403 	}
       
   404 	
       
   405 void CInetUriListServer::IncSessionCount () const
       
   406 	{
       
   407 	++iSessionCount;	
       
   408 	}
       
   409 
       
   410 void CInetUriListServer::DecSessionCount () const
       
   411 	{
       
   412 	--iSessionCount;
       
   413 	
       
   414 	if ( iSessionCount == 0 )	
       
   415 		{
       
   416 		CActiveScheduler::Stop ();			
       
   417 		}
       
   418 	}
       
   419 
       
   420 void CInetUriListServer::Error ( TInt aError )
       
   421 	{
       
   422 	Message().Complete ( aError );
       
   423 	ReStart();
       
   424 	}
       
   425 
       
   426 CSession2* CInetUriListServer::NewSessionL( const TVersion& aVersion, const RMessage2& /* aMessage */ ) const
       
   427 	{
       
   428 	TVersion ver ( KInetUriListServerMajorVersion, KInetUriListServerMinorVersion, KInetUriListServerBuildVersion );
       
   429 	if ( !User::QueryVersionSupported ( ver,aVersion ) )
       
   430 		{
       
   431 		User::Leave( KErrNotSupported );
       
   432 		}
       
   433 
       
   434 	CInetUriListServerSession* session = CInetUriListServerSession::NewL ();
       
   435 	IncSessionCount ();
       
   436 	
       
   437 	return session;
       
   438 	}
       
   439 
       
   440 CUriListInterface* CInetUriListServer::UriListInterface () const
       
   441 	{
       
   442 	return iUriListInterface;		
       
   443 	}
       
   444 // ----------------------------------------------------------------------
       
   445 
       
   446 CInetUriListSrvScheduler::CInetUriListSrvScheduler ()
       
   447 	{
       
   448 	}
       
   449 
       
   450 CInetUriListSrvScheduler::~CInetUriListSrvScheduler()
       
   451 	{
       
   452 	delete iInetUriListSrv;
       
   453 	}
       
   454 
       
   455 CInetUriListSrvScheduler* CInetUriListSrvScheduler::NewL ()
       
   456 	{
       
   457 	CInetUriListSrvScheduler* self = new ( ELeave ) CInetUriListSrvScheduler;
       
   458 	CActiveScheduler::Install ( self );
       
   459 	
       
   460 	// Create the inet urilist server
       
   461 	self->iInetUriListSrv = CInetUriListServer::NewL ();
       
   462 	
       
   463 	return self;	
       
   464 	}
       
   465 
       
   466 void CInetUriListSrvScheduler::Error ( TInt aError ) const
       
   467 	{	
       
   468 	if ( iInetUriListSrv )	
       
   469 		{
       
   470 		iInetUriListSrv->Error( aError );			
       
   471 		}
       
   472 	}
       
   473 	
       
   474 // ----------------------------------------------------------------------
       
   475 //
       
   476 // Thread top level
       
   477 // Perform all server initialisation, in particular creation of the
       
   478 // scheduler and server and then run the scheduler
       
   479 //
       
   480 
       
   481 static void RunServerL()
       
   482 	{
       
   483 	// create and install the active scheduler we need
       
   484 	CInetUriListSrvScheduler* s = CInetUriListSrvScheduler::NewL();
       
   485 	CleanupStack::PushL(s);
       
   486 
       
   487 	//
       
   488 	// naming the server thread after the server helps to debug panics
       
   489 	User::LeaveIfError ( RThread().RenameMe ( KInetUriListServerName() ) );
       
   490 
       
   491 	//
       
   492 	// Initialisation complete, now signal the client
       
   493 	RProcess::Rendezvous ( KErrNone );
       
   494 	//
       
   495 	// Ready to run
       
   496 	CActiveScheduler::Start ();
       
   497 	//
       
   498 	// Cleanup the scheduler
       
   499 	CleanupStack::PopAndDestroy ( s );
       
   500 	}
       
   501 
       
   502 // Inet URI server entrypoint
       
   503 GLDEF_C TInt E32Main()
       
   504 	{
       
   505 	__UHEAP_MARK;
       
   506 	//
       
   507 	CTrapCleanup* cleanup = CTrapCleanup::New ();
       
   508 	TInt r = KErrNoMemory;
       
   509 	if ( cleanup )
       
   510 		{
       
   511 		TRAP ( r, RunServerL () );
       
   512 		delete cleanup;
       
   513 		}
       
   514 	__UHEAP_MARKEND;
       
   515 	return r;
       
   516 	}
       
   517