// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_IDENTITY_SERVICE_H_ #define CONTENT_RENDERER_MEDIA_WEBRTC_IDENTITY_SERVICE_H_ #include <deque> #include <string> #include "base/basictypes.h" #include "base/callback.h" #include "content/common/content_export.h" #include "content/public/renderer/render_process_observer.h" #include "url/gurl.h" namespace content { // This class handles WebRTC DTLS identity requests by sending IPC messages to // the browser process. Only one request is sent to the browser at a time; other // requests are queued and have to wait for the outstanding request to complete. class CONTENT_EXPORT WebRTCIdentityService : public RenderProcessObserver { public: typedef base::Callback< void(const std::string& certificate, const std::string& private_key)> SuccessCallback; typedef base::Callback<void(int error)> FailureCallback; WebRTCIdentityService(); virtual ~WebRTCIdentityService(); // Sends an identity request. // // |origin| is the origin of the caller; // |identity_name| and |common_name| have the same meaning as in // webrtc::DTLSIdentityServiceInterface::RequestIdentity; // |success_callback| is the callback if the identity is successfully // returned; // |failure_callback| is the callback if the identity request fails. // // The request id is returned. It's unique within the renderer and can be used // to cancel the request. int RequestIdentity(const GURL& origin, const std::string& identity_name, const std::string& common_name, const SuccessCallback& success_callback, const FailureCallback& failure_callback); // Cancels a previous request and the callbacks will not be called. // If the |request_id| is not associated with the // outstanding request or any queued request, this method does nothing. // // |request_id| is the request id returned from RequestIdentity. void CancelRequest(int request_id); protected: // For unittest to override. virtual bool Send(IPC::Message* message); // RenderProcessObserver implementation. Protected for testing. virtual bool OnControlMessageReceived(const IPC::Message& message) OVERRIDE; private: struct RequestInfo { RequestInfo(int request_id, const GURL& origin, const std::string& identity_name, const std::string& common_name, const SuccessCallback& success_callback, const FailureCallback& failure_callback); ~RequestInfo(); int request_id; GURL origin; std::string identity_name; std::string common_name; SuccessCallback success_callback; FailureCallback failure_callback; }; // IPC message handlers. void OnIdentityReady(int request_id, const std::string& certificate, const std::string& private_key); void OnRequestFailed(int request_id, int error); void SendRequest(const RequestInfo& request_info); void OnOutstandingRequestReturned(); std::deque<RequestInfo> pending_requests_; int next_request_id_; DISALLOW_COPY_AND_ASSIGN(WebRTCIdentityService); }; } // namespace content #endif // CONTENT_RENDERER_MEDIA_WEBRTC_IDENTITY_SERVICE_H_