container;
rv = nsComponentManager::CreateInstance(kRDFContainerCID,
nsnull,
nsIRDFContainer::GetIID(),
getter_AddRefs(container));
if (NS_SUCCEEDED(rv))
{
strm << indentation;
strm << "\n";
nsCOMPtr children;
if (NS_SUCCEEDED(rv = container->GetElements(getter_AddRefs(children))))
{
PRBool more = PR_TRUE;
while (more == PR_TRUE)
{
if (NS_FAILED(rv = children->HasMoreElements(&more))) break;
if (more != PR_TRUE) break;
nsCOMPtr iSupports;
if (NS_FAILED(rv = children->GetNext(getter_AddRefs(iSupports)))) break;
nsCOMPtr child = do_QueryInterface(iSupports);
if (!child) break;
PRBool isIERoot = PR_FALSE, isContainer = PR_FALSE;
if (NS_SUCCEEDED(child->EqualsResource(kNC_IEFavoritesRoot, &isIERoot)))
{
if (isIERoot == PR_FALSE)
{
if (NS_SUCCEEDED(rv = gRDFC->IsContainer(ds, child, &isContainer)))
{
}
}
}
nsCOMPtr nameNode;
nsAutoString nameString("");
char *name = nsnull;
if (NS_SUCCEEDED(rv = ds->GetTarget(child, kNC_Name, PR_TRUE, getter_AddRefs(nameNode))))
{
nsCOMPtr nameLiteral = do_QueryInterface(nameNode);
PRUnichar *title = nsnull;
if (NS_SUCCEEDED(rv = nameLiteral->GetValue(&title)))
{
nameString = title;
name = nameString.ToNewCString();
}
}
strm << indentation;
strm << " ";
if (isContainer == PR_TRUE)
{
strm << "GetValue(getter_Copies(id));
if (NS_SUCCEEDED(rv) && (id)) {
strm << (const char*) id;
}
strm << "\"";
strm << ">";
// output title
if (name) strm << name;
strm << "
\n";
rv = WriteBookmarksContainer(ds, strm, child, level+1);
}
else
{
char *url = nsnull;
if (NS_SUCCEEDED(rv = child->GetValue(&url)))
{
if (url)
{
nsAutoString uri(url);
// XXX What's the best way to determine if its a separator?
if (uri.Find(kURINC_BookmarksRoot) == 0)
{
// its a separator
strm << "
\n";
}
else
{
strm << "- ";
// output title
if (name) strm << name;
strm << "\n";
}
}
}
}
if (nsnull != name)
{
delete []name;
name = nsnull;
}
if (NS_FAILED(rv)) break;
}
strm << indentation;
strm << "
\n";
}
}
delete [] indentation;
return(rv);
}
nsresult
nsBookmarksService::WriteBookmarkProperties(nsIRDFDataSource *ds, nsOutputFileStream strm,
nsIRDFResource *child, nsIRDFResource *property, const char *htmlAttrib, PRBool isFirst)
{
nsresult rv;
nsCOMPtr node;
if (NS_SUCCEEDED(rv = ds->GetTarget(child, property, PR_TRUE, getter_AddRefs(node))))
{
nsCOMPtr literal = do_QueryInterface(node);
if (literal)
{
PRUnichar *literalUni = nsnull;
if (NS_SUCCEEDED(rv = literal->GetValue(&literalUni)))
{
nsAutoString literalString = literalUni;
char *attribute = literalString.ToNewCString();
if (nsnull != attribute)
{
if (isFirst == PR_FALSE)
{
strm << " ";
}
strm << htmlAttrib;
strm << attribute;
strm << "\"";
delete [] attribute;
attribute = nsnull;
}
}
}
}
return(rv);
}
PRBool
nsBookmarksService::CanAccept(nsIRDFResource* aSource,
nsIRDFResource* aProperty,
nsIRDFNode* aTarget)
{
// XXX This is really crippled, and needs to be stricter. We want
// to exclude any property that isn't talking about a known
// bookmark.
nsresult rv;
PRBool isOrdinal;
rv = gRDFC->IsOrdinalProperty(aProperty, &isOrdinal);
if (NS_FAILED(rv))
return PR_FALSE;
if (isOrdinal) {
return PR_TRUE;
}
else if ((aProperty != kRDF_type) ||
(aProperty != kWEB_LastModifiedDate) ||
(aProperty != kWEB_LastVisitDate) ||
(aProperty != kNC_Name) ||
(aProperty != kNC_BookmarkAddDate)) {
return PR_TRUE;
}
else {
return PR_FALSE;
}
}
////////////////////////////////////////////////////////////////////////
// Component Exports
extern "C" PR_IMPLEMENT(nsresult)
NSGetFactory(nsISupports* aServiceMgr,
const nsCID &aClass,
const char *aClassName,
const char *aProgID,
nsIFactory **aFactory)
{
NS_PRECONDITION(aFactory != nsnull, "null ptr");
if (! aFactory)
return NS_ERROR_NULL_POINTER;
nsIGenericFactory::ConstructorProcPtr constructor;
if (aClass.Equals(kBookmarksServiceCID)) {
constructor = NS_NewBookmarksService;
}
else {
*aFactory = nsnull;
return NS_NOINTERFACE; // XXX
}
nsresult rv;
NS_WITH_SERVICE1(nsIComponentManager, compMgr, aServiceMgr, kComponentManagerCID, &rv);
if (NS_FAILED(rv)) return rv;
nsCOMPtr factory;
rv = compMgr->CreateInstance(kGenericFactoryCID,
nsnull,
nsIGenericFactory::GetIID(),
getter_AddRefs(factory));
if (NS_FAILED(rv)) return rv;
rv = factory->SetConstructor(constructor);
if (NS_FAILED(rv)) return rv;
*aFactory = factory;
NS_ADDREF(*aFactory);
return NS_OK;
}
extern "C" PR_IMPLEMENT(nsresult)
NSRegisterSelf(nsISupports* aServMgr , const char* aPath)
{
nsresult rv;
nsCOMPtr servMgr(do_QueryInterface(aServMgr, &rv));
if (NS_FAILED(rv)) return rv;
NS_WITH_SERVICE1(nsIComponentManager, compMgr, servMgr, kComponentManagerCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = compMgr->RegisterComponent(kBookmarksServiceCID, "Bookmarks",
NS_BOOKMARKS_SERVICE_PROGID,
aPath, PR_TRUE, PR_TRUE);
rv = compMgr->RegisterComponent(kBookmarksServiceCID, "Bookmarks",
NS_BOOKMARKS_DATASOURCE_PROGID,
aPath, PR_TRUE, PR_TRUE);
return NS_OK;
}
extern "C" PR_IMPLEMENT(nsresult)
NSUnregisterSelf(nsISupports* aServMgr, const char* aPath)
{
nsresult rv;
nsCOMPtr servMgr(do_QueryInterface(aServMgr, &rv));
if (NS_FAILED(rv)) return rv;
NS_WITH_SERVICE1(nsIComponentManager, compMgr, servMgr, kComponentManagerCID, &rv);
if (NS_FAILED(rv)) return rv;
rv = compMgr->UnregisterComponent(kBookmarksServiceCID, aPath);
return NS_OK;
}