Sorting out both server side and client side. Now supporting more display APIs.
authorlenclud@WUE-9BW295J.ad.garmin.com
Fri, 08 Feb 2013 17:43:02 +0100
changeset 3e4cac218e73f
parent 2 ebd2fb40b033
child 4 0b9403db32ef
Sorting out both server side and client side. Now supporting more display APIs.
CSNamedPipe/CSNamedPipe/NamedPipeServer.cs
CSNamedPipe/CSNamedPipe/Program.cs
SoundGraphAccess.cpp
     1.1 --- a/CSNamedPipe/CSNamedPipe/NamedPipeServer.cs	Thu Feb 07 20:11:58 2013 +0100
     1.2 +++ b/CSNamedPipe/CSNamedPipe/NamedPipeServer.cs	Fri Feb 08 17:43:02 2013 +0100
     1.3 @@ -4,6 +4,7 @@
     1.4  using System.Runtime.InteropServices;
     1.5  using System.Threading;
     1.6  using System.IO;
     1.7 +using System.Diagnostics;
     1.8  
     1.9  namespace CSNamedPipe
    1.10  {
    1.11 @@ -77,10 +78,11 @@
    1.12           */
    1.13          private void ThreadOutbound()
    1.14          {
    1.15 -            //TODO: Check that 255
    1.16 +            
    1.17 +            //Create our outbound named pipe
    1.18              iPipeOutbound = CreateNamedPipe(this.iPipeNameOutbound, PIPE_ACCESS_OUTBOUND /*| FILE_FLAG_OVERLAPPED*/, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero);
    1.19  
    1.20 -            //could not create named pipe
    1.21 +            //Could not create named pipe
    1.22              if (iPipeOutbound.IsInvalid)
    1.23              {
    1.24                  //TODO: error handling
    1.25 @@ -123,6 +125,7 @@
    1.26              if (success == 0)
    1.27                  return;
    1.28  
    1.29 +            //Client now connected create our inbound stream
    1.30              iStreamInbound = new FileStream(iPipeInbound, FileAccess.Read, BUFFER_SIZE, false);
    1.31  
    1.32  
    1.33 @@ -168,7 +171,8 @@
    1.34                      byte[] Rc = new byte[ReadLength];
    1.35                      Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength);
    1.36  
    1.37 -                    Console.WriteLine("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength));
    1.38 +                    Console.WriteLine(encoder.GetString(Rc, 0, ReadLength));
    1.39 +                    Trace.WriteLine("Received " + ReadLength + " Bytes: " + encoder.GetString(Rc, 0, ReadLength));
    1.40                      buffer.Initialize();
    1.41                  }
    1.42                 
     2.1 --- a/CSNamedPipe/CSNamedPipe/Program.cs	Thu Feb 07 20:11:58 2013 +0100
     2.2 +++ b/CSNamedPipe/CSNamedPipe/Program.cs	Fri Feb 08 17:43:02 2013 +0100
     2.3 @@ -1,5 +1,6 @@
     2.4  using System;
     2.5  using System.Text;
     2.6 +using System.Diagnostics;
     2.7  
     2.8  
     2.9  namespace CSNamedPipe
    2.10 @@ -8,18 +9,24 @@
    2.11      {
    2.12          static void Main(string[] args)
    2.13          {
    2.14 -            //NamedPipeServer PServer1 = new NamedPipeServer(@"\\.\pipe\myNamedPipe1",0);
    2.15 -            //NamedPipeServer PServer2 = new NamedPipeServer(@"\\.\pipe\myNamedPipe2",1);
    2.16 +            //Start our client if needed
    2.17 +            Process[] processes = Process.GetProcessesByName("SoundGraphAccess");
    2.18 +            if (!(processes.Length > 0))
    2.19 +            {
    2.20 +                Process client = new Process();
    2.21 +                client.StartInfo.FileName = @"E:\Dev\SoundGraphAccess\Debug\SoundGraphAccess.exe";
    2.22 +                client.StartInfo.WorkingDirectory = @"E:\Dev\SoundGraphAccess";
    2.23 +                client.Start();
    2.24 +            }
    2.25 +
    2.26 +            //Create and start our server
    2.27              NamedPipeServer server = new NamedPipeServer(@"\\.\pipe\sga-receiver", @"\\.\pipe\sga-sender");
    2.28 -            
    2.29 -
    2.30 -            //PServer1.Start();
    2.31              server.Start();
    2.32  
    2.33              string Ms="Start";
    2.34              do
    2.35              {
    2.36 -                Console.WriteLine("Enter the message");
    2.37 +                //Console.WriteLine("Enter the message");
    2.38                  Ms = Console.ReadLine();
    2.39                  server.SendMessage(Ms);
    2.40              } while (Ms != "quit");
     3.1 --- a/SoundGraphAccess.cpp	Thu Feb 07 20:11:58 2013 +0100
     3.2 +++ b/SoundGraphAccess.cpp	Fri Feb 08 17:43:02 2013 +0100
     3.3 @@ -4,10 +4,15 @@
     3.4  #include "stdafx.h"
     3.5  #include "SoundGraphAccess.h"
     3.6  #include "iMONDisplayAPI.h"
     3.7 +#include <stdio.h>
     3.8  
     3.9 -#define WM_DSP_PLUGIN_NOTIFY	WM_APP + 1100
    3.10 -#define WM_IMON_INIT			WM_APP + 1101
    3.11 -#define WM_IMON_UNINIT			WM_APP + 1102
    3.12 +#define WM_DSP_PLUGIN_NOTIFY			WM_APP + 1100
    3.13 +#define WM_IMON_INIT					WM_APP + 1101
    3.14 +#define WM_IMON_UNINIT					WM_APP + 1102
    3.15 +#define WM_IMON_IS_INIT					WM_APP + 1103
    3.16 +#define WM_IMON_IS_PLUGIN_MODE_ENABLED	WM_APP + 1104
    3.17 +
    3.18 +//
    3.19  #define MAX_LOADSTRING 100
    3.20  
    3.21  
    3.22 @@ -15,14 +20,14 @@
    3.23  HINSTANCE hInst = 0;								// current instance
    3.24  TCHAR szTitle[MAX_LOADSTRING];					// The title bar text
    3.25  TCHAR szWindowClass[MAX_LOADSTRING];			// the main window class name
    3.26 -HANDLE gThreadReceiver = 0;
    3.27 -HANDLE gThreadSender = 0;
    3.28 +HANDLE gThreadReceiver = INVALID_HANDLE_VALUE;
    3.29 +//HANDLE gThreadSender = INVALID_HANDLE_VALUE;
    3.30  BOOL gQuit=FALSE;
    3.31  
    3.32  LPTSTR gPipeNameSender = TEXT("\\\\.\\pipe\\sga-sender"); 
    3.33  LPTSTR gPipeNameReceiver = TEXT("\\\\.\\pipe\\sga-receiver"); 
    3.34 -HANDLE gPipeSender=0;
    3.35 -HANDLE gPipeReceiver=0;
    3.36 +HANDLE gPipeSender=INVALID_HANDLE_VALUE;
    3.37 +HANDLE gPipeReceiver=INVALID_HANDLE_VALUE;
    3.38  
    3.39  char gBufferReceiver[256];
    3.40  char gBufferSender[256];
    3.41 @@ -40,11 +45,20 @@
    3.42  LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
    3.43  INT_PTR CALLBACK	About(HWND, UINT, WPARAM, LPARAM);
    3.44  
    3.45 -
    3.46 -const char KMsgDone[]="done";
    3.47 -const char KMsgError[]="error";
    3.48 -
    3.49 -
    3.50 +//Supported responses
    3.51 +const char KRspDone[]="done:";
    3.52 +const char KRspPending[]="pending:";
    3.53 +const char KRspError[]="error:";
    3.54 +const char KRspClose[]="close:";
    3.55 +const char KRspOpen[]="open:";
    3.56 +const char KRspUnknown[]="unknown:";
    3.57 +const char KRspTrue[]="true:";
    3.58 +const char KRspFalse[]="false:";
    3.59 +//Supported incoming messages
    3.60 +const char KMsgInit[]="init:";
    3.61 +const char KMsgUninit[]="uninit:";
    3.62 +const char KMsgIsInit[]="is-init:";
    3.63 +const char KMsgIsPluginModeEnabled[]="is-plugin-mode-enabled:";
    3.64  
    3.65  /**
    3.66  Send a message to our server.
    3.67 @@ -52,6 +66,9 @@
    3.68  void SendMessageToServer(const char* aResponse)
    3.69  	{
    3.70  	DWORD cbWritten=0;
    3.71 +	char msg[512];
    3.72 +	sprintf(msg,"%s\n",aResponse);
    3.73 +	OutputDebugStringA(msg);
    3.74  	WriteFile(gPipeSender, aResponse, strlen(aResponse), &cbWritten, NULL);		
    3.75  	}
    3.76  
    3.77 @@ -62,96 +79,107 @@
    3.78  void MessageReceived(const char* aMsg)
    3.79  	{
    3.80  	//
    3.81 -
    3.82 -	if (strcmp(aMsg,"handshake")==0)
    3.83 -		{
    3.84 -		const char response[]="ready";
    3.85 -		DWORD cbWritten=0;
    3.86 -		SendMessageToServer(response);
    3.87 -		}
    3.88 -	else if (strcmp(aMsg,"init")==0)
    3.89 -		{
    3.90 -		/*
    3.91 -		DSPResult res=IMON_Display_Uninit();
    3.92 -		res=IMON_Display_Init(gWnd, WM_DSP_PLUGIN_NOTIFY);
    3.93 -		if (res!=DSP_SUCCEEDED)
    3.94 -			{
    3.95 -			SendMessage(error);
    3.96 -			}
    3.97 -		*/
    3.98 -		//IMON API call need to be done from window thread for some reason
    3.99 -		SendMessage(gWnd,WM_IMON_INIT,0,0);
   3.100 -		}
   3.101 -	else if (strcmp(aMsg,"uninit")==0)
   3.102 +	if (strcmp(aMsg,KMsgInit)==0)
   3.103  		{
   3.104  		//IMON API call need to be done from window thread for some reason
   3.105 -		SendMessage(gWnd,WM_IMON_UNINIT,0,0);
   3.106 +		SendMessageToServer(KRspPending);
   3.107 +		PostMessage(gWnd,WM_IMON_INIT,0,0);
   3.108 +		}
   3.109 +	else if (strcmp(aMsg,KMsgUninit)==0)
   3.110 +		{
   3.111 +		//IMON API call need to be done from window thread for some reason
   3.112 +		SendMessageToServer(KRspPending);
   3.113 +		PostMessage(gWnd,WM_IMON_UNINIT,0,0);		
   3.114 +		}
   3.115 +	else if (strcmp(aMsg,KMsgIsPluginModeEnabled)==0)
   3.116 +		{
   3.117 +		//IMON API call need to be done from window thread for some reason
   3.118 +		SendMessageToServer(KRspPending);
   3.119 +		PostMessage(gWnd,WM_IMON_IS_PLUGIN_MODE_ENABLED,0,0);		
   3.120 +		}
   3.121 +	else if (strcmp(aMsg,KMsgIsInit)==0)
   3.122 +		{
   3.123 +		//IMON API call need to be done from window thread for some reason
   3.124 +		SendMessageToServer(KRspPending);
   3.125 +		PostMessage(gWnd,WM_IMON_IS_INIT,0,0);		
   3.126 +		}
   3.127 +	else
   3.128 +		{		
   3.129 +		SendMessageToServer(KRspUnknown);
   3.130 +		}
   3.131 +	}
   3.132 +
   3.133 +
   3.134 +
   3.135 +/**
   3.136 +Connect our named pipes from here.
   3.137 +First connect our read pipe then our write pipe.
   3.138 +Then notify our server we are connected.
   3.139 +Then keep on waiting for incoming messages.
   3.140 +*/
   3.141 +DWORD WINAPI ThreadReceiver( LPVOID lpParam )
   3.142 +	{
   3.143 +	//Keep on trying to connect on our read pipe
   3.144 +	while (gPipeReceiver==INVALID_HANDLE_VALUE && !gQuit)
   3.145 +		{
   3.146 +		OutputDebugStringA("Trying to connect...\n");
   3.147 +		gPipeReceiver=CreateFile(gPipeNameReceiver,	GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
   3.148 +		Sleep(1000);
   3.149 +		}
   3.150 +	
   3.151 +	OutputDebugStringA("Read pipe open!\n");
   3.152 +	//Now try connecting on our write pipe
   3.153 +	gPipeSender=CreateFile(gPipeNameSender,	GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
   3.154 +	if (gPipeSender==INVALID_HANDLE_VALUE)
   3.155 +		{
   3.156 +		OutputDebugStringA("ERROR: Write pipe failure!\n");
   3.157 +		gQuit=TRUE;
   3.158  		}
   3.159  	else
   3.160  		{
   3.161 -		const char response[]="unknown";
   3.162 -		SendMessageToServer(response);
   3.163 +		OutputDebugStringA("Write pipe opened.\n");
   3.164 +		OutputDebugStringA("Connected.\n");
   3.165 +		SendMessageToServer(KRspOpen);
   3.166  		}
   3.167 -	}
   3.168 -
   3.169 -
   3.170 -
   3.171 -/**
   3.172 -Read our pipe from this thread
   3.173 -*/
   3.174 -DWORD WINAPI ThreadReceiver( LPVOID lpParam )
   3.175 -	{
   3.176 -	//Create our pipe and listen
   3.177 -	gPipeReceiver=CreateFile(gPipeNameReceiver,	GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
   3.178 +	//
   3.179  
   3.180  	while(!gQuit)
   3.181  		{
   3.182  		DWORD cbRead;
   3.183  		BOOL success=ReadFile(gPipeReceiver,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL); 
   3.184  		if(success)
   3.185 -			{			
   3.186 +			{
   3.187  			gBufferReceiver[cbRead]='\0';
   3.188  			OutputDebugStringA(gBufferReceiver);
   3.189  			MessageReceived(gBufferReceiver);
   3.190  			}
   3.191 -		if (!success && GetLastError() != ERROR_MORE_DATA) 
   3.192 +		//if (!success && GetLastError() != ERROR_MORE_DATA) 
   3.193 +		//	{
   3.194 +		//	OutputDebugStringA("Can't Read\n");
   3.195 +		//	}
   3.196 +		//
   3.197 +		//Sleep(500);
   3.198 +
   3.199 +		if (!success)
   3.200  			{
   3.201 -			OutputDebugStringA("Can't Read\n");
   3.202 +			gQuit=TRUE;
   3.203  			}
   3.204 -		//
   3.205 -		Sleep(500);
   3.206  		}
   3.207  
   3.208 -	if (gPipeReceiver!=0)
   3.209 -		{
   3.210 -		CloseHandle(gPipeReceiver);	
   3.211 -		gPipeReceiver=0;
   3.212 -		}
   3.213 -	
   3.214 +	//Try tell our server
   3.215 +	SendMessageToServer(KRspClose);
   3.216 +	//Close our pipes
   3.217 +	CloseHandle(gPipeReceiver);	
   3.218 +	gPipeReceiver=INVALID_HANDLE_VALUE;
   3.219 +	CloseHandle(gPipeSender);	
   3.220 +	gPipeSender=INVALID_HANDLE_VALUE;
   3.221 +	//Quit our application
   3.222 +	PostMessage(gWnd,WM_CLOSE,0,0);
   3.223 +		
   3.224  	return 0;
   3.225  	}
   3.226  
   3.227  
   3.228 -/**
   3.229 -Write to our pipe from this thread
   3.230 -*/
   3.231 -DWORD WINAPI ThreadSender( LPVOID lpParam )
   3.232 -	{
   3.233 -	
   3.234 -	gPipeSender=CreateFile(gPipeNameSender,	GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
   3.235 -	
   3.236 -	
   3.237 -	/*
   3.238 -	if (gPipeSender!=0)
   3.239 -		{
   3.240 -		CloseHandle(gPipeSender);
   3.241 -		gPipeSender=0;
   3.242 -		}
   3.243 -	*/
   3.244 -
   3.245 -	return 0;
   3.246 -	}
   3.247 -
   3.248  
   3.249  /**
   3.250  */
   3.251 @@ -193,7 +221,6 @@
   3.252  		}
   3.253  
   3.254  	return (int) msg.wParam;
   3.255 -
   3.256  	}
   3.257  
   3.258  /**
   3.259 @@ -209,23 +236,33 @@
   3.260  			case DSPN_ERR_IN_USED:			strErrMsg = ("Display Plug-in is Already Used by Other Application.");		break;
   3.261  			case DSPN_ERR_HW_DISCONNECTED:	strErrMsg = ("iMON HW is Not Connected.");									break;
   3.262  			case DSPN_ERR_NOT_SUPPORTED_HW:	strErrMsg = ("The Connected iMON HW doesn't Support Display Plug-in.");		break;
   3.263 -			case DSPN_ERR_PLUGIN_DISABLED:	strErrMsg = ("Display Plug-in Mode Option is Disabled.");						break;
   3.264 +			case DSPN_ERR_PLUGIN_DISABLED:	strErrMsg = ("Display Plug-in Mode Option is Disabled.");					break;
   3.265  			case DSPN_ERR_IMON_NO_REPLY:	strErrMsg = ("The Latest iMON is Not Installed or iMON Not Running.");		break;
   3.266 -			case DSPN_ERR_UNKNOWN:			strErrMsg = ("Unknown Failure.");												break;
   3.267 +			case DSPN_ERR_UNKNOWN:			strErrMsg = ("Unknown Failure.");											break;
   3.268  			}
   3.269  		}
   3.270  	else
   3.271  		{
   3.272  		switch(uErrCode)
   3.273  			{
   3.274 -			case DSPNM_PLUGIN_SUCCEED:		strErrMsg = ("Plug-in Mode Inited Successfully.");		break;
   3.275 +			case DSPNM_PLUGIN_SUCCEED:		strErrMsg = ("Plug-in Mode Inited Successfully.");			break;
   3.276  			case DSPNM_IMON_RESTARTED:		strErrMsg = ("iMON Started and Plug-in Mode Inited.");		break;
   3.277  			case DSPNM_HW_CONNECTED:		strErrMsg = ("iMON HW Connected and Plug-in Mode Inited.");	break;
   3.278  			}
   3.279  		}
   3.280  	//
   3.281  	OutputDebugStringA(strErrMsg);
   3.282 -	SendMessageToServer(strErrMsg);
   3.283 +
   3.284 +	char msg[256];
   3.285 +	if (bError)
   3.286 +		{
   3.287 +		sprintf(msg,"error:%s",strErrMsg);
   3.288 +		}
   3.289 +	else
   3.290 +		{
   3.291 +		sprintf(msg,"done:%s",strErrMsg);	
   3.292 +		}	
   3.293 +	SendMessageToServer(msg);
   3.294  	}
   3.295  
   3.296  
   3.297 @@ -316,7 +353,6 @@
   3.298  		//IMON_Display_Uninit();
   3.299  		//IMON_Display_Init(hWnd, WM_DSP_PLUGIN_NOTIFY);
   3.300  		gThreadReceiver = CreateThread( NULL, 0, ThreadReceiver, NULL/*data pointer*/, 0, NULL);
   3.301 -		gThreadSender = CreateThread( NULL, 0, ThreadSender, NULL/*data pointer*/, 0, NULL);
   3.302  		break;
   3.303  	case WM_COMMAND:
   3.304  		wmId    = LOWORD(wParam);
   3.305 @@ -342,20 +378,19 @@
   3.306  	case WM_DESTROY:
   3.307  		gQuit=TRUE;
   3.308  		//To complete write op
   3.309 -		if (gPipeSender!=0)
   3.310 +		if (gPipeSender!=INVALID_HANDLE_VALUE)
   3.311  			{
   3.312  			CloseHandle(gPipeSender);
   3.313 -			gPipeSender=0;
   3.314 +			gPipeSender=INVALID_HANDLE_VALUE;
   3.315  			}
   3.316  		//To complete read op
   3.317 -		if (gPipeReceiver!=0)
   3.318 +		if (gPipeReceiver!=INVALID_HANDLE_VALUE)
   3.319  			{
   3.320  			CloseHandle(gPipeReceiver);
   3.321 -			gPipeReceiver=0;
   3.322 +			gPipeReceiver=INVALID_HANDLE_VALUE;
   3.323  			}
   3.324 -		WaitForSingleObject(gThreadSender,INFINITE);
   3.325 +
   3.326  		WaitForSingleObject(gThreadReceiver,INFINITE);
   3.327 -		CloseHandle(gThreadSender);
   3.328  		CloseHandle(gThreadReceiver);
   3.329  		//IMON_Display_Uninit();
   3.330  		PostQuitMessage(0);
   3.331 @@ -363,13 +398,36 @@
   3.332  
   3.333  	case WM_IMON_UNINIT:
   3.334  		IMON_Display_Uninit();
   3.335 -		SendMessageToServer(KMsgDone);
   3.336 +		SendMessageToServer(KRspDone);
   3.337  		break;
   3.338  
   3.339  	case WM_IMON_INIT:
   3.340  		IMON_Display_Uninit();
   3.341  		IMON_Display_Init(hWnd, WM_DSP_PLUGIN_NOTIFY);
   3.342  		break;
   3.343 +	//
   3.344 +	case WM_IMON_IS_PLUGIN_MODE_ENABLED:
   3.345 +		if (IMON_Display_IsPluginModeEnabled()==DSP_S_IN_PLUGIN_MODE)
   3.346 +			{
   3.347 +			SendMessageToServer(KRspTrue);
   3.348 +			}
   3.349 +		else
   3.350 +			{
   3.351 +			SendMessageToServer(KRspFalse);
   3.352 +			}
   3.353 +		break;
   3.354 +	//
   3.355 +	case WM_IMON_IS_INIT:
   3.356 +		if (IMON_Display_IsInited()==DSP_S_INITED)
   3.357 +			{
   3.358 +			SendMessageToServer(KRspTrue);
   3.359 +			}
   3.360 +		else
   3.361 +			{
   3.362 +			SendMessageToServer(KRspFalse);
   3.363 +			}
   3.364 +		break;
   3.365 +
   3.366  
   3.367  	case WM_DSP_PLUGIN_NOTIFY:
   3.368  		switch(wParam)