I made few mistakes in my previous note, following attached a working code. Please note that mystrstream is a little wrapper for ostrstream. Its code is also attached below.

Greetings from Israel,
Anton.

_________________________________________________________________________


static inline bool getStream(nsCOMPtr<nsIByteArrayInputStream>& stream, const char *data, const int size) { if (!data || size <= 0) return true;

        char *temp = (char *)nsMemory::Alloc(size + 1);
        if (!temp)
                return false;

        strcpy(temp, data);

// Create a byte array input stream object.
nsCOMPtr<nsIByteArrayInputStream> bytestr;
if (NS_FAILED(NS_NewByteArrayInputStream(getter_AddRefs(bytestr), temp, size)) || !bytestr)
{
nsMemory::Free(temp);
return false;
}


        stream = bytestr;
        return true;
}

static inline bool makePostStreams(const string& data,
        nsCOMPtr<nsIByteArrayInputStream>& dataStream,
        nsCOMPtr<nsIByteArrayInputStream>& headersStream)
{
        if (data.empty())
                return true;

        mystrstream str;
        str << "Content-Length: " << data.length() << "\r\n\r\n" << data;

if (!getStream(dataStream, str.str(), str.pcount()))
return false;

static const char postHeader[] = "Content-Type: application/x-www-form-urlencoded\r\n";
return getStream(headersStream, postHeader, strlen(postHeader));
}


void nsPluginInstance::PostQuery(const string& url, const string& data)
{
nsCOMPtr<nsIWebNavigation> webNavigation;
m_spBrowser->QueryInterface(NS_GET_IID(nsIWebNavigation), (void **)&webNavigation);

nsCOMPtr<nsIByteArrayInputStream> dataStream;
nsCOMPtr<nsIByteArrayInputStream> headersStream;

if (!makePostStreams(data, dataStream, headersStream))
return;


webNavigation->LoadURI(a2w(url.c_str()),
nsIWebNavigation::LOAD_FLAGS_BYPASS_CACHE | nsIWebNavigation::LOAD_FLAGS_BYPASS_PROXY,
nsnull,
dataStream,
headersStream);
}




class mystrstream : public std::ostrstream
{
public:
        // The call to str() freezes the buffer.
        // To prevent a memory leak, we should unfreeze it, or free it ourselves.
        virtual ~mystrstream()
        {
                rdbuf()->freeze(false);
        }
        const char *str()
        {
                std::ends(*this);                               // Zero-terminate the 
string.
                return rdbuf()->str();
        }
        void reset()
        {
                seekp(0);
                rdbuf()->freeze(false);
        }
        int pcount()
        {
                return rdbuf()->pcount();
        }
};
_______________________________________________
mozilla-embedding mailing list
[EMAIL PROTECTED]
http://mail.mozilla.org/listinfo/mozilla-embedding

Reply via email to