1/* -*- Mode: C; tab-width: 4 -*-
2 *
3 * Copyright (c) 2003-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#pragma once
19
20using namespace System;
21using namespace System::Text;
22
23namespace Apple
24{
25	__gc class PString
26	{
27	public:
28
29		PString(String* string)
30		{
31			if (string != NULL)
32			{
33				Byte unicodeBytes[] = Encoding::Unicode->GetBytes(string);
34				Byte utf8Bytes[] = Encoding::Convert(Encoding::Unicode, Encoding::UTF8, unicodeBytes);
35				m_p = Marshal::AllocHGlobal(utf8Bytes->Length + 1);
36
37				Byte __pin * p = &utf8Bytes[0];
38				char * hBytes = static_cast<char*>(m_p.ToPointer());
39				memcpy(hBytes, p, utf8Bytes->Length);
40				hBytes[utf8Bytes->Length] = '\0';
41			}
42			else
43			{
44				m_p = NULL;
45			}
46		}
47
48		~PString()
49		{
50			Marshal::FreeHGlobal(m_p);
51		}
52
53		const char*
54		c_str()
55		{
56			if (m_p != NULL)
57			{
58				return static_cast<const char*>(m_p.ToPointer());
59			}
60			else
61			{
62				return NULL;
63			}
64		}
65
66	protected:
67
68		IntPtr m_p;
69	};
70}
71