Просмотр исходного кода

close and reopen the database after windows resumes

git-svn-id: svn://svn.code.sf.net/p/ditto-cp/code/trunk@783 595ec19a-5cb4-439b-94a8-42fb3063c22c
sabrogden 10 лет назад
Родитель
Сommit
ca7df2eb4e
8 измененных файлов с 147 добавлено и 9 удалено
  1. 2 0
      CP_Main.vcxproj
  2. 2 6
      CP_Main.vcxproj.filters
  3. 26 1
      MainFrm.cpp
  4. 4 0
      MainFrm.h
  5. 1 0
      Misc.h
  6. 75 0
      PowerManager.cpp
  7. 34 0
      PowerManager.h
  8. 3 2
      QPasteWnd.cpp

+ 2 - 0
CP_Main.vcxproj

@@ -582,6 +582,7 @@
     <ClCompile Include="MessagePumpThread.cpp" />
     <ClCompile Include="MyDropTarget.cpp" />
     <ClCompile Include="Popup.cpp" />
+    <ClCompile Include="PowerManager.cpp" />
     <ClCompile Include="QPasteWndThread.cpp" />
     <ClCompile Include="QRCodeViewer.cpp" />
     <ClCompile Include="QRCode\bitstream.c">
@@ -1852,6 +1853,7 @@
     <ClInclude Include="MyDropTarget.h" />
     <ClInclude Include="NumberEdit.h" />
     <ClInclude Include="Popup.h" />
+    <ClInclude Include="PowerManager.h" />
     <ClInclude Include="QListCtrl.h" />
     <ClInclude Include="QPasteWndThread.h" />
     <ClInclude Include="QRCodeViewer.h" />

+ 2 - 6
CP_Main.vcxproj.filters

@@ -397,6 +397,7 @@
     <ClCompile Include="SpecialPasteOptions.cpp">
       <Filter>source</Filter>
     </ClCompile>
+    <ClCompile Include="PowerManager.cpp" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="sqlite\CppSQLite3.h">
@@ -846,6 +847,7 @@
     <ClInclude Include="TrayWnd.h">
       <Filter>header</Filter>
     </ClInclude>
+    <ClInclude Include="PowerManager.h" />
   </ItemGroup>
   <ItemGroup>
     <ResourceCompile Include="CP_Main.rc">
@@ -1116,12 +1118,6 @@
     <None Include="res\yellow_star_32_32.png">
       <Filter>res</Filter>
     </None>
-    <None Include="res\Ditto3.ico">
-      <Filter>res</Filter>
-    </None>
-    <None Include="res\Ditto3_NoCopyCb.ico">
-      <Filter>res</Filter>
-    </None>
   </ItemGroup>
   <ItemGroup>
     <Filter Include="sqlite">

+ 26 - 1
MainFrm.cpp

@@ -64,6 +64,7 @@ IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
 	ON_COMMAND(ID_FIRST_SAVECURRENTCLIPBOARD, &CMainFrame::OnFirstSavecurrentclipboard)
 	ON_MESSAGE(WM_SAVE_CLIPBOARD, &CMainFrame::OnSaveClipboardMessage)
 	ON_MESSAGE(WM_READD_TASKBAR_ICON, OnReAddTaskBarIcon)
+	ON_MESSAGE(WM_REOPEN_DATABASE, &CMainFrame::OnReOpenDatabase)
 	END_MESSAGE_MAP()
 
 	static UINT indicators[] = 
@@ -101,6 +102,8 @@ int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
         return  - 1;
     }
 
+	m_PowerManager.Start(m_hWnd);
+
     //Center the main window so message boxes are in the center
     CRect rcScreen;
     GetMonitorRect(0, &rcScreen);
@@ -746,6 +749,8 @@ void CMainFrame::OnClose()
 
     theApp.BeforeMainClose();
 
+	m_PowerManager.Close();
+
     CFrameWnd::OnClose();
 }
 
@@ -1189,4 +1194,24 @@ LRESULT CMainFrame::OnReAddTaskBarIcon(WPARAM wParam, LPARAM lParam)
 		m_TrayIcon.AddIcon();
 	}
 	return TRUE;
