All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.core.internal.filesystem.local.Convert Maven / Gradle / Ivy

Go to download

AspectJ tools most notably contains the AspectJ compiler (AJC). AJC applies aspects to Java classes during compilation, fully replacing Javac for plain Java classes and also compiling native AspectJ or annotation-based @AspectJ syntax. Furthermore, AJC can weave aspects into existing class files in a post-compile binary weaving step. This library is a superset of AspectJ weaver and hence also of AspectJ runtime.

There is a newer version: 1.9.22.1
Show newest version
/*******************************************************************************
 * 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;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy