//+------------------------------------------------------------------+
//|                                            Named Pipe Server.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#define PIPE_TYPE_MESSAGE			4
#define PIPE_READMODE_MESSAGE		2
#define PIPE_WAIT					0
#define PIPE_ACCESS_DUPLEX      	3
#define PIPE_UNLIMITED_INSTANCES 	255
#define NMPWAIT_USE_DEFAULT_WAIT	0
#define INVALID_HANDLE_VALUE 		-1
#define ERROR_PIPE_CONNECTED 		535

#import "kernel32.dll"
int CreateNamedPipeA(uchar &PipeName[],int dwOpenMode,int dwPipeMode,int nMaxInstances,int nOutBufferSize,int nInBufferSize,int nDefaultTimeOut,int lpSecurityAttributes);
int ConnectNamedPipe(int hPipe,int lpOverlapped);
int ReadFile(int hPipe,uchar &inBuffer[],int NumberOfBytesToRead,int &bytesRead[],int lpOverlapped);
int WriteFile(int hPipe,uchar &outBuffer[],int NumberOfBytesToWrite,int &bytesWritten[],int lpOverlapped);
int FlushFileBuffers(int hPipe);
int DisconnectNamedPipe(int hPipe);
int CloseHandle(int hPipe);
#import

string lastMessage="";
int thisPipe;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CreatePipeServer(string Pipe)
  {
   uchar pipeName[];
   ArrayResize(pipeName,StringLen("\\\\.\\pipe\\"+Pipe));
   StringToCharArray("\\\\.\\pipe\\"+Pipe,pipeName);
   int PipeMode=PIPE_TYPE_MESSAGE|PIPE_READMODE_MESSAGE|PIPE_WAIT;
   int hPipe=CreateNamedPipeA(pipeName,PIPE_ACCESS_DUPLEX,PipeMode,PIPE_UNLIMITED_INSTANCES,1024,1024,NMPWAIT_USE_DEFAULT_WAIT,NULL);
   thisPipe=hPipe;

   if(hPipe==INVALID_HANDLE_VALUE)
     {
      Alert("CreateNamedPipe failed!; on pipe" + Pipe);
      return (false);
     }
   return(hPipe);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string CheckForPipeMessages(int hPipe)
  {
   string inString;
   bool fConnected=ConnectNamedPipe(hPipe,NULL)!=0;
   if(!fConnected)
      fConnected=GetLastError()==ERROR_PIPE_CONNECTED;

   if(fConnected)
     {
      uchar inBuffer[512];
      int bytesRead[1];
      bool fSuccess=ReadFile(hPipe,inBuffer,ArraySize(inBuffer),bytesRead,NULL)!=0;
      if(!fSuccess || (bytesRead[0]==0))
        {
         return("Message read failed!");
        };
      inString=CharArrayToString(inBuffer,0,bytesRead[0]);
      lastMessage=inString;
      string outString="Received ["+inString+"]";
      if(StringLen(inString)>0)
        {
         Print("Server received message, on pipe: "+IntegerToString(thisPipe)+"; "+inString);
        };
      uchar outBuffer[];
      ArrayResize(outBuffer,StringLen(outString)+1);
      StringToCharArray(outString,outBuffer);
      int bytesWritten[1];
      fSuccess=WriteFile(hPipe,outBuffer,ArraySize(outBuffer),bytesWritten,NULL)!=0;
      if(!fSuccess || bytesWritten[0]!=StringLen(outString)+1)
        {
         return("Message read failed!");
        };
     }
   FlushFileBuffers(hPipe);
   DisconnectNamedPipe(hPipe);
   return(lastMessage);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void DestroyPipeServer(int hPipe)
  {
   CloseHandle(hPipe);
  }
//+------------------------------------------------------------------+
