source: trunk/src/gui/kernel/qclipboard_s60.cpp@ 561

Last change on this file since 561 was 561, checked in by Dmitry A. Kuminov, 15 years ago

trunk: Merged in qt 4.6.1 sources.

  • Property svn:eol-style set to native
File size: 7.6 KB
Line 
1/****************************************************************************
2**
3** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
4** All rights reserved.
5** Contact: Nokia Corporation ([email protected])
6**
7** This file is part of the QtGui module of the Qt Toolkit.
8**
9** $QT_BEGIN_LICENSE:LGPL$
10** Commercial Usage
11** Licensees holding valid Qt Commercial licenses may use this file in
12** accordance with the Qt Commercial License Agreement provided with the
13** Software or, alternatively, in accordance with the terms contained in
14** a written agreement between you and Nokia.
15**
16** GNU Lesser General Public License Usage
17** Alternatively, this file may be used under the terms of the GNU Lesser
18** General Public License version 2.1 as published by the Free Software
19** Foundation and appearing in the file LICENSE.LGPL included in the
20** packaging of this file. Please review the following information to
21** ensure the GNU Lesser General Public License version 2.1 requirements
22** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
23**
24** In addition, as a special exception, Nokia gives you certain additional
25** rights. These rights are described in the Nokia Qt LGPL Exception
26** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
27**
28** GNU General Public License Usage
29** Alternatively, this file may be used under the terms of the GNU
30** General Public License version 3.0 as published by the Free Software
31** Foundation and appearing in the file LICENSE.GPL included in the
32** packaging of this file. Please review the following information to
33** ensure the GNU General Public License version 3.0 requirements will be
34** met: http://www.gnu.org/copyleft/gpl.html.
35**
36** If you have questions regarding the use of this file, please contact
37** Nokia at [email protected].
38** $QT_END_LICENSE$
39**
40****************************************************************************/
41
42#include "qclipboard.h"
43
44#ifndef QT_NO_CLIPBOARD
45
46#include "qapplication.h"
47#include "qbitmap.h"
48#include "qdatetime.h"
49#include "qbuffer.h"
50#include "qwidget.h"
51#include "qevent.h"
52#include "private/qcore_symbian_p.h"
53#include <QtDebug>
54
55// Symbian's clipboard
56#include <baclipb.h>
57QT_BEGIN_NAMESPACE
58
59//### Mime Type mapping to UIDs
60
61const TUid KQtCbDataStream = {0x2001B2DD};
62
63
64class QClipboardData
65{
66public:
67 QClipboardData();
68 ~QClipboardData();
69
70 void setSource(QMimeData* s)
71 {
72 if (s == src)
73 return;
74 delete src;
75 src = s;
76 }
77 QMimeData* source()
78 { return src; }
79 bool connected()
80 { return connection; }
81 void clear();
82
83private:
84 QMimeData* src;
85 bool connection;
86};
87
88QClipboardData::QClipboardData():src(0),connection(true)
89{
90 clear();
91}
92
93QClipboardData::~QClipboardData()
94{
95 connection = false;
96 delete src;
97}
98
99void QClipboardData::clear()
100{
101 QMimeData* newSrc = new QMimeData;
102 delete src;
103 src = newSrc;
104}
105
106static QClipboardData *internalCbData = 0;
107
108static void cleanupClipboardData()
109{
110 delete internalCbData;
111 internalCbData = 0;
112}
113
114static QClipboardData *clipboardData()
115{
116 if (internalCbData == 0) {
117 internalCbData = new QClipboardData;
118 if (internalCbData)
119 {
120 if (!internalCbData->connected())
121 {
122 delete internalCbData;
123 internalCbData = 0;
124 }
125 else
126 {
127 qAddPostRoutine(cleanupClipboardData);
128 }
129 }
130 }
131 return internalCbData;
132}
133
134void writeToStreamLX(const QMimeData* aData, RWriteStream& aStream)
135{
136 // This function both leaves and throws exceptions. There must be no destructor
137 // dependencies between cleanup styles, and no cleanup stack dependencies on stacked objects.
138 QStringList headers = aData->formats();
139 aStream << TCardinality(headers.count());
140 for (QStringList::const_iterator iter= headers.constBegin();iter != headers.constEnd();iter++)
141 {
142 HBufC* stringData = TPtrC(reinterpret_cast<const TUint16*>((*iter).utf16())).AllocLC();
143 QByteArray ba = aData->data((*iter));
144 qDebug() << "copy to clipboard mime: " << *iter << " data: " << ba;
145 // mime type
146 aStream << TCardinality(stringData->Size());
147 aStream << *(stringData);
148 // mime data
149 aStream << TCardinality(ba.size());
150 aStream.WriteL(reinterpret_cast<const uchar*>(ba.constData()),ba.size());
151 CleanupStack::PopAndDestroy(stringData);
152 }
153}
154
155void readFromStreamLX(QMimeData* aData,RReadStream& aStream)
156{
157 // This function both leaves and throws exceptions. There must be no destructor
158 // dependencies between cleanup styles, and no cleanup stack dependencies on stacked objects.
159 TCardinality mimeTypeCount;
160 aStream >> mimeTypeCount;
161 for (int i = 0; i< mimeTypeCount;i++)
162 {
163 // mime type
164 TCardinality mimeTypeSize;
165 aStream >> mimeTypeSize;
166 HBufC* mimeTypeBuf = HBufC::NewLC(aStream,mimeTypeSize);
167 QString mimeType = QString::fromUtf16(mimeTypeBuf->Des().Ptr(),mimeTypeBuf->Length());
168 CleanupStack::PopAndDestroy(mimeTypeBuf);
169 // mime data
170 TCardinality dataSize;
171 aStream >> dataSize;
172 QByteArray ba;
173 ba.reserve(dataSize);
174 aStream.ReadL(reinterpret_cast<uchar*>(ba.data_ptr()->data),dataSize);
175 ba.data_ptr()->size = dataSize;
176 qDebug() << "paste from clipboard mime: " << mimeType << " data: " << ba;
177 aData->setData(mimeType,ba);
178 }
179}
180
181
182/*****************************************************************************
183 QClipboard member functions
184 *****************************************************************************/
185
186void QClipboard::clear(Mode mode)
187{
188 setText(QString(), mode);
189}
190const QMimeData* QClipboard::mimeData(Mode mode) const
191{
192 if (mode != Clipboard) return 0;
193 QClipboardData *d = clipboardData();
194 if (d)
195 {
196 TRAPD(err,{
197 RFs fs = qt_s60GetRFs();
198 CClipboard* cb = CClipboard::NewForReadingLC(fs);
199 Q_ASSERT(cb);
200 RStoreReadStream stream;
201 TStreamId stid = (cb->StreamDictionary()).At(KQtCbDataStream);
202 stream.OpenLC(cb->Store(),stid);
203 QT_TRYCATCH_LEAVING(readFromStreamLX(d->source(),stream));
204 CleanupStack::PopAndDestroy(2,cb);
205 return d->source();
206 });
207 if (err != KErrNone){
208 qDebug()<< "clipboard is empty/err: " << err;
209 }
210
211 }
212 return 0;
213}
214
215
216void QClipboard::setMimeData(QMimeData* src, Mode mode)
217{
218 if (mode != Clipboard) return;
219 QClipboardData *d = clipboardData();
220 if (d)
221 {
222 TRAPD(err,{
223 RFs fs = qt_s60GetRFs();
224 CClipboard* cb = CClipboard::NewForWritingLC(fs);
225 RStoreWriteStream stream;
226 TStreamId stid = stream.CreateLC(cb->Store());
227 QT_TRYCATCH_LEAVING(writeToStreamLX(src,stream));
228 d->setSource(src);
229 stream.CommitL();
230 (cb->StreamDictionary()).AssignL(KQtCbDataStream,stid);
231 cb->CommitL();
232 CleanupStack::PopAndDestroy(2,cb);
233 });
234 if (err != KErrNone){
235 qDebug()<< "clipboard write err :" << err;
236 }
237 }
238 emitChanged(QClipboard::Clipboard);
239}
240
241bool QClipboard::supportsMode(Mode mode) const
242{
243 return (mode == Clipboard);
244}
245
246bool QClipboard::ownsMode(Mode mode) const
247{
248 if (mode == Clipboard)
249 qWarning("QClipboard::ownsClipboard: UNIMPLEMENTED!");
250 return false;
251}
252
253bool QClipboard::event(QEvent * /* e */)
254{
255 return true;
256}
257
258void QClipboard::connectNotify( const char * )
259{
260}
261
262void QClipboard::ownerDestroyed()
263{
264}
265QT_END_NAMESPACE
266#endif // QT_NO_CLIPBOARD
Note: See TracBrowser for help on using the repository browser.