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