Mozdev
mozilla/verbosio/datatypes/nsReadonlyWrapper.cpp
author Alex Vincent@SKYFIREDEMO1
Mon Oct 20 22:25:52 2008 -0700 (15 months ago)
changeset 46 9db1ccb62e4d
parent 313c08ad38a682
child 61dbfae695a375
permissions -rw-r--r--
Remove more JSLib cruft.
     1 #include "nsComponentManagerUtils.h"
     2 #include "nsID.h"
     3 #include "nsReadonlyWrapper.h"
     4 #include "nsReadonlyClasses.h"
     5 #include "nsIVariant.h"
     6 
     7 NS_IMPL_ISUPPORTS1(nsReadonlyWrapper, nsIInterfaceWrapper)
     8 
     9 nsReadonlyWrapper::nsReadonlyWrapper()
    10 {
    11   // do nothing
    12 }
    13 
    14 nsReadonlyWrapper::~nsReadonlyWrapper()
    15 {
    16   Shutdown();
    17 }
    18 
    19 nsresult
    20 nsReadonlyWrapper::GetWrapperNative(const nsIID & iid,
    21                                     nsISupports *wrappee,
    22                                     nsISupports **wrapper)
    23 {
    24   NS_ENSURE_ARG_POINTER(wrappee);
    25   *wrapper = nsnull;
    26   nsresult rv;
    27   
    28   if (iid.Equals(NS_GET_IID(nsIArray)))
    29   {
    30     nsCOMPtr<nsIArray> array = do_QueryInterface((nsISupports*) wrappee, &rv);
    31     NS_ENSURE_SUCCESS(rv, rv);
    32     nsCOMPtr<nsIArray> localArray = new nsArrayRO(array);
    33     NS_ENSURE_TRUE(localArray, NS_ERROR_OUT_OF_MEMORY);
    34     NS_IF_ADDREF(*wrapper = localArray);
    35     return NS_OK;
    36   }
    37 
    38   if (iid.Equals(NS_GET_IID(nsIDataMatrix)))
    39   {
    40     nsCOMPtr<nsIDataMatrix> data
    41       = do_QueryInterface((nsISupports*) wrappee, &rv);
    42     NS_ENSURE_SUCCESS(rv, rv);
    43     nsCOMPtr<nsIDataMatrix> localData = new nsDataMatrixRO(data);
    44     NS_ENSURE_TRUE(localData, NS_ERROR_OUT_OF_MEMORY);
    45     NS_IF_ADDREF(*wrapper = localData);
    46     return NS_OK;
    47   }
    48 
    49   return NS_ERROR_NO_INTERFACE;
    50 }
    51 
    52 NS_IMETHODIMP
    53 nsReadonlyWrapper::GetWrapper(const nsIID & iid,
    54                               nsISupports *wrappee,
    55                               nsIVariant **_retval)
    56 {
    57   nsISupports* wrapper = nsnull;
    58   nsresult rv = GetWrapperNative(iid, wrappee, &wrapper);
    59   NS_ENSURE_SUCCESS(rv, rv);
    60 
    61   nsCOMPtr<nsIWritableVariant> variant
    62     = do_CreateInstance(NS_VARIANT_CONTRACTID, &rv);
    63   NS_ENSURE_SUCCESS(rv, rv);
    64 
    65   rv = variant->SetAsInterface(iid, wrapper);
    66   NS_ENSURE_SUCCESS(rv, rv);
    67 
    68   // Prevent leak:  variant holds the owning reference now.
    69   NS_IF_RELEASE(wrapper);
    70 
    71   rv = variant->SetWritable(PR_FALSE);
    72   NS_ENSURE_SUCCESS(rv, rv);
    73   NS_ADDREF(*_retval = variant);
    74   return NS_OK;
    75 }
    76 
    77 nsRefPtr<nsReadonlyWrapper>
    78 nsReadonlyWrapper::mService = nsnull;
    79 
    80 nsReadonlyWrapper*
    81 nsReadonlyWrapper::GetSingleton()
    82 {
    83   if (!nsReadonlyWrapper::mService)
    84     nsReadonlyWrapper::mService = new nsReadonlyWrapper();
    85   nsIInterfaceWrapper* service = nsReadonlyWrapper::mService;
    86   NS_IF_ADDREF(service);
    87   return nsReadonlyWrapper::mService;
    88 }
    89 
    90 void
    91 nsReadonlyWrapper::Shutdown()
    92 {
    93   //mService = nsnull;
    94 }