/*
 *  Copyright 2016 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#ifndef WEBRTC_BASE_RTCCERTIFICATEGENERATOR_H_
#define WEBRTC_BASE_RTCCERTIFICATEGENERATOR_H_

#include "webrtc/base/optional.h"
#include "webrtc/base/refcount.h"
#include "webrtc/base/rtccertificate.h"
#include "webrtc/base/scoped_ref_ptr.h"
#include "webrtc/base/sslidentity.h"
#include "webrtc/base/thread.h"

namespace rtc {

class RTCCertificateGeneratorCallback : public RefCountInterface {
 public:
  virtual void OnSuccess(
    const scoped_refptr<RTCCertificate>& certificate) = 0;
  virtual void OnFailure() = 0;

 protected:
  ~RTCCertificateGeneratorCallback() override {}
};

// Generates |RTCCertificate|s.
// The static function |GenerateCertificate| generates a certificate on the
// current thread. The |RTCCertificateGenerator| instance generates certificates
// asynchronously on the worker thread with |GenerateCertificateAsync|.
class RTCCertificateGenerator {
 public:
  // Generates a certificate on the current thread. Returns null on failure.
  // If |expires_ms| is specified, the certificate will expire in approximately
  // that many milliseconds from now. |expires_ms| is limited to a year, a
  // larger value than that is clamped down to a year. If |expires_ms| is not
  // specified, a default expiration time is used.
  static scoped_refptr<RTCCertificate> GenerateCertificate(
      const KeyParams& key_params,
      const Optional<uint64_t>& expires_ms);

  RTCCertificateGenerator(Thread* signaling_thread, Thread* worker_thread);

  // Generates a certificate asynchronously on the worker thread.
  // Must be called on the signaling thread. The |callback| is invoked with the
  // result on the signaling thread. If |expires_ms| is specified, the
  // certificate will expire in approximately that many milliseconds from now.
  // |expires_ms| is limited to a year, a larger value than that is clamped down
  // to a year. If |expires_ms| is not  specified, a default expiration time is
  // used.
  void GenerateCertificateAsync(
      const KeyParams& key_params,
      const Optional<uint64_t>& expires_ms,
      const scoped_refptr<RTCCertificateGeneratorCallback>& callback);

 private:
  Thread* const signaling_thread_;
  Thread* const worker_thread_;
};

}  // namespace rtc

#endif  // WEBRTC_BASE_RTCCERTIFICATEGENERATOR_H_
