protected function unpackImpl(TreasureData_API_Stream_InputStream $stream, $callback = null) { $unpacker = new MessagePackUnpacker(); $result = array(); $offset = 0; $flag = true; $call = false; if (is_callable($callback)) { $call = true; $result = true; } while (true) { if ($flag) { $buffer = $stream->read(); $flag = false; } if (empty($buffer)) { break; } if ($unpacker->execute($buffer, $offset)) { if ($call) { call_user_func_array($callback, array($unpacker->data())); } else { $result[] = $unpacker->data(); } $unpacker->reset(); $buffer = substr($buffer, $offset); $offset = 0; if (empty($buffer)) { $flag = true; continue; } } } return $result; }