diff -r 71c436fe3ce0 -r 4376525cdefb javauis/lcdui_akn/javalcdui/src.nokialcdui/Clipboard.cpp --- a/javauis/lcdui_akn/javalcdui/src.nokialcdui/Clipboard.cpp Wed Jun 09 09:34:07 2010 +0300 +++ b/javauis/lcdui_akn/javalcdui/src.nokialcdui/Clipboard.cpp Mon Jun 21 15:32:50 2010 +0300 @@ -25,6 +25,54 @@ #include #include #include +#include +#include + +#ifdef SYMBIAN_ENABLE_SPLIT_HEADERS +#include +#endif + +/** + * Local helper method for handling native strings and converting them to + * Java strings. + * + * Error is set also in this method. + * + * @param aJniEnv A valid reference JNI environment. + * @param aText The native descriptor to be converted. + * @param aError The return value from ExecuteTrap. + * @param aReturnError On return, contains an error code. + * @return The converted Java string or NULL if the conversion failed. + */ +LOCAL_C jstring HandleString( + JNIEnv& aJniEnv, + const TDesC& aText, + TInt aError, + jintArray aReturnError) +{ + DEBUG("TextEditor.cpp - HandleString +"); + + jstring javaText = NULL; + + // Create Java string if the operation was successful. + if (aError == KErrNone) + { + javaText = CreateJavaString(aJniEnv, aText); + + // If NULL is returned, it indicates that the creation failed. + if (!javaText) + { + aError = KErrNoMemory; + } + } + + jint errorArray[ 1 ] = { aError }; + aJniEnv.SetIntArrayRegion(aReturnError, 0, 1, errorArray); + + DEBUG_INT("TextEditor.cpp - HandleString -, aError=%d", aError); + + return javaText; +} /** * Local helper function for inserting the text to clipboard. @@ -33,18 +81,24 @@ */ LOCAL_C void CopyToClipboardL(const TDesC* aText) { - CClipboard* clipboard = CClipboard::NewForWritingLC( - CCoeEnv::Static()->FsSession()); + if (aText == &KNullDesC) + { + CClipboard::Clear(CCoeEnv::Static()->FsSession()); + } + else + { + CClipboard* clipboard = CClipboard::NewForWritingLC( + CCoeEnv::Static()->FsSession()); - CPlainText* text = CPlainText::NewL(); - CleanupStack::PushL(text); - text->InsertL(0, *aText); - - text->CopyToStoreL(clipboard->Store(), clipboard->StreamDictionary(), 0, - text->DocumentLength()); - CleanupStack::PopAndDestroy(); // text - clipboard->CommitL(); - CleanupStack::PopAndDestroy(); // clipboard; + CPlainText* text = CPlainText::NewL(); + CleanupStack::PushL(text); + text->InsertL(0, *aText); + text->CopyToStoreL(clipboard->Store(), clipboard->StreamDictionary(), 0, + text->DocumentLength()); + CleanupStack::PopAndDestroy(); // text + clipboard->CommitL(); + CleanupStack::PopAndDestroy(); // clipboard; + } } /* @@ -64,6 +118,7 @@ // Convert the content to a native descriptor. NULL indicates // that an empty string is set as content. const RJString content(*aJniEnv, aText); + const TDesC* nativeContent = (aText ? &content : &KNullDesC); jint error = toolkit->ExecuteTrap(&CopyToClipboardL, @@ -72,4 +127,91 @@ return error; } +/** + * Local helper function for retrieving the text from clipboard. + * + * @return The text copied from the clipboard. + */ +LOCAL_C void CopyFromClipboardL(HBufC** aText) +{ + CClipboard* cb = NULL; + TRAPD(error, (cb = CClipboard::NewForReadingL( + CCoeEnv::Static()->FsSession()))); // codescanner::eikonenvstatic + // Nothing in the clipboard, not an error + if ((error != KErrPathNotFound) && (error != KErrNotFound)) + { + TStreamId id(cb->StreamDictionary().At(KClipboardUidTypePlainText)); + if (id != KNullStreamId) + { + CleanupStack::PushL(cb); + + RStoreReadStream stream; + stream.OpenLC(cb->Store(), id); + TInt length = stream.ReadInt32L(); + CBufFlat* buffer = CBufFlat::NewL(length); + CleanupStack::PushL(buffer); + + RBufWriteStream bufStream(*buffer); + CleanupClosePushL(bufStream); + TMemoryStreamUnicodeSink sink(bufStream); + TUnicodeExpander e; + e.ExpandL(sink, stream, length); + bufStream.CommitL(); + + CleanupStack::PopAndDestroy(); // bufStream + CleanupStack::Pop(buffer); + CleanupStack::PopAndDestroy(2, cb); // stream, cb + + CleanupStack::PushL(buffer); + + TPtrC8 ptr8(buffer->Ptr(0)); + + TPtr ptr = TPtr16(reinterpret_cast(const_cast(ptr8.Ptr())), + length, + length); + + if (ptr.Length() != 0) + { + *aText = ptr.AllocL(); + CleanupStack::PopAndDestroy(); // ptr; + } + } + } +} + +/* + * Class: com_nokia_mid_ui_Clipboard + * Method: _copyFromClipboard + * Signature: (II)Z + */ +JNIEXPORT jstring JNICALL Java_com_nokia_mid_ui_Clipboard__1copyFromClipboard( + JNIEnv* aJniEnv, + jclass /* aPeer */, + jint aToolkitHandle, + jintArray aError) +{ + DEBUG("Clipboard.cpp - copyFromClipboard +"); + + CMIDToolkit* toolkit = JavaUnhand< CMIDToolkit >(aToolkitHandle); + + HBufC* text = NULL; + + jstring content = NULL; + + TInt error = toolkit->ExecuteTrap( + &CopyFromClipboardL, + &text); + if (text != NULL) + { + // Handle text conversion an errors. + content = HandleString(*aJniEnv, *text, error, aError); + + // Text is not needed anymore. + delete text; + } + + DEBUG("Clipboard.cpp - copyFromClipboard -"); + return content; +} + // End of file