| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -60,4 +60,198 @@ String NamedPipe::getName() const | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			// other methods for this class are implemented in the platform-specific files
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			//==============================================================================
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#if JUCE_UNIT_TESTS
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			class NamedPipeTests  : public UnitTest
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			{
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			public:
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //==============================================================================
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    NamedPipeTests()
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        : UnitTest ("NamedPipe", "Networking")
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    {}
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    void runTest() override
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        const String pipeName ("TestPipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Pre test cleanup");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, false));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Create pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (! pipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, true));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, false));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe otherPipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (! otherPipe.createNewPipe (pipeName, true));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (! otherPipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Existing pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (! pipe.openExisting (pipeName));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (! pipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, true));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe otherPipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (otherPipe.openExisting (pipeName));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (otherPipe.isOpen());
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        int sendData = 4684682;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Receive message created pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, true));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            WaitableEvent senderFinished;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            SenderThread sender (pipeName, false, senderFinished, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            sender.startThread();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            int recvData = -1;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (senderFinished.wait (4000));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (bytesRead, (int) sizeof (recvData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (sender.result, (int) sizeof (sendData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (recvData, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Receive message existing pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            WaitableEvent senderFinished;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            SenderThread sender (pipeName, true, senderFinished, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.openExisting (pipeName));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            sender.startThread();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            int recvData = -1;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto bytesRead = pipe.read (&recvData, sizeof (recvData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (senderFinished.wait (4000));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (bytesRead, (int) sizeof (recvData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (sender.result, (int) sizeof (sendData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (recvData, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Send message created pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.createNewPipe (pipeName, true));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            WaitableEvent receiverFinished;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            ReceiverThread receiver (pipeName, false, receiverFinished);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            receiver.startThread();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (receiverFinished.wait (4000));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (bytesWritten, (int) sizeof (sendData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (receiver.result, (int) sizeof (receiver.recvData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (receiver.recvData, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        beginTest ("Send message existing pipe");
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            WaitableEvent receiverFinished;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            ReceiverThread receiver (pipeName, true, receiverFinished);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (pipe.openExisting (pipeName));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            receiver.startThread();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            auto bytesWritten = pipe.write (&sendData, sizeof (sendData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expect (receiverFinished.wait (4000));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (bytesWritten, (int) sizeof (sendData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (receiver.result, (int) sizeof (receiver.recvData));
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            expectEquals (receiver.recvData, sendData);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			private:
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //==============================================================================
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    struct NamedPipeThread   : public Thread
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        NamedPipeThread (const String& threadName, const String& pName,
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                         bool shouldCreatePipe, WaitableEvent& completed)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            : Thread (threadName), pipeName (pName), workCompleted (completed)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if (shouldCreatePipe)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                pipe.createNewPipe (pipeName);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            else
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                pipe.openExisting (pipeName);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        NamedPipe pipe;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        const String& pipeName;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        WaitableEvent& workCompleted;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        int result = -2;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    };
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //==============================================================================
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    struct SenderThread   : public NamedPipeThread
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        SenderThread (const String& pName, bool shouldCreatePipe,
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                      WaitableEvent& completed, int sData)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed),
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              sendData (sData)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {}
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        void run() override
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            result = pipe.write (&sendData, sizeof (sendData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            workCompleted.signal();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        const int sendData;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    };
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    //==============================================================================
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    struct ReceiverThread   : public NamedPipeThread
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ReceiverThread (const String& pName, bool shouldCreatePipe,
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        WaitableEvent& completed)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            : NamedPipeThread ("NamePipeSender", pName, shouldCreatePipe, completed)
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {}
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        void run() override
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        {
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            result = pipe.read (&recvData, sizeof (recvData), 2000);
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            workCompleted.signal();
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        }
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        int recvData = -2;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    };
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			};
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			static NamedPipeTests namedPipeTests;
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			#endif
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} // namespace juce
 |