-}
+}
+
+LRESULT CMainFrame::OnReOpenDatabase(WPARAM wParam, LPARAM lParam)
+{
+	Log(StrF(_T("OnReOpenDatabase, closing and reopening database")));
+
+	try
+	{
+		m_quickPaste.CloseQPasteWnd();
+		theApp.m_db.close();
+		OpenDatabase(CGetSetOptions::GetDBPath());
+	}
+	CATCH_SQLITE_EXCEPTION
+
+	return TRUE;
+}
+
+
+
+
+

+ 4 - 0
MainFrm.h

@@ -6,6 +6,7 @@
 #include "EditFrameWnd.h"
 #include "MainFrmThread.h"
 #include "ClipboardSaveRestore.h"
+#include "PowerManager.h"
 
 
 #define CLOSE_WINDOW_TIMER				1	
@@ -66,6 +67,7 @@ public:
 	CPropertySheet *m_pOptions;
 	int m_doubleClickGroupId;
 	DWORD m_doubleClickGroupStartTime;
+	CPowerManager m_PowerManager;
 
     void DoDittoCopyBufferPaste(int nCopyBuffer);
     void DoFirstTenPositionsPaste(int nPos);
@@ -83,6 +85,7 @@ public:
     void ShowEditWnd(CClipIDs &Ids);
     CEditFrameWnd *m_pEditFrameWnd;
 
+
     // Generated message map functions
 protected:
     //{{AFX_MSG(CMainFrame)
@@ -123,4 +126,5 @@ DECLARE_MESSAGE_MAP()public:
 	afx_msg void OnFirstGlobalhotkeys();
 	afx_msg void OnFirstDeleteclipdata();
 	afx_msg void OnFirstSavecurrentclipboard();
+	afx_msg LRESULT OnReOpenDatabase(WPARAM wParam, LPARAM lParam);
 };

+ 1 - 0
Misc.h

@@ -125,6 +125,7 @@ CString GetProcessName(HWND hWnd);
 #define WM_OPEN_CLOSE_WINDWOW WM_USER + 222
 #define WM_SAVE_CLIPBOARD WM_USER + 223
 #define WM_READD_TASKBAR_ICON WM_USER + 224
+#define WM_REOPEN_DATABASE WM_USER + 225
 
 
 #if !defined(_BITSET_)

+ 75 - 0
PowerManager.cpp

@@ -0,0 +1,75 @@
+#include "stdafx.h"
+#include "PowerManager.h"
+#include "Misc.h"
+
+static HWND s_notifyHwnd;
+static ULONG PowerChanged(PVOID Context, ULONG Type, PVOID Setting);
+
+ULONG PowerChanged(PVOID Context, ULONG Type, PVOID Setting)
+{
+	CString cs;
+	cs.Format(_T("PowerChanged Type %d"), Type);
+	Log(cs);
+
+	if(Type == PBT_APMRESUMEAUTOMATIC)
+	{
+		//had reports of the main window not showing clips after resuming (report was from a vmware vm), catch the resuming callback from windows
+		//and close and reopen the database
+		Log(_T("windows is RESUMING, sending message to main window to close and reopen the database/qpastewnd"));
+		::PostMessage(s_notifyHwnd, WM_REOPEN_DATABASE, 0, 0);
+	}
+
+	return 0;
+}
+
+
+
+CPowerManager::CPowerManager()
+{
+	m_registrationHandle = 0;
+}
+
+
+CPowerManager::~CPowerManager(void)
+{
+}
+
+
+void CPowerManager::Start(HWND hWnd)
+{
+	s_notifyHwnd = hWnd;
+
+	HMODULE powrprof = LoadLibrary( _T("powrprof.dll") );
+	if( powrprof != NULL )
+	{
+		DWORD (_stdcall*PowerRegisterSuspendResumeNotification)(_In_ DWORD,_In_ HANDLE,_Out_ PHPOWERNOTIFY);
+		PowerRegisterSuspendResumeNotification = (DWORD(_stdcall*)(_In_ DWORD,_In_ HANDLE,_Out_ PHPOWERNOTIFY))GetProcAddress(powrprof, "PowerRegisterSuspendResumeNotification");
+		if(PowerRegisterSuspendResumeNotification)
+		{
+			static _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS testCallback = {PowerChanged, nullptr};
+
+			PowerRegisterSuspendResumeNotification(DEVICE_NOTIFY_CALLBACK, &testCallback, &m_registrationHandle); 
+		}
+
+		::FreeLibrary(powrprof);
+	}
+}
+
+void CPowerManager::Close()
+{	
+	if(m_registrationHandle != 0)
+	{
+		HMODULE powrprof = LoadLibrary( _T("powrprof.dll") );
+		if( powrprof != NULL )
+		{
+			DWORD (_stdcall*PowerUnregisterSuspendResumeNotification)(_Inout_ PHPOWERNOTIFY);
+			PowerUnregisterSuspendResumeNotification = (DWORD(_stdcall*)(_Inout_ PHPOWERNOTIFY))GetProcAddress(powrprof, "PowerUnregisterSuspendResumeNotification");
+			if(PowerUnregisterSuspendResumeNotification)
+			{
+				PowerUnregisterSuspendResumeNotification(&m_registrationHandle); 
+			}
+
+			::FreeLibrary(powrprof);
+		}
+	}
+}

