diff --git a/netwerk/base/src/nsInputStreamChannel.cpp b/netwerk/base/src/nsInputStreamChannel.cpp new file mode 100644 index 000000000000..44da165c9114 --- /dev/null +++ b/netwerk/base/src/nsInputStreamChannel.cpp @@ -0,0 +1,184 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#include "nsInputStreamChannel.h" +#include "nsIStreamListener.h" + +//////////////////////////////////////////////////////////////////////////////// +// nsInputStreamChannel methods: + +nsInputStreamChannel::nsInputStreamChannel() + : mURI(nsnull), mContentType(nsnull), mInputStream(nsnull) +{ + NS_INIT_REFCNT(); +} + +nsInputStreamChannel::~nsInputStreamChannel() { + NS_IF_RELEASE(mURI); + if (mContentType) nsCRT::free(mContentType); + NS_IF_RELEASE(mInputStream); +} + +NS_METHOD +nsInputStreamChannel::Create(nsISupports *aOuter, REFNSIID aIID, + void **aResult) +{ + nsInputStreamChannel* about = new nsInputStreamChannel(); + if (about == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + NS_ADDREF(about); + nsresult rv = about->QueryInterface(aIID, aResult); + NS_RELEASE(about); + return rv; +} + +nsresult +nsInputStreamChannel::Init(nsIURI* uri, const char* contentType, + nsIInputStream* in) +{ + mURI = uri; + NS_IF_ADDREF(mURI); + mContentType = nsCRT::strdup(contentType); + if (mContentType == nsnull) + return NS_ERROR_OUT_OF_MEMORY; + mInputStream = in; + NS_IF_ADDREF(mInputStream); + return NS_OK; +} + +NS_IMPL_ISUPPORTS(nsInputStreamChannel, nsCOMTypeInfo::GetIID()); + +//////////////////////////////////////////////////////////////////////////////// +// nsIRequest methods: + +NS_IMETHODIMP +nsInputStreamChannel::IsPending(PRBool *result) +{ + *result = PR_FALSE; + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::Cancel(void) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::Suspend(void) +{ + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::Resume(void) +{ + return NS_OK; +} + +//////////////////////////////////////////////////////////////////////////////// +// nsIChannel methods: + +NS_IMETHODIMP +nsInputStreamChannel::GetURI(nsIURI * *aURI) +{ + *aURI = mURI; + NS_IF_ADDREF(mURI); + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::OpenInputStream(PRUint32 startPosition, PRInt32 readCount, + nsIInputStream **result) +{ + // if we had seekable streams, we could seek here: + NS_ASSERTION(startPosition == 0, "Can't seek in nsInputStreamChannel"); + *result = mInputStream; + NS_ADDREF(mInputStream); + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::OpenOutputStream(PRUint32 startPosition, nsIOutputStream **_retval) +{ + // we don't do output + return NS_ERROR_FAILURE; +} + +NS_IMETHODIMP +nsInputStreamChannel::AsyncRead(PRUint32 startPosition, PRInt32 readCount, + nsISupports *ctxt, nsIStreamListener *listener) +{ + // currently this happens before AsyncRead returns -- hope that's ok + nsresult rv; + rv = listener->OnStartRequest(ctxt); + if (NS_FAILED(rv)) return rv; + + PRUint32 amt; + while (PR_TRUE) { + rv = mInputStream->GetLength(&amt); + if (rv == NS_BASE_STREAM_EOF) { + rv = NS_OK; + break; + } + if (NS_FAILED(rv)) break; + if (readCount != -1) + amt = PR_MIN((PRUint32)readCount, amt); + if (amt == 0) + break; + rv = listener->OnDataAvailable(ctxt, mInputStream, 0, amt); + if (NS_FAILED(rv)) break; + } + + rv = listener->OnStopRequest(ctxt, rv, nsnull); // XXX error message + if (NS_FAILED(rv)) return rv; + + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::AsyncWrite(nsIInputStream *fromStream, PRUint32 startPosition, + PRInt32 writeCount, nsISupports *ctxt, + nsIStreamObserver *observer) +{ + // we don't do output + return NS_ERROR_FAILURE; +} + +NS_IMETHODIMP +nsInputStreamChannel::GetLoadAttributes(nsLoadFlags *aLoadAttributes) +{ + *aLoadAttributes = LOAD_NORMAL; + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::SetLoadAttributes(nsLoadFlags aLoadAttributes) +{ + // ignore attempts to set load attributes + return NS_OK; +} + +NS_IMETHODIMP +nsInputStreamChannel::GetContentType(char * *aContentType) +{ + *aContentType = nsCRT::strdup("text/html"); + return *aContentType ? NS_OK : NS_ERROR_OUT_OF_MEMORY; +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/netwerk/base/src/nsInputStreamChannel.h b/netwerk/base/src/nsInputStreamChannel.h new file mode 100644 index 000000000000..fc7636c7d9da --- /dev/null +++ b/netwerk/base/src/nsInputStreamChannel.h @@ -0,0 +1,75 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * + * The contents of this file are subject to the Netscape Public License + * Version 1.0 (the "NPL"); you may not use this file except in + * compliance with the NPL. You may obtain a copy of the NPL at + * http://www.mozilla.org/NPL/ + * + * Software distributed under the NPL is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL + * for the specific language governing rights and limitations under the + * NPL. + * + * The Initial Developer of this code under the NPL is Netscape + * Communications Corporation. Portions created by Netscape are + * Copyright (C) 1998 Netscape Communications Corporation. All Rights + * Reserved. + */ + +#ifndef nsInputStreamChannel_h__ +#define nsInputStreamChannel_h__ + +#include "nsIChannel.h" +#include "nsIInputStream.h" +#include "nsIURI.h" +#include "nsCRT.h" + +class nsInputStreamChannel : public nsIChannel +{ +public: + NS_DECL_ISUPPORTS + + // nsIRequest methods: + NS_IMETHOD IsPending(PRBool *result); + NS_IMETHOD Cancel(void); + NS_IMETHOD Suspend(void); + NS_IMETHOD Resume(void); + + // nsIChannel methods: + NS_IMETHOD GetURI(nsIURI * *aURI); + NS_IMETHOD OpenInputStream(PRUint32 startPosition, PRInt32 readCount, + nsIInputStream **_retval); + NS_IMETHOD OpenOutputStream(PRUint32 startPosition, nsIOutputStream **_retval); + NS_IMETHOD AsyncRead(PRUint32 startPosition, PRInt32 readCount, + nsISupports *ctxt, nsIStreamListener *listener); + NS_IMETHOD AsyncWrite(nsIInputStream *fromStream, PRUint32 startPosition, + PRInt32 writeCount, nsISupports *ctxt, + nsIStreamObserver *observer); + NS_IMETHOD GetLoadAttributes(nsLoadFlags *aLoadAttributes); + NS_IMETHOD SetLoadAttributes(nsLoadFlags aLoadAttributes); + NS_IMETHOD GetContentType(char * *aContentType); + + // nsInputStreamChannel methods: + nsInputStreamChannel(); + virtual ~nsInputStreamChannel(); + + static NS_METHOD + Create(nsISupports *aOuter, REFNSIID aIID, void **aResult); + + nsresult Init(nsIURI* uri, const char* contentType, nsIInputStream* in); + +protected: + nsIURI* mURI; + char* mContentType; + nsIInputStream* mInputStream; +}; + +#define NS_INPUTSTREAMCHANNEL_CID \ +{ /* ccae3fae-30f5-11d3-8cd0-0060b0fc14a3 */ \ + 0xccae3fae, \ + 0x30f5, \ + 0x11d3, \ + {0x8c, 0xd0, 0x00, 0x60, 0xb0, 0xfc, 0x14, 0xa3} \ +} + +#endif // nsInputStreamChannel_h__