- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / test / chromedriver / net / sync_websocket_impl.h
1 // Copyright (c) 2012 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 CHROME_TEST_CHROMEDRIVER_NET_SYNC_WEBSOCKET_IMPL_H_
6 #define CHROME_TEST_CHROMEDRIVER_NET_SYNC_WEBSOCKET_IMPL_H_
7
8 #include <list>
9 #include <string>
10
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "base/memory/ref_counted.h"
14 #include "base/memory/scoped_ptr.h"
15 #include "base/synchronization/condition_variable.h"
16 #include "base/synchronization/lock.h"
17 #include "chrome/test/chromedriver/net/sync_websocket.h"
18 #include "chrome/test/chromedriver/net/websocket.h"
19 #include "net/base/completion_callback.h"
20 #include "net/socket_stream/socket_stream.h"
21
22 namespace base {
23 class WaitableEvent;
24 }
25
26 namespace net {
27 class URLRequestContextGetter;
28 }
29
30 class GURL;
31
32 class SyncWebSocketImpl : public SyncWebSocket {
33  public:
34   explicit SyncWebSocketImpl(net::URLRequestContextGetter* context_getter);
35   virtual ~SyncWebSocketImpl();
36
37   // Overridden from SyncWebSocket:
38   virtual bool IsConnected() OVERRIDE;
39   virtual bool Connect(const GURL& url) OVERRIDE;
40   virtual bool Send(const std::string& message) OVERRIDE;
41   virtual StatusCode ReceiveNextMessage(
42       std::string* message,
43       const base::TimeDelta& timeout) OVERRIDE;
44   virtual bool HasNextMessage() OVERRIDE;
45
46  private:
47   struct CoreTraits;
48   class Core : public WebSocketListener,
49                public base::RefCountedThreadSafe<Core, CoreTraits> {
50    public:
51     explicit Core(net::URLRequestContextGetter* context_getter);
52
53     bool IsConnected();
54     bool Connect(const GURL& url);
55     bool Send(const std::string& message);
56     SyncWebSocket::StatusCode ReceiveNextMessage(
57         std::string* message,
58         const base::TimeDelta& timeout);
59     bool HasNextMessage();
60
61     // Overriden from WebSocketListener:
62     virtual void OnMessageReceived(const std::string& message) OVERRIDE;
63     virtual void OnClose() OVERRIDE;
64
65    private:
66     friend class base::RefCountedThreadSafe<Core, CoreTraits>;
67     friend class base::DeleteHelper<Core>;
68     friend struct CoreTraits;
69
70     virtual ~Core();
71
72     void ConnectOnIO(const GURL& url,
73                      bool* success,
74                      base::WaitableEvent* event);
75     void OnConnectCompletedOnIO(bool* connected,
76                                 base::WaitableEvent* event,
77                                 int error);
78     void SendOnIO(const std::string& message,
79                   bool* result,
80                   base::WaitableEvent* event);
81
82     // OnDestruct is meant to ensure deletion on the IO thread.
83     void OnDestruct() const;
84
85     scoped_refptr<net::URLRequestContextGetter> context_getter_;
86
87     // Only accessed on IO thread.
88     scoped_ptr<WebSocket> socket_;
89
90     base::Lock lock_;
91
92     // Protected by |lock_|.
93     bool is_connected_;
94
95     // Protected by |lock_|.
96     std::list<std::string> received_queue_;
97
98     // Protected by |lock_|.
99     // Signaled when the socket closes or a message is received.
100     base::ConditionVariable on_update_event_;
101   };
102
103   scoped_refptr<Core> core_;
104 };
105
106 struct SyncWebSocketImpl::CoreTraits {
107   static void Destruct(const SyncWebSocketImpl::Core* core) {
108     core->OnDestruct();
109   }
110 };
111
112 #endif  // CHROME_TEST_CHROMEDRIVER_NET_SYNC_WEBSOCKET_IMPL_H_