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