On 2015年05月01日 04:09, Joshua Cranmer 🐧 wrote:
> On 4/30/2015 1:25 PM, ISHIKAWA, Chiaki wrote:
>> *   787       nsCOMPtr <nsIInputStream> inboxInputStream =
>> do_QueryInterface(m_outFileStream);
>>      788       rv = MsgReopenFileStream(m_tmpDownloadFile, inboxInputStream);
>>
>> Before, as in the current release, m_outFileStream is not buffered.
>> And the code on line 787 produces non-null inboxInputStream.
>>
>> However, once m_outFileStream is turned into a buffered output stream
>> using, say,
>>
>>    m_outFileStream = NS_BufferOutputStream(m_outFileStream, 64 * 1024 );
>>
>> the code on line 787 produces nullptr.
>>
>> Is this to be expected?
> 
> In short, yes. What happens is that the original m_outFileStream happens to
> be of type nsFileStreams (or something like that), which inherits from both
> nsIInputStream and nsIOutputStream. When you wrap that in a buffered output
> stream, the resulting type of m_outFileStream is of nsBufferedOutputStream,
> which does not inherit nsIInputStream; therefore the cast to nsIInputStream
> fails.
>>
>> Up until now, I thought of do_QueryInterface() as mere sugar-coating for
>> certain type-mutation or something. But I now know I am wrong.
> 
> do_QueryInterface is the equivalent of a type-checked downcast, e.g.
> (ClassName)foo in Java.  (Regular C++ downcasts are not dynamically
> type-checked).
>>
>> I read a page about do_QueryInterface() but it does not
>> explain the principle very much.
>>
>> Is the reason of failure something like as follows.
>> I am using a very general class hierarchy.
>>
>>
>>       A   base class
>>       |
>>   +---+---+
>>   B       C     B and C are derived from base class A
>>           |
>>         --+--+
>>              |
>>              D     D is derived further from Class D.
>>
>> Let's say Class B and C are derived from Class A.
>> Class D is further derived from Class C.
>> Let us assume there are corresponding XPCOM class/object A', B', C', D'.
>>
>> By using do_QueryInterface() on objects,
>>      we can follow the path of  direct "derives" relation
>>           B' <= do_QueryInterface (A') (or is it the other way round?)
>>
>>      and maybe between B' and C' (? Not sure about this.)
>>
>>      but we can NOT follow the direction of
>>        B' <= do_QueryInterface (D')
>>      That is
>>         X = do_QeuryInterface(Y) is possible only when X is the direct or
>> indirect  descendant of Y?
> 
> No, you are incorrect. The issue is the dynamic type of the object (if you
> have A *x = new B, the static type of x is A whereas the dynamic type is B).
> In the pre-modified code, the dynamic type of m_outFileStream supported the
> interface in question, but your modification changed the dynamic type to one
> that did not support the interface.
> 

Thank you. I am learning bit by bit.

I did not realize that the do_QueryInterface has something to do with
"dynamic type".

Hmm, a lot to learn just to be able to use less buggy mail client :-)

Thank you again.

CI


_______________________________________________
dev-platform mailing list
dev-platform@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-platform

Reply via email to