+ 34 - 0
PowerManager.h

@@ -0,0 +1,34 @@
+#pragma once
+
+#define DEVICE_NOTIFY_CALLBACK 2
+
+typedef
+	ULONG
+	DEVICE_NOTIFY_CALLBACK_ROUTINE (
+	_In_opt_ PVOID Context,
+	_In_ ULONG Type,
+	_In_ PVOID Setting
+	);
+typedef DEVICE_NOTIFY_CALLBACK_ROUTINE* PDEVICE_NOTIFY_CALLBACK_ROUTINE;
+
+typedef struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS {
+	PDEVICE_NOTIFY_CALLBACK_ROUTINE Callback;
+	PVOID Context;
+} DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS, *PDEVICE_NOTIFY_SUBSCRIBE_PARAMETERS;
+
+typedef  PVOID           HPOWERNOTIFY;
+typedef  HPOWERNOTIFY   *PHPOWERNOTIFY;
+
+class CPowerManager
+{
+public:
+	CPowerManager();
+	~CPowerManager(void);
+
+	void Start(HWND hWnd);
+	void CPowerManager::Close();
+
+protected:
+	HPOWERNOTIFY m_registrationHandle;
+};
+

+ 3 - 2
QPasteWnd.cpp

@@ -4009,14 +4009,15 @@ void CQPasteWnd::OnGetToolTipText(NMHDR *pNMHDR, LRESULT *pResult)
         CString cs;
 
         int id = m_lstHeader.GetItemData(pInfo->lItem);
-        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, clipOrder, stickyClipOrder, lDontAutoDelete, QuickPasteText, lastPasteDate, globalShortCut FROM Main WHERE lID = %d"), id);
+        CppSQLite3Query q = theApp.m_db.execQueryEx(_T("SELECT lID, mText, lDate, lShortCut, clipOrder, clipGroupOrder, stickyClipOrder, lDontAutoDelete, QuickPasteText, lastPasteDate, globalShortCut FROM Main WHERE lID = %d"), id);
         if(q.eof() == false)
         {
             cs = q.getStringField(1);
             cs += "\n\n";
 
             #ifdef _DEBUG
-                cs += StrF(_T("(Index = %d) (DB ID = %d) (Seq = %f) (Sticky Seq = %f)\n"), pInfo->lItem, q.getIntField(_T("lID")), q.getFloatField(_T("clipOrder")), q.getFloatField(_T("stickyClipOrder")));
+                cs += StrF(_T("(Index = %d) (DB ID = %d) (Seq = %f) (Group Seq = %f) (Sticky Seq = %f)\n"), pInfo->lItem, q.getIntField(_T("lID")), 
+													q.getFloatField(_T("clipOrder")), q.getFloatField(_T("clipGroupOrder")), q.getFloatField(_T("stickyClipOrder")));
             #endif 
 
             COleDateTime time((time_t)q.getIntField(_T("lDate")));