1// Copyright (c) 2011 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 CRYPTO_SCOPED_NSS_TYPES_H_
6#define CRYPTO_SCOPED_NSS_TYPES_H_
7#pragma once
8
9#include <nss.h>
10#include <pk11pub.h>
11
12#include "base/memory/scoped_ptr.h"
13
14namespace crypto {
15
16template <typename Type, void (*Destroyer)(Type*)>
17struct NSSDestroyer {
18  void operator()(Type* ptr) const {
19    if (ptr)
20      Destroyer(ptr);
21  }
22};
23
24template <typename Type, void (*Destroyer)(Type*, PRBool), PRBool freeit>
25struct NSSDestroyer1 {
26  void operator()(Type* ptr) const {
27    if (ptr)
28      Destroyer(ptr, freeit);
29  }
30};
31
32// Define some convenient scopers around NSS pointers.
33typedef scoped_ptr_malloc<
34    PK11Context, NSSDestroyer1<PK11Context,
35                               PK11_DestroyContext,
36                               PR_TRUE> > ScopedPK11Context;
37typedef scoped_ptr_malloc<
38    PK11SlotInfo, NSSDestroyer<PK11SlotInfo, PK11_FreeSlot> > ScopedPK11Slot;
39typedef scoped_ptr_malloc<
40    PK11SymKey, NSSDestroyer<PK11SymKey, PK11_FreeSymKey> > ScopedPK11SymKey;
41typedef scoped_ptr_malloc<
42    SECAlgorithmID, NSSDestroyer1<SECAlgorithmID,
43                                  SECOID_DestroyAlgorithmID,
44                                  PR_TRUE> > ScopedSECAlgorithmID;
45typedef scoped_ptr_malloc<
46    SECItem, NSSDestroyer1<SECItem,
47                           SECITEM_FreeItem,
48                           PR_TRUE> > ScopedSECItem;
49
50}  // namespace crypto
51
52#endif  // CRYPTO_SCOPED_NSS_TYPES_H_
53