# HG changeset patch # User lenclud@WUE-9BW295J.ad.garmin.com # Date 1360341782 -3600 # Node ID e4cac218e73fef56ea919dc4a0fcf68d4e9c5176 # Parent ebd2fb40b03324c5e7293f4024f531ede0359fba Sorting out both server side and client side. Now supporting more display APIs. diff -r ebd2fb40b033 -r e4cac218e73f CSNamedPipe/CSNamedPipe/NamedPipeServer.cs --- a/CSNamedPipe/CSNamedPipe/NamedPipeServer.cs Thu Feb 07 20:11:58 2013 +0100 +++ b/CSNamedPipe/CSNamedPipe/NamedPipeServer.cs Fri Feb 08 17:43:02 2013 +0100 @@ -4,6 +4,7 @@ using System.Runtime.InteropServices; using System.Threading; using System.IO; +using System.Diagnostics; namespace CSNamedPipe { @@ -77,10 +78,11 @@ */ private void ThreadOutbound() { - //TODO: Check that 255 + + //Create our outbound named pipe iPipeOutbound = CreateNamedPipe(this.iPipeNameOutbound, PIPE_ACCESS_OUTBOUND /*| FILE_FLAG_OVERLAPPED*/, PIPE_TYPE_BYTE, PIPE_UNLIMITED_INSTANCES, BUFFER_SIZE, BUFFER_SIZE, 0, IntPtr.Zero); - //could not create named pipe + //Could not create named pipe if (iPipeOutbound.IsInvalid) { //TODO: error handling @@ -123,6 +125,7 @@ if (success == 0) return; + //Client now connected create our inbound stream iStreamInbound = new FileStream(iPipeInbound, FileAccess.Read, BUFFER_SIZE, false); @@ -168,7 +171,8 @@ byte[] Rc = new byte[ReadLength]; Buffer.BlockCopy(buffer, 0, Rc, 0, ReadLength); - Console.WriteLine("C# App: Received " + ReadLength +" Bytes: "+ encoder.GetString(Rc, 0, ReadLength)); + Console.WriteLine(encoder.GetString(Rc, 0, ReadLength)); + Trace.WriteLine("Received " + ReadLength + " Bytes: " + encoder.GetString(Rc, 0, ReadLength)); buffer.Initialize(); } diff -r ebd2fb40b033 -r e4cac218e73f CSNamedPipe/CSNamedPipe/Program.cs --- a/CSNamedPipe/CSNamedPipe/Program.cs Thu Feb 07 20:11:58 2013 +0100 +++ b/CSNamedPipe/CSNamedPipe/Program.cs Fri Feb 08 17:43:02 2013 +0100 @@ -1,5 +1,6 @@ using System; using System.Text; +using System.Diagnostics; namespace CSNamedPipe @@ -8,18 +9,24 @@ { static void Main(string[] args) { - //NamedPipeServer PServer1 = new NamedPipeServer(@"\\.\pipe\myNamedPipe1",0); - //NamedPipeServer PServer2 = new NamedPipeServer(@"\\.\pipe\myNamedPipe2",1); + //Start our client if needed + Process[] processes = Process.GetProcessesByName("SoundGraphAccess"); + if (!(processes.Length > 0)) + { + Process client = new Process(); + client.StartInfo.FileName = @"E:\Dev\SoundGraphAccess\Debug\SoundGraphAccess.exe"; + client.StartInfo.WorkingDirectory = @"E:\Dev\SoundGraphAccess"; + client.Start(); + } + + //Create and start our server NamedPipeServer server = new NamedPipeServer(@"\\.\pipe\sga-receiver", @"\\.\pipe\sga-sender"); - - - //PServer1.Start(); server.Start(); string Ms="Start"; do { - Console.WriteLine("Enter the message"); + //Console.WriteLine("Enter the message"); Ms = Console.ReadLine(); server.SendMessage(Ms); } while (Ms != "quit"); diff -r ebd2fb40b033 -r e4cac218e73f SoundGraphAccess.cpp --- a/SoundGraphAccess.cpp Thu Feb 07 20:11:58 2013 +0100 +++ b/SoundGraphAccess.cpp Fri Feb 08 17:43:02 2013 +0100 @@ -4,10 +4,15 @@ #include "stdafx.h" #include "SoundGraphAccess.h" #include "iMONDisplayAPI.h" +#include -#define WM_DSP_PLUGIN_NOTIFY WM_APP + 1100 -#define WM_IMON_INIT WM_APP + 1101 -#define WM_IMON_UNINIT WM_APP + 1102 +#define WM_DSP_PLUGIN_NOTIFY WM_APP + 1100 +#define WM_IMON_INIT WM_APP + 1101 +#define WM_IMON_UNINIT WM_APP + 1102 +#define WM_IMON_IS_INIT WM_APP + 1103 +#define WM_IMON_IS_PLUGIN_MODE_ENABLED WM_APP + 1104 + +// #define MAX_LOADSTRING 100 @@ -15,14 +20,14 @@ HINSTANCE hInst = 0; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name -HANDLE gThreadReceiver = 0; -HANDLE gThreadSender = 0; +HANDLE gThreadReceiver = INVALID_HANDLE_VALUE; +//HANDLE gThreadSender = INVALID_HANDLE_VALUE; BOOL gQuit=FALSE; LPTSTR gPipeNameSender = TEXT("\\\\.\\pipe\\sga-sender"); LPTSTR gPipeNameReceiver = TEXT("\\\\.\\pipe\\sga-receiver"); -HANDLE gPipeSender=0; -HANDLE gPipeReceiver=0; +HANDLE gPipeSender=INVALID_HANDLE_VALUE; +HANDLE gPipeReceiver=INVALID_HANDLE_VALUE; char gBufferReceiver[256]; char gBufferSender[256]; @@ -40,11 +45,20 @@ LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM); - -const char KMsgDone[]="done"; -const char KMsgError[]="error"; - - +//Supported responses +const char KRspDone[]="done:"; +const char KRspPending[]="pending:"; +const char KRspError[]="error:"; +const char KRspClose[]="close:"; +const char KRspOpen[]="open:"; +const char KRspUnknown[]="unknown:"; +const char KRspTrue[]="true:"; +const char KRspFalse[]="false:"; +//Supported incoming messages +const char KMsgInit[]="init:"; +const char KMsgUninit[]="uninit:"; +const char KMsgIsInit[]="is-init:"; +const char KMsgIsPluginModeEnabled[]="is-plugin-mode-enabled:"; /** Send a message to our server. @@ -52,6 +66,9 @@ void SendMessageToServer(const char* aResponse) { DWORD cbWritten=0; + char msg[512]; + sprintf(msg,"%s\n",aResponse); + OutputDebugStringA(msg); WriteFile(gPipeSender, aResponse, strlen(aResponse), &cbWritten, NULL); } @@ -62,96 +79,107 @@ void MessageReceived(const char* aMsg) { // - - if (strcmp(aMsg,"handshake")==0) - { - const char response[]="ready"; - DWORD cbWritten=0; - SendMessageToServer(response); - } - else if (strcmp(aMsg,"init")==0) - { - /* - DSPResult res=IMON_Display_Uninit(); - res=IMON_Display_Init(gWnd, WM_DSP_PLUGIN_NOTIFY); - if (res!=DSP_SUCCEEDED) - { - SendMessage(error); - } - */ - //IMON API call need to be done from window thread for some reason - SendMessage(gWnd,WM_IMON_INIT,0,0); - } - else if (strcmp(aMsg,"uninit")==0) + if (strcmp(aMsg,KMsgInit)==0) { //IMON API call need to be done from window thread for some reason - SendMessage(gWnd,WM_IMON_UNINIT,0,0); + SendMessageToServer(KRspPending); + PostMessage(gWnd,WM_IMON_INIT,0,0); + } + else if (strcmp(aMsg,KMsgUninit)==0) + { + //IMON API call need to be done from window thread for some reason + SendMessageToServer(KRspPending); + PostMessage(gWnd,WM_IMON_UNINIT,0,0); + } + else if (strcmp(aMsg,KMsgIsPluginModeEnabled)==0) + { + //IMON API call need to be done from window thread for some reason + SendMessageToServer(KRspPending); + PostMessage(gWnd,WM_IMON_IS_PLUGIN_MODE_ENABLED,0,0); + } + else if (strcmp(aMsg,KMsgIsInit)==0) + { + //IMON API call need to be done from window thread for some reason + SendMessageToServer(KRspPending); + PostMessage(gWnd,WM_IMON_IS_INIT,0,0); + } + else + { + SendMessageToServer(KRspUnknown); + } + } + + + +/** +Connect our named pipes from here. +First connect our read pipe then our write pipe. +Then notify our server we are connected. +Then keep on waiting for incoming messages. +*/ +DWORD WINAPI ThreadReceiver( LPVOID lpParam ) + { + //Keep on trying to connect on our read pipe + while (gPipeReceiver==INVALID_HANDLE_VALUE && !gQuit) + { + OutputDebugStringA("Trying to connect...\n"); + gPipeReceiver=CreateFile(gPipeNameReceiver, GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); + Sleep(1000); + } + + OutputDebugStringA("Read pipe open!\n"); + //Now try connecting on our write pipe + gPipeSender=CreateFile(gPipeNameSender, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); + if (gPipeSender==INVALID_HANDLE_VALUE) + { + OutputDebugStringA("ERROR: Write pipe failure!\n"); + gQuit=TRUE; } else { - const char response[]="unknown"; - SendMessageToServer(response); + OutputDebugStringA("Write pipe opened.\n"); + OutputDebugStringA("Connected.\n"); + SendMessageToServer(KRspOpen); } - } - - - -/** -Read our pipe from this thread -*/ -DWORD WINAPI ThreadReceiver( LPVOID lpParam ) - { - //Create our pipe and listen - gPipeReceiver=CreateFile(gPipeNameReceiver, GENERIC_READ ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); + // while(!gQuit) { DWORD cbRead; BOOL success=ReadFile(gPipeReceiver,gBufferReceiver,sizeof(gBufferReceiver),&cbRead, NULL); if(success) - { + { gBufferReceiver[cbRead]='\0'; OutputDebugStringA(gBufferReceiver); MessageReceived(gBufferReceiver); } - if (!success && GetLastError() != ERROR_MORE_DATA) + //if (!success && GetLastError() != ERROR_MORE_DATA) + // { + // OutputDebugStringA("Can't Read\n"); + // } + // + //Sleep(500); + + if (!success) { - OutputDebugStringA("Can't Read\n"); + gQuit=TRUE; } - // - Sleep(500); } - if (gPipeReceiver!=0) - { - CloseHandle(gPipeReceiver); - gPipeReceiver=0; - } - + //Try tell our server + SendMessageToServer(KRspClose); + //Close our pipes + CloseHandle(gPipeReceiver); + gPipeReceiver=INVALID_HANDLE_VALUE; + CloseHandle(gPipeSender); + gPipeSender=INVALID_HANDLE_VALUE; + //Quit our application + PostMessage(gWnd,WM_CLOSE,0,0); + return 0; } -/** -Write to our pipe from this thread -*/ -DWORD WINAPI ThreadSender( LPVOID lpParam ) - { - - gPipeSender=CreateFile(gPipeNameSender, GENERIC_WRITE ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL); - - - /* - if (gPipeSender!=0) - { - CloseHandle(gPipeSender); - gPipeSender=0; - } - */ - - return 0; - } - /** */ @@ -193,7 +221,6 @@ } return (int) msg.wParam; - } /** @@ -209,23 +236,33 @@ case DSPN_ERR_IN_USED: strErrMsg = ("Display Plug-in is Already Used by Other Application."); break; case DSPN_ERR_HW_DISCONNECTED: strErrMsg = ("iMON HW is Not Connected."); break; case DSPN_ERR_NOT_SUPPORTED_HW: strErrMsg = ("The Connected iMON HW doesn't Support Display Plug-in."); break; - case DSPN_ERR_PLUGIN_DISABLED: strErrMsg = ("Display Plug-in Mode Option is Disabled."); break; + case DSPN_ERR_PLUGIN_DISABLED: strErrMsg = ("Display Plug-in Mode Option is Disabled."); break; case DSPN_ERR_IMON_NO_REPLY: strErrMsg = ("The Latest iMON is Not Installed or iMON Not Running."); break; - case DSPN_ERR_UNKNOWN: strErrMsg = ("Unknown Failure."); break; + case DSPN_ERR_UNKNOWN: strErrMsg = ("Unknown Failure."); break; } } else { switch(uErrCode) { - case DSPNM_PLUGIN_SUCCEED: strErrMsg = ("Plug-in Mode Inited Successfully."); break; + case DSPNM_PLUGIN_SUCCEED: strErrMsg = ("Plug-in Mode Inited Successfully."); break; case DSPNM_IMON_RESTARTED: strErrMsg = ("iMON Started and Plug-in Mode Inited."); break; case DSPNM_HW_CONNECTED: strErrMsg = ("iMON HW Connected and Plug-in Mode Inited."); break; } } // OutputDebugStringA(strErrMsg); - SendMessageToServer(strErrMsg); + + char msg[256]; + if (bError) + { + sprintf(msg,"error:%s",strErrMsg); + } + else + { + sprintf(msg,"done:%s",strErrMsg); + } + SendMessageToServer(msg); } @@ -316,7 +353,6 @@ //IMON_Display_Uninit(); //IMON_Display_Init(hWnd, WM_DSP_PLUGIN_NOTIFY); gThreadReceiver = CreateThread( NULL, 0, ThreadReceiver, NULL/*data pointer*/, 0, NULL); - gThreadSender = CreateThread( NULL, 0, ThreadSender, NULL/*data pointer*/, 0, NULL); break; case WM_COMMAND: wmId = LOWORD(wParam); @@ -342,20 +378,19 @@ case WM_DESTROY: gQuit=TRUE; //To complete write op - if (gPipeSender!=0) + if (gPipeSender!=INVALID_HANDLE_VALUE) { CloseHandle(gPipeSender); - gPipeSender=0; + gPipeSender=INVALID_HANDLE_VALUE; } //To complete read op - if (gPipeReceiver!=0) + if (gPipeReceiver!=INVALID_HANDLE_VALUE) { CloseHandle(gPipeReceiver); - gPipeReceiver=0; + gPipeReceiver=INVALID_HANDLE_VALUE; } - WaitForSingleObject(gThreadSender,INFINITE); + WaitForSingleObject(gThreadReceiver,INFINITE); - CloseHandle(gThreadSender); CloseHandle(gThreadReceiver); //IMON_Display_Uninit(); PostQuitMessage(0); @@ -363,13 +398,36 @@ case WM_IMON_UNINIT: IMON_Display_Uninit(); - SendMessageToServer(KMsgDone); + SendMessageToServer(KRspDone); break; case WM_IMON_INIT: IMON_Display_Uninit(); IMON_Display_Init(hWnd, WM_DSP_PLUGIN_NOTIFY); break; + // + case WM_IMON_IS_PLUGIN_MODE_ENABLED: + if (IMON_Display_IsPluginModeEnabled()==DSP_S_IN_PLUGIN_MODE) + { + SendMessageToServer(KRspTrue); + } + else + { + SendMessageToServer(KRspFalse); + } + break; + // + case WM_IMON_IS_INIT: + if (IMON_Display_IsInited()==DSP_S_INITED) + { + SendMessageToServer(KRspTrue); + } + else + { + SendMessageToServer(KRspFalse); + } + break; + case WM_DSP_PLUGIN_NOTIFY: switch(wParam)