xref: /aoo41x/main/svl/source/svdde/ddedata.cxx (revision 40df464e)
1*40df464eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*40df464eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*40df464eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*40df464eSAndrew Rist  * distributed with this work for additional information
6*40df464eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*40df464eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*40df464eSAndrew Rist  * "License"); you may not use this file except in compliance
9*40df464eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*40df464eSAndrew Rist  *
11*40df464eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*40df464eSAndrew Rist  *
13*40df464eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*40df464eSAndrew Rist  * software distributed under the License is distributed on an
15*40df464eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*40df464eSAndrew Rist  * KIND, either express or implied.  See the License for the
17*40df464eSAndrew Rist  * specific language governing permissions and limitations
18*40df464eSAndrew Rist  * under the License.
19*40df464eSAndrew Rist  *
20*40df464eSAndrew Rist  *************************************************************/
21*40df464eSAndrew Rist 
22*40df464eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svl.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // ACHTUNG: es wird angenommen, dass StarView-Clipboard-Foamatnummern
28cdf0e10cSrcweir // und Windows-Formatnummern identisch sind! Ist dies einmal nicht der
29cdf0e10cSrcweir // Fall, muessen die Routinen hier angepasst werden. Die Implementation
30cdf0e10cSrcweir // verwendet die hier defineirten Konversionen.
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #define UNICODE
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <string.h>
35cdf0e10cSrcweir #include "ddeimp.hxx"
36cdf0e10cSrcweir #include <svl/svdde.hxx>
37cdf0e10cSrcweir 
38cdf0e10cSrcweir #include <osl/thread.h>
39cdf0e10cSrcweir 
40cdf0e10cSrcweir // --- DdeData::DdeData() ------------------------------------------
41cdf0e10cSrcweir 
DdeData()42cdf0e10cSrcweir DdeData::DdeData()
43cdf0e10cSrcweir {
44cdf0e10cSrcweir 	pImp = new DdeDataImp;
45cdf0e10cSrcweir 	pImp->hData = NULL;
46cdf0e10cSrcweir 	pImp->nData = 0;
47cdf0e10cSrcweir 	pImp->pData = NULL;
48cdf0e10cSrcweir 	pImp->nFmt  = CF_TEXT;
49cdf0e10cSrcweir }
50cdf0e10cSrcweir 
51cdf0e10cSrcweir // --- DdeData::DdeData() ------------------------------------------
52cdf0e10cSrcweir 
DdeData(const void * p,long n,sal_uLong f)53cdf0e10cSrcweir DdeData::DdeData( const void* p, long n, sal_uLong f )
54cdf0e10cSrcweir {
55cdf0e10cSrcweir 	pImp = new DdeDataImp;
56cdf0e10cSrcweir 	pImp->hData = NULL;
57cdf0e10cSrcweir 	pImp->pData = (LPBYTE)p;
58cdf0e10cSrcweir 	pImp->nData = n;
59cdf0e10cSrcweir 	pImp->nFmt  = f;
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
62cdf0e10cSrcweir // --- DdeData::DdeData() ------------------------------------------
63cdf0e10cSrcweir 
DdeData(const String & s)64cdf0e10cSrcweir DdeData::DdeData( const String& s )
65cdf0e10cSrcweir {
66cdf0e10cSrcweir 	pImp = new DdeDataImp;
67cdf0e10cSrcweir 	pImp->hData = NULL;
68cdf0e10cSrcweir 	pImp->pData = (LPBYTE)s.GetBuffer();
69cdf0e10cSrcweir 	pImp->nData = s.Len()+1;
70cdf0e10cSrcweir 	pImp->nFmt  = CF_TEXT;
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir // --- DdeData::DdeData() ------------------------------------------
74cdf0e10cSrcweir 
DdeData(const DdeData & rData)75cdf0e10cSrcweir DdeData::DdeData( const DdeData& rData )
76cdf0e10cSrcweir {
77cdf0e10cSrcweir 	pImp = new DdeDataImp;
78cdf0e10cSrcweir 	pImp->hData = rData.pImp->hData;
79cdf0e10cSrcweir 	pImp->nData = rData.pImp->nData;
80cdf0e10cSrcweir 	pImp->pData = rData.pImp->pData;
81cdf0e10cSrcweir 	pImp->nFmt  = rData.pImp->nFmt;
82cdf0e10cSrcweir 	Lock();
83cdf0e10cSrcweir }
84cdf0e10cSrcweir 
85cdf0e10cSrcweir // --- DdeData::~DdeData() -----------------------------------------
86cdf0e10cSrcweir 
~DdeData()87cdf0e10cSrcweir DdeData::~DdeData()
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	if ( pImp && pImp->hData )
90cdf0e10cSrcweir 		DdeUnaccessData( pImp->hData );
91cdf0e10cSrcweir 	delete pImp;
92cdf0e10cSrcweir }
93cdf0e10cSrcweir 
94cdf0e10cSrcweir // --- DdeData::Lock() ---------------------------------------------
95cdf0e10cSrcweir 
Lock()96cdf0e10cSrcweir void DdeData::Lock()
97cdf0e10cSrcweir {
98cdf0e10cSrcweir 	if ( pImp->hData )
99cdf0e10cSrcweir 		pImp->pData = DdeAccessData( pImp->hData, (LPDWORD) &pImp->nData );
100cdf0e10cSrcweir }
101cdf0e10cSrcweir 
102cdf0e10cSrcweir // --- DdeData::GetFormat() ----------------------------------------
103cdf0e10cSrcweir 
GetFormat() const104cdf0e10cSrcweir sal_uLong DdeData::GetFormat() const
105cdf0e10cSrcweir {
106cdf0e10cSrcweir 	return pImp->nFmt;
107cdf0e10cSrcweir }
108cdf0e10cSrcweir 
SetFormat(sal_uLong nFmt)109cdf0e10cSrcweir void DdeData::SetFormat( sal_uLong nFmt )
110cdf0e10cSrcweir {
111cdf0e10cSrcweir 	pImp->nFmt = nFmt;
112cdf0e10cSrcweir }
113cdf0e10cSrcweir 
114cdf0e10cSrcweir // --- DdeData::operator const char*() -----------------------------
115cdf0e10cSrcweir 
116cdf0e10cSrcweir DdeData::operator const void*() const
117cdf0e10cSrcweir {
118cdf0e10cSrcweir 	return pImp->pData;
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
121cdf0e10cSrcweir // --- DdeData::operator long() ------------------------------------
122cdf0e10cSrcweir 
123cdf0e10cSrcweir DdeData::operator long() const
124cdf0e10cSrcweir {
125cdf0e10cSrcweir 	return pImp->nData;
126cdf0e10cSrcweir }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir // --- DdeData::operator =() ---------------------------------------
129cdf0e10cSrcweir 
operator =(const DdeData & rData)130cdf0e10cSrcweir DdeData& DdeData::operator = ( const DdeData& rData )
131cdf0e10cSrcweir {
132cdf0e10cSrcweir 	if ( &rData != this )
133cdf0e10cSrcweir 	{
134cdf0e10cSrcweir 		DdeData tmp( rData );
135cdf0e10cSrcweir 		delete pImp;
136cdf0e10cSrcweir 		pImp = tmp.pImp;
137cdf0e10cSrcweir 		tmp.pImp = NULL;
138cdf0e10cSrcweir 	}
139cdf0e10cSrcweir 
140cdf0e10cSrcweir 	return *this;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir 
GetExternalFormat(sal_uLong nFmt)143cdf0e10cSrcweir sal_uLong DdeData::GetExternalFormat( sal_uLong nFmt )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir 	switch( nFmt )
146cdf0e10cSrcweir 	{
147cdf0e10cSrcweir 	case FORMAT_STRING:
148cdf0e10cSrcweir 		nFmt = CF_TEXT;
149cdf0e10cSrcweir 		break;
150cdf0e10cSrcweir 	case FORMAT_BITMAP:
151cdf0e10cSrcweir 		nFmt = CF_BITMAP;
152cdf0e10cSrcweir 		break;
153cdf0e10cSrcweir 	case FORMAT_GDIMETAFILE:
154cdf0e10cSrcweir 		nFmt = CF_METAFILEPICT;
155cdf0e10cSrcweir 		break;
156cdf0e10cSrcweir 
157cdf0e10cSrcweir 	default:
158cdf0e10cSrcweir 		{
159cdf0e10cSrcweir #if defined(WNT) || defined( PM2 )
160cdf0e10cSrcweir 			String aName( SotExchange::GetFormatName( nFmt ) );
161cdf0e10cSrcweir 
162cdf0e10cSrcweir #if defined(WNT)
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 			if( aName.Len() )
165cdf0e10cSrcweir 				nFmt = RegisterClipboardFormat( reinterpret_cast<LPCWSTR>(aName.GetBuffer()) );
166cdf0e10cSrcweir #endif
167cdf0e10cSrcweir #if defined( PM2 )
168cdf0e10cSrcweir 
169cdf0e10cSrcweir 			if( aName.Len() )
170cdf0e10cSrcweir 			{
171cdf0e10cSrcweir 				HATOMTBL hSysTable = WinQuerySystemAtomTable();
172cdf0e10cSrcweir 				nFmt = (sal_uLong)WinAddAtom( hSysTable, (PSZ)aName.GetBuffer() );
173cdf0e10cSrcweir 			}
174cdf0e10cSrcweir #endif
175cdf0e10cSrcweir #endif
176cdf0e10cSrcweir 		}
177cdf0e10cSrcweir 	}
178cdf0e10cSrcweir 	return nFmt;
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
GetInternalFormat(sal_uLong nFmt)181cdf0e10cSrcweir sal_uLong DdeData::GetInternalFormat( sal_uLong nFmt )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir 	switch( nFmt )
184cdf0e10cSrcweir 	{
185cdf0e10cSrcweir 	case CF_TEXT:
186cdf0e10cSrcweir 		nFmt = FORMAT_STRING;
187cdf0e10cSrcweir 		break;
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 	case CF_BITMAP:
190cdf0e10cSrcweir 		nFmt = FORMAT_BITMAP;
191cdf0e10cSrcweir 		break;
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 	case CF_METAFILEPICT:
194cdf0e10cSrcweir 		nFmt = FORMAT_GDIMETAFILE;
195cdf0e10cSrcweir 		break;
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 	default:
198cdf0e10cSrcweir #if defined(WNT)
199cdf0e10cSrcweir 		if( nFmt >= CF_MAX )
200cdf0e10cSrcweir 		{
201cdf0e10cSrcweir 			TCHAR szName[ 256 ];
202cdf0e10cSrcweir 
203cdf0e10cSrcweir 			if( GetClipboardFormatName( nFmt, szName, sizeof(szName) ) )
204cdf0e10cSrcweir 				nFmt = SotExchange::RegisterFormatName( String(reinterpret_cast<const sal_Unicode*>(szName)) );
205cdf0e10cSrcweir 		}
206cdf0e10cSrcweir #endif
207cdf0e10cSrcweir #if defined(PM2)
208cdf0e10cSrcweir 		if( nFmt > CF_PALETTE )
209cdf0e10cSrcweir 		{
210cdf0e10cSrcweir 			char szName[ 256 ];
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 			HATOMTBL hSysTable = WinQuerySystemAtomTable();
213cdf0e10cSrcweir 			WinQueryAtomName( hSysTable, (ATOM)nFmt, (PSZ)szName,
214cdf0e10cSrcweir 								sizeof( szName ) );
215cdf0e10cSrcweir 			nFmt = SotExchange::RegisterFormatName( String( szName ) );
216cdf0e10cSrcweir 		}
217cdf0e10cSrcweir #endif
218cdf0e10cSrcweir 		break;
219cdf0e10cSrcweir 	}
220cdf0e10cSrcweir 	return nFmt;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
223