1 /*
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 #include <stdio.h>
17 #include <stdlib.h>
18 #include "ServerConnection.h"
19 #include "TcpStream.h"
20 #include "QemuPipeStream.h"
21 #include <cutils/log.h>
22 #include "ThreadInfo.h"
23 
s_getGlContext()24 gl_client_context_t *ServerConnection::s_getGlContext()
25 {
26     EGLThreadInfo *ti = getEGLThreadInfo();
27     if (ti->serverConn) {
28         return ti->serverConn->m_glEnc;
29     }
30     return NULL;
31 }
32 
s_getGl2Context()33 gl2_client_context_t *ServerConnection::s_getGl2Context()
34 {
35     EGLThreadInfo *ti = getEGLThreadInfo();
36     if (ti->serverConn) {
37         return ti->serverConn->m_gl2Enc;
38     }
39     return NULL;
40 }
41 
s_getServerConnection()42 ServerConnection *ServerConnection::s_getServerConnection()
43 {
44     EGLThreadInfo *ti = getEGLThreadInfo();
45     if (!ti->serverConn)
46     {
47         ti->serverConn = new ServerConnection();
48         if (ti->serverConn->create() < 0) {
49             delete ti->serverConn;
50             ti->serverConn = NULL;
51         }
52     }
53 
54     return ti->serverConn;
55 }
56 
57 
ServerConnection()58 ServerConnection::ServerConnection() :
59     m_stream(NULL),
60     m_glEnc(NULL),
61     m_ut_enc(NULL)
62 {
63 }
64 
~ServerConnection()65 ServerConnection::~ServerConnection()
66 {
67     delete m_ut_enc;
68     delete m_glEnc;
69     delete m_stream;
70 }
71 
72 
73 
create(size_t bufsize,const char * defaultServer)74 int ServerConnection::create(size_t bufsize,
75                              const char *defaultServer)
76 {
77     /* XXX: Make configurable through system property */
78     int useQemuPipe = 1;
79 
80     if (m_stream != NULL) delete(m_stream);
81 
82     if (useQemuPipe) {
83         QemuPipeStream*  pipeStream = new QemuPipeStream(bufsize);
84 
85         if (pipeStream->connect() < 0) {
86             ALOGE("couldn't connect to host server\n");
87             delete pipeStream;
88             return -1;
89         }
90         m_stream = pipeStream;
91     }
92     else /* !useQemuPipe */
93     {
94         TcpStream*  tcpStream = new TcpStream(bufsize);
95 
96         char *s = getenv(ENV_RGL_SERVER);
97         char *hostname;
98         if (s == NULL) {
99             hostname = strdup(defaultServer);
100         } else {
101             hostname = strdup(s);
102         }
103 
104         if (tcpStream->connect(hostname, CODEC_SERVER_PORT) < 0) {
105             ALOGE("couldn't connect to %s\n", hostname);
106             free(hostname);
107             delete tcpStream;
108             return -1;
109         }
110         LOGI("connecting to server %s\n", hostname);
111         free(hostname);
112 
113         m_stream = tcpStream;
114     }
115 
116     m_glEnc = new GLEncoder(m_stream);
117     m_glEnc->setContextAccessor(s_getGlContext);
118 
119     m_gl2Enc = new GL2Encoder(m_stream);
120     m_gl2Enc->setContextAccessor(s_getGl2Context);
121 
122     m_ut_enc = new ut_rendercontrol_encoder_context_t(m_stream);
123     return 0;
124 }
125 
126