| /* | |
| * Copyright 2011 Google Inc. | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include "SkNetPipeController.h" | |
| SkNetPipeController::SkNetPipeController(SkCanvas* target) : fReader(target) { | |
| fBlock = NULL; | |
| fBlockSize = fBytesWritten = 0; | |
| fPlayback = true; | |
| fStatus = SkGPipeReader::kDone_Status; | |
| fTotalWritten = 0; | |
| fAtomsWritten = 0; | |
| } | |
| SkNetPipeController::~SkNetPipeController() { | |
| sk_free(fBlock); | |
| } | |
| int SkNetPipeController::writeToSocket(SkSocket* sockfd, SkSocket::DataType type) { | |
| if (NULL != sockfd && fTotalWritten > 4) | |
| return sockfd->writePacket(fBlock, fBytesWritten, type); | |
| else | |
| return -1; | |
| } | |
| void* SkNetPipeController::requestBlock(size_t minRequest, size_t* actual) { | |
| sk_free(fBlock); | |
| fBlockSize = minRequest * 4; | |
| fBlock = sk_malloc_throw(fBlockSize); | |
| fBytesWritten = 0; | |
| *actual = fBlockSize; | |
| return fBlock; | |
| } | |
| void SkNetPipeController::notifyWritten(size_t bytes) { | |
| SkASSERT(fBytesWritten + bytes <= fBlockSize); | |
| if (fPlayback) { | |
| fStatus = fReader.playback((const char*)fBlock + fBytesWritten, bytes); | |
| } | |
| SkASSERT(SkGPipeReader::kError_Status != fStatus); | |
| fBytesWritten += bytes; | |
| fTotalWritten += bytes; | |
| fAtomsWritten += 1; | |
| } |