1 // ClipboardFormatSnap.cpp: CClipboardFormatSnap
\83N
\83\89\83X
\82Ì
\83C
\83\93\83v
\83\8a\83\81\83\93\83e
\81[
\83V
\83\87\83\93\r
3 //////////////////////////////////////////////////////////////////////
\r
5 #include "ClipboardFormatSnap.h"
\r
10 static char THIS_FILE[]=__FILE__;
\r
11 #define new DEBUG_NEW
\r
14 //////////////////////////////////////////////////////////////////////
\r
15 //
\8d\
\92z/
\8fÁ
\96Å
\r
16 //////////////////////////////////////////////////////////////////////
\r
18 CClipboardFormatSnap::CClipboardFormatSnap() :
\r
19 m_nFormat( 0 ), m_oData()
\r
23 CClipboardFormatSnap::~CClipboardFormatSnap()
\r
27 //////////////////////////////////////////////////////////////////////
\r
29 //////////////////////////////////////////////////////////////////////
\r
31 CClipboardFormatSnap::CClipboardFormatSnap( const CClipboardFormatSnap& rhs ) :
\r
32 m_nFormat( 0 ), m_oData()
\r
34 m_nFormat = rhs.m_nFormat;
\r
36 int nLen = rhs.m_oData.GetSize();
\r
37 m_oData.RemoveAll();
\r
38 m_oData.SetSize( nLen );
\r
40 for( int i = 0; i < nLen; ++i )
\r
42 m_oData[ i ] = rhs.m_oData[ i ];
\r
46 const BOOL CClipboardFormatSnap::operator==( const CClipboardFormatSnap& rhs )
\r
48 if( m_nFormat != rhs.m_nFormat ) return FALSE;
\r
50 if( m_oData.GetSize() != rhs.m_oData.GetSize() ) return FALSE;
\r
52 for( int i = 0; i < m_oData.GetSize(); ++i )
\r
54 if( m_oData[ i ] != rhs.m_oData[ i ] ) return FALSE;
\r
60 const BOOL CClipboardFormatSnap::operator!=( const CClipboardFormatSnap& rhs )
\r
62 return !( *this == rhs );
\r
65 const CClipboardFormatSnap& CClipboardFormatSnap::operator=( const CClipboardFormatSnap& rhs )
\r
67 m_nFormat = rhs.m_nFormat;
\r
69 int nLen = rhs.m_oData.GetSize();
\r
70 m_oData.RemoveAll();
\r
71 m_oData.SetSize( nLen );
\r
73 for( int i = 0; i < nLen; ++i )
\r
75 m_oData[ i ] = rhs.m_oData[ i ];
\r
81 void CClipboardFormatSnap::MergeText( const CClipboardFormatSnap &rhs, const int nSizeOfNullTerminator )
\r
83 const int nOriginalTextLength = GetTextLength( nSizeOfNullTerminator );
\r
84 if( 0 < nOriginalTextLength )
\r
86 m_oData.SetSize( nOriginalTextLength + rhs.m_oData.GetSize() );
\r
87 for( int i = 0; i < rhs.m_oData.GetSize(); ++i )
\r
89 m_oData[ nOriginalTextLength + i ] = rhs.m_oData[ i ];
\r
98 void CClipboardFormatSnap::MergeRTF( const CClipboardFormatSnap& rhs )
\r
100 const int nOriginalHead = GetRTFBodyHead();
\r
101 const int nOriginalLength = GetRTFBodyLength();
\r
102 const int nRHSHead = rhs.GetRTFBodyHead();
\r
103 const int nRHSLength = rhs.GetRTFBodyLength();
\r
107 m_oData.SetSize( m_oData.GetSize() + nRHSLength );
\r
108 for( int i = m_oData.GetSize() - 1; nOriginalHead + nOriginalLength <= i ; --i )
\r
110 m_oData[ i ] = m_oData[ i - nRHSLength ];
\r
112 for( int j = 0; j < nRHSLength; ++j )
\r
114 m_oData[ nOriginalHead + nOriginalLength + j ] = rhs.m_oData[ nRHSHead + j ];
\r
119 const CClipboardFormatSnap& CClipboardFormatSnap::operator+( const CClipboardFormatSnap& rhs )
\r
121 if( !rhs.m_oData.GetSize() ) return *this;
\r
123 ASSERT( m_nFormat == rhs.m_nFormat );
\r
124 m_nFormat = rhs.m_nFormat;
\r
126 switch( m_nFormat )
\r
130 MergeText( rhs, 1 );
\r
132 case CF_UNICODETEXT:
\r
133 MergeText( rhs, 2 );
\r
138 case 49310: // Rich Text Format
\r
151 const CClipboardFormatSnap& CClipboardFormatSnap::Merge( CClipboardFormatSnap& lhs, CClipboardFormatSnap& rhs )
\r
153 ASSERT( m_nFormat == rhs.m_nFormat );
\r
154 m_nFormat = lhs.m_nFormat;
\r
155 m_oData.RemoveAll();
\r
157 switch( m_nFormat )
\r
162 const int nSizeOfNullTerminator = 1;
\r
163 if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )
\r
165 m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );
\r
168 for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )
\r
170 m_oData[ nLHS ] = lhs.m_oData[ nLHS ];
\r
172 for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )
\r
174 m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];
\r
177 else if( lhs.m_oData.GetSize() )
\r
181 else if( rhs.m_oData.GetSize() )
\r
191 case CF_UNICODETEXT:
\r
193 const int nSizeOfNullTerminator = 2;
\r
194 if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )
\r
196 m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );
\r
199 for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )
\r
201 m_oData[ nLHS ] = lhs.m_oData[ nLHS ];
\r
203 for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )
\r
205 m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];
\r
208 else if( lhs.m_oData.GetSize() )
\r
212 else if( rhs.m_oData.GetSize() )
\r
235 //////////////////////////////////////////////////////////////////////
\r
237 //////////////////////////////////////////////////////////////////////
\r
239 BOOL CClipboardFormatSnap::Capture( int nFormat )
\r
241 // CUtils::Log("CClipboardFormatSnap::Capture: 0");
\r
242 m_nFormat = nFormat;
\r
245 // (0) DataObject
\82Í
\8eæ
\82è
\8f\9c\82(4byte
\82Ì
\83|
\83C
\83\93\83^
\82µ
\82©
\93¾
\82ç
\82ê
\82È
\82¢
\82½
\82ß)
\r
247 if( GetFormatName( nFormat ) == _T("DataObject") ) return FALSE;
\r
250 // (0.5) Excel
\8fã
\82Å CF_METAFILEPICT/CF_ENHMETAFILE
\82É GetClipboardData
\82·
\82é
\82Æ "
\90}
\82ª
\91å
\82«
\82·
\82¬
\82Ü
\82·
\81B"
\82Æ
\82¢
\82¤
\83G
\83\89\81[
\82ª
\95\
\8e¦
\82³
\82ê
\82é
\81B
\r
252 // CUtils::Log("CClipboardFormatSnap::Capture: 0.5");
\r
253 if( CUtils::IsExcel() && ( nFormat == CF_METAFILEPICT || nFormat == CF_ENHMETAFILE ) ) return FALSE;
\r
256 // (1) Clipboard
\93à
\82Ì
\83\81\83\82\83\8a\83u
\83\8d\83b
\83N
\8eæ
\93¾
\r
258 // CUtils::Log("CClipboardFormatSnap::Capture: 1");
\r
259 HANDLE hData = GetClipboardData( nFormat ); if( hData == NULL ) return FALSE;
\r
260 // CUtils::Log("CClipboardFormatSnap::Capture: 1.1");
\r
261 void *pData = GlobalLock( hData ); if( pData == NULL ) return FALSE;
\r
262 // CUtils::Log("CClipboardFormatSnap::Capture: 1.2");
\r
263 size_t nLenData = GlobalSize( hData ); if( nLenData == 0 ) return FALSE;
\r
266 // (2)
\83\8d\81[
\83J
\83\8b\83I
\83u
\83W
\83F
\83N
\83g
\82Ö
\83f
\81[
\83^
\83R
\83s
\81[
\r
268 // CUtils::Log("CClipboardFormatSnap::Capture: 2");
\r
269 m_oData.RemoveAll();
\r
270 // CUtils::Log("CClipboardFormatSnap::Capture: 2.1");
\r
271 m_oData.SetSize( nLenData );
\r
272 // CUtils::Log("CClipboardFormatSnap::Capture: 2.2");
\r
273 CopyMemory( &m_oData[ 0 ], pData, nLenData );
\r
274 // CUtils::Log("CClipboardFormatSnap::Capture: 2.3");
\r
275 GlobalUnlock( hData );
\r
278 // CUtils::Log( "nFormat: %d (%s)", nFormat, GetFormatName( nFormat ) );
\r
279 /// if( nFormat == CF_OEMTEXT )
\r
280 // if( nFormat == 49310 ) // Rich Text Format
\r
281 /// if( nFormat == 49360 ) // HTML Format
\r
282 /// if( nFormat == 49669 ) // Notes Editor Internal
\r
283 /// if( nFormat == 49742 ) // HPB HTML Format
\r
285 /// for( int i = 0; i < m_oData.GetSize(); ++i )
\r
287 /// CUtils::Log( "%02x (%c)", m_oData[i], m_oData[ i ] );
\r
290 /// CUtils::Log( "size = %d", m_oData.GetSize() );
\r
291 // char *sz = new char[ m_oData.GetSize() + 1 ];
\r
292 // memset( sz, 0, m_oData.GetSize() + 1 );
\r
293 // for( int i = 0; i < m_oData.GetSize(); ++i )
\r
295 // *(sz + i) = m_oData[ i ];
\r
297 // CUtils::Log( "%s", sz );
\r
298 // CUtils::Log( "length = %d", GetRTFBodyLength());
\r
302 // CUtils::Log("CClipboardFormatSnap::Capture: 3");
\r
306 BOOL CClipboardFormatSnap::Restore()
\r
308 int nLenData = m_oData.GetSize() * sizeof(BYTE);
\r
309 HANDLE hClip = GlobalAlloc( GMEM_MOVEABLE, nLenData );
\r
310 void *pClip = GlobalLock( hClip );
\r
311 CopyMemory( pClip, &m_oData[ 0 ], nLenData );
\r
313 GlobalUnlock( hClip );
\r
314 SetClipboardData( m_nFormat, hClip );
\r
318 BOOL CClipboardFormatSnap::IsSameFormat( const CClipboardFormatSnap *const pFormatSnap )
\r
320 return m_nFormat == pFormatSnap->m_nFormat;
\r
323 BOOL CClipboardFormatSnap::IsMergeableFormat()
\r
325 return IsMergeableFormat( m_nFormat );
\r
328 BOOL CClipboardFormatSnap::IsMergeableFormat( const int nFormat )
\r
334 case CF_UNICODETEXT:
\r
336 // case 49310: // Rich Text Format
\r
346 int CClipboardFormatSnap::FindReturn()
\r
348 // CUtils::Log( "%s", GetFormatName( m_nFormat ) );
\r
349 switch( m_nFormat )
\r
354 for( int i = 0; i < m_oData.GetSize(); ++i )
\r
356 // CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );
\r
357 if( m_oData[ i ] == VK_RETURN ) return i; // CR
\r
358 if( !m_oData[ i ] ) break; // NULL Terminator
\r
362 case CF_UNICODETEXT:
\r
364 // for( int i = 0; i < m_oData.GetSize(); ++i )
\r
366 // CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );
\r
377 const int CClipboardFormatSnap::GetTextLength( const int nSizeOfNullTerminator )
\r
380 char *pNullTerminator = new char[ nSizeOfNullTerminator ];
\r
382 if( !pNullTerminator ) return -1;
\r
383 memset( pNullTerminator, 0, nSizeOfNullTerminator );
\r
385 char *pCurrentCharactor = new char[ nSizeOfNullTerminator ];
\r
386 if( !pCurrentCharactor )
\r
388 delete [] pNullTerminator;
\r
389 pNullTerminator = NULL;
\r
393 for( int i = 0; i < m_oData.GetSize() - nSizeOfNullTerminator + 1; i += nSizeOfNullTerminator )
\r
395 for( int j = 0; j < nSizeOfNullTerminator; ++j ) pCurrentCharactor[ j ] = m_oData[ i + j ];
\r
397 if( !memcmp( pCurrentCharactor, pNullTerminator, nSizeOfNullTerminator ) )
\r
399 delete [] pNullTerminator;
\r
400 pNullTerminator = NULL;
\r
401 delete [] pCurrentCharactor;
\r
402 pCurrentCharactor = NULL;
\r
407 delete [] pNullTerminator;
\r
408 pNullTerminator = NULL;
\r
409 delete [] pCurrentCharactor;
\r
410 pCurrentCharactor = NULL;
\r
412 catch (CMemoryException* e) {
\r
414 // CUtils::Log("CClipboardFormatSnap::GetTextLength: 'new' threw an exception");
\r
420 const int CClipboardFormatSnap::GetRTFBodyHead() const
\r
424 for( i = 0; i < m_oData.GetSize(); ++i )
\r
426 BOOL bBody = FALSE;
\r
428 switch( m_oData[ i ] )
\r
433 for( ++i ; i < m_oData.GetSize(); ++i )
\r
435 switch( m_oData[ i ] )
\r
444 // // for Microsoft Word
\r
445 // if( i < m_oData.GetSize() + 7 &&
\r
446 // m_oData[ i + 1 ] == 'i' &&
\r
447 // m_oData[ i + 2 ] == 'n' &&
\r
448 // m_oData[ i + 3 ] == 's' &&
\r
449 // m_oData[ i + 4 ] == 'r' &&
\r
450 // m_oData[ i + 5 ] == 's' &&
\r
451 // m_oData[ i + 6 ] == 'i' &&
\r
452 // m_oData[ i + 7 ] == 'd' )
\r
462 if( nBra == 1 ) break;
\r
468 if( --nBra == 0 ) {
\r
469 i = m_oData.GetSize();
\r
475 for( ; i < m_oData.GetSize(); ++i )
\r
477 BOOL bTagEnd = FALSE;
\r
478 switch( m_oData[ i ] )
\r
489 if( i < m_oData.GetSize() + 5 &&
\r
490 m_oData[ i + 1 ] == 'p' &&
\r
491 m_oData[ i + 2 ] == 'a' &&
\r
492 m_oData[ i + 3 ] == 'r' &&
\r
493 m_oData[ i + 4 ] == 0x0d &&
\r
494 m_oData[ i + 5 ] == 0x0a )
\r
499 if( i < m_oData.GetSize() + 1 &&
\r
500 ( m_oData[ i + 1 ] == '\\' ||
\r
501 m_oData[ i + 1 ] == '{' ||
\r
502 m_oData[ i + 1 ] == '}' ) )
\r
512 if( bTagEnd ) break;
\r
517 if( i < m_oData.GetSize() + 5 &&
\r
518 m_oData[ i + 1 ] == 0x0a &&
\r
519 m_oData[ i + 2 ] == '\\' &&
\r
520 m_oData[ i + 3 ] == 'p' &&
\r
521 m_oData[ i + 4 ] == 'a' &&
\r
522 m_oData[ i + 5 ] == 'r' )
\r
541 const int CClipboardFormatSnap::GetRTFBodyLength() const
\r
543 // CUtils::Log("const int CClipboardFormatSnap::GetRTFBodyLength() const: GetRTFBodyHead() = %d, m_oData.GetSize() = %d", GetRTFBodyHead(), m_oData.GetSize());
\r
546 for( int i = GetRTFBodyHead(); i < m_oData.GetSize(); ++i )
\r
548 if( m_oData[ i ] == '}' ) break;
\r
549 else if( m_oData[ i ] == '\\' )
\r
551 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );
\r
552 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i + 1 ], m_oData[ i + 1 ] );
\r
558 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );
\r
566 BOOL CClipboardFormatSnap::IsEmpty()
\r
569 switch( m_nFormat )
\r
573 if( ( 1 < m_oData.GetSize() ) && m_oData[ 0 ] ) rc = FALSE;
\r
575 case CF_UNICODETEXT:
\r
576 if( ( 2 < m_oData.GetSize() ) && m_oData[ 0 ] && m_oData[ 1 ] ) rc = FALSE;
\r
584 void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop )
\r
586 switch( m_nFormat )
\r
590 Add( pAddedString, bTop, 1 );
\r
592 case CF_UNICODETEXT:
\r
593 Add( pAddedString, bTop, 2 );
\r
600 void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop, const int nSizeOfNullTerminator )
\r
602 int nOffset = GetTextLength( nSizeOfNullTerminator );
\r
603 if( nOffset < 0 ) nOffset = 0;
\r
605 if( m_oData.GetSize() < ( nOffset + nSizeOfNullTerminator * ( (int)strlen( pAddedString ) + 1 ) ) )
\r
607 m_oData.SetSize( nOffset + nSizeOfNullTerminator * ( strlen( pAddedString ) + 1 ) );
\r
613 for( i = nOffset + nSizeOfNullTerminator - 1; 0 <= i ; --i )
\r
615 m_oData[ nSizeOfNullTerminator * strlen(pAddedString) + i ] = m_oData[ i ];
\r
617 for( i = 0; i < ( int )strlen( pAddedString ); ++i )
\r
619 for ( int j = 0; j < nSizeOfNullTerminator; ++j ) {
\r
620 if( j ) m_oData[ i * nSizeOfNullTerminator + j ] = 0;
\r
621 else m_oData[ i * nSizeOfNullTerminator + j ] = *( pAddedString + i );
\r
628 for( i = 0; i < strlen( pAddedString ); ++i )
\r
630 for( int j = 0; j < nSizeOfNullTerminator; ++j )
\r
632 if( j ) m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;
\r
633 else m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = *( pAddedString + i );
\r
637 for( int j = 0; j < nSizeOfNullTerminator; ++j )
\r
639 m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;
\r
644 void CClipboardFormatSnap::DeleteLastReturn()
\r
646 switch( m_nFormat )
\r
650 DeleteLastReturn( 1 );
\r
652 case CF_UNICODETEXT:
\r
653 DeleteLastReturn( 2 );
\r
660 void CClipboardFormatSnap::DeleteLastReturn(const int nSizeOfNullTerminator)
\r
662 if( GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 < 0 ) return;
\r
665 char *pCRLF = new char[ nSizeOfNullTerminator * 2 ];
\r
666 if( !pCRLF ) return;
\r
667 memset( pCRLF, 0, nSizeOfNullTerminator * 2 );
\r
669 *(pCRLF + nSizeOfNullTerminator) = '\n';
\r
671 BOOL bDelete = TRUE;
\r
672 for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )
\r
674 // CUtils::Log( "%#02x (%c) AA _%#02x_", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], *( pCRLF + i ) );
\r
675 if( m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] != *( pCRLF + i ) )
\r
684 const int nOffset = GetTextLength( nSizeOfNullTerminator );
\r
685 for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )
\r
687 // CUtils::Log( "%#02x (%c) BB", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] );
\r
688 m_oData[ nOffset - nSizeOfNullTerminator * 2 + i ] = 0;
\r
692 catch (CMemoryException* e) {
\r
694 // CUtils::Log("CClipboardFormatSnap::DeleteLastReturn: 'new' threw an exception");
\r