| /* |
| * 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; |
| } |