OSDN Git Service

Add work around to vista explore crash.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseShell / ShellCache.h
index 849b5ca..761202b 100644 (file)
@@ -1,4 +1,4 @@
-// ToroiseGit - a Windows shell extension for easy version control\r
+// TortoiseGit - a Windows shell extension for easy version control\r
 \r
 // Copyright (C) 2003-2008 - Stefan Kueng\r
 \r
@@ -20,6 +20,7 @@
 #include "registry.h"\r
 #include "Globals.h"\r
 #include "GitAdminDir.h"\r
+#include "Git.h"\r
 \r
 #define REGISTRYTIMEOUT 2000\r
 #define EXCLUDELISTTIMEOUT 5000\r
@@ -46,24 +47,24 @@ public:
        };\r
        ShellCache()\r
        {\r
-               cachetype = CRegStdWORD(_T("Software\\ToroiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? dll : exe);\r
-               showrecursive = CRegStdWORD(_T("Software\\ToroiseGit\\RecursiveOverlay"), TRUE);\r
-               folderoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\FolderOverlay"), TRUE);\r
-               driveremote = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRemote"));\r
-               drivefixed = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskFixed"), TRUE);\r
-               drivecdrom = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskCDROM"));\r
-               driveremove = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRemovable"));\r
-               drivefloppy = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskFloppy"));\r
-               driveram = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskRAM"));\r
-               driveunknown = CRegStdWORD(_T("Software\\ToroiseGit\\DriveMaskUnknown"));\r
-               excludelist = CRegStdString(_T("Software\\ToroiseGit\\OverlayExcludeList"));\r
-               includelist = CRegStdString(_T("Software\\ToroiseGit\\OverlayIncludeList"));\r
-               simplecontext = CRegStdWORD(_T("Software\\ToroiseGit\\SimpleContext"), FALSE);\r
-               unversionedasmodified = CRegStdWORD(_T("Software\\ToroiseGit\\UnversionedAsModified"), FALSE);\r
-               showunversionedoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\ShowUnversionedOverlay"), TRUE);\r
-               showignoredoverlay = CRegStdWORD(_T("Software\\ToroiseGit\\ShowIgnoredOverlay"), TRUE);\r
-               getlocktop = CRegStdWORD(_T("Software\\ToroiseGit\\GetLockTop"), TRUE);\r
-               excludedasnormal = CRegStdWORD(_T("Software\\ToroiseGit\\ShowExcludedAsNormal"), TRUE);\r
+               cachetype = CRegStdWORD(_T("Software\\TortoiseGit\\CacheType"), GetSystemMetrics(SM_REMOTESESSION) ? dll : exe);\r
+               showrecursive = CRegStdWORD(_T("Software\\TortoiseGit\\RecursiveOverlay"), TRUE);\r
+               folderoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\FolderOverlay"), TRUE);\r
+               driveremote = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRemote"));\r
+               drivefixed = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskFixed"), TRUE);\r
+               drivecdrom = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskCDROM"));\r
+               driveremove = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRemovable"));\r
+               drivefloppy = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskFloppy"));\r
+               driveram = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskRAM"));\r
+               driveunknown = CRegStdWORD(_T("Software\\TortoiseGit\\DriveMaskUnknown"));\r
+               excludelist = CRegStdString(_T("Software\\TortoiseGit\\OverlayExcludeList"));\r
+               includelist = CRegStdString(_T("Software\\TortoiseGit\\OverlayIncludeList"));\r
+               simplecontext = CRegStdWORD(_T("Software\\TortoiseGit\\SimpleContext"), FALSE);\r
+               unversionedasmodified = CRegStdWORD(_T("Software\\TortoiseGit\\UnversionedAsModified"), FALSE);\r
+               showunversionedoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\ShowUnversionedOverlay"), TRUE);\r
+               showignoredoverlay = CRegStdWORD(_T("Software\\TortoiseGit\\ShowIgnoredOverlay"), TRUE);\r
+               getlocktop = CRegStdWORD(_T("Software\\TortoiseGit\\GetLockTop"), TRUE);\r
+               excludedasnormal = CRegStdWORD(_T("Software\\TortoiseGit\\ShowExcludedAsNormal"), TRUE);\r
                cachetypeticker = GetTickCount();\r
                recursiveticker = cachetypeticker;\r
                folderoverlayticker = cachetypeticker;\r
@@ -82,15 +83,15 @@ public:
                getlocktopticker = cachetypeticker;\r
                excludedasnormalticker = cachetypeticker;\r
                excontextticker = cachetypeticker;\r
-               menulayoutlow = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntries"),               MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT);\r
-               menulayouthigh = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntrieshigh"), (MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT)>>32);\r
-               menumasklow_lm = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskLow"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
-               menumaskhigh_lm = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskHigh"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
-               menumasklow_cu = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskLow"), 0);\r
-               menumaskhigh_cu = CRegStdWORD(_T("Software\\ToroiseGit\\ContextMenuEntriesMaskHigh"), 0);\r
-               langid = CRegStdWORD(_T("Software\\ToroiseGit\\LanguageID"), 1033);\r
-               blockstatus = CRegStdWORD(_T("Software\\ToroiseGit\\BlockStatus"), 0);\r
-               columnseverywhere = CRegStdWORD(_T("Software\\ToroiseGit\\ColumnsEveryWhere"), FALSE);\r
+               menulayoutlow = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntries"),              MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT);\r
+               menulayouthigh = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntrieshigh"), (MENUCREATEREPOS|MENUCLONE|MENUUPDATE|MENUCOMMIT)>>32);\r
+               menumasklow_lm = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
+               menumaskhigh_lm = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0, FALSE, HKEY_LOCAL_MACHINE);\r
+               menumasklow_cu = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskLow"), 0);\r
+               menumaskhigh_cu = CRegStdWORD(_T("Software\\TortoiseGit\\ContextMenuEntriesMaskHigh"), 0);\r
+               langid = CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033);\r
+               blockstatus = CRegStdWORD(_T("Software\\TortoiseGit\\BlockStatus"), 0);\r
+               columnseverywhere = CRegStdWORD(_T("Software\\TortoiseGit\\ColumnsEveryWhere"), FALSE);\r
                for (int i=0; i<27; i++)\r
                {\r
                        drivetypecache[i] = (UINT)-1;\r
@@ -110,7 +111,7 @@ public:
                GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_INEGNUMBER, &szBuffer[0], sizeof(szBuffer));\r
                columnrevformat.NegativeOrder = _ttoi(szBuffer);\r
                sAdminDirCacheKey.reserve(MAX_PATH);            // MAX_PATH as buffer reservation ok.\r
-               nocontextpaths = CRegStdString(_T("Software\\ToroiseGit\\NoContextPaths"), _T(""));\r
+               nocontextpaths = CRegStdString(_T("Software\\TortoiseGit\\NoContextPaths"), _T(""));\r
                m_critSec.Init();\r
        }\r
        void ForceRefresh()\r
