Back to index

lightning-sunbird  0.9+nobinonly
nsNSSCleaner.h
Go to the documentation of this file.
00001 /* ***** BEGIN LICENSE BLOCK *****
00002  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00003  *
00004  * The contents of this file are subject to the Mozilla Public License Version
00005  * 1.1 (the "License"); you may not use this file except in compliance with
00006  * the License. You may obtain a copy of the License at
00007  * http://www.mozilla.org/MPL/
00008  *
00009  * Software distributed under the License is distributed on an "AS IS" basis,
00010  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00011  * for the specific language governing rights and limitations under the
00012  * License.
00013  *
00014  * The Original Code is Mozilla Communicator.
00015  *
00016  * The Initial Developer of the Original Code is
00017  * Netscape Communications Corporation.
00018  * Portions created by the Initial Developer are Copyright (C) 2002
00019  * the Initial Developer. All Rights Reserved.
00020  *
00021  * Contributor(s):
00022  *   Kai Engert <kaie@netscape.com>
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either the GNU General Public License Version 2 or later (the "GPL"), or
00026  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #ifndef _INC_NSSCleaner_H
00039 #define _INC_NSSCleaner_H
00040 
00041 /*
00042   NSSCleanupAutoPtrClass(CERTCertificate, CERT_DestroyCertificate)
00043 
00044   will produce:
00045 
00046   class CERTCertificateCleaner
00047   {
00048   private:
00049     CERTCertificateCleaner(const CERTCertificateCleaner&);
00050     CERTCertificateCleaner();
00051     void operator=(const CERTCertificateCleaner&);
00052     CERTCertificate *&object;
00053   public:
00054     CERTCertificateCleaner(CERTCertificate *&a_object)
00055       :object(a_object) {}
00056     ~CERTCertificateCleaner() {
00057       if (object) {
00058         CERT_DestroyCertificate(object);
00059         object = nsnull;
00060       }
00061     }
00062   };
00063   
00064   By making default and copy constructor, and assignment operator
00065   private, we will make sure nobody will be able to use it.
00066   Not defining bodies for them is an additional safeguard.
00067   
00068   This class is not designed to allow being passed around.
00069   It's just for automatic cleanup of a local variable.
00070   
00071   
00072   By storing a reference to the underlying pointer,
00073   we will zero out the given pointer variable,
00074   making sure it will not be used after it has been freed.
00075   
00076   Even better, in case the underlying pointer variable gets
00077   assigned another value, this will be recognized, and
00078   the latest value stored in the pointer will be freed.
00079   
00080   
00081   In order to not require everybody to have all the NSS
00082   includes in their implementation files,
00083   we don't declare the classes here.
00084   
00085 */
00086 
00087 #define NSSCleanupAutoPtrClass(nsstype, cleanfunc) \
00088 class nsstype##Cleaner                             \
00089 {                                                  \
00090 private:                                           \
00091   nsstype##Cleaner(const nsstype##Cleaner&);       \
00092   nsstype##Cleaner();                              \
00093   void operator=(const nsstype##Cleaner&);         \
00094   nsstype *&object;                                \
00095 public:                                            \
00096   nsstype##Cleaner(nsstype *&a_object)             \
00097     :object(a_object) {}                           \
00098   ~nsstype##Cleaner() {                            \
00099     if (object) {                                  \
00100       cleanfunc(object);                           \
00101       object = nsnull;                             \
00102     }                                              \
00103   }                                                \
00104 };
00105 
00106 #endif