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