customization/ScreenSaverAdapter/ScreenSaverServer/src/ScreenSaverClient.cpp
changeset 0 3ce708148e4d
equal deleted inserted replaced
-1:000000000000 0:3ce708148e4d
       
     1 /*
       
     2 * Copyright (c) 2007 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: Implementation of customization components
       
    15 *
       
    16 */
       
    17  
       
    18 
       
    19 
       
    20 #include "ScreenSaverClientServer.h"
       
    21 #include "ScreenSaverClient.h"
       
    22 #include "debug.h"
       
    23 #include <f32file.h>
       
    24 
       
    25 
       
    26 TInt StartServer()
       
    27 	{
       
    28 	RDEBUG("RScreenSaverClient: StartServer()...");	
       
    29 	const TUidType serverUid(KNullUid,KNullUid,KDMSSServerUid);
       
    30 
       
    31 	RProcess server;
       
    32 	TInt r=server.Create(KDMSSServerImg,KNullDesC);
       
    33 
       
    34 	if (r!=KErrNone)
       
    35 		{
       
    36 		RDEBUG_2("RScreenSaverClient: server start failed %d",r);
       
    37 		return r;
       
    38 		}
       
    39 	TRequestStatus stat;
       
    40 	server.Rendezvous(stat);
       
    41 	if (stat!=KRequestPending)
       
    42 		server.Kill(0);		// abort startup
       
    43 	else
       
    44 		server.Resume();	// logon OK - start the server
       
    45 	RDEBUG("RScreenSaverClient: Started");
       
    46 	User::WaitForRequest(stat);		// wait for start or death
       
    47 	r=(server.ExitType()==EExitPanic) ? KErrGeneral : stat.Int();
       
    48 	server.Close();
       
    49 	return r;
       
    50 	}
       
    51 
       
    52 EXPORT_C TInt RScreenSaverClient::Connect()
       
    53 	{
       
    54 	RDEBUG("RScreenSaverClient::Connect - start");
       
    55 	TInt retry=2;
       
    56 	for (;;)
       
    57 		{
       
    58 		TInt r=CreateSession(KDMSSServerName,TVersion(0,0,0),50);
       
    59 		if (r!=KErrNotFound && r!=KErrServerTerminated)
       
    60 			return r;
       
    61 		if (--retry==0)
       
    62 			return r;
       
    63 		r=StartServer();
       
    64 		if (r!=KErrNone && r!=KErrAlreadyExists)
       
    65 			return r;
       
    66 		}
       
    67 	}
       
    68 
       
    69 
       
    70 EXPORT_C void RScreenSaverClient::Close()
       
    71 	{
       
    72 	RSessionBase::Close();  //basecall
       
    73 	}
       
    74 	
       
    75 	
       
    76 //EXPORT_C void RScreenSaverClient::GetScreenSaverListL(RArray< TUid >& aUids,CDesCArray& aIds)
       
    77 EXPORT_C void RScreenSaverClient::GetScreenSaverListL(CDesCArray& aIds)
       
    78 	{
       
    79 	RDEBUG("	-> RScreenSaverClient: GetScreenSaverList ... STARTED!");
       
    80 	TInt ssCount(0);
       
    81 	TPckgBuf<TInt>count(ssCount);
       
    82 	
       
    83 	User::LeaveIfError(SendReceive(EScreenSaversCount,TIpcArgs(&count)));
       
    84 	ssCount = count();
       
    85 	RDEBUG_2(" RScreenSaverClient: GetScreenSaverList **SSCount : %d",ssCount);
       
    86 	
       
    87 	HBufC8* buffer = HBufC8::NewLC((sizeof(TUid)*ssCount)+sizeof(TInt8));
       
    88     TPtr8 bufPtr = buffer->Des();
       
    89     TInt err =  SendReceive(EGetAvailableScreenSavers,TIpcArgs(&bufPtr));
       
    90 	
       
    91 	if ( err == KErrNone || err == KErrOverflow )
       
    92 		{
       
    93 		RDesReadStream stream( bufPtr );
       
    94 		CleanupClosePushL( stream );
       
    95 		TInt count = stream.ReadInt8L();
       
    96 
       
    97 		for ( TInt i = 0; i < count; ++i )
       
    98         	{
       
    99 	        TUid uid = TUid::Uid(stream.ReadInt32L());
       
   100 	        //aUids.AppendL( uid );
       
   101 	        aIds.AppendL( uid.Name() );
       
   102         	}
       
   103         
       
   104 		//aUids.SortSigned( );
       
   105 		aIds.Sort( );
       
   106 		
       
   107     	CleanupStack::PopAndDestroy(&stream);
       
   108 		CleanupStack::PopAndDestroy(buffer);
       
   109 		}
       
   110 	RDEBUG("	-> RScreenSaverClient: GetScreenSaverList ... END!");
       
   111 	}
       
   112 	
       
   113 	
       
   114 EXPORT_C void RScreenSaverClient::GetScreenSaverListInfoL(RSSListInfoPtrArray &aScreenSaverList)
       
   115 	{
       
   116 	RDEBUG("	-> RScreenSaverClient: GetScreenSaverListInfo ... STARTED!");
       
   117 	
       
   118 	TInt ssCount(0);
       
   119 	TPckgBuf<TInt>count(ssCount);
       
   120 	User::LeaveIfError(SendReceive(EScreenSaversCount,TIpcArgs(&count)));
       
   121 	
       
   122 	ssCount = count();
       
   123 	RDEBUG_2(" RScreenSaverClient: GetScreenSaverListInfo **SSCount : %d",ssCount);
       
   124 
       
   125 	HBufC8* buffer = HBufC8::NewLC(KSSInfoBufferLength * ssCount);
       
   126     TPtr8 bufPtr = buffer->Des();
       
   127 
       
   128 	TInt err =  SendReceive(EGetscreensaverInfo,TIpcArgs(&bufPtr));
       
   129 	TInt lenght = bufPtr.Length();
       
   130 	if ( err == KErrNone || err == KErrOverflow )
       
   131 		{
       
   132 		RDesReadStream stream( bufPtr );
       
   133 		CleanupClosePushL( stream );
       
   134 		TInt count = stream.ReadInt8L();
       
   135 		
       
   136 			
       
   137 		for ( TInt i = 0; i < count; ++i )
       
   138     		{
       
   139 	        TUid uid = TUid::Uid(stream.ReadInt32L());
       
   140 	        TInt version = stream.ReadInt32L();
       
   141 	        
       
   142 	        TInt length = stream.ReadUint32L();
       
   143 	        HBufC* name = HBufC::NewLC( stream,length  );
       
   144 	        
       
   145 	        length = stream.ReadUint32L();
       
   146 	        HBufC8* opaqueData = HBufC8::NewLC( stream, length );
       
   147 	        
       
   148 	        
       
   149 	        CScreenSaverListInfo *ScreensaverInfo = CScreenSaverListInfo::NewL(uid,
       
   150 	        																   version,
       
   151 	        																   name,
       
   152 	 	       																   opaqueData);
       
   153 	        //TInt error = aScreenSaverList.Append(ScreensaverInfo);
       
   154 	        User::LeaveIfError(aScreenSaverList.Append(ScreensaverInfo));
       
   155 	        
       
   156 	        CleanupStack::PopAndDestroy(opaqueData); 
       
   157 	        CleanupStack::PopAndDestroy(name); 
       
   158     		}
       
   159   	   	CleanupStack::PopAndDestroy(&stream);
       
   160 		CleanupStack::PopAndDestroy(buffer);
       
   161 		}
       
   162 	RDEBUG("	-> RScreenSaverClient: GetScreenSaverListInfo ... Ended!");
       
   163 	}
       
   164 
       
   165 
       
   166 
       
   167 CScreenSaverListInfo* CScreenSaverListInfo::NewL(TUid aUid, 
       
   168 												   TInt aVersion, 
       
   169 												   TDesC*  aName, 
       
   170 												   TDesC8* aOpaqueData)
       
   171 	{
       
   172 	CScreenSaverListInfo* self = CScreenSaverListInfo::NewLC(aUid, 
       
   173 															aVersion, 
       
   174 															aName, 
       
   175 															aOpaqueData);
       
   176     CleanupStack::Pop(self);
       
   177     return self;
       
   178 	}
       
   179 												   
       
   180 
       
   181 CScreenSaverListInfo* CScreenSaverListInfo::NewLC(TUid aUid, 
       
   182 												   TInt aVersion, 
       
   183 												   TDesC*  aName, 
       
   184 												   TDesC8* aOpaqueData)
       
   185 	{
       
   186 	RDEBUG("CScreenSaverListInfo::NewLC - start");
       
   187 	
       
   188 	CScreenSaverListInfo* self = new(ELeave)CScreenSaverListInfo(aUid,aVersion);
       
   189 	CleanupStack::PushL(self);
       
   190 	self->ConstructL(aName,aOpaqueData);
       
   191 	RDEBUG("CScreenSaverListInfo::NewLC - end");
       
   192 	return self;
       
   193 	}
       
   194 
       
   195 
       
   196 CScreenSaverListInfo::CScreenSaverListInfo(TUid aUid, 
       
   197 											TInt aVersion)
       
   198 											
       
   199 		
       
   200 	:CBase(),
       
   201 	iUid(aUid),
       
   202 	iVersion(aVersion)								
       
   203 	{
       
   204 	//Do nothing here
       
   205 	}
       
   206 
       
   207 CScreenSaverListInfo::~CScreenSaverListInfo()
       
   208 	{
       
   209 	delete iName;
       
   210 	iName = NULL;
       
   211 	delete iOpaqueData;
       
   212 	iOpaqueData = NULL;
       
   213 	}
       
   214 
       
   215 void CScreenSaverListInfo::ConstructL(TDesC*  aName, 
       
   216 									  TDesC8* aOpaqueData)
       
   217 	{
       
   218 	iName = aName->AllocL();
       
   219 	iOpaqueData = aOpaqueData->AllocL();
       
   220 	}
       
   221 
       
   222 
       
   223 EXPORT_C const TDesC& CScreenSaverListInfo::DisplayName() const
       
   224 	{
       
   225 	if(iName == NULL)
       
   226 		return KNullDesC();
       
   227 	else
       
   228 		return *iName;
       
   229 	}
       
   230 
       
   231 
       
   232 
       
   233 EXPORT_C const TDesC8& CScreenSaverListInfo::OpaqueData() const
       
   234 	{
       
   235 	if(iOpaqueData == NULL)
       
   236 		return KNullDesC8();
       
   237 	else
       
   238 		return *iOpaqueData;
       
   239 	}
       
   240 
       
   241 
       
   242 EXPORT_C TUid CScreenSaverListInfo::ImplementationUid() const
       
   243 	{
       
   244 	return iUid;
       
   245 	}
       
   246 
       
   247 
       
   248 EXPORT_C TInt CScreenSaverListInfo::Version() const
       
   249 	{
       
   250 	return iVersion;
       
   251 	}
       
   252 	
       
   253 //End of file
       
   254