| Index: crypto/scoped_capi_types.h
|
| ===================================================================
|
| --- crypto/scoped_capi_types.h (revision 0)
|
| +++ crypto/scoped_capi_types.h (revision 0)
|
| @@ -0,0 +1,125 @@
|
| +// Copyright (c) 2011 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 CRYPTO_SCOPED_CAPI_TYPES_H_
|
| +#define CRYPTO_SCOPED_CAPI_TYPES_H_
|
| +#pragma once
|
| +
|
| +#include <windows.h>
|
| +#include <wincrypt.h>
|
| +
|
| +#include <algorithm>
|
| +
|
| +#include "base/logging.h"
|
| +
|
| +namespace crypto {
|
| +
|
| +// Simple destructor for the Free family of CryptoAPI functions, such as
|
| +// CryptDestroyHash, which take only a single argument to release.
|
| +template <typename CAPIHandle, BOOL (WINAPI *Destroyer)(CAPIHandle)>
|
| +struct CAPIDestroyer {
|
| + void operator()(CAPIHandle handle) const {
|
| + if (handle) {
|
| + BOOL ok = Destroyer(handle);
|
| + DCHECK(ok);
|
| + }
|
| + }
|
| +};
|
| +
|
| +// Destructor for the Close/Release family of CryptoAPI functions, which take
|
| +// a second DWORD parameter indicating flags to use when closing or releasing.
|
| +// This includes functions like CertCloseStore or CryptReleaseContext.
|
| +template <typename CAPIHandle, BOOL (WINAPI *Destroyer)(CAPIHandle, DWORD),
|
| + DWORD flags>
|
| +struct CAPIDestroyerWithFlags {
|
| + void operator()(CAPIHandle handle) const {
|
| + if (handle) {
|
| + BOOL ok = Destroyer(handle, flags);
|
| + DCHECK(ok);
|
| + }
|
| + }
|
| +};
|
| +
|
| +// scoped_ptr-like class for the CryptoAPI cryptography and certificate
|
| +// handles. Because these handles are defined as integer types, and not
|
| +// pointers, the existing scoped classes, such as scoped_ptr_malloc, are
|
| +// insufficient. The semantics are the same as scoped_ptr.
|
| +template <class CAPIHandle, typename FreeProc>
|
| +class ScopedCAPIHandle {
|
| + public:
|
| + explicit ScopedCAPIHandle(CAPIHandle handle = NULL) : handle_(handle) {}
|
| +
|
| + ~ScopedCAPIHandle() {
|
| + free_(handle_);
|
| + }
|
| +
|
| + void reset(CAPIHandle handle = NULL) {
|
| + if (handle_ != handle) {
|
| + free_(handle_);
|
| + handle_ = handle;
|
| + }
|
| + }
|
| +
|
| + operator CAPIHandle() const { return handle_; }
|
| + CAPIHandle get() const { return handle_; }
|
| +
|
| + CAPIHandle* receive() {
|
| + CHECK(handle_ == NULL);
|
| + return &handle_;
|
| + }
|
| +
|
| + bool operator==(CAPIHandle handle) const {
|
| + return handle_ == handle;
|
| + }
|
| +
|
| + bool operator!=(CAPIHandle handle) const {
|
| + return handle_ != handle;
|
| + }
|
| +
|
| + void swap(ScopedCAPIHandle& b) {
|
| + CAPIHandle tmp = b.handle_;
|
| + b.handle_ = handle_;
|
| + handle_ = tmp;
|
| + }
|
| +
|
| + CAPIHandle release() {
|
| + CAPIHandle tmp = handle_;
|
| + handle_ = NULL;
|
| + return tmp;
|
| + }
|
| +
|
| + private:
|
| + CAPIHandle handle_;
|
| + static const FreeProc free_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedCAPIHandle);
|
| +};
|
| +
|
| +template<class CH, typename FP>
|
| +const FP ScopedCAPIHandle<CH, FP>::free_ = FP();
|
| +
|
| +template<class CH, typename FP> inline
|
| +bool operator==(CH h, const ScopedCAPIHandle<CH, FP>& b) {
|
| + return h == b.get();
|
| +}
|
| +
|
| +template<class CH, typename FP> inline
|
| +bool operator!=(CH h, const ScopedCAPIHandle<CH, FP>& b) {
|
| + return h != b.get();
|
| +}
|
| +
|
| +typedef ScopedCAPIHandle<
|
| + HCRYPTPROV,
|
| + CAPIDestroyerWithFlags<HCRYPTPROV,
|
| + CryptReleaseContext, 0> > ScopedHCRYPTPROV;
|
| +
|
| +typedef ScopedCAPIHandle<
|
| + HCRYPTKEY, CAPIDestroyer<HCRYPTKEY, CryptDestroyKey> > ScopedHCRYPTKEY;
|
| +
|
| +typedef ScopedCAPIHandle<
|
| + HCRYPTHASH, CAPIDestroyer<HCRYPTHASH, CryptDestroyHash> > ScopedHCRYPTHASH;
|
| +
|
| +} // namespace crypto
|
| +
|
| +#endif // CRYPTO_SCOPED_CAPI_TYPES_H_
|
|
|
| Property changes on: crypto\scoped_capi_types.h
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|