1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18#include "WinServices.h"
19#include <DebugServices.h>
20
21
22//===========================================================================================================================
23//	UTF8StringToStringObject
24//===========================================================================================================================
25
26OSStatus	UTF8StringToStringObject( const char *inUTF8, CString &inObject )
27{
28	OSStatus		err;
29	int				n;
30	BSTR			unicode;
31
32	unicode = NULL;
33
34	n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, NULL, 0 );
35	if( n > 0 )
36	{
37		unicode = (BSTR) malloc( (size_t)( n * sizeof( wchar_t ) ) );
38		if( !unicode )
39		{
40			err = ERROR_INSUFFICIENT_BUFFER;
41			goto exit;
42		}
43
44		n = MultiByteToWideChar( CP_UTF8, 0, inUTF8, -1, unicode, n );
45		try
46		{
47			inObject = unicode;
48		}
49		catch( ... )
50		{
51			err = ERROR_NO_UNICODE_TRANSLATION;
52			goto exit;
53		}
54	}
55	else
56	{
57		inObject = "";
58	}
59	err = ERROR_SUCCESS;
60
61exit:
62	if( unicode )
63	{
64		free( unicode );
65	}
66	return( err );
67}
68
69
70//===========================================================================================================================
71//	UTF8StringToStringObject
72//===========================================================================================================================
73
74OSStatus
75StringObjectToUTF8String( CString &inObject, char* outUTF8, size_t outUTF8Len )
76{
77    OSStatus err = kNoErr;
78
79	memset( outUTF8, 0, outUTF8Len );
80
81	if ( inObject.GetLength() > 0 )
82    {
83		size_t size;
84
85		size = (size_t) WideCharToMultiByte( CP_UTF8, 0, inObject.GetBuffer(), inObject.GetLength(), outUTF8, (int) outUTF8Len, NULL, NULL);
86        err = translate_errno( size != 0, GetLastError(), kUnknownErr );
87        require_noerr( err, exit );
88    }
89
90exit:
91
92	return err;
93}
94