/* ============================================================================== This file is part of the JUCE library - "Jules' Utility Class Extensions" Copyright 2004-7 by Raw Material Software ltd. ------------------------------------------------------------------------------ JUCE can be redistributed and/or modified under the terms of the GNU General Public License, as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. JUCE is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with JUCE; if not, visit www.gnu.org/licenses or write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ------------------------------------------------------------------------------ If you'd like to release a closed-source product which uses JUCE, commercial licenses are also available: visit www.rawmaterialsoftware.com/juce for more information. ============================================================================== */ // (This file gets included by juce_mac_NativeCode.mm, rather than being // compiled on its own). #ifdef JUCE_INCLUDED_FILE //============================================================================== static const String nsStringToJuce (NSString* s) { return String::fromUTF8 ((uint8*) [s UTF8String]); } static NSString* juceStringToNS (const String& s) { return [NSString stringWithUTF8String: (const char*) s.toUTF8()]; } //============================================================================== static const String convertUTF16ToString (const UniChar* utf16) { String s; while (*utf16 != 0) s += (juce_wchar) *utf16++; return s; } const String PlatformUtilities::cfStringToJuceString (CFStringRef cfString) { String result; if (cfString != 0) { #if JUCE_STRINGS_ARE_UNICODE CFRange range = { 0, CFStringGetLength (cfString) }; UniChar* const u = (UniChar*) juce_malloc (sizeof (UniChar) * (range.length + 1)); CFStringGetCharacters (cfString, range, u); u[range.length] = 0; result = convertUTF16ToString (u); juce_free (u); #else const int len = CFStringGetLength (cfString); char* buffer = (char*) juce_malloc (len + 1); CFStringGetCString (cfString, buffer, len + 1, CFStringGetSystemEncoding()); result = buffer; juce_free (buffer); #endif } return result; } CFStringRef PlatformUtilities::juceStringToCFString (const String& s) { #if JUCE_STRINGS_ARE_UNICODE const int len = s.length(); const juce_wchar* t = (const juce_wchar*) s; UniChar* temp = (UniChar*) juce_malloc (sizeof (UniChar) * len + 4); for (int i = 0; i <= len; ++i) temp[i] = t[i]; CFStringRef result = CFStringCreateWithCharacters (kCFAllocatorDefault, temp, len); juce_free (temp); return result; #else return CFStringCreateWithCString (kCFAllocatorDefault, (const char*) s, CFStringGetSystemEncoding()); #endif } const String PlatformUtilities::convertToPrecomposedUnicode (const String& s) { UnicodeMapping map; map.unicodeEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, kUnicodeNoSubset, kTextEncodingDefaultFormat); map.otherEncoding = CreateTextEncoding (kTextEncodingUnicodeDefault, kUnicodeCanonicalCompVariant, kTextEncodingDefaultFormat); map.mappingVersion = kUnicodeUseLatestMapping; UnicodeToTextInfo conversionInfo = 0; String result; if (CreateUnicodeToTextInfo (&map, &conversionInfo) == noErr) { const int len = s.length(); UniChar* const tempIn = (UniChar*) juce_calloc (sizeof (UniChar) * len + 4); UniChar* const tempOut = (UniChar*) juce_calloc (sizeof (UniChar) * len + 4); for (int i = 0; i <= len; ++i) tempIn[i] = s[i]; ByteCount bytesRead = 0; ByteCount outputBufferSize = 0; if (ConvertFromUnicodeToText (conversionInfo, len * sizeof (UniChar), tempIn, kUnicodeDefaultDirectionMask, 0, 0, 0, 0, len * sizeof (UniChar), &bytesRead, &outputBufferSize, tempOut) == noErr) { result.preallocateStorage (bytesRead / sizeof (UniChar) + 2); tchar* t = const_cast ((const tchar*) result); unsigned int i; for (i = 0; i < bytesRead / sizeof (UniChar); ++i) t[i] = (tchar) tempOut[i]; t[i] = 0; } juce_free (tempIn); juce_free (tempOut); DisposeUnicodeToTextInfo (&conversionInfo); } return result; } //============================================================================== #if ! JUCE_ONLY_BUILD_CORE_LIBRARY void SystemClipboard::copyTextToClipboard (const String& text) throw() { [[NSPasteboard generalPasteboard] declareTypes: [NSArray arrayWithObject: NSStringPboardType] owner: nil]; [[NSPasteboard generalPasteboard] setString: juceStringToNS (text) forType: NSStringPboardType]; } const String SystemClipboard::getTextFromClipboard() throw() { NSString* text = [[NSPasteboard generalPasteboard] stringForType: NSStringPboardType]; return text == 0 ? String::empty : nsStringToJuce (text); } #endif #endif