os/graphics/graphicscomposition/surfaceupdate/src/surfaceupdateclient.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2006-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 /**
    17  @file
    18 */
    19 
    20 #include <graphics/surfaceupdateclient.h>
    21 #include <e32debug.h>
    22 #include "surfaceupdate.h"
    23 
    24 inline void SurfaceUpdateAssert(TInt aCond)	{__ASSERT_ALWAYS(aCond, User::Panic(_L("surfaceupdateclient.cpp; assertion failed"), __LINE__));}
    25 
    26 EXPORT_C RSurfaceUpdateSession::RSurfaceUpdateSession() :
    27 	RSessionBase(), 
    28 	iStatusAvailable(NULL), iStatusDisplayed(NULL), iStatusDisplayedXTimes(NULL), iTimeStamp(NULL), iCount(0)
    29 	{
    30 	}
    31 
    32 EXPORT_C TInt RSurfaceUpdateSession::Connect(TInt aMessageSlots)
    33 	{
    34 	if(Handle())
    35 		{
    36 		return KErrAlreadyExists; 
    37 		}
    38 	iStatusAvailable = NULL;
    39 	iStatusDisplayed = NULL;
    40 	iStatusDisplayedXTimes = NULL;
    41 	
    42 	//establish connection to the server
    43 #ifndef TEST_SURFACE_UPDATE
    44 	return CreateSession(KSurfaceUpdateServerName, Version(), aMessageSlots);
    45 #else
    46 	return CreateSession(KTestSurfaceUpdateServerName, Version(), aMessageSlots);
    47 #endif
    48 	}
    49 
    50 EXPORT_C void RSurfaceUpdateSession::Close()	
    51 	{
    52 	if(Handle())
    53 		{
    54 		RHandleBase::Close();
    55 		}
    56 	iStatusAvailable = NULL;
    57 	iStatusDisplayed = NULL;
    58 	iStatusDisplayedXTimes = NULL;
    59 	}
    60 
    61 EXPORT_C TInt RSurfaceUpdateSession::SubmitUpdate(TInt aScreen, const TSurfaceId& aSurfaceId, 
    62 									TInt aBuffer, const TRegion* aDirtyRegion)
    63 	{
    64 	SurfaceUpdateAssert(Handle() != KNullHandle);
    65 
    66 #if defined _DEBUG
    67 	if (aScreen != KAllScreens)
    68 		RDebug::Printf("You should use KAllScreens as the argument for the screen: (other values OK for test)");
    69 #endif
    70 
    71 	if(aScreen < 0 || aBuffer < 0 || aSurfaceId.IsNull())
    72 		{
    73 		IssueRequestComplete(KErrArgument);
    74 		return KErrArgument;
    75 		}
    76 	if(iStatusAvailable)
    77 		{
    78 		SendReceive(EUpdateServNotifyWhenAvailable, *iStatusAvailable);
    79 		iStatusAvailable= NULL;
    80 		}
    81 	
    82 	if(iStatusDisplayed)
    83 		{
    84 		TIpcArgs args(iTimeStamp);
    85 		SendReceive(EUpdateServNotifyWhenDisplayed, args, *iStatusDisplayed);
    86 		iStatusDisplayed=NULL;
    87 		}
    88 		
    89 	if(iStatusDisplayedXTimes)
    90 		{
    91 		if(iCount <= 0)
    92 			{
    93 			User::RequestComplete(iStatusDisplayedXTimes, KErrArgument);
    94 			}
    95 		else
    96 			{
    97 			TIpcArgs args(iCount);
    98 			SendReceive(EUpdateServNotifyWhenDisplayedXTimes, 
    99                      args, *iStatusDisplayedXTimes);
   100 			}	
   101 		iStatusDisplayedXTimes=NULL;
   102 		}
   103 
   104 	TPckgC<TSurfaceId> pckgSurfaceId(aSurfaceId);
   105 	TIpcArgs theArgs(aScreen, &pckgSurfaceId, aBuffer);
   106 
   107 	if(aDirtyRegion)
   108 		{
   109 		const TInt regionCount = aDirtyRegion->Count();
   110 		if(regionCount > 0)
   111 			{
   112 			TPtrC8 ptrRect(reinterpret_cast<const TUint8*> (aDirtyRegion->RectangleList()), regionCount * sizeof(TRect));
   113 			theArgs.Set(3, &ptrRect);
   114 			}
   115 		}
   116 
   117 	//final request for composition 
   118 	return SendReceive(EUpdateServSubmitUpdate, theArgs);
   119 	}
   120 
   121 EXPORT_C void RSurfaceUpdateSession::NotifyWhenAvailable(TRequestStatus& aStatus)
   122 	{
   123 	SurfaceUpdateAssert(Handle() != KNullHandle);
   124 	iStatusAvailable = &aStatus;
   125 	}
   126 	
   127 EXPORT_C void RSurfaceUpdateSession::NotifyWhenDisplayed(TRequestStatus& aStatus, TTimeStamp& aTimeStamp)
   128 	{
   129 	SurfaceUpdateAssert(Handle() != KNullHandle);
   130 	iStatusDisplayed = &aStatus;
   131 	iTimeStamp = &aTimeStamp;
   132 	}
   133 
   134 EXPORT_C void RSurfaceUpdateSession::NotifyWhenDisplayedXTimes(TInt aCount, TRequestStatus &aStatus)
   135 	{
   136 	SurfaceUpdateAssert(Handle() != KNullHandle);
   137 	iStatusDisplayedXTimes = &aStatus;
   138 	//we will check aCount validity at submission time (in SubmitUpdate)
   139 	iCount = aCount;
   140 	}
   141 
   142 EXPORT_C void RSurfaceUpdateSession::CancelAllUpdateNotifications()
   143 	{
   144 	SurfaceUpdateAssert(Handle() != KNullHandle);
   145 	SendReceive(EUpdateServCancelAllNotifications);
   146 	//Signal calling client's TRequestStatus object if server didn't do that (SubmitUpdate is not called)
   147 	//if SubmitUpdate is called, server will take care of signaling status object and following line does nothing
   148 	IssueRequestComplete(KErrCancel);
   149 	}
   150 	
   151 TVersion RSurfaceUpdateSession::Version() const
   152 	{
   153 	return (TVersion(KSurfaceUpdateServMajorVersionNumber, KSurfaceUpdateServMinorVersionNumber, KSurfaceUpdateServBuildVersionNumber));
   154 	}
   155 
   156 /*
   157  Helper function to complete all outstanding requests. 
   158  
   159  param - aErr Error code for completion.
   160  */
   161 void RSurfaceUpdateSession::IssueRequestComplete(TInt aErr)
   162 	{
   163 	if(iStatusAvailable)
   164 		{
   165 		User::RequestComplete(iStatusAvailable, aErr);
   166 		iStatusAvailable= NULL;
   167 		}
   168 	
   169 	if(iStatusDisplayed)
   170 		{
   171 		User::RequestComplete(iStatusDisplayed, aErr);
   172 		iStatusDisplayed=NULL;
   173 		}
   174 		
   175 	if(iStatusDisplayedXTimes)
   176 		{
   177 		User::RequestComplete(iStatusDisplayedXTimes, aErr);
   178 		iStatusDisplayedXTimes=NULL;
   179 		}
   180 	}