Sorting out both server side and client side. Now supporting more display APIs.
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)