1
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
/* ***** BEGIN LICENSE BLOCK *****
3
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
* The contents of this file are subject to the Mozilla Public License Version
6
* 1.1 (the "License"); you may not use this file except in compliance with
7
* the License. You may obtain a copy of the License at
8
* http://www.mozilla.org/MPL/
10
* Software distributed under the License is distributed on an "AS IS" basis,
11
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
* for the specific language governing rights and limitations under the
15
* The Original Code is the Mozilla XTF project.
17
* The Initial Developer of the Original Code is
19
* Portions created by the Initial Developer are Copyright (C) 2004
20
* the Initial Developer. All Rights Reserved.
23
* Alex Fritze <alex@croczilla.com> (original author)
25
* Alternatively, the contents of this file may be used under the terms of
26
* either the GNU General Public License Version 2 or later (the "GPL"), or
27
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28
* in which case the provisions of the GPL or the LGPL are applicable instead
29
* of those above. If you wish to allow use of your version of this file only
30
* under the terms of either the GPL or the LGPL, and not to allow others to
31
* use your version of this file under the terms of the MPL, indicate your
32
* decision by deleting the provisions above and replace them with the notice
33
* and other provisions required by the GPL or the LGPL. If you do not delete
34
* the provisions above, a recipient may use your version of this file under
35
* the terms of any one of the MPL, the GPL or the LGPL.
37
* ***** END LICENSE BLOCK ***** */
40
#include "nsXPTCUtils.h"
41
#include "nsIInterfaceInfo.h"
42
#include "nsIInterfaceInfoManager.h"
43
#include "nsServiceManagerUtils.h"
44
#include "nsAutoPtr.h"
49
////////////////////////////////////////////////////////////////////////
50
// nsXTFWeakTearoff class
52
class nsXTFWeakTearoff : protected nsAutoXPTCStub
58
nsXTFWeakTearoff(const nsIID& iid,
62
// nsISupports interface
65
NS_IMETHOD CallMethod(PRUint16 methodIndex,
66
const XPTMethodDescriptor* info,
67
nsXPTCMiniVariant* params);
74
//----------------------------------------------------------------------
77
nsXTFWeakTearoff::nsXTFWeakTearoff(const nsIID& iid,
80
: mObj(obj), mIID(iid)
82
MOZ_COUNT_CTOR(nsXTFWeakTearoff);
87
nsXTFWeakTearoff::~nsXTFWeakTearoff()
89
MOZ_COUNT_DTOR(nsXTFWeakTearoff);
93
NS_NewXTFWeakTearoff(const nsIID& iid,
95
nsISupports** aResult){
96
NS_PRECONDITION(aResult != nsnull, "null ptr");
98
return NS_ERROR_NULL_POINTER;
102
nsRefPtr<nsXTFWeakTearoff> result =
103
new nsXTFWeakTearoff(iid, obj, &rv);
105
return NS_ERROR_OUT_OF_MEMORY;
110
return result->QueryInterface(iid, (void**) aResult);
113
//----------------------------------------------------------------------
114
// nsISupports implementation
116
NS_IMPL_ADDREF(nsXTFWeakTearoff)
117
NS_IMPL_RELEASE(nsXTFWeakTearoff)
120
nsXTFWeakTearoff::QueryInterface(REFNSIID aIID, void** aInstancePtr)
122
NS_PRECONDITION(aInstancePtr, "null out param");
124
if (aIID.Equals(mIID) || aIID.Equals(NS_GET_IID(nsISupports))) {
125
*aInstancePtr = mXPTCStub;
129
// we can't map QI onto the obj, because the xpcom wrapper otherwise
130
// QI-accumulates all interfaces defined on mObj
131
// else return mObj->QueryInterface(aIID, aInstancePtr);
132
*aInstancePtr = nsnull;
133
return NS_ERROR_NO_INTERFACE;
137
nsXTFWeakTearoff::CallMethod(PRUint16 methodIndex,
138
const XPTMethodDescriptor* info,
139
nsXPTCMiniVariant* params)
141
NS_ASSERTION(methodIndex >= 3,
142
"huh? indirect nsISupports method call unexpected");
145
int paramCount = info->num_args;
146
nsXPTCVariant* fullPars;
151
fullPars = new nsXPTCVariant[paramCount];
153
return NS_ERROR_OUT_OF_MEMORY;
156
for (int i=0; i<paramCount; ++i) {
157
const nsXPTParamInfo& paramInfo = info->params[i];
158
uint8 flags = paramInfo.IsOut() ? nsXPTCVariant::PTR_IS_DATA : 0;
159
fullPars[i].Init(params[i], paramInfo.GetType(), flags);
163
nsresult rv = NS_InvokeByIndex(mObj, methodIndex, paramCount, fullPars);