| The Android Open Source Project | dd7bc33 | 2009-03-03 19:32:55 -0800 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2007 The Android Open Source Project | 
|  | 3 | * | 
|  | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | 5 | * you may not use this file except in compliance with the License. | 
|  | 6 | * You may obtain a copy of the License at | 
|  | 7 | * | 
|  | 8 | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | 9 | * | 
|  | 10 | * Unless required by applicable law or agreed to in writing, software | 
|  | 11 | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | 13 | * See the License for the specific language governing permissions and | 
|  | 14 | * limitations under the License. | 
|  | 15 | */ | 
|  | 16 |  | 
|  | 17 | /** | 
|  | 18 | * Byte buffer utilities. | 
|  | 19 | */ | 
|  | 20 |  | 
|  | 21 | #ifndef __BUFFER_H | 
|  | 22 | #define __BUFFER_H | 
|  | 23 |  | 
|  | 24 | #ifdef __cplusplus | 
|  | 25 | extern "C" { | 
|  | 26 | #endif | 
|  | 27 |  | 
|  | 28 | #include <stdlib.h> | 
|  | 29 |  | 
|  | 30 | /** | 
|  | 31 | * Byte buffer of known size. Keeps track of how much data has been read | 
|  | 32 | * into or written out of the buffer. | 
|  | 33 | */ | 
|  | 34 | typedef struct { | 
|  | 35 | /** Buffered data. */ | 
|  | 36 | char* data; | 
|  | 37 |  | 
|  | 38 | union { | 
|  | 39 | /** For reading. # of bytes we expect. */ | 
|  | 40 | size_t expected; | 
|  | 41 |  | 
|  | 42 | /** For writing. # of bytes to write. */ | 
|  | 43 | size_t remaining; | 
|  | 44 | }; | 
|  | 45 |  | 
|  | 46 | /** Actual # of bytes in the buffer. */ | 
|  | 47 | size_t size; | 
|  | 48 |  | 
|  | 49 | /** Amount of memory allocated for this buffer. */ | 
|  | 50 | size_t capacity; | 
|  | 51 | } Buffer; | 
|  | 52 |  | 
|  | 53 | /** | 
|  | 54 | * Returns true if all data has been read into the buffer. | 
|  | 55 | */ | 
|  | 56 | #define bufferReadComplete(buffer) (buffer->expected == buffer->size) | 
|  | 57 |  | 
|  | 58 | /** | 
|  | 59 | * Returns true if the buffer has been completely written. | 
|  | 60 | */ | 
|  | 61 | #define bufferWriteComplete(buffer) (buffer->remaining == 0) | 
|  | 62 |  | 
|  | 63 | /** | 
|  | 64 | * Creates a new buffer with the given initial capacity. | 
|  | 65 | */ | 
|  | 66 | Buffer* bufferCreate(size_t initialCapacity); | 
|  | 67 |  | 
|  | 68 | /** | 
|  | 69 | * Wraps an existing byte array. | 
|  | 70 | */ | 
|  | 71 | Buffer* bufferWrap(char* data, size_t capacity, size_t size); | 
|  | 72 |  | 
|  | 73 | /** | 
|  | 74 | * Frees and its data. | 
|  | 75 | */ | 
|  | 76 | void bufferFree(Buffer* buffer); | 
|  | 77 |  | 
|  | 78 | /** | 
|  | 79 | * Prepares buffer to read 'expected' number of bytes. Expands capacity if | 
|  | 80 | * necessary. Returns 0 if successful or -1 if an error occurs allocating | 
|  | 81 | * memory. | 
|  | 82 | */ | 
|  | 83 | int bufferPrepareForRead(Buffer* buffer, size_t expected); | 
|  | 84 |  | 
|  | 85 | /** | 
|  | 86 | * Reads some data into a buffer. Returns -1 in case of an error and sets | 
|  | 87 | * errno (see read()). Returns 0 for EOF. Updates buffer->size and returns | 
|  | 88 | * the new size after a succesful read. | 
|  | 89 | * | 
|  | 90 | * Precondition: buffer->size < buffer->expected | 
|  | 91 | */ | 
|  | 92 | ssize_t bufferRead(Buffer* buffer, int fd); | 
|  | 93 |  | 
|  | 94 | /** | 
|  | 95 | * Prepares a buffer to be written out. | 
|  | 96 | */ | 
|  | 97 | void bufferPrepareForWrite(Buffer* buffer); | 
|  | 98 |  | 
|  | 99 | /** | 
|  | 100 | * Writes data from buffer to the given fd. Returns -1 and sets errno in case | 
|  | 101 | * of an error. Updates buffer->remaining and returns the number of remaining | 
|  | 102 | * bytes to be written after a successful write. | 
|  | 103 | * | 
|  | 104 | * Precondition: buffer->remaining > 0 | 
|  | 105 | */ | 
|  | 106 | ssize_t bufferWrite(Buffer* buffer, int fd); | 
|  | 107 |  | 
|  | 108 | #ifdef __cplusplus | 
|  | 109 | } | 
|  | 110 | #endif | 
|  | 111 |  | 
|  | 112 | #endif /* __BUFFER_H */ |