if I know the CID of the component sitting behind an interface XX
(via nsIClassInfo) and I know the implementing C++ class
associated with the CID, is it then safe to "downcast" XX to
the implementing class?

btIBuffer* other;
btCBuffer* otherBuf = static_cast<btCBuffer*>(other);

Tobias.


I only want to do this in very _rare_ controlled cases - here, I want
to do some deep swapping of data held by components:


/* void swap (in btIBuffer other); */
NS_IMETHODIMP
btCBuffer::Swap(btIBuffer *other)
{
     // implements deep swapping

     PR_ASSERT(other);
     nsresult rv;

     nsCOMPtr<btIBuffer> otherBuffer(other);
     nsCOMPtr<nsIClassInfo> clsInfo (do_QueryInterface(otherBuffer, &rv));

     if (NS_FAILED(rv)) { // need nsIClassInfo to get to the ClassID
         return NS_ERROR_FAILURE;
     }

     // get the other components ClassID
     nsCID* clsId = nsnull;
     rv = clsInfo->GetClassID (&clsId);

     if (NS_FAILED(rv)) {
         return NS_ERROR_UNEXPECTED;
     }

     // get this components ClassID
     nsCID thisClsId = this->GetCID ();

     // bail out if those CIDs do not match !
     if (thisClsId.Equals(*clsId) == PR_FALSE) {
         return NS_ERROR_FAILURE;
     }

     // now, it should be safe to downcast the interface
     // to the component ..
     btCBuffer* otherBuf = static_cast<btCBuffer*>(other);

     // .. and do all the swap stuff directly
     void* data = otherBuf->data_;
     PRUint32 size = otherBuf->size_;
     PRUint32 length = otherBuf->length_;
     PRUint32 lbmask = otherBuf->lbmask_;

     otherBuf->data_ = this->data_;
     otherBuf->size_ = this->size_;
     otherBuf->length_ = this->length_;
     otherBuf->lbmask_ = this->lbmask_;

     this->data_ = data;
     this->size_ = size;
     this->length_ = length;
     this->lbmask_ = lbmask;

     return NS_OK;
}


Reply via email to