Back to index

lightning-sunbird  0.9+nobinonly
nsWeakReference.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
00002  *
00003  * ***** BEGIN LICENSE BLOCK *****
00004  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00005  *
00006  * The contents of this file are subject to the Mozilla Public License Version
00007  * 1.1 (the "License"); you may not use this file except in compliance with
00008  * the License. You may obtain a copy of the License at
00009  * http://www.mozilla.org/MPL/
00010  *
00011  * Software distributed under the License is distributed on an "AS IS" basis,
00012  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00013  * for the specific language governing rights and limitations under the
00014  * License.
00015  *
00016  * The Original Code is the Mozilla browser.
00017  *
00018  * The Initial Developer of the Original Code is
00019  * Netscape Communications, Inc.
00020  * Portions created by the Initial Developer are Copyright (C) 1999
00021  * the Initial Developer. All Rights Reserved.
00022  *
00023  * Contributor(s):
00024  *   Scott Collins <scc@netscape.com>
00025  *   Pierre Phaneuf <pp@ludusdesign.com>
00026  *
00027  * Alternatively, the contents of this file may be used under the terms of
00028  * either of the GNU General Public License Version 2 or later (the "GPL"),
00029  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00030  * in which case the provisions of the GPL or the LGPL are applicable instead
00031  * of those above. If you wish to allow use of your version of this file only
00032  * under the terms of either the GPL or the LGPL, and not to allow others to
00033  * use your version of this file under the terms of the MPL, indicate your
00034  * decision by deleting the provisions above and replace them with the notice
00035  * and other provisions required by the GPL or the LGPL. If you do not delete
00036  * the provisions above, a recipient may use your version of this file under
00037  * the terms of any one of the MPL, the GPL or the LGPL.
00038  *
00039  * ***** END LICENSE BLOCK ***** */
00040 
00041 // nsWeakReference.cpp
00042 
00043 #include "nsWeakReference.h"
00044 #include "nsCOMPtr.h"
00045 
00046 nsresult
00047 nsQueryReferent::operator()( const nsIID& aIID, void** answer ) const
00048   {
00049     nsresult status;
00050     if ( mWeakPtr )
00051       {
00052         if ( NS_FAILED(status = mWeakPtr->QueryReferent(aIID, answer)) )
00053           *answer = 0;
00054       }
00055     else
00056       status = NS_ERROR_NULL_POINTER;
00057 
00058     if ( mErrorPtr )
00059       *mErrorPtr = status;
00060     return status;
00061   }
00062 
00063 NS_COM_GLUE nsIWeakReference*  // or else |already_AddRefed<nsIWeakReference>|
00064 NS_GetWeakReference( nsISupports* aInstancePtr, nsresult* aErrorPtr )
00065   {
00066     nsresult status;
00067 
00068     nsIWeakReference* result = nsnull;
00069 
00070     if ( aInstancePtr )
00071       {
00072         nsCOMPtr<nsISupportsWeakReference> factoryPtr = do_QueryInterface(aInstancePtr, &status);
00073         NS_ASSERTION(factoryPtr, "Oops!  You're asking for a weak reference to an object that doesn't support that.");
00074         if ( factoryPtr )
00075           {
00076             status = factoryPtr->GetWeakReference(&result);
00077           }
00078         // else, |status| has already been set by |do_QueryInterface|
00079       }
00080     else
00081       status = NS_ERROR_NULL_POINTER;
00082 
00083     if ( aErrorPtr )
00084       *aErrorPtr = status;
00085     return result;
00086   }
00087 
00088 NS_COM_GLUE nsresult
00089 nsSupportsWeakReference::GetWeakReference( nsIWeakReference** aInstancePtr )
00090   {
00091     if ( !aInstancePtr )
00092       return NS_ERROR_NULL_POINTER;
00093 
00094     if ( !mProxy )
00095       mProxy = new nsWeakReference(this);
00096     *aInstancePtr = mProxy;
00097 
00098     nsresult status;
00099     if ( !*aInstancePtr )
00100       status = NS_ERROR_OUT_OF_MEMORY;
00101     else
00102       {
00103         NS_ADDREF(*aInstancePtr);
00104         status = NS_OK;
00105       }
00106 
00107     return status;
00108   }
00109 
00110 NS_IMPL_ISUPPORTS1(nsWeakReference, nsIWeakReference)
00111 
00112 NS_IMETHODIMP
00113 nsWeakReference::QueryReferent( const nsIID& aIID, void** aInstancePtr )
00114   {
00115     return mReferent ? mReferent->QueryInterface(aIID, aInstancePtr) : NS_ERROR_NULL_POINTER;
00116   }