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
6 #include "ClipboardFormatSnap.h"
\r
11 static char THIS_FILE[]=__FILE__;
\r
12 #define new DEBUG_NEW
\r
15 //////////////////////////////////////////////////////////////////////
\r
16 //
\8d\
\92z/
\8fÁ
\96Å
\r
17 //////////////////////////////////////////////////////////////////////
\r
19 CClipboardFormatSnap::CClipboardFormatSnap() :
\r
20 m_nFormat( 0 ), m_oData()
\r
24 CClipboardFormatSnap::~CClipboardFormatSnap()
\r
28 //////////////////////////////////////////////////////////////////////
\r
30 //////////////////////////////////////////////////////////////////////
\r
32 CClipboardFormatSnap::CClipboardFormatSnap( const CClipboardFormatSnap& rhs ) :
\r
33 m_nFormat( 0 ), m_oData()
\r
35 m_nFormat = rhs.m_nFormat;
\r
37 int nLen = rhs.m_oData.GetSize();
\r
38 m_oData.RemoveAll();
\r
39 m_oData.SetSize( nLen );
\r
41 for( int i = 0; i < nLen; i++ )
\r
43 m_oData[ i ] = rhs.m_oData[ i ];
\r
47 const BOOL CClipboardFormatSnap::operator==( const CClipboardFormatSnap& rhs )
\r
49 if( m_nFormat != rhs.m_nFormat ) return FALSE;
\r
51 if( m_oData.GetSize() != rhs.m_oData.GetSize() ) return FALSE;
\r
53 for( int i = 0; i < m_oData.GetSize(); ++i )
\r
55 if( m_oData[ i ] != rhs.m_oData[ i ] ) return FALSE;
\r
61 const BOOL CClipboardFormatSnap::operator!=( const CClipboardFormatSnap& rhs )
\r
63 return !( *this == rhs );
\r
66 const CClipboardFormatSnap& CClipboardFormatSnap::operator=( const CClipboardFormatSnap& rhs )
\r
68 m_nFormat = rhs.m_nFormat;
\r
70 int nLen = rhs.m_oData.GetSize();
\r
71 m_oData.RemoveAll();
\r
72 m_oData.SetSize( nLen );
\r
74 for( int i = 0; i < nLen; i++ )
\r
76 m_oData[ i ] = rhs.m_oData[ i ];
\r
82 void CClipboardFormatSnap::MergeText( const CClipboardFormatSnap &rhs, const int nSizeOfNullTerminator )
\r
84 const int nOriginalTextLength = GetTextLength( nSizeOfNullTerminator );
\r
85 if( 0 < nOriginalTextLength )
\r
87 m_oData.SetSize( nOriginalTextLength + rhs.m_oData.GetSize() );
\r
88 for( int i = 0; i < rhs.m_oData.GetSize(); ++i )
\r
90 m_oData[ nOriginalTextLength + i ] = rhs.m_oData[ i ];
\r
99 void CClipboardFormatSnap::MergeRTF( const CClipboardFormatSnap& rhs )
\r
101 const int nOriginalHead = GetRTFBodyHead();
\r
102 const int nOriginalLength = GetRTFBodyLength();
\r
103 const int nRHSHead = rhs.GetRTFBodyHead();
\r
104 const int nRHSLength = rhs.GetRTFBodyLength();
\r
108 m_oData.SetSize( m_oData.GetSize() + nRHSLength );
\r
109 for( int i = m_oData.GetSize() - 1; nOriginalHead + nOriginalLength <= i ; --i )
\r
111 m_oData[ i ] = m_oData[ i - nRHSLength ];
\r
113 for( int j = 0; j < nRHSLength; ++j )
\r
115 m_oData[ nOriginalHead + nOriginalLength + j ] = rhs.m_oData[ nRHSHead + j ];
\r
120 const CClipboardFormatSnap& CClipboardFormatSnap::operator+( const CClipboardFormatSnap& rhs )
\r
122 if( !rhs.m_oData.GetSize() ) return *this;
\r
124 ASSERT( m_nFormat == rhs.m_nFormat );
\r
125 m_nFormat = rhs.m_nFormat;
\r
127 switch( m_nFormat )
\r
131 MergeText( rhs, 1 );
\r
133 case CF_UNICODETEXT:
\r
134 MergeText( rhs, 2 );
\r
139 case 49310: // Rich Text Format
\r
152 const CClipboardFormatSnap& CClipboardFormatSnap::Merge( CClipboardFormatSnap& lhs, CClipboardFormatSnap& rhs )
\r
154 ASSERT( m_nFormat == rhs.m_nFormat );
\r
155 m_nFormat = lhs.m_nFormat;
\r
156 m_oData.RemoveAll();
\r
158 switch( m_nFormat )
\r
163 const int nSizeOfNullTerminator = 1;
\r
164 if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )
\r
166 m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );
\r
169 for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )
\r
171 m_oData[ nLHS ] = lhs.m_oData[ nLHS ];
\r
173 for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )
\r
175 m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];
\r
178 else if( lhs.m_oData.GetSize() )
\r
182 else if( rhs.m_oData.GetSize() )
\r
192 case CF_UNICODETEXT:
\r
194 const int nSizeOfNullTerminator = 2;
\r
195 if( lhs.m_oData.GetSize() && rhs.m_oData.GetSize() )
\r
197 m_oData.SetSize( lhs.m_oData.GetSize() - nSizeOfNullTerminator + rhs.m_oData.GetSize() );
\r
200 for( nLHS = 0; nLHS < lhs.m_oData.GetSize() - nSizeOfNullTerminator; ++nLHS )
\r
202 m_oData[ nLHS ] = lhs.m_oData[ nLHS ];
\r
204 for( int nRHS = 0; nRHS < rhs.m_oData.GetSize(); ++nRHS )
\r
206 m_oData[ nLHS + nRHS ] = rhs.m_oData[ nRHS ];
\r
209 else if( lhs.m_oData.GetSize() )
\r
213 else if( rhs.m_oData.GetSize() )
\r
236 //////////////////////////////////////////////////////////////////////
\r
238 //////////////////////////////////////////////////////////////////////
\r
240 BOOL CClipboardFormatSnap::Capture( int nFormat )
\r
242 // CUtils::Log("CClipboardFormatSnap::Capture: 0");
\r
243 m_nFormat = nFormat;
\r
246 // (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
248 if( GetFormatName( nFormat ) == _T("DataObject") ) return FALSE;
\r
251 // (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
253 // CUtils::Log("CClipboardFormatSnap::Capture: 0.5");
\r
254 if( CUtils::IsExcel() && ( nFormat == CF_METAFILEPICT || nFormat == CF_ENHMETAFILE ) ) return FALSE;
\r
257 // (1) Clipboard
\93à
\82Ì
\83\81\83\82\83\8a\83u
\83\8d\83b
\83N
\8eæ
\93¾
\r
259 // CUtils::Log("CClipboardFormatSnap::Capture: 1");
\r
260 HANDLE hData = GetClipboardData( nFormat ); if( hData == NULL ) return FALSE;
\r
261 // CUtils::Log("CClipboardFormatSnap::Capture: 1.1");
\r
262 void *pData = GlobalLock( hData ); if( pData == NULL ) return FALSE;
\r
263 // CUtils::Log("CClipboardFormatSnap::Capture: 1.2");
\r
264 size_t nLenData = GlobalSize( hData ); if( nLenData == 0 ) return FALSE;
\r
267 // (2)
\83\8d\81[
\83J
\83\8b\83I
\83u
\83W
\83F
\83N
\83g
\82Ö
\83f
\81[
\83^
\83R
\83s
\81[
\r
269 // CUtils::Log("CClipboardFormatSnap::Capture: 2");
\r
270 m_oData.RemoveAll();
\r
271 // CUtils::Log("CClipboardFormatSnap::Capture: 2.1");
\r
272 m_oData.SetSize( nLenData );
\r
273 // CUtils::Log("CClipboardFormatSnap::Capture: 2.2");
\r
274 CopyMemory( &m_oData[ 0 ], pData, nLenData );
\r
275 // CUtils::Log("CClipboardFormatSnap::Capture: 2.3");
\r
276 GlobalUnlock( hData );
\r
279 // CUtils::Log( "nFormat: %d (%s)", nFormat, GetFormatName( nFormat ) );
\r
280 /// if( nFormat == CF_OEMTEXT )
\r
281 // if( nFormat == 49310 ) // Rich Text Format
\r
282 /// if( nFormat == 49360 ) // HTML Format
\r
283 /// if( nFormat == 49669 ) // Notes Editor Internal
\r
284 /// if( nFormat == 49742 ) // HPB HTML Format
\r
286 /// for( int i = 0; i < m_oData.GetSize(); ++i )
\r
288 /// CUtils::Log( "%02x (%c)", m_oData[i], m_oData[ i ] );
\r
291 /// CUtils::Log( "size = %d", m_oData.GetSize() );
\r
292 // char *sz = new char[ m_oData.GetSize() + 1 ];
\r
293 // memset( sz, 0, m_oData.GetSize() + 1 );
\r
294 // for( int i = 0; i < m_oData.GetSize(); ++i )
\r
296 // *(sz + i) = m_oData[ i ];
\r
298 // CUtils::Log( "%s", sz );
\r
299 // CUtils::Log( "length = %d", GetRTFBodyLength());
\r
303 // CUtils::Log("CClipboardFormatSnap::Capture: 3");
\r
307 BOOL CClipboardFormatSnap::Restore()
\r
309 int nLenData = m_oData.GetSize() * sizeof(BYTE);
\r
310 HANDLE hClip = GlobalAlloc( GMEM_MOVEABLE, nLenData );
\r
311 void *pClip = GlobalLock( hClip );
\r
312 CopyMemory( pClip, &m_oData[ 0 ], nLenData );
\r
314 GlobalUnlock( hClip );
\r
315 SetClipboardData( m_nFormat, hClip );
\r
319 BOOL CClipboardFormatSnap::IsSameFormat( const CClipboardFormatSnap *const pFormatSnap )
\r
321 return m_nFormat == pFormatSnap->m_nFormat;
\r
324 BOOL CClipboardFormatSnap::IsMergeableFormat()
\r
326 return IsMergeableFormat( m_nFormat );
\r
329 BOOL CClipboardFormatSnap::IsMergeableFormat( const int nFormat )
\r
335 case CF_UNICODETEXT:
\r
337 // case 49310: // Rich Text Format
\r
347 int CClipboardFormatSnap::FindReturn()
\r
349 // CUtils::Log( "%s", GetFormatName( m_nFormat ) );
\r
350 switch( m_nFormat )
\r
355 for( int i = 0; i < m_oData.GetSize(); ++i )
\r
357 // CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );
\r
358 if( m_oData[ i ] == VK_RETURN ) return i; // CR
\r
359 if( !m_oData[ i ] ) break; // NULL Terminator
\r
363 case CF_UNICODETEXT:
\r
365 // for( int i = 0; i < m_oData.GetSize(); ++i )
\r
367 // CUtils::Log( "%#02x (%c)", m_oData[ i ], m_oData[ i ] );
\r
378 const int CClipboardFormatSnap::GetTextLength( const int nSizeOfNullTerminator )
\r
381 char *pNullTerminator = new char[ nSizeOfNullTerminator ];
\r
383 if( !pNullTerminator ) return -1;
\r
384 memset( pNullTerminator, 0, nSizeOfNullTerminator );
\r
386 char *pCurrentCharactor = new char[ nSizeOfNullTerminator ];
\r
387 if( !pCurrentCharactor )
\r
389 delete [] pNullTerminator;
\r
390 pNullTerminator = NULL;
\r
394 for( int i = 0; i < m_oData.GetSize() - nSizeOfNullTerminator + 1; i += nSizeOfNullTerminator )
\r
396 for( int j = 0; j < nSizeOfNullTerminator; ++j ) pCurrentCharactor[ j ] = m_oData[ i + j ];
\r
398 if( !memcmp( pCurrentCharactor, pNullTerminator, nSizeOfNullTerminator ) )
\r
400 delete [] pNullTerminator;
\r
401 pNullTerminator = NULL;
\r
402 delete [] pCurrentCharactor;
\r
403 pCurrentCharactor = NULL;
\r
408 delete [] pNullTerminator;
\r
409 pNullTerminator = NULL;
\r
410 delete [] pCurrentCharactor;
\r
411 pCurrentCharactor = NULL;
\r
413 catch (CMemoryException* e) {
\r
415 // CUtils::Log("CClipboardFormatSnap::GetTextLength: 'new' threw an exception");
\r
421 const int CClipboardFormatSnap::GetRTFBodyHead() const
\r
425 for( int i = 0; i < m_oData.GetSize(); ++i )
\r
427 BOOL bBody = FALSE;
\r
429 switch( m_oData[ i ] )
\r
434 for( ++i ; i < m_oData.GetSize(); ++i )
\r
436 switch( m_oData[ i ] )
\r
445 // // for Microsoft Word
\r
446 // if( i < m_oData.GetSize() + 7 &&
\r
447 // m_oData[ i + 1 ] == 'i' &&
\r
448 // m_oData[ i + 2 ] == 'n' &&
\r
449 // m_oData[ i + 3 ] == 's' &&
\r
450 // m_oData[ i + 4 ] == 'r' &&
\r
451 // m_oData[ i + 5 ] == 's' &&
\r
452 // m_oData[ i + 6 ] == 'i' &&
\r
453 // m_oData[ i + 7 ] == 'd' )
\r
463 if( nBra == 1 ) break;
\r
469 if( --nBra == 0 ) {
\r
470 i = m_oData.GetSize();
\r
476 for( ; i < m_oData.GetSize(); ++i )
\r
478 BOOL bTagEnd = FALSE;
\r
479 switch( m_oData[ i ] )
\r
490 if( i < m_oData.GetSize() + 5 &&
\r
491 m_oData[ i + 1 ] == 'p' &&
\r
492 m_oData[ i + 2 ] == 'a' &&
\r
493 m_oData[ i + 3 ] == 'r' &&
\r
494 m_oData[ i + 4 ] == 0x0d &&
\r
495 m_oData[ i + 5 ] == 0x0a )
\r
500 if( i < m_oData.GetSize() + 1 &&
\r
501 ( m_oData[ i + 1 ] == '\\' ||
\r
502 m_oData[ i + 1 ] == '{' ||
\r
503 m_oData[ i + 1 ] == '}' ) )
\r
513 if( bTagEnd ) break;
\r
518 if( i < m_oData.GetSize() + 5 &&
\r
519 m_oData[ i + 1 ] == 0x0a &&
\r
520 m_oData[ i + 2 ] == '\\' &&
\r
521 m_oData[ i + 3 ] == 'p' &&
\r
522 m_oData[ i + 4 ] == 'a' &&
\r
523 m_oData[ i + 5 ] == 'r' )
\r
542 const int CClipboardFormatSnap::GetRTFBodyLength() const
\r
544 // CUtils::Log("const int CClipboardFormatSnap::GetRTFBodyLength() const: GetRTFBodyHead() = %d, m_oData.GetSize() = %d", GetRTFBodyHead(), m_oData.GetSize());
\r
547 for( int i = GetRTFBodyHead(); i < m_oData.GetSize(); ++i )
\r
549 if( m_oData[ i ] == '}' ) break;
\r
550 else if( m_oData[ i ] == '\\' )
\r
552 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );
\r
553 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i + 1 ], m_oData[ i + 1 ] );
\r
559 // CUtils::Log( "Body: %#04x (%c)", m_oData[ i ], m_oData[ i ] );
\r
567 BOOL CClipboardFormatSnap::IsEmpty()
\r
570 switch( m_nFormat )
\r
574 if( ( 1 < m_oData.GetSize() ) && m_oData[ 0 ] ) rc = FALSE;
\r
576 case CF_UNICODETEXT:
\r
577 if( ( 2 < m_oData.GetSize() ) && m_oData[ 0 ] && m_oData[ 1 ] ) rc = FALSE;
\r
585 void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop )
\r
587 switch( m_nFormat )
\r
591 Add( pAddedString, bTop, 1 );
\r
593 case CF_UNICODETEXT:
\r
594 Add( pAddedString, bTop, 2 );
\r
601 void CClipboardFormatSnap::Add( const char *const pAddedString, const BOOL bTop, const int nSizeOfNullTerminator )
\r
603 int nOffset = GetTextLength( nSizeOfNullTerminator );
\r
604 if( nOffset < 0 ) nOffset = 0;
\r
606 if( m_oData.GetSize() < ( nOffset + nSizeOfNullTerminator * ( (int)strlen( pAddedString ) + 1 ) ) )
\r
608 m_oData.SetSize( nOffset + nSizeOfNullTerminator * ( strlen( pAddedString ) + 1 ) );
\r
613 for( int 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
627 for( unsigned int i = 0; i < strlen( pAddedString ); ++i )
\r
629 for( int j = 0; j < nSizeOfNullTerminator; ++j )
\r
631 if( j ) m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;
\r
632 else m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = *( pAddedString + i );
\r
636 for( int j = 0; j < nSizeOfNullTerminator; ++j )
\r
638 m_oData[ nOffset + i * nSizeOfNullTerminator + j ] = 0;
\r
643 void CClipboardFormatSnap::DeleteLastReturn()
\r
645 switch( m_nFormat )
\r
649 DeleteLastReturn( 1 );
\r
651 case CF_UNICODETEXT:
\r
652 DeleteLastReturn( 2 );
\r
659 void CClipboardFormatSnap::DeleteLastReturn(const int nSizeOfNullTerminator)
\r
661 if( GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 < 0 ) return;
\r
664 char *pCRLF = new char[ nSizeOfNullTerminator * 2 ];
\r
665 if( !pCRLF ) return;
\r
666 memset( pCRLF, 0, nSizeOfNullTerminator * 2 );
\r
668 *(pCRLF + nSizeOfNullTerminator) = '\n';
\r
670 BOOL bDelete = TRUE;
\r
671 for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )
\r
673 // CUtils::Log( "%#02x (%c) AA _%#02x_", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], *( pCRLF + i ) );
\r
674 if( m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] != *( pCRLF + i ) )
\r
683 const int nOffset = GetTextLength( nSizeOfNullTerminator );
\r
684 for( int i = 0; i < nSizeOfNullTerminator * 2; ++i )
\r
686 // CUtils::Log( "%#02x (%c) BB", m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ], m_oData[ GetTextLength( nSizeOfNullTerminator ) - nSizeOfNullTerminator * 2 + i ] );
\r
687 m_oData[ nOffset - nSizeOfNullTerminator * 2 + i ] = 0;
\r
691 catch (CMemoryException* e) {
\r
693 // CUtils::Log("CClipboardFormatSnap::DeleteLastReturn: 'new' threw an exception");
\r