зеркало из https://github.com/mozilla/gecko-dev.git
FTP datasource (not yet being built)
This commit is contained in:
Родитель
2ad00ba13e
Коммит
f13f327752
|
@ -0,0 +1,934 @@
|
|||
/* -*- Mode: C++; tab-width: 8; 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
Implementation for a FTP RDF data store.
|
||||
*/
|
||||
|
||||
#include <ctype.h> // for toupper()
|
||||
#include <stdio.h>
|
||||
#include "nscore.h"
|
||||
#include "nsIRDFCursor.h"
|
||||
#include "nsIRDFDataSource.h"
|
||||
#include "nsIRDFNode.h"
|
||||
#include "nsIRDFObserver.h"
|
||||
#include "nsIRDFResourceFactory.h"
|
||||
#include "nsIServiceManager.h"
|
||||
#include "nsString.h"
|
||||
#include "nsVoidArray.h" // XXX introduces dependency on raptorbase
|
||||
#include "nsRDFCID.h"
|
||||
#include "rdfutil.h"
|
||||
#include "nsIRDFService.h"
|
||||
#include "xp_core.h"
|
||||
#include "plhash.h"
|
||||
#include "plstr.h"
|
||||
#include "prmem.h"
|
||||
#include "prprf.h"
|
||||
#include "prio.h"
|
||||
|
||||
#include "net.h"
|
||||
#include "nsINetlibURL.h"
|
||||
#include "nsIURL.h"
|
||||
#include "nsIInputStream.h"
|
||||
#include "nsIStreamListener.h"
|
||||
#include "nsIRDFFTP.h"
|
||||
#include "nsFTPDataSource.h"
|
||||
|
||||
|
||||
|
||||
static NS_DEFINE_CID(kRDFServiceCID, NS_RDFSERVICE_CID);
|
||||
static NS_DEFINE_IID(kIRDFServiceIID, NS_IRDFSERVICE_IID);
|
||||
static NS_DEFINE_IID(kIRDFDataSourceIID, NS_IRDFDATASOURCE_IID);
|
||||
static NS_DEFINE_IID(kIRDFFTPDataSourceIID, NS_IRDFFTPDATAOURCE_IID);
|
||||
static NS_DEFINE_IID(kIRDFAssertionCursorIID, NS_IRDFASSERTIONCURSOR_IID);
|
||||
static NS_DEFINE_IID(kIRDFCursorIID, NS_IRDFCURSOR_IID);
|
||||
static NS_DEFINE_IID(kIRDFArcsOutCursorIID, NS_IRDFARCSOUTCURSOR_IID);
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kIRDFResourceIID, NS_IRDFRESOURCE_IID);
|
||||
static NS_DEFINE_IID(kIRDFNodeIID, NS_IRDFNODE_IID);
|
||||
static NS_DEFINE_IID(kIRDFLiteralIID, NS_IRDFLITERAL_IID);
|
||||
static NS_DEFINE_IID(kINetlibURLIID, NS_INETLIBURL_IID);
|
||||
static NS_DEFINE_IID(kIRDFFTPDataSourceCallbackIID, NS_IRDFFTPDATASOURCECALLBACK_IID);
|
||||
|
||||
|
||||
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, child);
|
||||
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, Name);
|
||||
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, URL);
|
||||
DEFINE_RDF_VOCAB(NC_NAMESPACE_URI, NC, FTPObject);
|
||||
DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, instanceOf);
|
||||
DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, type);
|
||||
DEFINE_RDF_VOCAB(RDF_NAMESPACE_URI, RDF, Seq);
|
||||
|
||||
|
||||
static nsIRDFService *gRDFService = nsnull;
|
||||
static FTPDataSource *gFTPDataSource = nsnull;
|
||||
|
||||
PRInt32 FTPDataSource::gRefCnt;
|
||||
|
||||
nsIRDFResource *FTPDataSource::kNC_Child;
|
||||
nsIRDFResource *FTPDataSource::kNC_Name;
|
||||
nsIRDFResource *FTPDataSource::kNC_URL;
|
||||
nsIRDFResource *FTPDataSource::kNC_FTPObject;
|
||||
nsIRDFResource *FTPDataSource::kRDF_InstanceOf;
|
||||
nsIRDFResource *FTPDataSource::kRDF_type;
|
||||
|
||||
|
||||
|
||||
static PRBool
|
||||
peq(nsIRDFResource* r1, nsIRDFResource* r2)
|
||||
{
|
||||
PRBool retVal=PR_FALSE, result;
|
||||
|
||||
if (NS_SUCCEEDED(r1->EqualsResource(r2, &result)))
|
||||
{
|
||||
if (result)
|
||||
{
|
||||
retVal = PR_TRUE;
|
||||
}
|
||||
}
|
||||
return(retVal);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PRBool
|
||||
isFTPURI(nsIRDFResource *r)
|
||||
{
|
||||
PRBool isFTPURI = PR_FALSE;
|
||||
const char *uri;
|
||||
|
||||
r->GetValue(&uri);
|
||||
if (!strncmp(uri, "ftp:", PL_strlen("ftp:")))
|
||||
{
|
||||
isFTPURI = PR_TRUE;
|
||||
}
|
||||
return(isFTPURI);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static PRBool
|
||||
isFTPDirectory(nsIRDFResource *r)
|
||||
{
|
||||
PRBool isFTPDirectoryFlag = PR_FALSE;
|
||||
const char *uri;
|
||||
int len;
|
||||
|
||||
r->GetValue(&uri);
|
||||
if (uri)
|
||||
{
|
||||
if ((len = PL_strlen(uri)) > 0)
|
||||
{
|
||||
if (uri[len-1] == '/')
|
||||
{
|
||||
isFTPDirectoryFlag = PR_TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return(isFTPDirectoryFlag);
|
||||
}
|
||||
|
||||
|
||||
|
||||
FTPDataSource::FTPDataSource(void)
|
||||
: mURI(nsnull),
|
||||
mObservers(nsnull)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
|
||||
if (gRefCnt++ == 0) {
|
||||
nsresult rv = nsServiceManager::GetService(kRDFServiceCID,
|
||||
kIRDFServiceIID,
|
||||
(nsISupports**) &gRDFService);
|
||||
|
||||
PR_ASSERT(NS_SUCCEEDED(rv));
|
||||
|
||||
gRDFService->GetResource(kURINC_child, &kNC_Child);
|
||||
gRDFService->GetResource(kURINC_Name, &kNC_Name);
|
||||
gRDFService->GetResource(kURINC_URL, &kNC_URL);
|
||||
gRDFService->GetResource(kURINC_FTPObject, &kNC_FTPObject);
|
||||
gRDFService->GetResource(kURIRDF_instanceOf, &kRDF_InstanceOf);
|
||||
gRDFService->GetResource(kURIRDF_type, &kRDF_type);
|
||||
|
||||
gFTPDataSource = this;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
FTPDataSource::~FTPDataSource (void)
|
||||
{
|
||||
gRDFService->UnregisterDataSource(this);
|
||||
|
||||
PL_strfree(mURI);
|
||||
if (nsnull != mObservers)
|
||||
{
|
||||
for (PRInt32 i = mObservers->Count(); i >= 0; --i)
|
||||
{
|
||||
nsIRDFObserver* obs = (nsIRDFObserver*) mObservers->ElementAt(i);
|
||||
NS_RELEASE(obs);
|
||||
}
|
||||
delete mObservers;
|
||||
mObservers = nsnull;
|
||||
}
|
||||
|
||||
if (--gRefCnt == 0)
|
||||
{
|
||||
NS_RELEASE(kNC_Child);
|
||||
NS_RELEASE(kNC_Name);
|
||||
NS_RELEASE(kNC_URL);
|
||||
NS_RELEASE(kNC_FTPObject);
|
||||
NS_RELEASE(kRDF_InstanceOf);
|
||||
NS_RELEASE(kRDF_type);
|
||||
|
||||
gFTPDataSource = nsnull;
|
||||
nsServiceManager::ReleaseService(kRDFServiceCID, gRDFService);
|
||||
gRDFService = nsnull;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// NS_IMPL_ISUPPORTS(FTPDataSource, kIRDFFTPDataSourceIID);
|
||||
NS_IMPL_ISUPPORTS(FTPDataSource, kIRDFDataSourceIID);
|
||||
|
||||
#if 0
|
||||
NS_IMPL_ADDREF(FTPDataSource);
|
||||
NS_IMPL_RELEASE(FTPDataSource);
|
||||
|
||||
|
||||
|
||||
nsresult
|
||||
FTPDataSource::QueryInterface(REFNSIID aIID, void ** aInstancePtr)
|
||||
{
|
||||
nsresult rv = NS_NOINTERFACE;
|
||||
|
||||
if (nsnull == aInstancePtr) return(NS_ERROR_NULL_POINTER);
|
||||
if (aIID.Equals(kIRDFDataSourceIID))
|
||||
{
|
||||
*aInstancePtr = (void *)((nsIRDFFTPDataSource *)this);
|
||||
NS_ADDREF_THIS();
|
||||
rv = NS_OK;
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::Init(const char *uri)
|
||||
{
|
||||
nsresult rv = NS_ERROR_OUT_OF_MEMORY;
|
||||
|
||||
if ((mURI = PL_strdup(uri)) == nsnull)
|
||||
return rv;
|
||||
|
||||
// register this as a named data source with the service manager
|
||||
if (NS_FAILED(rv = gRDFService->RegisterDataSource(this)))
|
||||
return rv;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetURI(const char **uri) const
|
||||
{
|
||||
*uri = mURI;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetSource(nsIRDFResource* property,
|
||||
nsIRDFNode* target,
|
||||
PRBool tv,
|
||||
nsIRDFResource** source /* out */)
|
||||
{
|
||||
nsresult rv = NS_ERROR_RDF_NO_VALUE;
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetSources(nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv,
|
||||
nsIRDFAssertionCursor **sources /* out */)
|
||||
{
|
||||
PR_ASSERT(0);
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_METHOD
|
||||
FTPDataSource::GetURL(nsIRDFResource *source, nsVoidArray **array)
|
||||
{
|
||||
nsVoidArray *urlArray = new nsVoidArray();
|
||||
*array = urlArray;
|
||||
if (nsnull == urlArray)
|
||||
{
|
||||
return(NS_ERROR_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
const char *uri;
|
||||
source->GetValue(&uri);
|
||||
nsAutoString url(uri);
|
||||
|
||||
nsIRDFLiteral *literal;
|
||||
gRDFService->GetLiteral(url, &literal);
|
||||
urlArray->AppendElement(literal);
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetTarget(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
PRBool tv,
|
||||
nsIRDFNode **target /* out */)
|
||||
{
|
||||
nsresult rv = NS_ERROR_RDF_NO_VALUE;
|
||||
|
||||
// we only have positive assertions in the FTP data source.
|
||||
if (! tv)
|
||||
return rv;
|
||||
|
||||
if (isFTPURI(source))
|
||||
{
|
||||
nsVoidArray *array = nsnull;
|
||||
|
||||
if (peq(property, kNC_Name))
|
||||
{
|
||||
// rv = GetName(source, &array);
|
||||
}
|
||||
else if (peq(property, kNC_URL))
|
||||
{
|
||||
rv = GetURL(source, &array);
|
||||
rv = NS_OK;
|
||||
}
|
||||
else if (peq(property, kRDF_type))
|
||||
{
|
||||
const char *uri;
|
||||
kNC_FTPObject->GetValue(&uri);
|
||||
if (uri)
|
||||
{
|
||||
nsAutoString url(uri);
|
||||
nsIRDFLiteral *literal;
|
||||
gRDFService->GetLiteral(url, &literal);
|
||||
*target = literal;
|
||||
rv = NS_OK;
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
if (array != nsnull)
|
||||
{
|
||||
nsIRDFLiteral *literal = (nsIRDFLiteral *)(array->ElementAt(0));
|
||||
*target = (nsIRDFNode *)literal;
|
||||
delete array;
|
||||
rv = NS_OK;
|
||||
}
|
||||
else
|
||||
{
|
||||
rv = NS_ERROR_RDF_NO_VALUE;
|
||||
}
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// FTP class for Netlib callback
|
||||
|
||||
|
||||
|
||||
FTPDataSourceCallback::FTPDataSourceCallback(nsIRDFDataSource *ds, nsIRDFResource *parent)
|
||||
: mDataSource(ds),
|
||||
mParent(parent)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ADDREF(mDataSource);
|
||||
NS_ADDREF(mParent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
FTPDataSourceCallback::~FTPDataSourceCallback()
|
||||
{
|
||||
NS_IF_RELEASE(mDataSource);
|
||||
NS_IF_RELEASE(mParent);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// stream observer methods
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::OnStartBinding(nsIURL *aURL, const char *aContentType)
|
||||
{
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::OnProgress(nsIURL* aURL, PRUint32 aProgress, PRUint32 aProgressMax)
|
||||
{
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::OnStatus(nsIURL* aURL, const PRUnichar* aMsg)
|
||||
{
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::OnStopBinding(nsIURL* aURL, nsresult aStatus, const PRUnichar* aMsg)
|
||||
{
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// stream listener methods
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::GetBindInfo(nsIURL* aURL, nsStreamBindingInfo* aInfo)
|
||||
{
|
||||
return(NS_OK);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::OnDataAvailable(nsIURL* aURL, nsIInputStream *aIStream, PRUint32 aLength)
|
||||
{
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
if (aLength > 0)
|
||||
{
|
||||
nsAutoString line("");
|
||||
char c;
|
||||
for (PRUint32 loop=0; loop<aLength; loop++)
|
||||
{
|
||||
PRUint32 count;
|
||||
if (NS_FAILED(rv = aIStream->Read(&c, 1, &count)))
|
||||
{
|
||||
printf("FTP datasource read failure.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
if (count != 1) break;
|
||||
line += c;
|
||||
}
|
||||
|
||||
|
||||
|
||||
printf("Line: '%s'\n", line.ToNewCString());
|
||||
|
||||
|
||||
// yes, very primitive HTML parsing follows
|
||||
|
||||
PRInt32 hrefStart = line.Find("<A HREF=\"");
|
||||
if (hrefStart >= 0)
|
||||
{
|
||||
hrefStart += PL_strlen("<A HREF=\"");
|
||||
line.Cut(0, hrefStart);
|
||||
PRInt32 hrefEnd = line.Find("\"");
|
||||
PRInt32 isDirectory = line.Find("Directory");
|
||||
if (hrefEnd > 0)
|
||||
{
|
||||
nsAutoString file("");
|
||||
line.Mid(file, 0, hrefEnd);
|
||||
|
||||
const char *parentURL;
|
||||
mParent->GetValue(&parentURL);
|
||||
|
||||
nsAutoString path(parentURL);
|
||||
path += file;
|
||||
if (isDirectory > 0)
|
||||
{
|
||||
path += "/";
|
||||
}
|
||||
|
||||
char *name = path.ToNewCString();
|
||||
if (nsnull != name)
|
||||
{
|
||||
printf("File: %s\n", name);
|
||||
delete []name;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMPL_ISUPPORTS(FTPDataSourceCallback, kIRDFFTPDataSourceCallbackIID);
|
||||
#if 0
|
||||
NS_IMPL_ADDREF(FTPDataSourceCallback);
|
||||
NS_IMPL_RELEASE(FTPDataSourceCallback);
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSourceCallback::QueryInterface(REFNSIID iid, void **result)
|
||||
{
|
||||
if (!result)
|
||||
return (NS_ERROR_NULL_POINTER);
|
||||
|
||||
*result = nsnull;
|
||||
if (iid.Equals(kIRDFFTPDataSourceCallbackIID))
|
||||
{
|
||||
*result = NS_STATIC_CAST(nsIRDFFTPDataSourceCallback *, this);
|
||||
AddRef();
|
||||
return(NS_OK);
|
||||
}
|
||||
return(NS_NOINTERFACE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
NS_METHOD
|
||||
FTPDataSource::GetFTPListing(nsIRDFResource *source, nsVoidArray **array)
|
||||
{
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
nsVoidArray *urlArray = new nsVoidArray();
|
||||
*array = urlArray;
|
||||
if (nsnull == urlArray)
|
||||
{
|
||||
return(NS_ERROR_OUT_OF_MEMORY);
|
||||
}
|
||||
|
||||
if (isFTPDirectory(source))
|
||||
{
|
||||
const char *ftpURL;
|
||||
source->GetValue(&ftpURL);
|
||||
|
||||
nsIURL *url;
|
||||
if (NS_SUCCEEDED(rv = NS_NewURL(&url, ftpURL)))
|
||||
{
|
||||
FTPDataSourceCallback *callback = new FTPDataSourceCallback(this, source);
|
||||
if (nsnull != callback)
|
||||
{
|
||||
rv = NS_OpenURL(url, NS_STATIC_CAST(nsIStreamListener *, callback));
|
||||
}
|
||||
}
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetTargets(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
PRBool tv,
|
||||
nsIRDFAssertionCursor **targets /* out */)
|
||||
{
|
||||
nsVoidArray *array = nsnull;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
// we only have positive assertions in the FTP data source.
|
||||
if (! tv)
|
||||
return rv;
|
||||
|
||||
if (isFTPURI(source))
|
||||
{
|
||||
if (peq(property, kNC_Child))
|
||||
{
|
||||
rv = GetFTPListing(source, &array);
|
||||
}
|
||||
else if (peq(property, kNC_Name))
|
||||
{
|
||||
// rv = getFindName(source, &array);
|
||||
}
|
||||
else if (peq(property, kRDF_type))
|
||||
{
|
||||
const char *uri;
|
||||
kNC_FTPObject->GetValue(&uri);
|
||||
if (uri)
|
||||
{
|
||||
nsAutoString url(uri);
|
||||
nsIRDFLiteral *literal;
|
||||
gRDFService->GetLiteral(url, &literal);
|
||||
array = new nsVoidArray();
|
||||
if (array)
|
||||
{
|
||||
array->AppendElement(literal);
|
||||
rv = NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if ((rv == NS_OK) && (nsnull != array))
|
||||
{
|
||||
*targets = new FTPCursor(source, property, PR_FALSE, array);
|
||||
NS_ADDREF(*targets);
|
||||
}
|
||||
return(rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::Assert(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv)
|
||||
{
|
||||
// PR_ASSERT(0);
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::Unassert(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target)
|
||||
{
|
||||
// PR_ASSERT(0);
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::HasAssertion(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv,
|
||||
PRBool *hasAssertion /* out */)
|
||||
{
|
||||
PRBool retVal = PR_FALSE;
|
||||
nsresult rv = NS_ERROR_FAILURE;
|
||||
|
||||
// we only have positive assertions in the FTP data source.
|
||||
if (! tv)
|
||||
return rv;
|
||||
|
||||
*hasAssertion = PR_FALSE;
|
||||
if (isFTPURI(source))
|
||||
{
|
||||
if (peq(property, kRDF_type))
|
||||
{
|
||||
if (peq((nsIRDFResource *)target, kRDF_type))
|
||||
{
|
||||
*hasAssertion = PR_TRUE;
|
||||
rv = NS_OK;
|
||||
}
|
||||
}
|
||||
}
|
||||
return (rv);
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::ArcLabelsIn(nsIRDFNode *node,
|
||||
nsIRDFArcsInCursor ** labels /* out */)
|
||||
{
|
||||
PR_ASSERT(0);
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::ArcLabelsOut(nsIRDFResource *source,
|
||||
nsIRDFArcsOutCursor **labels /* out */)
|
||||
{
|
||||
nsresult rv = NS_ERROR_RDF_NO_VALUE;
|
||||
|
||||
*labels = nsnull;
|
||||
|
||||
if (isFTPURI(source) && isFTPDirectory(source))
|
||||
{
|
||||
nsVoidArray *temp = new nsVoidArray();
|
||||
if (nsnull == temp)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
temp->AppendElement(kNC_Child);
|
||||
*labels = new FTPCursor(source, kNC_Child, PR_TRUE, temp);
|
||||
if (nsnull != *labels)
|
||||
{
|
||||
NS_ADDREF(*labels);
|
||||
rv = NS_OK;
|
||||
}
|
||||
}
|
||||
return(rv);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetAllResources(nsIRDFResourceCursor** aCursor)
|
||||
{
|
||||
NS_NOTYETIMPLEMENTED("sorry!");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::AddObserver(nsIRDFObserver *n)
|
||||
{
|
||||
if (nsnull == mObservers)
|
||||
{
|
||||
if ((mObservers = new nsVoidArray()) == nsnull)
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
mObservers->AppendElement(n);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::RemoveObserver(nsIRDFObserver *n)
|
||||
{
|
||||
if (nsnull == mObservers)
|
||||
return NS_OK;
|
||||
mObservers->RemoveElement(n);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::Flush()
|
||||
{
|
||||
PR_ASSERT(0);
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::GetAllCommands(nsIRDFResource* source,nsIEnumerator/*<nsIRDFResource>*/** commands)
|
||||
{
|
||||
NS_NOTYETIMPLEMENTED("write me!");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::IsCommandEnabled(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments)
|
||||
{
|
||||
NS_NOTYETIMPLEMENTED("write me!");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPDataSource::DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments)
|
||||
{
|
||||
NS_NOTYETIMPLEMENTED("write me!");
|
||||
return NS_ERROR_NOT_IMPLEMENTED;
|
||||
}
|
||||
|
||||
|
||||
|
||||
nsresult
|
||||
NS_NewRDFFTPDataSource(nsIRDFDataSource **result)
|
||||
{
|
||||
if (!result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
// only one FTP data source
|
||||
if (nsnull == gFTPDataSource)
|
||||
{
|
||||
if ((gFTPDataSource = new FTPDataSource()) == nsnull)
|
||||
{
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
}
|
||||
NS_ADDREF(gFTPDataSource);
|
||||
*result = gFTPDataSource;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
FTPCursor::FTPCursor(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
PRBool isArcsOut,
|
||||
nsVoidArray *array)
|
||||
: mSource(source),
|
||||
mProperty(property),
|
||||
mArcsOut(isArcsOut),
|
||||
mArray(array),
|
||||
mCount(0),
|
||||
mTarget(nsnull),
|
||||
mValue(nsnull)
|
||||
{
|
||||
NS_INIT_REFCNT();
|
||||
NS_ADDREF(mSource);
|
||||
NS_ADDREF(mProperty);
|
||||
}
|
||||
|
||||
|
||||
|
||||
FTPCursor::~FTPCursor(void)
|
||||
{
|
||||
NS_IF_RELEASE(mSource);
|
||||
NS_IF_RELEASE(mValue);
|
||||
NS_IF_RELEASE(mProperty);
|
||||
NS_IF_RELEASE(mTarget);
|
||||
if (nsnull != mArray)
|
||||
{
|
||||
delete mArray;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::Advance(void)
|
||||
{
|
||||
if (!mArray)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
if (mArray->Count() <= mCount)
|
||||
return NS_ERROR_RDF_CURSOR_EMPTY;
|
||||
NS_IF_RELEASE(mValue);
|
||||
mTarget = mValue = (nsIRDFNode *)mArray->ElementAt(mCount++);
|
||||
NS_ADDREF(mValue);
|
||||
NS_ADDREF(mTarget);
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetValue(nsIRDFNode **aValue)
|
||||
{
|
||||
if (nsnull == mValue)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
NS_ADDREF(mValue);
|
||||
*aValue = mValue;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetDataSource(nsIRDFDataSource **aDataSource)
|
||||
{
|
||||
NS_ADDREF(gFTPDataSource);
|
||||
*aDataSource = gFTPDataSource;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetSubject(nsIRDFResource **aResource)
|
||||
{
|
||||
NS_ADDREF(mSource);
|
||||
*aResource = mSource;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetPredicate(nsIRDFResource **aPredicate)
|
||||
{
|
||||
if (mArcsOut == PR_FALSE)
|
||||
{
|
||||
NS_ADDREF(mProperty);
|
||||
*aPredicate = mProperty;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (nsnull == mValue)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
NS_ADDREF(mValue);
|
||||
*(nsIRDFNode **)aPredicate = mValue;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetObject(nsIRDFNode **aObject)
|
||||
{
|
||||
if (nsnull != mTarget)
|
||||
NS_ADDREF(mTarget);
|
||||
*aObject = mTarget;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::GetTruthValue(PRBool *aTruthValue)
|
||||
{
|
||||
*aTruthValue = 1;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
NS_IMPL_ADDREF(FTPCursor);
|
||||
NS_IMPL_RELEASE(FTPCursor);
|
||||
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
FTPCursor::QueryInterface(REFNSIID iid, void **result)
|
||||
{
|
||||
if (! result)
|
||||
return NS_ERROR_NULL_POINTER;
|
||||
|
||||
*result = nsnull;
|
||||
if (iid.Equals(kIRDFAssertionCursorIID) ||
|
||||
iid.Equals(kIRDFCursorIID) ||
|
||||
iid.Equals(kIRDFArcsOutCursorIID) ||
|
||||
iid.Equals(kISupportsIID))
|
||||
{
|
||||
*result = NS_STATIC_CAST(nsIRDFAssertionCursor *, this);
|
||||
AddRef();
|
||||
return NS_OK;
|
||||
}
|
||||
return(NS_NOINTERFACE);
|
||||
}
|
||||
|
|
@ -0,0 +1,210 @@
|
|||
/* -*- Mode: C++; tab-width: 4; 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 nsFTPDataSource_h__
|
||||
#define nsFTPDataSource_h__
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// NS_DECL_IRDFRESOURCE, NS_IMPL_IRDFRESOURCE
|
||||
//
|
||||
// Convenience macros for implementing the RDF resource interface.
|
||||
//
|
||||
// XXX It might make sense to move these macros to nsIRDFResource.h?
|
||||
|
||||
#define NS_DECL_IRDFRESOURCE \
|
||||
NS_IMETHOD EqualsNode(nsIRDFNode* node, PRBool* result) const;\
|
||||
NS_IMETHOD GetValue(const char* *uri) const;\
|
||||
NS_IMETHOD EqualsResource(const nsIRDFResource* resource, PRBool* result) const;\
|
||||
NS_IMETHOD EqualsString(const char* uri, PRBool* result) const;
|
||||
|
||||
|
||||
#define NS_IMPL_IRDFRESOURCE(__class) \
|
||||
NS_IMETHODIMP \
|
||||
__class::EqualsNode(nsIRDFNode* node, PRBool* result) const {\
|
||||
nsresult rv;\
|
||||
nsIRDFResource* resource;\
|
||||
if (NS_SUCCEEDED(node->QueryInterface(kIRDFResourceIID, (void**) &resource))) {\
|
||||
rv = EqualsResource(resource, result);\
|
||||
NS_RELEASE(resource);\
|
||||
}\
|
||||
else {\
|
||||
*result = PR_FALSE;\
|
||||
rv = NS_OK;\
|
||||
}\
|
||||
return rv;\
|
||||
}\
|
||||
NS_IMETHODIMP \
|
||||
__class::GetValue(const char* *uri) const{\
|
||||
if (!uri)\
|
||||
return NS_ERROR_NULL_POINTER;\
|
||||
*uri = mURI;\
|
||||
return NS_OK;\
|
||||
}\
|
||||
NS_IMETHODIMP \
|
||||
__class::EqualsResource(const nsIRDFResource* resource, PRBool* result) const {\
|
||||
if (!resource || !result) return NS_ERROR_NULL_POINTER;\
|
||||
*result = (resource == (nsIRDFResource*) this);\
|
||||
return NS_OK;\
|
||||
}\
|
||||
NS_IMETHODIMP \
|
||||
__class::EqualsString(const char* uri, PRBool* result) const {\
|
||||
if (!uri || !result) return NS_ERROR_NULL_POINTER;\
|
||||
*result = (PL_strcmp(uri, mURI) == 0);\
|
||||
return NS_OK;\
|
||||
}
|
||||
|
||||
|
||||
|
||||
class FTPDataSourceCallback : public nsIStreamListener
|
||||
{
|
||||
private:
|
||||
nsIRDFDataSource *mDataSource;
|
||||
nsIRDFResource *mParent;
|
||||
|
||||
static PRInt32 gRefCnt;
|
||||
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
FTPDataSourceCallback(nsIRDFDataSource *ds, nsIRDFResource *parent);
|
||||
virtual ~FTPDataSourceCallback(void);
|
||||
|
||||
// stream observer
|
||||
|
||||
NS_IMETHOD OnStartBinding(nsIURL *aURL, const char *aContentType);
|
||||
NS_IMETHOD OnProgress(nsIURL* aURL, PRUint32 aProgress, PRUint32 aProgressMax);
|
||||
NS_IMETHOD OnStatus(nsIURL* aURL, const PRUnichar* aMsg);
|
||||
NS_IMETHOD OnStopBinding(nsIURL* aURL, nsresult aStatus, const PRUnichar* aMsg);
|
||||
|
||||
// stream listener
|
||||
NS_IMETHOD GetBindInfo(nsIURL* aURL, nsStreamBindingInfo* aInfo);
|
||||
NS_IMETHOD OnDataAvailable(nsIURL* aURL, nsIInputStream *aIStream,
|
||||
PRUint32 aLength);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class FTPDataSource : public nsIRDFFTPDataSource
|
||||
{
|
||||
private:
|
||||
char *mURI;
|
||||
nsVoidArray *mObservers;
|
||||
|
||||
static PRInt32 gRefCnt;
|
||||
|
||||
// pseudo-constants
|
||||
static nsIRDFResource *kNC_Child;
|
||||
static nsIRDFResource *kNC_Name;
|
||||
static nsIRDFResource *kNC_URL;
|
||||
static nsIRDFResource *kNC_FTPObject;
|
||||
static nsIRDFResource *kRDF_InstanceOf;
|
||||
static nsIRDFResource *kRDF_type;
|
||||
|
||||
NS_METHOD GetFTPListing(nsIRDFResource *source, nsVoidArray **array);
|
||||
NS_METHOD GetURL(nsIRDFResource *source, nsVoidArray **array);
|
||||
|
||||
public:
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
FTPDataSource(void);
|
||||
virtual ~FTPDataSource(void);
|
||||
|
||||
// nsIRDFDataSource methods
|
||||
|
||||
NS_IMETHOD Init(const char *uri);
|
||||
NS_IMETHOD GetURI(const char **uri) const;
|
||||
NS_IMETHOD GetSource(nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv,
|
||||
nsIRDFResource **source /* out */);
|
||||
NS_IMETHOD GetSources(nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv,
|
||||
nsIRDFAssertionCursor **sources /* out */);
|
||||
NS_IMETHOD GetTarget(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
PRBool tv,
|
||||
nsIRDFNode **target /* out */);
|
||||
NS_IMETHOD GetTargets(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
PRBool tv,
|
||||
nsIRDFAssertionCursor **targets /* out */);
|
||||
NS_IMETHOD Assert(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv);
|
||||
NS_IMETHOD Unassert(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target);
|
||||
NS_IMETHOD HasAssertion(nsIRDFResource *source,
|
||||
nsIRDFResource *property,
|
||||
nsIRDFNode *target,
|
||||
PRBool tv,
|
||||
PRBool *hasAssertion /* out */);
|
||||
NS_IMETHOD ArcLabelsIn(nsIRDFNode *node,
|
||||
nsIRDFArcsInCursor **labels /* out */);
|
||||
NS_IMETHOD ArcLabelsOut(nsIRDFResource *source,
|
||||
nsIRDFArcsOutCursor **labels /* out */);
|
||||
NS_IMETHOD GetAllResources(nsIRDFResourceCursor** aCursor);
|
||||
NS_IMETHOD AddObserver(nsIRDFObserver *n);
|
||||
NS_IMETHOD RemoveObserver(nsIRDFObserver *n);
|
||||
NS_IMETHOD Flush();
|
||||
NS_IMETHOD GetAllCommands(nsIRDFResource* source,
|
||||
nsIEnumerator/*<nsIRDFResource>*/** commands);
|
||||
NS_IMETHOD IsCommandEnabled(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments);
|
||||
NS_IMETHOD DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSources,
|
||||
nsIRDFResource* aCommand,
|
||||
nsISupportsArray/*<nsIRDFResource>*/* aArguments);
|
||||
};
|
||||
|
||||
|
||||
|
||||
class FTPCursor : public nsIRDFAssertionCursor, public nsIRDFArcsOutCursor
|
||||
{
|
||||
private:
|
||||
nsIRDFNode *mValue;
|
||||
nsIRDFResource *mSource;
|
||||
nsIRDFResource *mProperty;
|
||||
nsIRDFNode *mTarget;
|
||||
int mCount;
|
||||
nsVoidArray *mArray;
|
||||
PRBool mArcsOut;
|
||||
|
||||
public:
|
||||
FTPCursor(nsIRDFResource *source, nsIRDFResource *property, PRBool isArcsOut, nsVoidArray *array);
|
||||
virtual ~FTPCursor(void);
|
||||
|
||||
NS_DECL_ISUPPORTS
|
||||
|
||||
NS_IMETHOD Advance(void);
|
||||
NS_IMETHOD GetValue(nsIRDFNode **aValue);
|
||||
NS_IMETHOD GetDataSource(nsIRDFDataSource **aDataSource);
|
||||
NS_IMETHOD GetSubject(nsIRDFResource **aResource);
|
||||
NS_IMETHOD GetPredicate(nsIRDFResource **aPredicate);
|
||||
NS_IMETHOD GetObject(nsIRDFNode **aObject);
|
||||
NS_IMETHOD GetTruthValue(PRBool *aTruthValue);
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif // nsFTPDataSource_h__
|
Загрузка…
Ссылка в новой задаче