2 * Copyright (c) 2013 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 #ifndef _SOCKETCONNECTION_H_
18 #define _SOCKETCONNECTION_H_
26 #include "SocketStream.h"
27 #include "PrivacyGuardTypes.h"
30 * This class implements interface for generic read and write from given socket.
31 * It does not maintain socket descriptor, so any connecting and disconnecting should be
35 * Throws SocketConnectionException when read/write will not succeed or if any bad allocation
36 * exception occurs during read.
39 class EXTERN_API SocketConnection
44 explicit SocketConnection(int socket_fd) : m_socketStream(socket_fd){
48 template<typename T, typename ...Args>
49 int read(T* out, const Args&... args )
52 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
54 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
56 return PRIV_FLTR_ERROR_SUCCESS;
63 int res = m_socketStream.readStream(sizeof(length), &length);
64 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
65 char* pBuf = new (std::nothrow) char[length + 1];
66 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
68 res = m_socketStream.readStream(length, pBuf);
69 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
77 return PRIV_FLTR_ERROR_SUCCESS;
83 int res = m_socketStream.readStream(sizeof(length), &length);
84 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
86 char* pBuf = new (std::nothrow) char[length + 1];
87 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
89 res = m_socketStream.readStream(length, pBuf);
90 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
94 *pB = * reinterpret_cast <bool* > (pBuf);
98 return PRIV_FLTR_ERROR_SUCCESS;
114 int res = m_socketStream.readStream(sizeof(length), &length);
115 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
117 char* pBuf = new (std::nothrow) char[length + 1];
118 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
120 res = m_socketStream.readStream(length, pBuf);
121 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
125 *pI = * reinterpret_cast <int* > (pBuf);
129 return PRIV_FLTR_ERROR_SUCCESS;
132 int read(unsigned int* pUi)
135 int res = m_socketStream.readStream(sizeof(length), &length);
136 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
138 char* pBuf = new (std::nothrow) char[length + 1];
139 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
141 res = m_socketStream.readStream(length, pBuf);
142 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
146 *pUi = * reinterpret_cast <unsigned int* > (pBuf);
150 return PRIV_FLTR_ERROR_SUCCESS;
152 int read(std::string* pStr)
155 int res = m_socketStream.readStream(sizeof(length), &length);
156 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
158 char* pBuf = new (std::nothrow) char[length + 1];
159 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
161 m_socketStream.readStream(length, pBuf);
162 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
166 *pStr = std::string(pBuf);
169 return PRIV_FLTR_ERROR_SUCCESS;
172 int read(std::string& str)
177 int read(privacy_data_s& out)
183 res = m_socketStream.readStream(sizeof(length), &length);
184 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
185 pBuf = new (std::nothrow) char[length + 1];
186 TryReturn(pBuf != NULL, PRIV_FLTR_ERROR_OUT_OF_MEMORY, , "new : %d", PRIV_FLTR_ERROR_OUT_OF_MEMORY);
187 m_socketStream.readStream(length, pBuf);
188 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, delete[] pBuf, "readStream : %d", res);
190 out.privacy_id = strdup(pBuf);
194 res = read(&(out.monitor_policy));
195 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "readStream : %d", res);
197 return PRIV_FLTR_ERROR_SUCCESS;
199 template < typename T >
200 int read (std::list<T>& list)
203 int res = read(length);
204 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
206 for (int i = 0; i < length; ++i)
210 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
214 return PRIV_FLTR_ERROR_SUCCESS;
217 template < typename T >
218 int read (std::list<T>* pList)
223 template < typename K, typename P >
224 int read (std::pair<K, P>& pair)
226 int res = read( pair.first);
227 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
228 res = read( pair.second);
229 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "read : %d", res);
231 return PRIV_FLTR_ERROR_SUCCESS;
234 template < typename K, typename P >
235 int read (std::pair<K, P>* pPair)
237 return read( *pPair);
240 template<typename T, typename ...Args>
241 int write(const T& in, const Args&... args)
244 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
245 res = write(args...);
246 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
248 return PRIV_FLTR_ERROR_SUCCESS;
251 int write(const std::string& in)
253 int length = in.size();
254 int res = m_socketStream.writeStream(sizeof(length), &length);
255 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
256 res = m_socketStream.writeStream(length, in.c_str());
257 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
259 return PRIV_FLTR_ERROR_SUCCESS;
262 int write(const unsigned int& in)
264 int length = sizeof(in);
265 int res = m_socketStream.writeStream(sizeof(length), &length);
266 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
267 res = m_socketStream.writeStream(length, &in);
268 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
270 return PRIV_FLTR_ERROR_SUCCESS;
273 int write(const int& in)
275 int length = sizeof(in);
276 int res = m_socketStream.writeStream(sizeof(length), &length);
277 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
278 res = m_socketStream.writeStream(length, &in);
279 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
281 return PRIV_FLTR_ERROR_SUCCESS;
284 int write(const bool& in)
286 int length = sizeof(in);
287 int res = m_socketStream.writeStream(sizeof(length), &length);
288 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
289 res = m_socketStream.writeStream(length, &in);
290 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
292 return PRIV_FLTR_ERROR_SUCCESS;
295 int write(const char*& in)
297 int length = strlen(in);
298 int res = m_socketStream.writeStream(sizeof(length), &length);
299 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
300 res = m_socketStream.writeStream(length, in);
301 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
303 return PRIV_FLTR_ERROR_SUCCESS;
306 int write(const char* in_str, const int in_int1, const int in_int2)
310 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
311 res = write(in_int1);
312 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
313 res = write(in_int2);
314 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
315 return PRIV_FLTR_ERROR_SUCCESS;
318 int write(const privacy_data_s& in)
321 int length = strlen(in.privacy_id);
323 res = m_socketStream.writeStream(sizeof(length), &length);
324 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
325 res = m_socketStream.writeStream(length, in.privacy_id);
326 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "writeStream : %d", res);
329 res = write(in.monitor_policy);
330 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
332 return PRIV_FLTR_ERROR_SUCCESS;
334 template<typename T, typename ...Args>
335 int write(const T* in, const Args&... args)
338 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
339 res = write(args...);
340 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
342 return PRIV_FLTR_ERROR_SUCCESS;
345 template<typename K, typename T>
346 int write(const std::pair<K, T> p)
348 int res = write(p.first);
349 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
350 res = write(p.second);
351 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
353 return PRIV_FLTR_ERROR_SUCCESS;
356 template<typename K, typename T>
357 int write(const std::pair<K, T&> p)
359 int res = write(p.first);
360 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
361 res = write(p.second);
362 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
364 return PRIV_FLTR_ERROR_SUCCESS;
367 template<typename K, typename T>
368 int write(const std::pair<K, T&>* pPair)
370 return write(*pPair);
374 int write(const std::list <T> list)
376 int length = list.size();
377 int res = write(length);
378 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
379 for (typename std::list <T>::const_iterator iter = list.begin(); iter != list.end(); iter++) {
381 TryReturn(res == PRIV_FLTR_ERROR_SUCCESS, res, , "write : %d", res);
384 return PRIV_FLTR_ERROR_SUCCESS;
388 int write(const std::list <T>* pList)
390 return write(*pList);
395 SocketStream m_socketStream;
398 #endif // _SOCKETCONNECTION_H_