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