blob: d06440e6c0efa91a6753b40629fd3c39ad098944 [file] [log] [blame]
keunyoungb85b2752013-03-08 12:28:03 -08001/*
2* Copyright (C) 2011 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#ifndef __IO_STREAM_H__
17#define __IO_STREAM_H__
18
19#include <stdlib.h>
20#include <stdio.h>
21
22#include "ErrorLog.h"
23
24class IOStream {
25public:
26
27 IOStream(size_t bufSize) {
28 m_buf = NULL;
29 m_bufsize = bufSize;
30 m_free = 0;
31 }
32
33 virtual void *allocBuffer(size_t minSize) = 0;
34 virtual int commitBuffer(size_t size) = 0;
35 virtual const unsigned char *readFully( void *buf, size_t len) = 0;
36 virtual const unsigned char *read( void *buf, size_t *inout_len) = 0;
37 virtual int writeFully(const void* buf, size_t len) = 0;
38
39 virtual ~IOStream() {
40
41 // NOTE: m_buf is 'owned' by the child class thus we expect it to be released by it
42 }
43
Alistair Strachan694745b2018-03-30 18:11:39 -070044 virtual unsigned char *alloc(size_t len) {
keunyoungb85b2752013-03-08 12:28:03 -080045
46 if (m_buf && len > m_free) {
47 if (flush() < 0) {
48 ERR("Failed to flush in alloc\n");
49 return NULL; // we failed to flush so something is wrong
50 }
51 }
52
53 if (!m_buf || len > m_bufsize) {
54 int allocLen = m_bufsize < len ? len : m_bufsize;
55 m_buf = (unsigned char *)allocBuffer(allocLen);
56 if (!m_buf) {
57 ERR("Alloc (%u bytes) failed\n", allocLen);
58 return NULL;
59 }
60 m_bufsize = m_free = allocLen;
61 }
62
63 unsigned char *ptr;
64
65 ptr = m_buf + (m_bufsize - m_free);
66 m_free -= len;
67
68 return ptr;
69 }
70
Alistair Strachan694745b2018-03-30 18:11:39 -070071 virtual int flush() {
keunyoungb85b2752013-03-08 12:28:03 -080072
73 if (!m_buf || m_free == m_bufsize) return 0;
74
75 int stat = commitBuffer(m_bufsize - m_free);
76 m_buf = NULL;
77 m_free = 0;
78 return stat;
79 }
80
81 const unsigned char *readback(void *buf, size_t len) {
82 flush();
83 return readFully(buf, len);
84 }
85
Lingfeng Yang22dc42d2018-05-29 10:11:38 -070086 void readbackPixels(void* context, int width, int height, unsigned int format, unsigned int type, void* pixels);
87
keunyoungb85b2752013-03-08 12:28:03 -080088
89private:
90 unsigned char *m_buf;
91 size_t m_bufsize;
92 size_t m_free;
93};
94
95//
96// When a client opens a connection to the renderer, it should
97// send unsigned int value indicating the "clientFlags".
98// The following are the bitmask of the clientFlags.
99// currently only one bit is used which flags the server
100// it should exit.
101//
102#define IOSTREAM_CLIENT_EXIT_SERVER 1
103
104#endif