summaryrefslogtreecommitdiff
path: root/datamodel/clipboardmanager.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /datamodel/clipboardmanager.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'datamodel/clipboardmanager.cpp')
-rw-r--r--datamodel/clipboardmanager.cpp169
1 files changed, 169 insertions, 0 deletions
diff --git a/datamodel/clipboardmanager.cpp b/datamodel/clipboardmanager.cpp
new file mode 100644
index 0000000..5ffa533
--- /dev/null
+++ b/datamodel/clipboardmanager.cpp
@@ -0,0 +1,169 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "clipboardmanager.h"
+#include "datamodel.h"
+#include "tier1/KeyValues.h"
+
+#ifndef _LINUX
+#define USE_WINDOWS_CLIPBOARD
+#endif
+
+#if defined( USE_WINDOWS_CLIPBOARD )
+#include <windows.h>
+#endif
+
+CClipboardManager::CClipboardManager( ) :
+ m_pfnCleanup( NULL )
+{
+}
+
+CClipboardManager::~CClipboardManager()
+{
+ EmptyClipboard( false );
+}
+
+void CClipboardManager::EmptyClipboard( bool bClearWindowsClipboard )
+{
+ // Call optional cleanup function if there is one...
+ if ( m_pfnCleanup )
+ {
+ m_pfnCleanup->ReleaseClipboardData( m_Data );
+ }
+ int c = m_Data.Count();
+ for ( int i = 0; i < c; ++i )
+ {
+ m_Data[ i ]->deleteThis();
+ }
+ m_Data.RemoveAll();
+ m_pfnCleanup = NULL;
+
+#if defined( USE_WINDOWS_CLIPBOARD )
+ if ( bClearWindowsClipboard )
+ {
+ if ( ::OpenClipboard( ::GetDesktopWindow() ) )
+ {
+ ::EmptyClipboard();
+ ::CloseClipboard();
+ }
+ }
+#endif
+}
+
+void CClipboardManager::SetClipboardData( CUtlVector< KeyValues * >& data, IClipboardCleanup *pfnOptionalCleanuFunction )
+{
+ EmptyClipboard( true );
+ m_Data = data;
+ m_pfnCleanup = pfnOptionalCleanuFunction;
+
+#if defined( USE_WINDOWS_CLIPBOARD )
+ if ( m_Data.Count() >= 0 )
+ {
+ // Only stick the first item's data into the clipboard
+ char const *text = m_Data[ 0 ]->GetString( "text", "" );
+ if ( text && text[ 0 ] )
+ {
+ int textLen = Q_strlen( text );
+
+ if ( ::OpenClipboard( ::GetDesktopWindow() ) )
+ {
+ HANDLE hmem = ::GlobalAlloc(GMEM_MOVEABLE, textLen + 1);
+ if (hmem)
+ {
+ void *ptr = ::GlobalLock( hmem );
+ if ( ptr )
+ {
+ Q_memset( ptr, 0, textLen + 1 );
+ Q_memcpy( ptr, text, textLen );
+ ::GlobalUnlock( hmem );
+
+ ::SetClipboardData( CF_TEXT, hmem );
+ }
+ }
+ ::CloseClipboard();
+ }
+ }
+ }
+#endif
+}
+
+void CClipboardManager::AddToClipboardData( KeyValues *add )
+{
+ m_Data.AddToTail( add );
+#if defined( USE_WINDOWS_CLIPBOARD )
+ if ( m_Data.Count() >= 0 )
+ {
+ // Only stick the first item's data into the clipboard
+ char const *text = m_Data[ 0 ]->GetString( "text", "" );
+ if ( text && text[ 0 ] )
+ {
+ int textLen = Q_strlen( text );
+
+
+ if ( ::OpenClipboard( ::GetDesktopWindow() ) )
+ {
+ ::EmptyClipboard();
+
+ HANDLE hmem = ::GlobalAlloc(GMEM_MOVEABLE, textLen + 1);
+ if (hmem)
+ {
+ void *ptr = ::GlobalLock( hmem );
+ if ( ptr )
+ {
+ Q_memset( ptr, 0, textLen + 1 );
+ Q_memcpy( ptr, text, textLen );
+ ::GlobalUnlock( hmem );
+
+ ::SetClipboardData( CF_TEXT, hmem );
+ }
+ }
+ ::CloseClipboard();
+ }
+ }
+ }
+#endif
+}
+
+void CClipboardManager::GetClipboardData( CUtlVector< KeyValues * >& data )
+{
+ data.RemoveAll();
+ data = m_Data;
+#if defined( USE_WINDOWS_CLIPBOARD )
+ if ( data.Count() == 0 )
+ {
+ // See if windows has some text since we didn't have any internally
+ if ( ::OpenClipboard( ::GetDesktopWindow() ) )
+ {
+ HANDLE hmem = ::GetClipboardData( CF_TEXT );
+ if ( hmem )
+ {
+ int len = GlobalSize( hmem );
+ if ( len > 0 )
+ {
+ void *ptr = GlobalLock(hmem);
+ if ( ptr )
+ {
+ char buf[ 8192 ];
+ len = min( len, 8191 );
+ Q_memcpy( buf, ( char * )ptr, len );
+ buf[ 8191 ] = 0;
+ GlobalUnlock(hmem);
+
+ KeyValues *newData = new KeyValues( "ClipBoard", "text", buf );
+ data.AddToTail( newData );
+ }
+ }
+ }
+ ::CloseClipboard();
+ }
+ }
+#endif
+}
+
+bool CClipboardManager::HasClipboardData() const
+{
+ return m_Data.Count() > 0 ? true : false;
+}