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 
UTF8StringToStringObject(const char * inUTF8,CString & inObject)26 OSStatus	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 
61 exit:
62 	if( unicode )
63 	{
64 		free( unicode );
65 	}
66 	return( err );
67 }
68 
69 
70 //===========================================================================================================================
71 //	UTF8StringToStringObject
72 //===========================================================================================================================
73 
74 OSStatus
StringObjectToUTF8String(CString & inObject,char * outUTF8,size_t outUTF8Len)75 StringObjectToUTF8String( 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 
90 exit:
91 
92 	return err;
93 }
94