1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4  * License, v. 2.0. If a copy of the MPL was not distributed with this
5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 
7 #include "nsCOMPtr.h"
8 
9 nsresult
operator ()(const nsIID & aIID,void ** aAnswer) const10 nsQueryInterface::operator()(const nsIID& aIID, void** aAnswer) const
11 {
12   nsresult status;
13   if (mRawPtr) {
14     status = mRawPtr->QueryInterface(aIID, aAnswer);
15   } else {
16     status = NS_ERROR_NULL_POINTER;
17   }
18 
19   return status;
20 }
21 
22 nsresult
operator ()(const nsIID & aIID,void ** aAnswer) const23 nsQueryInterfaceWithError::operator()(const nsIID& aIID, void** aAnswer) const
24 {
25   nsresult status;
26   if (mRawPtr) {
27     status = mRawPtr->QueryInterface(aIID, aAnswer);
28   } else {
29     status = NS_ERROR_NULL_POINTER;
30   }
31 
32   if (mErrorPtr) {
33     *mErrorPtr = status;
34   }
35   return status;
36 }
37 
38 void
assign_with_AddRef(nsISupports * aRawPtr)39 nsCOMPtr_base::assign_with_AddRef(nsISupports* aRawPtr)
40 {
41   if (aRawPtr) {
42     NSCAP_ADDREF(this, aRawPtr);
43   }
44   assign_assuming_AddRef(aRawPtr);
45 }
46 
47 void
assign_from_qi(const nsQueryInterface aQI,const nsIID & aIID)48 nsCOMPtr_base::assign_from_qi(const nsQueryInterface aQI, const nsIID& aIID)
49 {
50   void* newRawPtr;
51   if (NS_FAILED(aQI(aIID, &newRawPtr))) {
52     newRawPtr = nullptr;
53   }
54   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
55 }
56 
57 void
assign_from_qi_with_error(const nsQueryInterfaceWithError & aQI,const nsIID & aIID)58 nsCOMPtr_base::assign_from_qi_with_error(const nsQueryInterfaceWithError& aQI,
59                                          const nsIID& aIID)
60 {
61   void* newRawPtr;
62   if (NS_FAILED(aQI(aIID, &newRawPtr))) {
63     newRawPtr = nullptr;
64   }
65   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
66 }
67 
68 void
assign_from_gs_cid(const nsGetServiceByCID aGS,const nsIID & aIID)69 nsCOMPtr_base::assign_from_gs_cid(const nsGetServiceByCID aGS,
70                                   const nsIID& aIID)
71 {
72   void* newRawPtr;
73   if (NS_FAILED(aGS(aIID, &newRawPtr))) {
74     newRawPtr = nullptr;
75   }
76   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
77 }
78 
79 void
assign_from_gs_cid_with_error(const nsGetServiceByCIDWithError & aGS,const nsIID & aIID)80 nsCOMPtr_base::assign_from_gs_cid_with_error(
81     const nsGetServiceByCIDWithError& aGS, const nsIID& aIID)
82 {
83   void* newRawPtr;
84   if (NS_FAILED(aGS(aIID, &newRawPtr))) {
85     newRawPtr = nullptr;
86   }
87   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
88 }
89 
90 void
assign_from_gs_contractid(const nsGetServiceByContractID aGS,const nsIID & aIID)91 nsCOMPtr_base::assign_from_gs_contractid(const nsGetServiceByContractID aGS,
92                                          const nsIID& aIID)
93 {
94   void* newRawPtr;
95   if (NS_FAILED(aGS(aIID, &newRawPtr))) {
96     newRawPtr = nullptr;
97   }
98   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
99 }
100 
101 void
assign_from_gs_contractid_with_error(const nsGetServiceByContractIDWithError & aGS,const nsIID & aIID)102 nsCOMPtr_base::assign_from_gs_contractid_with_error(
103     const nsGetServiceByContractIDWithError& aGS, const nsIID& aIID)
104 {
105   void* newRawPtr;
106   if (NS_FAILED(aGS(aIID, &newRawPtr))) {
107     newRawPtr = nullptr;
108   }
109   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
110 }
111 
112 void
assign_from_helper(const nsCOMPtr_helper & aHelper,const nsIID & aIID)113 nsCOMPtr_base::assign_from_helper(const nsCOMPtr_helper& aHelper,
114                                   const nsIID& aIID)
115 {
116   void* newRawPtr;
117   if (NS_FAILED(aHelper(aIID, &newRawPtr))) {
118     newRawPtr = nullptr;
119   }
120   assign_assuming_AddRef(static_cast<nsISupports*>(newRawPtr));
121 }
122 
123 void**
begin_assignment()124 nsCOMPtr_base::begin_assignment()
125 {
126   assign_assuming_AddRef(nullptr);
127   return reinterpret_cast<void**>(&mRawPtr);
128 }
129