//--------------------------------------------------------------------------
        // Data transmission
        //--------------------------------------------------------------------------

        public override bool Send(NxtMessage msg)
            {
            lock (this.msgReplyTargets)
                {
                this.msgReplyTargets.Add(msg);
                }

            byte[] rgbToSend = msg.DataForUSBTransmission;

            int cbWritten = 0;
            bool fSuccess = WinUsb_WritePipe(
                hWinUSB,
                bulkOutPipe,
                rgbToSend,
                rgbToSend.Length,
                ref cbWritten,
                IntPtr.Zero);

            if (fSuccess)
                {
                msg.NoteSent();
                }
            else
                {
                this.Close();
                }

            return fSuccess;
            }        
        //--------------------------------------------------------------------------
        // Data transmission
        //--------------------------------------------------------------------------

        public override bool Send(NxtMessage msg)
            {
            bool fResult = false;
            if (this.IsOpen)
                {
                try {
                    lock (this.msgReplyTargets)
                        {
                        this.msgReplyTargets.Add(msg);
                        }

                    byte[] rgbToSend = msg.DataForBluetoothTransmission;
                    int cbSent = 0;

                    unsafe
                        {
                        EventWaitHandle     asyncWriteCompleteEvent = new EventWaitHandle(false, System.Threading.EventResetMode.ManualReset);
                        Overlapped          overlappedWrite         = new Overlapped(-1, -1, asyncWriteCompleteEvent.SafeWaitHandle.DangerousGetHandle(), null);
                        NativeOverlapped*   pNativeOverlappedWrite  = overlappedWrite.Pack(null, rgbToSend);
                        try 
                            {
                            bool fSuccess = WriteFile(this.hSerialPort, rgbToSend, rgbToSend.Length, out cbSent, new IntPtr(pNativeOverlappedWrite));
                            if (!fSuccess)
                                {
                                int err = Marshal.GetLastWin32Error();
                                if (ERROR_IO_PENDING == err)
                                    {
                                    asyncWriteCompleteEvent.WaitOne();
                                    }
                                else
                                    ThrowWin32Error(err);
                                }
                            }
                        finally
                            {
                            System.Threading.Overlapped.Free(pNativeOverlappedWrite);
                            }
                        }

                    msg.NoteSent();
                    fResult = true;
                    }
                catch (Exception)
                    {
                    }
                }
            return fResult;
            }
        //--------------------------------------------------------------------------
        // Data transmission
        //--------------------------------------------------------------------------

        public override bool Send(NxtMessage msg)
            {
            bool fResult = false;
            this.SocketMonitorLock(() =>
                {
                if (this.IsOpen)
                    {
                    try
                        {
                        lock (this.msgReplyTargets)
                            {
                            this.msgReplyTargets.Add(msg);
                            }

                        byte[] rgbToSend = msg.DataForIPTransmission;

                        this.socket.Send(rgbToSend);

                        msg.NoteSent();
                        fResult = true;
                        }
                    catch (Exception e)
                        {
                        // Remove the msg if we have issues
                        //
                        Program.Trace("IPConnection.Send({0}): exception thrown: {1}", this.epSamanthaTCP, e);
                        lock (this.msgReplyTargets)
                            {
                            for (int imsg = 0; imsg < this.msgReplyTargets.Count; imsg++)
                                {
                                if (this.msgReplyTargets[imsg] == msg)
                                    {
                                    this.msgReplyTargets.RemoveAt(imsg);
                                    break;
                                    }
                                }
                            }
                        }
                    }
                });
            return fResult;
            }