@@ -151,7 +152,11 @@ public:
                        cachetypeticker = GetTickCount();\r
                        cachetype.read();\r
                }\r
-               return CacheType(DWORD((cachetype)));\r
+               //return CacheType(DWORD((cachetype)));\r
+               /*TEMP: until TGitCache done*/\r
+               if(CGit::IsVista())\r
+                       return none;\r
+               return CacheType(DWORD((cachetype))) == exe ? dll : CacheType(DWORD((cachetype)));\r
        }\r
        DWORD BlockStatus()\r
        {\r
@@ -435,7 +440,7 @@ public:
                }\r
                return &columnrevformat;\r
        }\r
-       BOOL HasSVNAdminDir(LPCTSTR path, BOOL bIsDir)\r
+       BOOL HasSVNAdminDir(LPCTSTR path, BOOL bIsDir, CString *ProjectTopDir = NULL)\r
        {\r
                size_t len = _tcslen(path);\r
                TCHAR * buf = new TCHAR[len+1];\r
@@ -450,18 +455,31 @@ public:
                }\r
                if ((GetTickCount() - ADMINDIRTIMEOUT) < admindirticker)\r
                {\r
-                       std::map<stdstring, BOOL>::iterator iter;\r
+                       std::map<stdstring, AdminDir_s>::iterator iter;\r
                        sAdminDirCacheKey.assign(buf);\r
                        if ((iter = admindircache.find(sAdminDirCacheKey)) != admindircache.end())\r
                        {\r
                                delete [] buf;\r
-                               return iter->second;\r
+                               if (ProjectTopDir && iter->second.bHasAdminDir)\r
+                                       *ProjectTopDir = iter->second.sProjectRoot.c_str();\r
+                               return iter->second.bHasAdminDir;\r
                        }\r
                }\r
-               BOOL hasAdminDir = g_GitAdminDir.HasAdminDir(buf, true);\r
+               CString sProjectRoot;\r
+               BOOL hasAdminDir = g_GitAdminDir.HasAdminDir(buf, true, &sProjectRoot);\r
                admindirticker = GetTickCount();\r
                Locker lock(m_critSec);\r
-               admindircache[buf] = hasAdminDir;\r
+\r
+               AdminDir_s &ad = admindircache[buf];\r
+               ad.bHasAdminDir = hasAdminDir;\r
+               if (hasAdminDir)\r
+               {\r
+                       ad.sProjectRoot.assign(sProjectRoot);\r
+\r
+                       if (ProjectTopDir)\r
+                               *ProjectTopDir = sProjectRoot;\r
+               }\r
+\r
                delete [] buf;\r
                return hasAdminDir;\r
        }\r
@@ -568,6 +586,13 @@ private:
                        includeliststr = (stdstring)includelist;\r
                }\r
        }\r
+\r
+       struct AdminDir_s\r
+       {\r
+               BOOL bHasAdminDir;\r
+               stdstring sProjectRoot;\r
+       };\r
+\r
        CRegStdWORD cachetype;\r
        CRegStdWORD blockstatus;\r
        CRegStdWORD langid;\r
@@ -623,7 +648,7 @@ private:
        NUMBERFMT columnrevformat;\r
        TCHAR szDecSep[5];\r
        TCHAR szThousandsSep[5];\r
-       std::map<stdstring, BOOL> admindircache;\r
+       std::map<stdstring, AdminDir_s> admindircache;\r
        stdstring sAdminDirCacheKey;\r
        CRegStdString nocontextpaths;\r
        stdstring excludecontextstr;\r