1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef ECHO_SERVER_H_ 6#define ECHO_SERVER_H_ 7 8#include "ppapi/cpp/instance.h" 9#include "ppapi/cpp/tcp_socket.h" 10#include "ppapi/utility/completion_callback_factory.h" 11 12static const int kBufferSize = 1024; 13 14// Simple "echo" server based on a listening pp::TCPSocket. 15// This server handles just one connection at a time and will 16// echo back whatever bytes get sent to it. 17class EchoServer { 18 typedef void (*LogFunction)(const char*); 19 20 public: 21 EchoServer(pp::Instance* instance, 22 uint16_t port, 23 LogFunction log_function=NULL, 24 pthread_cond_t* ready_cond=NULL, 25 pthread_mutex_t* ready_lock=NULL) 26 : instance_(instance), 27 callback_factory_(this), 28 ready_(false), 29 ready_cond_(ready_cond), 30 ready_lock_(ready_lock), 31 log_function_(log_function) { 32 Start(port); 33 } 34 35 protected: 36 void Start(uint16_t port); 37 38 // Callback functions 39 void OnBindCompletion(int32_t result); 40 void OnListenCompletion(int32_t result); 41 void OnAcceptCompletion(int32_t result, pp::TCPSocket socket); 42 void OnReadCompletion(int32_t result); 43 void OnWriteCompletion(int32_t result); 44 45 void TryRead(); 46 void TryAccept(); 47 48 void Log(const char* msg) { 49 if (log_function_) 50 log_function_(msg); 51 } 52 53 pp::Instance* instance_; 54 pp::CompletionCallbackFactory<EchoServer> callback_factory_; 55 pp::TCPSocket listening_socket_; 56 pp::TCPSocket incoming_socket_; 57 58 char receive_buffer_[kBufferSize]; 59 bool ready_; 60 pthread_cond_t* ready_cond_; 61 pthread_mutex_t* ready_lock_; 62 LogFunction log_function_; 63}; 64 65#endif // ECHO_SERVER_H_ 66