jminta%gmail.com 1719e435b9 Bug 168411 Move bookmarks transactions into a JS service (adding a bookmark leaks the Add Bookmark dialog) r=sspitzer, sr+a=mconnor
git-svn-id: svn://10.0.0.236/trunk@200053 18797224-902f-48f8-a5cc-f745e15eee43
2006-06-15 21:59:21 +00:00

299 lines
10 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is mozilla.org code.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
#ifndef bookmarksservice___h___
#define bookmarksservice___h___
#include "nsIRDFDataSource.h"
#include "nsIRDFRemoteDataSource.h"
#include "nsIStreamListener.h"
#include "nsIRDFObserver.h"
#include "nsISupportsArray.h"
#include "nsCOMArray.h"
#include "nsIStringBundle.h"
#include "nsITimer.h"
#include "nsIRDFNode.h"
#include "nsIBookmarksService.h"
#include "nsString.h"
#include "nsIFile.h"
#include "nsIObserver.h"
#include "nsWeakReference.h"
#include "nsCOMArray.h"
#include "nsIIOService.h"
#include "nsICacheService.h"
#include "nsICacheSession.h"
#include "nsIPrefBranch.h"
class nsIOutputStream;
#ifdef DEBUG
#ifdef XP_MACOSX
#include <Timer.h>
#endif
#endif
class nsBookmarksService : public nsIBookmarksService,
public nsIRDFDataSource,
public nsIRDFRemoteDataSource,
public nsIStreamListener,
public nsIRDFObserver,
public nsIObserver,
public nsSupportsWeakReference
{
protected:
nsIRDFDataSource* mInner;
nsCOMPtr<nsIRDFResource> busyResource;
nsCOMArray<nsIRDFObserver> mObservers;
nsCOMPtr<nsIStringBundle> mBundle;
nsCOMPtr<nsITimer> mTimer;
nsCOMPtr<nsIIOService> mNetService;
nsCOMPtr<nsICacheService> mCacheService;
nsCOMPtr<nsICacheSession> mCacheSession;
PRUint32 htmlSize;
PRInt32 mUpdateBatchNest;
nsXPIDLString mPersonalToolbarName;
PRBool mBookmarksAvailable;
PRBool mDirty;
PRBool mBrowserIcons;
PRBool busySchedule;
PRBool mNeedBackupUpdate;
public:
// bookmark resources used to indicate that a livemark
// is either loading or failed to load.
nsCOMPtr<nsIRDFResource> mLivemarkLoadingBookmark;
nsCOMPtr<nsIRDFResource> mLivemarkLoadFailedBookmark;
nsCOMPtr<nsIPrefBranch> mBookmarksPrefs;
// utility to update the forward proxy based on the URL
static nsresult UpdateBookmarkForwardProxy(nsIRDFDataSource* aDS, nsIRDFResource* aBookmarkResource);
protected:
static void FireTimer(nsITimer* aTimer, void* aClosure);
nsresult ExamineBookmarkSchedule(nsIRDFResource *theBookmark, PRBool & examineFlag);
nsresult GetBookmarkToPing(nsIRDFResource **theBookmark);
nsresult WriteBookmarks(nsIFile* bookmarksFile, nsIRDFDataSource *ds,
nsIRDFResource *root);
nsresult WriteBookmarksContainer(nsIRDFDataSource *ds,
nsIOutputStream* strm,
nsIRDFResource *container,
PRInt32 level,
nsCOMArray<nsIRDFResource>& parentArray);
nsresult WriteBookmarkIdAndName(nsIRDFDataSource *aDs,
nsIOutputStream* aStrm,
nsIRDFResource *aNode);
nsresult WriteBookmarkProperties(nsIRDFDataSource *aDs,
nsIOutputStream* aStrm,
nsIRDFResource *aNode,
nsIRDFResource *aProperty,
const char *aHtmlAttrib,
PRBool aIsFirst);
nsresult SerializeBookmarks(nsIURI* aURI);
nsresult GetTextForNode(nsIRDFNode* aNode, nsString& aResult);
nsresult GetSynthesizedType(nsIRDFResource *aNode, nsIRDFNode **aType);
nsresult UpdateBookmarkLastModifiedDate(nsIRDFResource *aSource);
PRBool CanAccept(nsIRDFResource* aSource, nsIRDFResource* aProperty, nsIRDFNode* aTarget);
nsresult getArgumentN(nsISupportsArray *arguments, nsIRDFResource *res,
PRInt32 offset, nsIRDFNode **argValue);
nsresult setFolderHint(nsIRDFResource *src, nsIRDFResource *objType);
nsresult getFolderViaHint(nsIRDFResource *src, PRBool fallbackFlag,
nsIRDFResource **folder);
nsresult importBookmarks(nsISupportsArray *aArguments);
nsresult exportBookmarks(nsISupportsArray *aArguments);
void AnnotateBookmarkSchedule(nsIRDFResource* aSource,
PRBool scheduleFlag);
nsresult InsertResource(nsIRDFResource* aResource,
nsIRDFResource* aParentFolder, PRInt32 aIndex);
nsresult getLocaleString(const char *key, nsString &str);
nsresult GetURLFromResource(nsIRDFResource* aResource, nsAString& aURL);
nsresult LoadBookmarks();
nsresult ArchiveBookmarksFile(PRInt32 numberOfBackups, PRBool forceArchive);
nsresult InitDataSource();
nsresult GetLastModifiedFolders(nsISimpleEnumerator **aResult);
PRBool LivemarkNeedsUpdate(nsIRDFResource* aSource);
nsresult UpdateLivemarkChildren(nsIRDFResource* aSource);
void SaveToBackup();
// nsIStreamObserver methods:
NS_DECL_NSIREQUESTOBSERVER
// nsIStreamListener methods:
NS_DECL_NSISTREAMLISTENER
// nsIObserver methods:
NS_DECL_NSIOBSERVER
public:
nsBookmarksService();
virtual ~nsBookmarksService();
nsresult Init();
// we really need to figure out our public/private interface story
void RemoveBookmark(nsIRDFResource* aBookmark);
nsresult ClearBookmarksContainer(nsIRDFResource* aContainer);
// nsISupports
NS_DECL_ISUPPORTS
// nsIBookmarksService
NS_DECL_NSIBOOKMARKSSERVICE
// nsIRDFDataSource
NS_IMETHOD GetURI(char* *uri);
NS_IMETHOD GetSource(nsIRDFResource* property,
nsIRDFNode* target,
PRBool tv,
nsIRDFResource** source)
{
return mInner->GetSource(property, target, tv, source);
}
NS_IMETHOD GetSources(nsIRDFResource* property,
nsIRDFNode* target,
PRBool tv,
nsISimpleEnumerator** sources)
{
return mInner->GetSources(property, target, tv, sources);
}
NS_IMETHOD GetTarget(nsIRDFResource* source,
nsIRDFResource* property,
PRBool tv,
nsIRDFNode** target);
NS_IMETHOD GetTargets(nsIRDFResource* source,
nsIRDFResource* property,
PRBool tv,
nsISimpleEnumerator** targets);
NS_IMETHOD Assert(nsIRDFResource* aSource,
nsIRDFResource* aProperty,
nsIRDFNode* aTarget,
PRBool aTruthValue);
NS_IMETHOD Unassert(nsIRDFResource* aSource,
nsIRDFResource* aProperty,
nsIRDFNode* aTarget);
NS_IMETHOD Change(nsIRDFResource* aSource,
nsIRDFResource* aProperty,
nsIRDFNode* aOldTarget,
nsIRDFNode* aNewTarget);
NS_IMETHOD Move(nsIRDFResource* aOldSource,
nsIRDFResource* aNewSource,
nsIRDFResource* aProperty,
nsIRDFNode* aTarget);
NS_IMETHOD HasAssertion(nsIRDFResource* source,
nsIRDFResource* property,
nsIRDFNode* target,
PRBool tv,
PRBool* hasAssertion);
NS_IMETHOD AddObserver(nsIRDFObserver* aObserver);
NS_IMETHOD RemoveObserver(nsIRDFObserver* aObserver);
NS_IMETHOD HasArcIn(nsIRDFNode *aNode, nsIRDFResource *aArc, PRBool *_retval);
NS_IMETHOD HasArcOut(nsIRDFResource *aSource, nsIRDFResource *aArc, PRBool *_retval);
NS_IMETHOD ArcLabelsIn(nsIRDFNode* node,
nsISimpleEnumerator** labels)
{
return mInner->ArcLabelsIn(node, labels);
}
NS_IMETHOD ArcLabelsOut(nsIRDFResource* source,
nsISimpleEnumerator** labels);
NS_IMETHOD GetAllResources(nsISimpleEnumerator** aResult);
NS_IMETHOD GetAllCmds(nsIRDFResource* source,
nsISimpleEnumerator/*<nsIRDFResource>*/** commands);
NS_IMETHOD IsCommandEnabled(nsISupportsArray/*<nsIRDFResource>*/* aSources,
nsIRDFResource* aCommand,
nsISupportsArray/*<nsIRDFResource>*/* aArguments,
PRBool* aResult);
NS_IMETHOD DoCommand(nsISupportsArray/*<nsIRDFResource>*/* aSources,
nsIRDFResource* aCommand,
nsISupportsArray/*<nsIRDFResource>*/* aArguments);
NS_IMETHOD BeginUpdateBatch() {
return mInner->BeginUpdateBatch();
}
NS_IMETHOD EndUpdateBatch() {
return mInner->EndUpdateBatch();
}
// nsIRDFRemoteDataSource
NS_DECL_NSIRDFREMOTEDATASOURCE
// nsIRDFObserver
NS_DECL_NSIRDFOBSERVER
};
#endif // bookmarksservice___h___