blob: 4ac7f0a62c6e4e15de78ed6d16a20c4ebf71a18f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2010 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Martin Oberhuber (Wind River) - [170317] add symbolic link support to API
*******************************************************************************/
package org.eclipse.core.internal.filesystem.local;
import java.io.UnsupportedEncodingException;
import org.eclipse.osgi.service.environment.Constants;
public class Convert {
/** Indicates the default string encoding on this platform */
private static String defaultEncoding = new java.io.InputStreamReader(new java.io.ByteArrayInputStream(new byte[0])).getEncoding();
/** Indicates if we are running on windows */
private static final boolean isWindows = Constants.OS_WIN32.equals(LocalFileSystem.getOS());
private static final String WIN32_FILE_PREFIX = "\\\\?\\"; //$NON-NLS-1$
private static final String WIN32_UNC_FILE_PREFIX = "\\\\?\\UNC"; //$NON-NLS-1$
/**
* Performs conversion of a long value to a byte array representation.
*
* @see #bytesToLong(byte[])
*/
public static byte[] longToBytes(long value) {
// A long value is 8 bytes in length.
byte[] bytes = new byte[8];
// Convert and copy value to byte array:
// -- Cast long to a byte to retrieve least significant byte;
// -- Left shift long value by 8 bits to isolate next byte to be converted;
// -- Repeat until all 8 bytes are converted (long = 64 bits).
// Note: In the byte array, the least significant byte of the long is held in
// the highest indexed array bucket.
for (int i = 0; i < bytes.length; i++) {
bytes[(bytes.length - 1) - i] = (byte) value;
value >>>= 8;
}
return bytes;
}
/**
* Performs conversion of a byte array to a long representation.
*
* @see #longToBytes(long)
*/
public static long bytesToLong(byte[] value) {
long longValue = 0L;
// See method convertLongToBytes(long) for algorithm details.
for (byte element : value) {
// Left shift has no effect through first iteration of loop.
longValue <<= 8;
longValue ^= element & 0xFF;
}
return longValue;
}
/**
* Calling new String(byte[] s) creates a new encoding object and other garbage.
* This can be avoided by calling new String(byte[] s, String encoding) instead.
* @param source buffer with String in platform bytes
* @param length number of relevant bytes in the buffer
* @return converted Java String
* @since org.eclipse.core.filesystem 1.1
*/
public static String fromPlatformBytes(byte[] source, int length) {
if (defaultEncoding == null)
return new String(source, 0, length);
// try to use the default encoding
try {
return new String(source, 0, length, defaultEncoding);
} catch (UnsupportedEncodingException e) {
// null the default encoding so we don't try it again
defaultEncoding = null;
return new String(source, 0, length);
}
}
/*
* This method is called via Reflection API from the legacy file system
* library (liblocalfile_1_0_0). Source for the native code is located
* in org.eclipse.core.filesystem/natives/unix/localfile.c.
*/
public static String fromPlatformBytes(byte[] source) {
return fromPlatformBytes(source, source.length);
}
/**
* Calling String.getBytes() creates a new encoding object and other garbage.
* This can be avoided by calling String.getBytes(String encoding) instead.
*/
public static byte[] toPlatformBytes(String target) {
if (defaultEncoding == null)
return target.getBytes();
// try to use the default encoding
try {
return target.getBytes(defaultEncoding);
} catch (UnsupportedEncodingException e) {
// null the default encoding so we don't try it again
defaultEncoding = null;
return target.getBytes();
}
}
/**
* Converts a file name to a unicode char[] suitable for use by native methods.
* See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/naming_a_file.asp
*/
public static char[] toPlatformChars(String target) {
//Windows use special prefix to handle long filenames
if (!isWindows)
return target.toCharArray();
//convert UNC path of form \\server\path to unicode form \\?\UNC\server\path
if (target.startsWith("\\\\")) { //$NON-NLS-1$
int nameLength = target.length();
int prefixLength = WIN32_UNC_FILE_PREFIX.length();
char[] result = new char[prefixLength + nameLength - 1];
WIN32_UNC_FILE_PREFIX.getChars(0, prefixLength, result, 0);
target.getChars(1, nameLength, result, prefixLength);
return result;
}
//convert simple path of form c:\path to unicode form \\?\c:\path
int nameLength = target.length();
int prefixLength = WIN32_FILE_PREFIX.length();
char[] result = new char[prefixLength + nameLength];
WIN32_UNC_FILE_PREFIX.getChars(0, prefixLength, result, 0);
target.getChars(0, nameLength, result, prefixLength);
return result;
}
}