From e913f4cd0983928586ac58884e140ab37f135d11 Mon Sep 17 00:00:00 2001 From: "ben%bengoodger.com" Date: Sun, 29 Feb 2004 01:49:53 +0000 Subject: [PATCH] (215094) - Opera Migrator hangs at the end occasionally because of null observer service git-svn-id: svn://10.0.0.236/trunk@153363 18797224-902f-48f8-a5cc-f745e15eee43 --- .../components/migration/content/migration.js | 1 + .../src/nsBrowserProfileMigratorUtils.h | 3 +-- .../migration/src/nsCaminoProfileMigrator.cpp | 5 +---- .../migration/src/nsCaminoProfileMigrator.h | 2 ++ .../src/nsDogbertProfileMigrator.cpp | 5 +---- .../migration/src/nsDogbertProfileMigrator.h | 2 ++ .../migration/src/nsICabProfileMigrator.cpp | 5 +---- .../migration/src/nsICabProfileMigrator.h | 2 ++ .../migration/src/nsIEProfileMigrator.cpp | 8 +++---- .../migration/src/nsIEProfileMigrator.h | 6 +++++- .../migration/src/nsMacIEProfileMigrator.cpp | 5 +---- .../migration/src/nsMacIEProfileMigrator.h | 2 ++ .../src/nsOmniWebProfileMigrator.cpp | 5 +---- .../migration/src/nsOmniWebProfileMigrator.h | 2 ++ .../migration/src/nsOperaProfileMigrator.cpp | 21 ++++++++++--------- .../migration/src/nsOperaProfileMigrator.h | 4 +++- .../src/nsPhoenixProfileMigrator.cpp | 5 +---- .../migration/src/nsPhoenixProfileMigrator.h | 2 ++ .../migration/src/nsSafariProfileMigrator.cpp | 5 +---- .../migration/src/nsSafariProfileMigrator.h | 2 ++ .../src/nsSeamonkeyProfileMigrator.cpp | 5 +---- .../src/nsSeamonkeyProfileMigrator.h | 2 ++ 22 files changed, 48 insertions(+), 51 deletions(-) diff --git a/mozilla/browser/components/migration/content/migration.js b/mozilla/browser/components/migration/content/migration.js index 9c721a5f30a..d18ab998423 100644 --- a/mozilla/browser/components/migration/content/migration.js +++ b/mozilla/browser/components/migration/content/migration.js @@ -208,6 +208,7 @@ var MigrationWizard = { observe: function (aSubject, aTopic, aData) { + dump("*** aSubject = " + aSubject + ", aTopic = " + aTopic + ", aData = " + aData + "\n"); switch (aTopic) { case "Migration:Started": dump("*** started\n"); diff --git a/mozilla/browser/components/migration/src/nsBrowserProfileMigratorUtils.h b/mozilla/browser/components/migration/src/nsBrowserProfileMigratorUtils.h index dd9ef362adc..f008db389bf 100644 --- a/mozilla/browser/components/migration/src/nsBrowserProfileMigratorUtils.h +++ b/mozilla/browser/components/migration/src/nsBrowserProfileMigratorUtils.h @@ -44,8 +44,7 @@ #define MIGRATION_ENDED "Migration:Ended" #define NOTIFY_OBSERVERS(message, item) \ - if (sObserverService) \ - sObserverService->NotifyObservers(nsnull, message, item) + mObserverService->NotifyObservers(nsnull, message, item) #define COPY_DATA(func, replace, itemIndex) \ if (NS_SUCCEEDED(rv) && (aItems & itemIndex || !aItems)) { \ diff --git a/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.cpp index d0284e31752..331f164db55 100644 --- a/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.cpp @@ -49,16 +49,13 @@ NS_IMPL_ISUPPORTS1(nsCaminoProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsCaminoProfileMigrator::nsCaminoProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsCaminoProfileMigrator::~nsCaminoProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.h b/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.h index 40c6a45d917..91623ccac48 100644 --- a/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsCaminoProfileMigrator.h @@ -39,6 +39,7 @@ #define caminoprofilemigrator___h___ #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" @@ -54,6 +55,7 @@ public: protected: private: + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.cpp index 90f70d9f1a0..41c7c02f8db 100644 --- a/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.cpp @@ -93,16 +93,13 @@ NS_IMPL_ISUPPORTS1(nsDogbertProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsDogbertProfileMigrator::nsDogbertProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsDogbertProfileMigrator::~nsDogbertProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.h b/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.h index 346bd0816af..be7edd4b226 100644 --- a/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsDogbertProfileMigrator.h @@ -40,6 +40,7 @@ #include "nsIBrowserProfileMigrator.h" #include "nsILocalFile.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsNetscapeProfileMigratorBase.h" #include "nsString.h" @@ -82,6 +83,7 @@ protected: private: nsCOMPtr mProfiles; + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsICabProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsICabProfileMigrator.cpp index a99e855af7a..d9cb05c379c 100644 --- a/mozilla/browser/components/migration/src/nsICabProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsICabProfileMigrator.cpp @@ -49,16 +49,13 @@ NS_IMPL_ISUPPORTS1(nsICabProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsICabProfileMigrator::nsICabProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsICabProfileMigrator::~nsICabProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsICabProfileMigrator.h b/mozilla/browser/components/migration/src/nsICabProfileMigrator.h index 255cf037fa3..a641b877bc5 100644 --- a/mozilla/browser/components/migration/src/nsICabProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsICabProfileMigrator.h @@ -39,6 +39,7 @@ #define icabprofilemigrator___h___ #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" @@ -54,6 +55,7 @@ public: protected: private: + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp index 3770c8313ae..1daa054b695 100644 --- a/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsIEProfileMigrator.cpp @@ -99,8 +99,6 @@ const int sInitialCookieBufferSize = 1024; // but it can grow const int sUsernameLengthLimit = 80; const int sHostnameLengthLimit = 255; -static nsIObserverService* sObserverService = nsnull; - //*********************************************************************** //*** windows registry to mozilla prefs data type translation functions //*********************************************************************** @@ -489,11 +487,11 @@ NS_IMPL_ISUPPORTS1(nsIEProfileMigrator, nsIBrowserProfileMigrator); nsIEProfileMigrator::nsIEProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } -nsIEProfileMigrator::~nsIEProfileMigrator() { - NS_IF_RELEASE(sObserverService); +nsIEProfileMigrator::~nsIEProfileMigrator() +{ } nsresult diff --git a/mozilla/browser/components/migration/src/nsIEProfileMigrator.h b/mozilla/browser/components/migration/src/nsIEProfileMigrator.h index d798d20d22a..5ecdf5c16ba 100644 --- a/mozilla/browser/components/migration/src/nsIEProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsIEProfileMigrator.h @@ -44,6 +44,7 @@ #include #include #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsVoidArray.h" class nsIFile; @@ -63,7 +64,7 @@ public: nsIEProfileMigrator(); virtual ~nsIEProfileMigrator(); -private: +protected: nsresult CopyPreferences(PRBool aReplace); nsresult CopyStyleSheet(PRBool aReplace); nsresult CopyCookies(PRBool aReplace); @@ -97,6 +98,9 @@ private: time_t FileTimeToTimeT(const char *aLowDateIntString, const char *aHighDateIntString); void GetUserStyleSheetFile(nsIFile **aUserFile); + +private: + nsCOMPtr mObserverService; }; #endif diff --git a/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.cpp index cfa0d4c1c40..7beceb350ac 100644 --- a/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.cpp @@ -49,16 +49,13 @@ NS_IMPL_ISUPPORTS1(nsMacIEProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsMacIEProfileMigrator::nsMacIEProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsMacIEProfileMigrator::~nsMacIEProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.h b/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.h index c1a5a3e64a1..e3eccdd8954 100644 --- a/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsMacIEProfileMigrator.h @@ -39,6 +39,7 @@ #define maciebprofilemigrator___h___ #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" @@ -54,6 +55,7 @@ public: protected: private: + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.cpp index a9f3ed02096..6bd1ae40a0d 100644 --- a/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.cpp @@ -49,16 +49,13 @@ NS_IMPL_ISUPPORTS1(nsOmniWebProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsOmniWebProfileMigrator::nsOmniWebProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsOmniWebProfileMigrator::~nsOmniWebProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.h b/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.h index b6cb06bd376..ba43b14c684 100644 --- a/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsOmniWebProfileMigrator.h @@ -39,6 +39,7 @@ #define omniwebprofilemigrator___h___ #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" @@ -54,6 +55,7 @@ public: protected: private: + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp index 190195b40ba..834c2b73f16 100644 --- a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.cpp @@ -94,16 +94,13 @@ static NS_DEFINE_CID(kGlobalHistoryCID, NS_GLOBALHISTORY_CID); NS_IMPL_ISUPPORTS1(nsOperaProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsOperaProfileMigrator::nsOperaProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsOperaProfileMigrator::~nsOperaProfileMigrator() { - NS_IF_RELEASE(sObserverService); } NS_IMETHODIMP @@ -960,7 +957,8 @@ nsOperaProfileMigrator::CopyBookmarks(PRBool aReplace) else parentFolder = root; -#ifdef XP_WIN +#if defined(XP_WIN) || (defined(XP_UNIX) && !defined(XP_MACOSX)) + printf("*** before CopySmartKeywords\n"); CopySmartKeywords(bms, bundle, parentFolder); #endif @@ -973,7 +971,7 @@ nsOperaProfileMigrator::CopyBookmarks(PRBool aReplace) return ParseBookmarksFolder(lineInputStream, parentFolder, toolbar, bms); } -#ifdef XP_WIN +#if defined(XP_WIN) || (defined(XP_UNIX) && !defined(XP_MACOSX)) nsresult nsOperaProfileMigrator::CopySmartKeywords(nsIBookmarksService* aBMS, nsIStringBundle* aBundle, @@ -1166,6 +1164,9 @@ nsOperaProfileMigrator::ParseBookmarksFolder(nsILineInputStream* aStream, nsIRDFResource* aToolbar, nsIBookmarksService* aBMS) { + static PRInt32 callCount = 0; + printf("*** Entering ParseBookmarksFolder %d\n", ++callCount); + nsresult rv; PRBool moreData = PR_FALSE; nsAutoString buffer; EntryType entryType = EntryType_BOOKMARK; @@ -1173,7 +1174,7 @@ nsOperaProfileMigrator::ParseBookmarksFolder(nsILineInputStream* aStream, nsCAutoString url; PRBool onToolbar = PR_FALSE; do { - nsresult rv = aStream->ReadLine(buffer, &moreData); + rv = aStream->ReadLine(buffer, &moreData); if (NS_FAILED(rv)) return rv; if (!moreData) break; @@ -1226,7 +1227,7 @@ nsOperaProfileMigrator::ParseBookmarksFolder(nsILineInputStream* aStream, url.AssignWithConversion(empty); keyword = empty; description = empty; - if (NS_FAILED(rv)) + if (NS_FAILED(rv)) continue; } } @@ -1239,7 +1240,7 @@ nsOperaProfileMigrator::ParseBookmarksFolder(nsILineInputStream* aStream, name = empty; if (NS_FAILED(rv)) continue; - ParseBookmarksFolder(aStream, itemRes, aToolbar, aBMS); + rv = ParseBookmarksFolder(aStream, itemRes, aToolbar, aBMS); } } break; @@ -1251,7 +1252,7 @@ nsOperaProfileMigrator::ParseBookmarksFolder(nsILineInputStream* aStream, while (1); done: - return NS_OK; + return rv; } void diff --git a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.h b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.h index 2bcbbcd3c05..92bb0bcb98e 100644 --- a/mozilla/browser/components/migration/src/nsOperaProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsOperaProfileMigrator.h @@ -41,6 +41,7 @@ #include "nsCOMPtr.h" #include "nsIBinaryInputStream.h" #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" #include "nsVoidArray.h" @@ -106,7 +107,7 @@ protected: nsIRDFResource* aFolder, nsIRDFResource* aToolbar, nsIBookmarksService* aBMS); -#ifdef XP_WIN +#if defined(XP_WIN) || (defined(XP_UNIX) && !defined(XP_MACOSX)) nsresult CopySmartKeywords(nsIBookmarksService* aBMS, nsIStringBundle* aBundle, nsIRDFResource* aParentFolder); @@ -117,6 +118,7 @@ protected: private: nsCOMPtr mOperaProfile; nsCOMPtr mProfiles; + nsCOMPtr mObserverService; }; class nsOperaCookieMigrator diff --git a/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.cpp index 2e1dba68f69..50cb60449ef 100644 --- a/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.cpp @@ -68,16 +68,13 @@ NS_IMPL_ISUPPORTS1(nsPhoenixProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsPhoenixProfileMigrator::nsPhoenixProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsPhoenixProfileMigrator::~nsPhoenixProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.h b/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.h index ce472e1deda..7146cd8dcb8 100644 --- a/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsPhoenixProfileMigrator.h @@ -40,6 +40,7 @@ #include "nsIBrowserProfileMigrator.h" #include "nsILocalFile.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsNetscapeProfileMigratorBase.h" #include "nsString.h" @@ -80,6 +81,7 @@ protected: private: nsCOMPtr mProfileNames; nsCOMPtr mProfileLocations; + nsCOMPtr mObserverService; }; #endif diff --git a/mozilla/browser/components/migration/src/nsSafariProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsSafariProfileMigrator.cpp index 729150fca0b..4f319dc79d2 100644 --- a/mozilla/browser/components/migration/src/nsSafariProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsSafariProfileMigrator.cpp @@ -68,16 +68,13 @@ NS_IMPL_ISUPPORTS1(nsSafariProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsSafariProfileMigrator::nsSafariProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsSafariProfileMigrator::~nsSafariProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsSafariProfileMigrator.h b/mozilla/browser/components/migration/src/nsSafariProfileMigrator.h index ec079b7835d..9d2b85a5d3b 100644 --- a/mozilla/browser/components/migration/src/nsSafariProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsSafariProfileMigrator.h @@ -39,6 +39,7 @@ #define safariprofilemigrator___h___ #include "nsIBrowserProfileMigrator.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsString.h" @@ -85,6 +86,7 @@ protected: nsresult CopyBookmarks(PRBool aReplace); private: + nsCOMPtr mObserverService; }; #endif \ No newline at end of file diff --git a/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.cpp b/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.cpp index d5a6ff97e53..4ca6cf97174 100644 --- a/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.cpp +++ b/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.cpp @@ -69,16 +69,13 @@ NS_IMPL_ISUPPORTS1(nsSeamonkeyProfileMigrator, nsIBrowserProfileMigrator) -static nsIObserverService* sObserverService = nsnull; - nsSeamonkeyProfileMigrator::nsSeamonkeyProfileMigrator() { - CallGetService("@mozilla.org/observer-service;1", &sObserverService); + mObserverService = do_GetService("@mozilla.org/observer-service;1"); } nsSeamonkeyProfileMigrator::~nsSeamonkeyProfileMigrator() { - NS_IF_RELEASE(sObserverService); } /////////////////////////////////////////////////////////////////////////////// diff --git a/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.h b/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.h index 9653ce1da0d..1a6a57efdb3 100644 --- a/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.h +++ b/mozilla/browser/components/migration/src/nsSeamonkeyProfileMigrator.h @@ -40,6 +40,7 @@ #include "nsIBrowserProfileMigrator.h" #include "nsILocalFile.h" +#include "nsIObserverService.h" #include "nsISupportsArray.h" #include "nsNetscapeProfileMigratorBase.h" #include "nsString.h" @@ -86,6 +87,7 @@ protected: private: nsCOMPtr mProfileNames; nsCOMPtr mProfileLocations; + nsCOMPtr mObserverService; }; #endif \ No newline at end of file