00001 // -*- C++ -*- 00002 // 00003 // SSLIOP_OpenSSL_st_T.inl,v 1.5 2005/11/16 07:53:24 ossama Exp 00004 00005 00006 #include <openssl/crypto.h> 00007 00008 TAO_BEGIN_VERSIONED_NAMESPACE_DECL 00009 00010 template <typename T> ACE_INLINE T * 00011 TAO::SSLIOP::_duplicate (T * st) 00012 { 00013 // Shallow copy. 00014 00015 // OpenSSL provides no structure-specific functions to increase the 00016 // reference count on the structure it defines, so we do it 00017 // manually. 00018 if (st != 0) 00019 CRYPTO_add (&(st->references), 00020 1, 00021 TAO::SSLIOP::OpenSSL_traits<T>::LOCK_ID); 00022 00023 return st; 00024 } 00025 00026 template <typename T> ACE_INLINE T * 00027 TAO::SSLIOP::copy (T const & st) 00028 { 00029 // Deep copy. 00030 return TAO::SSLIOP::OpenSSL_traits<T>::copy (st); 00031 } 00032 00033 template <typename T> ACE_INLINE void 00034 TAO::SSLIOP::release (T * st) 00035 { 00036 TAO::SSLIOP::OpenSSL_traits<T>::release (st); 00037 } 00038 00039 // ------------------------------------------------------------------- 00040 00041 template <typename T> ACE_INLINE 00042 TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (void) 00043 : st_ (0) 00044 { 00045 } 00046 00047 template <typename T> ACE_INLINE 00048 TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (T * st) 00049 : st_ (st) 00050 { 00051 } 00052 00053 template <typename T> ACE_INLINE 00054 TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var ( 00055 TAO::SSLIOP::OpenSSL_st_var<T> const & st) 00056 : st_ (TAO::SSLIOP::OpenSSL_traits<T>::_duplicate (st.ptr ())) 00057 { 00058 } 00059 00060 template <typename T> ACE_INLINE 00061 TAO::SSLIOP::OpenSSL_st_var<T>::OpenSSL_st_var (T const & st) 00062 : st_ (TAO::SSLIOP::OpenSSL_traits<T>::copy (st)) 00063 { 00064 } 00065 00066 template <typename T> ACE_INLINE 00067 TAO::SSLIOP::OpenSSL_st_var<T>::~OpenSSL_st_var (void) 00068 { 00069 TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_); 00070 // TAO::SSLIOP::release (this->st_); 00071 } 00072 00073 template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> & 00074 TAO::SSLIOP::OpenSSL_st_var<T>::operator= (T * st) 00075 { 00076 TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_); 00077 this->st_ = st; 00078 return *this; 00079 } 00080 00081 template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> & 00082 TAO::SSLIOP::OpenSSL_st_var<T>::operator= ( 00083 TAO::SSLIOP::OpenSSL_st_var<T> const & st) 00084 { 00085 if (this != &st) 00086 { 00087 TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_); 00088 this->st_ = TAO::SSLIOP::OpenSSL_traits<T>::_duplicate (st.ptr ()); 00089 } 00090 00091 return *this; 00092 } 00093 00094 template <typename T> ACE_INLINE TAO::SSLIOP::OpenSSL_st_var<T> & 00095 TAO::SSLIOP::OpenSSL_st_var<T>::operator= (T const & st) 00096 { 00097 if (this->st_ != &st) 00098 { 00099 TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_); 00100 this->st_ = TAO::SSLIOP::OpenSSL_traits<T>::copy (st); 00101 } 00102 00103 return *this; 00104 } 00105 00106 template <typename T> ACE_INLINE T const * 00107 TAO::SSLIOP::OpenSSL_st_var<T>::operator-> (void) const 00108 { 00109 return this->st_; 00110 } 00111 00112 template <typename T> ACE_INLINE T * 00113 TAO::SSLIOP::OpenSSL_st_var<T>::operator-> (void) 00114 { 00115 return this->st_; 00116 } 00117 00118 template <typename T> ACE_INLINE 00119 TAO::SSLIOP::OpenSSL_st_var<T>::operator T const &() const 00120 { 00121 return *this->st_; 00122 } 00123 00124 template <typename T> ACE_INLINE 00125 TAO::SSLIOP::OpenSSL_st_var<T>::operator T &() 00126 { 00127 return *this->st_; 00128 } 00129 00130 template <typename T> ACE_INLINE T * 00131 TAO::SSLIOP::OpenSSL_st_var<T>::in (void) const 00132 { 00133 return this->st_; 00134 } 00135 00136 template <typename T> ACE_INLINE T *& 00137 TAO::SSLIOP::OpenSSL_st_var<T>::inout (void) 00138 { 00139 return this->st_; 00140 } 00141 00142 template <typename T> ACE_INLINE T *& 00143 TAO::SSLIOP::OpenSSL_st_var<T>::out (void) 00144 { 00145 TAO::SSLIOP::OpenSSL_traits<T>::release (this->st_); 00146 this->st_ = 0; 00147 return this->st_; 00148 } 00149 00150 template <typename T> ACE_INLINE T * 00151 TAO::SSLIOP::OpenSSL_st_var<T>::_retn (void) 00152 { 00153 // Yield ownership of the OpenSSL structure. 00154 T * st = this->st_; 00155 this->st_ = 0; 00156 return st; 00157 } 00158 00159 template <typename T> ACE_INLINE T * 00160 TAO::SSLIOP::OpenSSL_st_var<T>::ptr (void) const 00161 { 00162 return this->st_; 00163 } 00164 00165 TAO_END_VERSIONED_NAMESPACE_DECL