29 #include <imgIContainer.h>
30 #include <imgITools.h>
31 #include <nsIBinaryInputStream.h>
32 #include <nsIClipboard.h>
33 #include <nsIInputStream.h>
34 #include <nsIInterfaceRequestor.h>
35 #include <nsIInterfaceRequestorUtils.h>
36 #include <nsIMIMEService.h>
37 #include <nsIStringStream.h>
38 #include <nsISupportsPrimitives.h>
39 #include <nsITransferable.h>
41 #include <nsNetUtil.h>
42 #include <nsStringAPI.h>
44 #include "nsWidgetsCID.h"
46 #define kBinaryInputStream "@mozilla.org/binaryinputstream;1"
55 sbClipboardHelper::~sbClipboardHelper()
61 sbClipboardHelper::CopyImageFromClipboard(nsAString &aMimeType,
69 nsCOMPtr<nsIClipboard> nsClipboard =
70 do_GetService(
"@mozilla.org/widget/clipboard;1", &rv);
71 NS_ENSURE_SUCCESS(rv, rv);
73 nsCOMPtr<nsITransferable> xferable =
74 do_CreateInstance(
"@mozilla.org/widget/transferable;1", &rv);
75 NS_ENSURE_SUCCESS(rv, rv);
80 const char *flavorTypes[] = { kPNGImageMime,
86 const int flavorTypesLen = NS_ARRAY_LENGTH(flavorTypes);
87 for (
int iIndex = 0; iIndex < flavorTypesLen; iIndex++) {
88 rv = xferable->AddDataFlavor(flavorTypes[iIndex]);
89 NS_ENSURE_SUCCESS(rv, rv);
93 PRBool clipboardHasData = PR_FALSE;
94 rv = nsClipboard->HasDataMatchingFlavors(flavorTypes,
96 nsIClipboard::kGlobalClipboard,
98 NS_ENSURE_SUCCESS(rv, rv);
100 if (clipboardHasData) {
102 rv = nsClipboard->GetData(xferable, nsIClipboard::kGlobalClipboard);
103 NS_ENSURE_SUCCESS(rv, rv);
105 nsCOMPtr<nsISupports> clipboardData;
106 char *clipboardDataFlavor = 0;
107 PRUint32 clipboardDataLen = 0;
109 rv = xferable->GetAnyTransferData(&clipboardDataFlavor,
110 getter_AddRefs(clipboardData),
112 NS_ENSURE_SUCCESS(rv, rv);
115 nsCOMPtr<nsIInputStream> dataStream;
118 if (!strcmp(clipboardDataFlavor, kUnicodeMime) ||
119 !strcmp(clipboardDataFlavor, kFileMime)) {
122 nsCOMPtr<nsILocalFile> imageFile;
123 if (!strcmp(clipboardDataFlavor, kUnicodeMime)) {
125 nsCOMPtr<nsISupportsString>
stringData(do_QueryInterface(clipboardData));
135 imageFile = do_CreateInstance(
"@mozilla.org/file/local;1", &rv);
136 NS_ENSURE_SUCCESS(rv, rv);
138 rv = imageFile->InitWithPath(url);
144 imageFile = do_QueryInterface(clipboardData);
151 nsCOMPtr<nsIMIMEService> mimeService =
152 do_CreateInstance(
"@mozilla.org/mime;1", &rv);
153 NS_ENSURE_SUCCESS(rv, rv);
155 nsCAutoString mimeType;
156 rv = mimeService->GetTypeFromFile(imageFile, mimeType);
157 NS_ENSURE_SUCCESS(rv, rv);
159 aMimeType.Assign(NS_ConvertUTF8toUTF16(mimeType));
162 nsCOMPtr<nsIFileInputStream> fileStream =
163 do_CreateInstance(
"@mozilla.org/network/file-input-stream;1", &rv);
164 NS_ENSURE_SUCCESS(rv, rv);
166 rv = fileStream->Init(imageFile, 0x01, 0600, 0);
167 NS_ENSURE_SUCCESS(rv, rv);
169 dataStream = do_QueryInterface(fileStream, &rv);
170 NS_ENSURE_SUCCESS(rv, rv);
176 if(strcmp(clipboardDataFlavor, kJPEGImageMime)) {
177 aMimeType.AssignLiteral(clipboardDataFlavor);
180 aMimeType.AssignLiteral(
"image/jpeg");
183 dataStream = do_QueryInterface(clipboardData, &rv);
184 NS_ENSURE_SUCCESS(rv, rv);
189 rv = dataStream->Available(&dataSize);
190 NS_ENSURE_SUCCESS(rv, rv);
192 nsCOMPtr<nsIBinaryInputStream> imageDataStream =
194 NS_ENSURE_SUCCESS(rv, rv);
196 rv = imageDataStream->SetInputStream(dataStream);
197 NS_ENSURE_SUCCESS(rv, rv);
199 rv = imageDataStream->ReadByteArray(dataSize, aData);
200 NS_ENSURE_SUCCESS(rv, rv);
201 *aDataLen = dataSize;
208 sbClipboardHelper::PasteImageToClipboard(
const nsACString &aMimeType,
209 const PRUint8 *aData,
214 nsCOMPtr<imgITools> imgtool = do_CreateInstance(
"@mozilla.org/image/tools;1",
216 NS_ENSURE_SUCCESS(rv, rv);
219 nsCOMPtr<nsIStringInputStream> stream = do_CreateInstance(
"@mozilla.org/io/string-input-stream;1",
221 NS_ENSURE_SUCCESS(rv, rv);
222 stream->ShareData(reinterpret_cast<const char*>(aData), aDataLen);
225 nsCOMPtr<imgIContainer> image;
226 rv = imgtool->DecodeImageData(stream, aMimeType, getter_AddRefs(image));
227 NS_ENSURE_SUCCESS(rv, rv);
230 nsCOMPtr<nsITransferable> xferable = do_CreateInstance(
"@mozilla.org/widget/transferable;1", &rv);
231 NS_ENSURE_SUCCESS(rv, rv);
233 nsCOMPtr<nsISupportsInterfacePointer>
234 imgPtr(do_CreateInstance(NS_SUPPORTS_INTERFACE_POINTER_CONTRACTID, &rv));
235 NS_ENSURE_SUCCESS(rv, rv);
237 rv = imgPtr->SetData(image);
238 NS_ENSURE_SUCCESS(rv, rv);
241 rv = xferable->SetTransferData(kNativeImageMime,
243 sizeof(nsISupportsInterfacePointer*));
244 NS_ENSURE_SUCCESS(rv, rv);
247 nsCOMPtr<nsIClipboard> clipboard(do_GetService(
"@mozilla.org/widget/clipboard;1", &rv));
248 NS_ENSURE_SUCCESS(rv, rv);
251 PRBool selectionSupported;
252 rv = clipboard->SupportsSelectionClipboard(&selectionSupported);
253 NS_ENSURE_SUCCESS(rv, rv);
256 if (selectionSupported) {
257 rv = clipboard->SetData(xferable, nsnull, nsIClipboard::kSelectionClipboard);
258 NS_ENSURE_SUCCESS(rv, rv);
261 return clipboard->SetData(xferable, nsnull, nsIClipboard::kGlobalClipboard);
NS_IMPL_ISUPPORTS1(sbDeviceCapabilitiesUtils, sbIDeviceCapabilitiesUtils) sbDeviceCapabilitiesUtils
#define kBinaryInputStream
_updateTextAndScrollDataForFrame aData