os/mm/devsound/devsoundrefplugin/src/platsec/client/MmfAudioServerProxy.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 2004-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 <f32file.h>
    17 #include <e32math.h>
    18 #include <s32mem.h>
    19 
    20 #include "MmfAudioServerProxy.h"
    21 #include "MmfAudioServerStart.h"
    22 #include "MmfBase.hrh"
    23 #include "MmfAudioClientServer.h"
    24 
    25 #define KMaxServerNameLength 256
    26 
    27 static const TUid KUidAudioServer = {KUidMmfAudioServerDllUnicodeDefine};
    28 const TInt KRetries = 5; 
    29 const TInt KInitialTime = 100000;  //100ms
    30 const TInt KTimeIncrement = 50000; // 50ms 
    31 
    32 
    33 EXPORT_C TInt RMMFAudioServerProxy::Open()
    34 	{
    35 
    36 	const TUidType serverUid(KNullUid,KNullUid,KUidAudioServer);
    37 		
    38 	// Assume the server is already running and attempt to create a session
    39 	// 4 message slots
    40 	TInt err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
    41 														KMMFAudioServerMinorVersionNumber,
    42 														KMMFAudioServerBuildVersionNumber));
    43 	if(err == KErrNotFound)
    44 		{
    45 		// Server not running
    46 		// Construct the server binary name
    47 		TBuf<KMaxServerNameLength> serverFile;
    48 		RProcess server;
    49 
    50 		_LIT(KEmpty,"");
    51 
    52 		err = server.Create(KAudioServerFileName, KEmpty, serverUid);
    53 		if(err != KErrNone)
    54 			return err;
    55 		// Synchronise with the server
    56 		TRequestStatus reqStatus;
    57 		server.Rendezvous(reqStatus);
    58 		
    59 		if (reqStatus!=KRequestPending)
    60 			{
    61 			server.Kill(0);
    62 			}
    63 		else
    64 			{
    65 			// Start the test harness
    66 			server.Resume();
    67 			// Server will call the reciprocal static synchronise call
    68 			}
    69 		User::WaitForRequest(reqStatus); // wait for rendezvous or death
    70 		server.Close();
    71 		TInt reqStatusValue = reqStatus.Int();
    72 		if(reqStatusValue != KErrNone)
    73 			{
    74 			if(reqStatusValue == KErrNoMemory || reqStatusValue == KErrNotFound)
    75 				{
    76 				// All error codes except KErrNoMemory and KErrNotFound are assumed
    77 				// to be a duplicate server instance dying, then keep trying connection
    78 				// to the server. This can happen when two servers attempt to start
    79 				// at the same time.
    80 				return reqStatusValue;
    81 				}
    82 			//Wait for sometime, then retry and creation session
    83 			TInt waitTime = KInitialTime;
    84 			for(TInt retries=0;retries<KRetries;retries++)
    85 				{
    86 				User::After(waitTime);
    87 				waitTime+=KTimeIncrement;
    88 				err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
    89 														KMMFAudioServerMinorVersionNumber,
    90 														KMMFAudioServerBuildVersionNumber));
    91 				if(err==KErrNone)
    92 					{
    93 					//Session created successfully
    94 					break;
    95 					}	
    96 				}			
    97 			}
    98 		else
    99 			{
   100 			//Create the root server session
   101 			err = CreateSession(KAudioServerName, TVersion(KMMFAudioServerVersion,
   102 														KMMFAudioServerMinorVersionNumber,
   103 														KMMFAudioServerBuildVersionNumber));	
   104 			}
   105 		}
   106 	return err;		
   107 		
   108 	}
   109 
   110 EXPORT_C TInt RMMFAudioServerProxy::SetDevSoundInfo()
   111 	{
   112 	return SendReceive(EMMFAudioLaunchRequests);
   113 	}
   114 
   115 EXPORT_C TInt RMMFAudioServerProxy::GetDevSoundSessionHandle()
   116 	{
   117 	return SendReceive(EMMFDevSoundSessionHandle);
   118 	}
   119