Document Status: Draft. More explanation needed.
NS_IMETHODIMP
nsMyImplementation::QueryInterface( REFNSIID aIID, void** aInstancePtr )
{
if ( !aInstancePtr )
return NS_ERROR_NULL_POINTER;
if ( aIID.Equals(nsIX::GetIID()) )
*aInstancePtr = NS_STATIC_CAST(nsIX*, this);
else if ( aIID.Equals(nsIY::GetIID()) )
*aInstancePtr = NS_STATIC_CAST(nsIY*, this);
// ...as many cases as needed...
else if ( aIID.Equals(kISupportsIID) )
*aInstancePtr = NS_STATIC_CAST(nsISupports*, NS_STATIC_CAST(nsIX*, this));
else
*aInstancePtr = 0;
nsresult status;
if ( !*aInstancePtr )
status = NS_NOINTERFACE;
else
{
NS_ADDREF( NS_REINTERPRET_CAST(nsISupports*, *aInstancePtr) );
status = NS_OK;
}
return status;
}