1 /*------------------------------------------------------------------------- 2 * drawElements Stream Library 3 * --------------------------- 4 * 5 * Copyright 2014 The Android Open Source Project 6 * 7 * Licensed under the Apache License, Version 2.0 (the "License"); 8 * you may not use this file except in compliance with the License. 9 * You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, software 14 * distributed under the License is distributed on an "AS IS" BASIS, 15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 * See the License for the specific language governing permissions and 17 * limitations under the License. 18 * 19 *//*! 20 * \file 21 * \brief Stream copying thread 22 *//*--------------------------------------------------------------------*/ 23 #include "deStreamCpyThread.h" 24 25 #include <stdio.h> 26 #include <stdlib.h> 27 28 void cpyStream (void* arg) 29 { 30 deStreamCpyThread* thread = (deStreamCpyThread*)arg; 31 deUint8* buffer = malloc(sizeof(deUint8) * (size_t)thread->bufferSize); 32 33 for(;;) 34 { 35 deInt32 read = 0; 36 deInt32 written = 0; 37 deStreamResult readResult = DE_STREAMRESULT_ERROR; 38 39 readResult = deInStream_read(thread->input, buffer, thread->bufferSize, &read); 40 DE_ASSERT(readResult != DE_STREAMRESULT_ERROR); 41 while (written < read) 42 { 43 deInt32 wrote = 0; 44 deOutStream_write(thread->output, buffer, read - written, &wrote); 45 46 /* \todo [mika] Handle errors */ 47 written += wrote; 48 } 49 50 if (readResult == DE_STREAMRESULT_END_OF_STREAM) 51 { 52 break; 53 } 54 } 55 56 deOutStream_flush(thread->output); 57 free(buffer); 58 } 59 60 deStreamCpyThread* deStreamCpyThread_create (deInStream* input, deOutStream* output, deInt32 bufferSize) 61 { 62 deStreamCpyThread* thread = malloc(sizeof(deStreamCpyThread)); 63 64 DE_ASSERT(thread); 65 DE_ASSERT(input); 66 DE_ASSERT(output); 67 68 thread->input = input; 69 thread->output = output; 70 thread->bufferSize = bufferSize; 71 thread->thread = deThread_create(cpyStream, thread, DE_NULL); 72 73 return thread; 74 } 75 76 void deStreamCpyThread_destroy (deStreamCpyThread* thread) 77 { 78 deThread_destroy(thread->thread); 79 80 free(thread); 81 } 82 83 void deStreamCpyThread_join (deStreamCpyThread* thread) 84 { 85 deThread_join(thread->thread); 86 } 87