001: /*
002: Copyright (C) 2002-2004 MySQL AB
003:
004: This program is free software; you can redistribute it and/or modify
005: it under the terms of version 2 of the GNU General Public License as
006: published by the Free Software Foundation.
007:
008: There are special exceptions to the terms and conditions of the GPL
009: as it is applied to this software. View the full text of the
010: exception in file EXCEPTIONS-CONNECTOR-J in the directory of this
011: software distribution.
012:
013: This program is distributed in the hope that it will be useful,
014: but WITHOUT ANY WARRANTY; without even the implied warranty of
015: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
016: GNU General Public License for more details.
017:
018: You should have received a copy of the GNU General Public License
019: along with this program; if not, write to the Free Software
020: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
021:
022:
023:
024: */
025: package com.mysql.jdbc;
026:
027: import java.io.IOException;
028: import java.io.InputStream;
029: import java.io.OutputStream;
030: import java.io.RandomAccessFile;
031:
032: import java.net.Socket;
033: import java.net.SocketException;
034:
035: import java.util.Properties;
036:
037: /**
038: * A socket factory for named pipes (on Windows)
039: *
040: * @author Mark Matthews
041: */
042: public class NamedPipeSocketFactory implements SocketFactory {
043: /**
044: * A socket that encapsulates named pipes on Windows
045: */
046: class NamedPipeSocket extends Socket {
047: private boolean isClosed = false;
048:
049: private RandomAccessFile namedPipeFile;
050:
051: NamedPipeSocket(String filePath) throws IOException {
052: if ((filePath == null) || (filePath.length() == 0)) {
053: throw new IOException(Messages
054: .getString("NamedPipeSocketFactory.4")); //$NON-NLS-1$
055: }
056:
057: this .namedPipeFile = new RandomAccessFile(filePath, "rw"); //$NON-NLS-1$
058: }
059:
060: /**
061: * @see java.net.Socket#close()
062: */
063: public synchronized void close() throws IOException {
064: this .namedPipeFile.close();
065: this .isClosed = true;
066: }
067:
068: /**
069: * @see java.net.Socket#getInputStream()
070: */
071: public InputStream getInputStream() throws IOException {
072: return new RandomAccessFileInputStream(this .namedPipeFile);
073: }
074:
075: /**
076: * @see java.net.Socket#getOutputStream()
077: */
078: public OutputStream getOutputStream() throws IOException {
079: return new RandomAccessFileOutputStream(this .namedPipeFile);
080: }
081:
082: /**
083: * @see java.net.Socket#isClosed()
084: */
085: public boolean isClosed() {
086: return this .isClosed;
087: }
088: }
089:
090: /**
091: * Enables OutputStream-type functionality for a RandomAccessFile
092: */
093: class RandomAccessFileInputStream extends InputStream {
094: RandomAccessFile raFile;
095:
096: RandomAccessFileInputStream(RandomAccessFile file) {
097: this .raFile = file;
098: }
099:
100: /**
101: * @see java.io.InputStream#available()
102: */
103: public int available() throws IOException {
104: return -1;
105: }
106:
107: /**
108: * @see java.io.InputStream#close()
109: */
110: public void close() throws IOException {
111: this .raFile.close();
112: }
113:
114: /**
115: * @see java.io.InputStream#read()
116: */
117: public int read() throws IOException {
118: return this .raFile.read();
119: }
120:
121: /**
122: * @see java.io.InputStream#read(byte[])
123: */
124: public int read(byte[] b) throws IOException {
125: return this .raFile.read(b);
126: }
127:
128: /**
129: * @see java.io.InputStream#read(byte[], int, int)
130: */
131: public int read(byte[] b, int off, int len) throws IOException {
132: return this .raFile.read(b, off, len);
133: }
134: }
135:
136: /**
137: * Enables OutputStream-type functionality for a RandomAccessFile
138: */
139: class RandomAccessFileOutputStream extends OutputStream {
140: RandomAccessFile raFile;
141:
142: RandomAccessFileOutputStream(RandomAccessFile file) {
143: this .raFile = file;
144: }
145:
146: /**
147: * @see java.io.OutputStream#close()
148: */
149: public void close() throws IOException {
150: this .raFile.close();
151: }
152:
153: /**
154: * @see java.io.OutputStream#write(byte[])
155: */
156: public void write(byte[] b) throws IOException {
157: this .raFile.write(b);
158: }
159:
160: /**
161: * @see java.io.OutputStream#write(byte[], int, int)
162: */
163: public void write(byte[] b, int off, int len)
164: throws IOException {
165: this .raFile.write(b, off, len);
166: }
167:
168: /**
169: * @see java.io.OutputStream#write(int)
170: */
171: public void write(int b) throws IOException {
172: }
173: }
174:
175: private static final String NAMED_PIPE_PROP_NAME = "namedPipePath"; //$NON-NLS-1$
176:
177: private Socket namedPipeSocket;
178:
179: /**
180: * Constructor for NamedPipeSocketFactory.
181: */
182: public NamedPipeSocketFactory() {
183: super ();
184: }
185:
186: /**
187: * @see com.mysql.jdbc.SocketFactory#afterHandshake()
188: */
189: public Socket afterHandshake() throws SocketException, IOException {
190: return this .namedPipeSocket;
191: }
192:
193: /**
194: * @see com.mysql.jdbc.SocketFactory#beforeHandshake()
195: */
196: public Socket beforeHandshake() throws SocketException, IOException {
197: return this .namedPipeSocket;
198: }
199:
200: /**
201: * @see com.mysql.jdbc.SocketFactory#connect(String, Properties)
202: */
203: public Socket connect(String host, int portNumber /* ignored */,
204: Properties props) throws SocketException, IOException {
205: String namedPipePath = props.getProperty(NAMED_PIPE_PROP_NAME);
206:
207: if (namedPipePath == null) {
208: namedPipePath = "\\\\.\\pipe\\MySQL"; //$NON-NLS-1$
209: } else if (namedPipePath.length() == 0) {
210: throw new SocketException(Messages
211: .getString("NamedPipeSocketFactory.2") //$NON-NLS-1$
212: + NAMED_PIPE_PROP_NAME
213: + Messages.getString("NamedPipeSocketFactory.3")); //$NON-NLS-1$
214: }
215:
216: this .namedPipeSocket = new NamedPipeSocket(namedPipePath);
217:
218: return this.namedPipeSocket;
219: }
220: }
|