Implementation of the XUL content sink.

This commit is contained in:
hyatt%netscape.com 1999-02-03 02:49:30 +00:00
Родитель 536c0ed72c
Коммит 3d3d6ae3c2
7 изменённых файлов: 282 добавлений и 7 удалений

Просмотреть файл

@ -69,5 +69,8 @@ public:
nsresult nsresult
NS_NewRDFContentSink(nsIRDFContentSink** aResult); NS_NewRDFContentSink(nsIRDFContentSink** aResult);
nsresult
NS_NewXULContentSink(nsIRDFContentSink** aResult);
#endif // nsIRDFContentSink_h___ #endif // nsIRDFContentSink_h___

Просмотреть файл

@ -204,9 +204,13 @@ public:
NS_IMETHOD RemoveXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver) = 0; NS_IMETHOD RemoveXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver) = 0;
}; };
// Two different kinds of XML data sources exist for RDF: serialized RDF and XUL.
// These are the methods that make these data sources.
extern nsresult extern nsresult
NS_NewRDFXMLDataSource(nsIRDFXMLDataSource** result); NS_NewRDFXMLDataSource(nsIRDFXMLDataSource** result);
extern nsresult
NS_NewXULDataSource(nsIRDFXMLDataSource** result);
#endif // nsIRDFXMLDataSource_h__ #endif // nsIRDFXMLDataSource_h__

Просмотреть файл

@ -62,6 +62,10 @@
#define NS_RDFXMLDATASOURCE_CID \ #define NS_RDFXMLDATASOURCE_CID \
{ 0x7baf62e0, 0x8e61, 0x11d2, { 0x8e, 0xb1, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } } { 0x7baf62e0, 0x8e61, 0x11d2, { 0x8e, 0xb1, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } }
// {6791B601-B9FE-11d2-BF86-00105A1B0627}
#define NS_XULDATASOURCE_CID \
{ 0x6791b601, 0xb9fe, 0x11d2, { 0xbf, 0x86, 0x0, 0x10, 0x5a, 0x1b, 0x6, 0x27 } }
// {0958B101-9ADA-11d2-8EBC-00805F29F370} // {0958B101-9ADA-11d2-8EBC-00805F29F370}
#define NS_RDFCONTENTSINK_CID \ #define NS_RDFCONTENTSINK_CID \
{ 0x958b101, 0x9ada, 0x11d2, { 0x8e, 0xbc, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } } { 0x958b101, 0x9ada, 0x11d2, { 0x8e, 0xbc, 0x0, 0x80, 0x5f, 0x29, 0xf3, 0x70 } }
@ -70,4 +74,8 @@
#define NS_RDFXULBUILDER_CID \ #define NS_RDFXULBUILDER_CID \
{ 0xe45313f0, 0xb59c, 0x11d2, { 0xa6, 0x8c, 0x0, 0x10, 0x4b, 0xde, 0x60, 0x48 } } { 0xe45313f0, 0xb59c, 0x11d2, { 0xa6, 0x8c, 0x0, 0x10, 0x4b, 0xde, 0x60, 0x48 } }
// {CE058B21-BA9C-11d2-BF86-00105A1B0627}
#define NS_XULCONTENTSINK_CID \
{ 0xce058b21, 0xba9c, 0x11d2, { 0xbf, 0x86, 0x0, 0x10, 0x5a, 0x1b, 0x6, 0x27 } }
#endif // nsRDFCID_h__ #endif // nsRDFCID_h__

Просмотреть файл

