| OLD | NEW | 
|    1 // Copyright 2014 The Chromium Authors. All rights reserved. |    1 // Copyright 2014 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #ifndef MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ |    5 #ifndef MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ | 
|    6 #define MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ |    6 #define MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ | 
|    7  |    7  | 
|    8 #include <queue> |    8 #include <queue> | 
|    9  |    9  | 
|   10 #include "network/public/interfaces/udp_socket.mojom.h" |   10 #include "network/public/interfaces/udp_socket.mojom.h" | 
 |   11 #include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" | 
|   11  |   12  | 
|   12 namespace mojo { |   13 namespace mojo { | 
|   13  |   14  | 
|   14 // This class is a wrapper around the UDPSocket interface. It provides local |   15 // This class is a wrapper around the UDPSocket interface. It provides local | 
|   15 // cache for received datagrams as well as for (excessive) send requests: |   16 // cache for received datagrams as well as for (excessive) send requests: | 
|   16 // - You call ReceiveFrom() to retrieve one datagram. If there is already cached |   17 // - You call ReceiveFrom() to retrieve one datagram. If there is already cached | 
|   17 //   data, the operation completes synchronously. |   18 //   data, the operation completes synchronously. | 
|   18 // - You don't need to worry about the max-pending-send-requests restriction |   19 // - You don't need to worry about the max-pending-send-requests restriction | 
|   19 //   imposed by the service side. If you make many SendTo() calls in a short |   20 //   imposed by the service side. If you make many SendTo() calls in a short | 
|   20 //   period of time, it caches excessive requests and sends them later. |   21 //   period of time, it caches excessive requests and sends them later. | 
|   21 class UDPSocketWrapper : public UDPSocketClient { |   22 class UDPSocketWrapper : public UDPSocketReceiver { | 
|   22  public: |   23  public: | 
|   23   typedef Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)> |   24   using ReceiveCallback = | 
|   24       ReceiveCallback; |   25       Callback<void(NetworkErrorPtr, NetAddressPtr, Array<uint8_t>)>; | 
|   25   typedef Callback<void(NetworkErrorPtr)> ErrorCallback; |   26   using ErrorCallback = Callback<void(NetworkErrorPtr)>; | 
 |   27   using BindOrConnectCallback = | 
 |   28       Callback<void(NetworkErrorPtr, | 
 |   29                     NetAddressPtr, | 
 |   30                     InterfaceRequest<UDPSocketReceiver>)>; | 
|   26  |   31  | 
|   27   explicit UDPSocketWrapper(UDPSocketPtr socket); |   32   explicit UDPSocketWrapper(UDPSocketPtr socket); | 
|   28  |   33  | 
|   29   // |receive_queue_slots| determines the size (in datagrams) of the local |   34   // |receive_queue_slots| determines the size (in datagrams) of the local | 
|   30   // receive queue, which caches incoming datagrams. |   35   // receive queue, which caches incoming datagrams. | 
|   31   // |requested_max_pending_sends| is used to call |   36   // |requested_max_pending_sends| is used to call | 
|   32   // NegotiateMaxPendingSendRequests() on |socket|. |   37   // NegotiateMaxPendingSendRequests() on |socket|. | 
|   33   // The two numbers should be greater than 0. If you would like to use default |   38   // The two numbers should be greater than 0. If you would like to use default | 
|   34   // values, please use the other constructor. |   39   // values, please use the other constructor. | 
|   35   UDPSocketWrapper(UDPSocketPtr socket, |   40   UDPSocketWrapper(UDPSocketPtr socket, | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   91     void Run(NetworkErrorPtr result) const override; |   96     void Run(NetworkErrorPtr result) const override; | 
|   92  |   97  | 
|   93    private: |   98    private: | 
|   94     // Because this callback is passed to a method of |socket_|, and |socket_| |   99     // Because this callback is passed to a method of |socket_|, and |socket_| | 
|   95     // is owned by |delegate_|, it should be safe to assume that |delegate_| is |  100     // is owned by |delegate_|, it should be safe to assume that |delegate_| is | 
|   96     // valid if/when Run() is called. |  101     // valid if/when Run() is called. | 
|   97     UDPSocketWrapper* delegate_; |  102     UDPSocketWrapper* delegate_; | 
|   98     ErrorCallback forward_callback_; |  103     ErrorCallback forward_callback_; | 
|   99   }; |  104   }; | 
|  100  |  105  | 
 |  106   class ReceiverBindingCallback : public BindOrConnectCallback::Runnable { | 
 |  107    public: | 
 |  108     ReceiverBindingCallback( | 
 |  109         UDPSocketWrapper* delegate, | 
 |  110         const Callback<void(NetworkErrorPtr, NetAddressPtr)>& wrapper_callback); | 
 |  111     ~ReceiverBindingCallback() override; | 
 |  112  | 
 |  113     // BindOrConnectCallback::Runnable implementation: | 
 |  114     void Run(NetworkErrorPtr result, | 
 |  115              NetAddressPtr addr, | 
 |  116              InterfaceRequest<UDPSocketReceiver> request) const override; | 
 |  117  | 
 |  118    private: | 
 |  119     // Because this callback is passed to a method of |socket_|, and |socket_| | 
 |  120     // is owned by |delegate_|, it should be safe to assume that |delegate_| is | 
 |  121     // valid if/when Run() is called. | 
 |  122     UDPSocketWrapper* delegate_; | 
 |  123     const Callback<void(NetworkErrorPtr, NetAddressPtr)> wrapper_callback_; | 
 |  124   }; | 
 |  125  | 
|  101   struct ReceivedData { |  126   struct ReceivedData { | 
|  102     ReceivedData(); |  127     ReceivedData(); | 
|  103     ~ReceivedData(); |  128     ~ReceivedData(); | 
|  104  |  129  | 
|  105     NetworkErrorPtr result; |  130     NetworkErrorPtr result; | 
|  106     NetAddressPtr src_addr; |  131     NetAddressPtr src_addr; | 
|  107     Array<uint8_t> data; |  132     Array<uint8_t> data; | 
|  108   }; |  133   }; | 
|  109  |  134  | 
|  110   struct SendRequest { |  135   struct SendRequest { | 
|  111     SendRequest(); |  136     SendRequest(); | 
|  112     ~SendRequest(); |  137     ~SendRequest(); | 
|  113  |  138  | 
|  114     NetAddressPtr dest_addr; |  139     NetAddressPtr dest_addr; | 
|  115     Array<uint8_t> data; |  140     Array<uint8_t> data; | 
|  116     ErrorCallback callback; |  141     ErrorCallback callback; | 
|  117   }; |  142   }; | 
|  118  |  143  | 
|  119   // UDPSocketClient implementation: |  144   // UDPSocketReceiver implementation: | 
|  120   void OnReceived(NetworkErrorPtr result, |  145   void OnReceived(NetworkErrorPtr result, | 
|  121                   NetAddressPtr src_addr, |  146                   NetAddressPtr src_addr, | 
|  122                   Array<uint8_t> data) override; |  147                   Array<uint8_t> data) override; | 
|  123  |  148  | 
|  124   void Initialize(uint32_t requested_max_pending_sends); |  149   void Initialize(uint32_t requested_max_pending_sends); | 
|  125   void OnNegotiateMaxPendingSendRequestsCompleted(uint32_t actual_size); |  150   void OnNegotiateMaxPendingSendRequestsCompleted(uint32_t actual_size); | 
|  126  |  151  | 
|  127   void OnSendToCompleted(NetworkErrorPtr result, |  152   void OnSendToCompleted(NetworkErrorPtr result, | 
|  128                          const ErrorCallback& forward_callback); |  153                          const ErrorCallback& forward_callback); | 
|  129  |  154  | 
|  130   // Returns true if a send request in |send_requests_| has been processed. |  155   // Returns true if a send request in |send_requests_| has been processed. | 
|  131   bool ProcessNextSendRequest(); |  156   bool ProcessNextSendRequest(); | 
|  132  |  157  | 
 |  158   // Binds to a UDPSocketReceiver request and notifies |socket_| that we're | 
 |  159   // ready to start receiving data. | 
 |  160   void StartReceivingData(InterfaceRequest<UDPSocketReceiver> request); | 
 |  161  | 
 |  162   Binding<UDPSocketReceiver> binding_; | 
 |  163  | 
|  133   UDPSocketPtr socket_; |  164   UDPSocketPtr socket_; | 
|  134  |  165  | 
|  135   uint32_t max_receive_queue_size_; |  166   uint32_t max_receive_queue_size_; | 
|  136  |  167  | 
|  137   // Owns all the objects that its elements point to. |  168   // Owns all the objects that its elements point to. | 
|  138   std::queue<ReceivedData*> receive_queue_; |  169   std::queue<ReceivedData*> receive_queue_; | 
|  139  |  170  | 
|  140   std::queue<ReceiveCallback> receive_requests_; |  171   std::queue<ReceiveCallback> receive_requests_; | 
|  141  |  172  | 
|  142   uint32_t max_pending_sends_; |  173   uint32_t max_pending_sends_; | 
|  143   uint32_t current_pending_sends_; |  174   uint32_t current_pending_sends_; | 
|  144  |  175  | 
|  145   // Owns all the objects that its elements point to. |  176   // Owns all the objects that its elements point to. | 
|  146   std::queue<SendRequest*> send_requests_; |  177   std::queue<SendRequest*> send_requests_; | 
|  147 }; |  178 }; | 
|  148  |  179  | 
|  149 }  // namespace mojo |  180 }  // namespace mojo | 
|  150  |  181  | 
|  151 #endif  // MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ |  182 #endif  // MOJO_SERVICES_NETWORK_PUBLIC_CPP_UDP_SOCKET_WRAPPER_H_ | 
| OLD | NEW |