/*
* ====================================================================
* Copyright (c) 2004-2012 TMate Software Ltd. All rights reserved.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://svnkit.com/license.html.
* If newer versions of this license are posted there, you may use a
* newer version instead, at your option.
* ====================================================================
*/
package org.tmatesoft.svn.core.internal.util.jna;
import java.io.File;
import org.tmatesoft.svn.core.internal.util.jna.ISVNWin32Library.HRESULT;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import com.sun.jna.NativeLong;
import com.sun.jna.Pointer;
import com.sun.jna.WString;
/**
* @version 1.3
* @author TMate Software Ltd.
*/
class SVNWin32Util {
public static boolean setWritable(File file) {
if (file == null) {
return false;
}
ISVNKernel32Library library = JNALibraryLoader.getKernelLibrary();
if (library == null) {
// use ugly way.
return false;
}
synchronized (library) {
try {
int rc = library.SetFileAttributesW(new WString(file.getAbsolutePath()), new NativeLong(ISVNKernel32Library.FILE_ATTRIBUTE_NORMAL));
return rc != 0;
} catch (Throwable th) {
}
}
return false;
}
public static boolean setHidden(File file) {
if (file == null) {
return false;
}
ISVNKernel32Library library = JNALibraryLoader.getKernelLibrary();
if (library == null) {
// use ugly way.
return false;
}
synchronized (library) {
try {
int rc = library.SetFileAttributesW(new WString(file.getAbsolutePath()),
new NativeLong(ISVNKernel32Library.FILE_ATTRIBUTE_HIDDEN));
return rc != 0;
} catch (Throwable th) {
}
return false;
}
}
public static boolean moveFile(File src, File dst) {
if (src == null || dst == null) {
return false;
}
ISVNKernel32Library library = JNALibraryLoader.getKernelLibrary();
if (library == null) {
// use ugly way.
return false;
}
if (dst.isFile() && !dst.canWrite()) {
SVNFileUtil.setReadonly(dst, false);
SVNFileUtil.setReadonly(src, true);
}
synchronized (library) {
int errorCode = 0;
int attempts = SVNFileUtil.FILE_CREATION_ATTEMPTS_COUNT;
long sleep = 1;
do {
int rc = 0;
try {
rc = library.MoveFileExW(new WString(src.getAbsoluteFile().getAbsolutePath()), new WString(dst.getAbsoluteFile().getAbsolutePath()), new NativeLong(3));
} catch (Throwable th) {
return false;
}
if (rc != 0) {
return true;
}
errorCode = library.GetLastError();
attempts--;
if (errorCode == 5) {
try {
Thread.sleep(sleep);
} catch (InterruptedException e1) {
}
if (sleep < 128) {
sleep = sleep * 2;
}
}
} while(errorCode == 5 && attempts >= 0);
}
return false;
}
public static String getApplicationDataPath(boolean common) {
ISVNWin32Library library = JNALibraryLoader.getWin32Library();
if (library == null) {
return null;
}
final char[] commonAppDataPath = new char[1024];
int type = common ? ISVNWin32Library.CSIDL_COMMON_APPDATA : ISVNWin32Library.CSIDL_APPDATA;
HRESULT result = library.SHGetFolderPathW(Pointer.NULL, type, Pointer.NULL, ISVNWin32Library.SHGFP_TYPE_CURRENT, commonAppDataPath);
if (result == null || result.longValue() != 0) {
return null;
}
int length = commonAppDataPath.length;
for (int i = 0; i < commonAppDataPath.length; i++) {
if (commonAppDataPath[i] == '\0') {
length = i;
break;
}
}
String path = new String(commonAppDataPath, 0, length);
path = path.replace(File.separatorChar, '/');
return path;
}
}