@ -47,6 +47,8 @@ static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
static NS_DEFINE_CID(kRDFTreeBuilderCID, NS_RDFTREEBUILDER_CID); static NS_DEFINE_CID(kRDFTreeBuilderCID, NS_RDFTREEBUILDER_CID);
static NS_DEFINE_CID(kRDFXMLDataSourceCID, NS_RDFXMLDATASOURCE_CID); static NS_DEFINE_CID(kRDFXMLDataSourceCID, NS_RDFXMLDATASOURCE_CID);
static NS_DEFINE_CID(kRDFXULBuilderCID, NS_RDFXULBUILDER_CID); static NS_DEFINE_CID(kRDFXULBuilderCID, NS_RDFXULBUILDER_CID);
static NS_DEFINE_CID(kXULDataSourceCID, NS_XULDATASOURCE_CID);
static NS_DEFINE_CID(kXULContentSinkCID, NS_XULCONTENTSINK_CID);
class RDFFactoryImpl : public nsIFactory class RDFFactoryImpl : public nsIFactory
{ {
@ -165,6 +167,14 @@ RDFFactoryImpl::CreateInstance(nsISupports *aOuter,
else if (mClassID.Equals(kRDFContentSinkCID)) { else if (mClassID.Equals(kRDFContentSinkCID)) {
if (NS_FAILED(rv = NS_NewRDFContentSink((nsIRDFContentSink**) &inst))) if (NS_FAILED(rv = NS_NewRDFContentSink((nsIRDFContentSink**) &inst)))
return rv; return rv;
}
else if (mClassID.Equals(kXULDataSourceCID)) {
if (NS_FAILED(rv = NS_NewXULDataSource((nsIRDFXMLDataSource**) &inst)))
return rv;
}
else if (mClassID.Equals(kXULContentSinkCID)) {
if (NS_FAILED(rv = NS_NewXULContentSink((nsIRDFContentSink**) &inst)))
return rv;
} }
else { else {
return NS_ERROR_NO_INTERFACE; return NS_ERROR_NO_INTERFACE;

Просмотреть файл

@ -29,6 +29,7 @@ LIBRARY_NAME = rdfdatasource_s
CPPSRCS = \ CPPSRCS = \
nsBookmarkDataSource.cpp \ nsBookmarkDataSource.cpp \
nsMailDataSource.cpp \ nsMailDataSource.cpp \
nsXULDataSource.cpp \
$(NULL) $(NULL)
EXPORTS = \ EXPORTS = \

Просмотреть файл

@ -22,6 +22,7 @@ LIBRARY_NAME=rdfdatasource_s
CPP_OBJS=\ CPP_OBJS=\
.\$(OBJDIR)\nsBookmarkDataSource.obj \ .\$(OBJDIR)\nsBookmarkDataSource.obj \
.\$(OBJDIR)\nsMailDataSource.obj \ .\$(OBJDIR)\nsMailDataSource.obj \
.\$(OBJDIR)\nsXULDataSource.obj \
$(NULL) $(NULL)
# XXX Note the dependency on $(DEPTH)\rdf\base\src: we use rdfutil.h over # XXX Note the dependency on $(DEPTH)\rdf\base\src: we use rdfutil.h over

Просмотреть файл

@ -40,6 +40,7 @@
#include "nsIRDFNode.h" #include "nsIRDFNode.h"
#include "nsIRDFService.h" #include "nsIRDFService.h"
#include "nsIRDFDataSource.h" #include "nsIRDFDataSource.h"
#include "nsIRDFXMLDataSource.h"
#include "nsIServiceManager.h" #include "nsIServiceManager.h"
#include "nsIStreamListener.h" #include "nsIStreamListener.h"
#include "nsIURL.h" #include "nsIURL.h"
@ -74,6 +75,9 @@ static NS_DEFINE_CID(kRDFContentSinkCID, NS_RDFCONTENTSINK_CID);
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID); static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
static NS_DEFINE_CID(kWellFormedDTDCID, NS_WELLFORMEDDTD_CID); static NS_DEFINE_CID(kWellFormedDTDCID, NS_WELLFORMEDDTD_CID);
static NS_DEFINE_IID(kIRDFXMLDataSourceIID, NS_IRDFXMLDATASOURCE_IID);
static NS_DEFINE_IID(kXULContentSinkCID, NS_XULCONTENTSINK_CID);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// Vocabulary stuff // Vocabulary stuff
#include "rdf.h" #include "rdf.h"
@ -84,7 +88,7 @@ DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, nextVal);
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// XULDataSourceImpl // XULDataSourceImpl
class XULDataSourceImpl : public nsIRDFDataSource class XULDataSourceImpl : public nsIRDFXMLDataSource
{ {
protected: protected:
struct NameSpaceMap { struct NameSpaceMap {
@ -207,13 +211,31 @@ public:
return mInner->DoCommand(aCommand, aCommandTarget); return mInner->DoCommand(aCommand, aCommandTarget);
} }
// nsIRDFXMLDataSource interface
NS_IMETHOD SetSynchronous(PRBool aIsSynchronous);
NS_IMETHOD SetReadOnly(PRBool aIsReadOnly);
NS_IMETHOD BeginLoad(void);
NS_IMETHOD Interrupt(void);
NS_IMETHOD Resume(void);
NS_IMETHOD EndLoad(void);
NS_IMETHOD SetRootResource(nsIRDFResource* aResource);
NS_IMETHOD GetRootResource(nsIRDFResource** aResource);
NS_IMETHOD AddCSSStyleSheetURL(nsIURL* aStyleSheetURL);
NS_IMETHOD GetCSSStyleSheetURLs(nsIURL*** aStyleSheetURLs, PRInt32* aCount);
NS_IMETHOD AddNamedDataSourceURI(const char* aNamedDataSourceURI);
NS_IMETHOD GetNamedDataSourceURIs(const char* const** aNamedDataSourceURIs, PRInt32* aCount);
NS_IMETHOD AddNameSpace(nsIAtom* aPrefix, const nsString& aURI);
NS_IMETHOD SetContentModelBuilderCID(nsID* aCID);
NS_IMETHOD GetContentModelBuilderCID(nsID* aCID);
NS_IMETHOD AddXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver);
NS_IMETHOD RemoveXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver);
}; };
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
nsresult nsresult
NS_NewXULDataSource(nsIRDFDataSource** result) NS_NewXULDataSource(nsIRDFXMLDataSource** result)
{ {
XULDataSourceImpl* ds = new XULDataSourceImpl(); XULDataSourceImpl* ds = new XULDataSourceImpl();
if (! ds) if (! ds)
@ -291,7 +313,8 @@ XULDataSourceImpl::QueryInterface(REFNSIID iid, void** result)
return NS_ERROR_NULL_POINTER; return NS_ERROR_NULL_POINTER;
if (iid.Equals(kISupportsIID) || if (iid.Equals(kISupportsIID) ||
iid.Equals(kIRDFDataSourceIID)) { iid.Equals(kIRDFDataSourceIID) ||
iid.Equals(kIRDFXMLDataSourceIID)) {
*result = NS_STATIC_CAST(nsIRDFDataSource*, this); *result = NS_STATIC_CAST(nsIRDFDataSource*, this);
NS_ADDREF(this); NS_ADDREF(this);
return NS_OK; return NS_OK;
@ -348,10 +371,9 @@ static const char kResourceURIPrefix[] = "resource:";
(void**) &ns))) (void**) &ns)))
goto done; goto done;
#if 0
if (NS_FAILED(rv = nsRepository::CreateInstance(kXULContentSinkCID, if (NS_FAILED(rv = nsRepository::CreateInstance(kXULContentSinkCID,
nsnull, nsnull,
kIXULContentSinkIID, kIRDFContentSinkIID,
(void**) &sink))) (void**) &sink)))
goto done; goto done;
@ -362,7 +384,6 @@ static const char kResourceURIPrefix[] = "resource:";
// store. This allows the initial content to be generated "directly". // store. This allows the initial content to be generated "directly".
if (NS_FAILED(rv = sink->SetDataSource(this))) if (NS_FAILED(rv = sink->SetDataSource(this)))
goto done; goto done;
#endif
if (NS_FAILED(rv = nsRepository::CreateInstance(kParserCID, if (NS_FAILED(rv = nsRepository::CreateInstance(kParserCID,
nsnull, nsnull,
@ -412,3 +433,230 @@ XULDataSourceImpl::Flush(void)
return NS_ERROR_NOT_IMPLEMENTED; return NS_ERROR_NOT_IMPLEMENTED;
} }
////////////////////////////////////////////////////////////////////////
// nsIRDFXMLDataSource methods
NS_IMETHODIMP
XULDataSourceImpl::SetSynchronous(PRBool aIsSynchronous)
{
mIsSynchronous = aIsSynchronous;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::SetReadOnly(PRBool aIsReadOnly)
{
if (mIsWritable && aIsReadOnly)
mIsWritable = PR_FALSE;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::BeginLoad(void)
{
mIsLoading = PR_TRUE;
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnBeginLoad(this);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::Interrupt(void)
{
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnInterrupt(this);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::Resume(void)
{
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnResume(this);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::EndLoad(void)
{
mIsLoading = PR_FALSE;
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnEndLoad(this);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::SetRootResource(nsIRDFResource* aResource)
{
NS_PRECONDITION(aResource != nsnull, "null ptr");
if (! aResource)
return NS_ERROR_NULL_POINTER;
NS_ADDREF(aResource);
mRootResource = aResource;
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnRootResourceFound(this, mRootResource);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::GetRootResource(nsIRDFResource** aResource)
{
NS_ADDREF(mRootResource);
*aResource = mRootResource;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::AddCSSStyleSheetURL(nsIURL* aCSSStyleSheetURL)
{
NS_PRECONDITION(aCSSStyleSheetURL != nsnull, "null ptr");
if (! aCSSStyleSheetURL)
return NS_ERROR_NULL_POINTER;
nsIURL** p = new nsIURL*[mNumCSSStyleSheetURLs + 1];
if (! p)
return NS_ERROR_OUT_OF_MEMORY;
PRInt32 i;
for (i = mNumCSSStyleSheetURLs - 1; i >= 0; --i)
p[i] = mCSSStyleSheetURLs[i];
NS_ADDREF(aCSSStyleSheetURL);
p[mNumCSSStyleSheetURLs] = aCSSStyleSheetURL;
++mNumCSSStyleSheetURLs;
mCSSStyleSheetURLs = p;
for (i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnCSSStyleSheetAdded(this, aCSSStyleSheetURL);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::GetCSSStyleSheetURLs(nsIURL*** aCSSStyleSheetURLs, PRInt32* aCount)
{
*aCSSStyleSheetURLs = mCSSStyleSheetURLs;
*aCount = mNumCSSStyleSheetURLs;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::AddNamedDataSourceURI(const char* aNamedDataSourceURI)
{
NS_PRECONDITION(aNamedDataSourceURI != nsnull, "null ptr");
if (! aNamedDataSourceURI)
return NS_ERROR_NULL_POINTER;
char** p = new char*[mNumNamedDataSourceURIs + 1];
if (! p)
return NS_ERROR_OUT_OF_MEMORY;
PRInt32 i;
for (i = mNumNamedDataSourceURIs - 1; i >= 0; --i)
p[i] = mNamedDataSourceURIs[i];
PRInt32 len = PL_strlen(aNamedDataSourceURI);
char* buf = new char[len + 1];
if (! buf) {
delete p;
return NS_ERROR_OUT_OF_MEMORY;
}
PL_strcpy(buf, aNamedDataSourceURI);
p[mNumNamedDataSourceURIs] = buf;
++mNumNamedDataSourceURIs;
mNamedDataSourceURIs = p;
for (i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnNamedDataSourceAdded(this, aNamedDataSourceURI);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::GetNamedDataSourceURIs(const char* const** aNamedDataSourceURIs, PRInt32* aCount)
{
*aNamedDataSourceURIs = mNamedDataSourceURIs;
*aCount = mNumNamedDataSourceURIs;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::AddNameSpace(nsIAtom* aPrefix, const nsString& aURI)
{
NameSpaceMap* entry;
// ensure that URIs are unique
for (entry = mNameSpaces; entry != nsnull; entry = entry->Next) {
if (aURI.Equals(entry->URI))
return NS_OK;
}
// okay, it's a new one: let's add it.
entry = new NameSpaceMap;
if (! entry)
return NS_ERROR_OUT_OF_MEMORY;
NS_ADDREF(aPrefix);
entry->Prefix = aPrefix;
entry->URI = aURI;
entry->Next = mNameSpaces;
mNameSpaces = entry;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::SetContentModelBuilderCID(nsID* aCID)
{
mContentModelBuilderCID = *aCID;
for (PRInt32 i = mObservers.Count() - 1; i >= 0; --i) {
nsIRDFXMLDataSourceObserver* obs = (nsIRDFXMLDataSourceObserver*) mObservers[i];
obs->OnContentModelBuilderSpecified(this, &mContentModelBuilderCID);
}
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::GetContentModelBuilderCID(nsID* aCID)
{
*aCID = mContentModelBuilderCID;
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::AddXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver)
{
mObservers.AppendElement(aObserver);
return NS_OK;
}
NS_IMETHODIMP
XULDataSourceImpl::RemoveXMLStreamObserver(nsIRDFXMLDataSourceObserver* aObserver)
{
mObservers.RemoveElement(aObserver);
return NS_OK;
}