| 51 | | /** |
|---|
| 52 | | * Constructs a SocketStream with the specified Socket and FileMode flags. |
|---|
| 53 | | */ |
|---|
| 54 | | this(Socket sock, FileMode mode) |
|---|
| 55 | | { |
|---|
| 56 | | if(mode & FileMode.In) |
|---|
| 57 | | readable = true; |
|---|
| 58 | | if(mode & FileMode.Out) |
|---|
| 59 | | writeable = true; |
|---|
| 60 | | |
|---|
| 61 | | this.sock = sock; |
|---|
| 62 | | } |
|---|
| 63 | | |
|---|
| 64 | | /** |
|---|
| 65 | | * Uses mode <b>FileMode.In | FileMode.Out</b>. |
|---|
| 66 | | */ |
|---|
| 67 | | this(Socket sock) |
|---|
| 68 | | { |
|---|
| 69 | | writeable = readable = true; |
|---|
| 70 | | this.sock = sock; |
|---|
| 71 | | } |
|---|
| 72 | | |
|---|
| 73 | | /** |
|---|
| 74 | | * Property to get the <b>Socket</b> that is being streamed. |
|---|
| 75 | | */ |
|---|
| 76 | | Socket socket() |
|---|
| 77 | | { |
|---|
| 78 | | return sock; |
|---|
| 79 | | } |
|---|
| 80 | | |
|---|
| 81 | | /** |
|---|
| 82 | | * Attempts to read the entire block, waiting if necessary. |
|---|
| 83 | | */ |
|---|
| 84 | | override size_t readBlock(void* _buffer, size_t size) |
|---|
| 85 | | { |
|---|
| 86 | | ubyte* buffer = cast(ubyte*)_buffer; |
|---|
| 87 | | assertReadable(); |
|---|
| 88 | | |
|---|
| 89 | | if (size == 0) |
|---|
| 90 | | return size; |
|---|
| 91 | | |
|---|
| 92 | | auto len = sock.receive(buffer[0 .. size]); |
|---|
| 93 | | readEOF = cast(bool)(len == 0); |
|---|
| 94 | | if (len == sock.ERROR) |
|---|
| 95 | | len = 0; |
|---|
| 96 | | return len; |
|---|
| 97 | | } |
|---|
| 98 | | |
|---|
| 99 | | /** |
|---|
| 100 | | * Attempts to write the entire block, waiting if necessary. |
|---|
| 101 | | */ |
|---|
| 102 | | override size_t writeBlock(void* _buffer, size_t size) |
|---|
| 103 | | { |
|---|
| 104 | | ubyte* buffer = cast(ubyte*)_buffer; |
|---|
| 105 | | assertWriteable(); |
|---|
| | 51 | /** |
|---|
| | 52 | * Constructs a SocketStream with the specified Socket and FileMode flags. |
|---|
| | 53 | */ |
|---|
| | 54 | this(Socket sock, FileMode mode) |
|---|
| | 55 | { |
|---|
| | 56 | if(mode & FileMode.In) |
|---|
| | 57 | readable = true; |
|---|
| | 58 | if(mode & FileMode.Out) |
|---|
| | 59 | writeable = true; |
|---|
| 107 | | if (size == 0) |
|---|
| 108 | | return size; |
|---|
| 109 | | |
|---|
| 110 | | auto len = sock.send(buffer[0 .. size]); |
|---|
| 111 | | readEOF = cast(bool)(len == 0); |
|---|
| 112 | | if (len == sock.ERROR) |
|---|
| 113 | | len = 0; |
|---|
| 114 | | return len; |
|---|
| 115 | | } |
|---|
| 116 | | |
|---|
| 117 | | /** |
|---|
| 118 | | * |
|---|
| 119 | | */ |
|---|
| 120 | | override ulong seek(long offset, SeekPos whence) |
|---|
| 121 | | { |
|---|
| 122 | | throw new SeekException("Cannot seek a socket."); |
|---|
| 123 | | } |
|---|
| 124 | | |
|---|
| 125 | | /** |
|---|
| 126 | | * Does not return the entire stream because that would |
|---|
| 127 | | * require the remote connection to be closed. |
|---|
| 128 | | */ |
|---|
| 129 | | override char[] toString() |
|---|
| 130 | | { |
|---|
| 131 | | return sock.toString(); |
|---|
| 132 | | } |
|---|
| 133 | | |
|---|
| 134 | | /** |
|---|
| 135 | | * Close the <b>Socket</b>. |
|---|
| 136 | | */ |
|---|
| 137 | | override void close() |
|---|
| 138 | | { |
|---|
| 139 | | sock.close(); |
|---|
| 140 | | } |
|---|
| | 61 | this.sock = sock; |
|---|
| | 62 | } |
|---|
| | 63 | |
|---|
| | 64 | /** |
|---|
| | 65 | * Uses mode <b>FileMode.In | FileMode.Out</b>. |
|---|
| | 66 | */ |
|---|
| | 67 | this(Socket sock) |
|---|
| | 68 | { |
|---|
| | 69 | writeable = readable = true; |
|---|
| | 70 | this.sock = sock; |
|---|
| | 71 | } |
|---|
| | 72 | |
|---|
| | 73 | /** |
|---|
| | 74 | * Property to get the <b>Socket</b> that is being streamed. |
|---|
| | 75 | */ |
|---|
| | 76 | Socket socket() |
|---|
| | 77 | { |
|---|
| | 78 | return sock; |
|---|
| | 79 | } |
|---|
| | 80 | |
|---|
| | 81 | /** |
|---|
| | 82 | * Attempts to read the entire block, waiting if necessary. |
|---|
| | 83 | */ |
|---|
| | 84 | override size_t readBlock(void* _buffer, size_t size) |
|---|
| | 85 | { |
|---|
| | 86 | ubyte* buffer = cast(ubyte*)_buffer; |
|---|
| | 87 | assertReadable(); |
|---|
| | 88 | |
|---|
| | 89 | if (size == 0) |
|---|
| | 90 | return size; |
|---|
| | 91 | |
|---|
| | 92 | auto len = sock.receive(buffer[0 .. size]); |
|---|
| | 93 | readEOF = cast(bool)(len == 0); |
|---|
| | 94 | if (len == sock.ERROR) |
|---|
| | 95 | len = 0; |
|---|
| | 96 | return len; |
|---|
| | 97 | } |
|---|
| | 98 | |
|---|
| | 99 | /** |
|---|
| | 100 | * Attempts to write the entire block, waiting if necessary. |
|---|
| | 101 | */ |
|---|
| | 102 | override size_t writeBlock(void* _buffer, size_t size) |
|---|
| | 103 | { |
|---|
| | 104 | ubyte* buffer = cast(ubyte*)_buffer; |
|---|
| | 105 | assertWriteable(); |
|---|
| | 106 | |
|---|
| | 107 | if (size == 0) |
|---|
| | 108 | return size; |
|---|
| | 109 | |
|---|
| | 110 | auto len = sock.send(buffer[0 .. size]); |
|---|
| | 111 | readEOF = cast(bool)(len == 0); |
|---|
| | 112 | if (len == sock.ERROR) |
|---|
| | 113 | len = 0; |
|---|
| | 114 | return len; |
|---|
| | 115 | } |
|---|
| | 116 | |
|---|
| | 117 | /** |
|---|
| | 118 | * |
|---|
| | 119 | */ |
|---|
| | 120 | override ulong seek(long offset, SeekPos whence) |
|---|
| | 121 | { |
|---|
| | 122 | throw new SeekException("Cannot seek a socket."); |
|---|
| | 123 | } |
|---|
| | 124 | |
|---|
| | 125 | /** |
|---|
| | 126 | * Does not return the entire stream because that would |
|---|
| | 127 | * require the remote connection to be closed. |
|---|
| | 128 | */ |
|---|
| | 129 | override char[] toString() |
|---|
| | 130 | { |
|---|
| | 131 | return sock.toString(); |
|---|
| | 132 | } |
|---|
| | 133 | |
|---|
| | 134 | /** |
|---|
| | 135 | * Close the <b>Socket</b>. |
|---|
| | 136 | */ |
|---|
| | 137 | override void close() |
|---|
| | 138 | { |
|---|
| | 139 | sock.close(); |
|---|
| | 140 | } |
|---|