aboutsummaryrefslogtreecommitdiffstats
path: root/ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java
diff options
context:
space:
mode:
Diffstat (limited to 'ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java')
-rw-r--r--ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java883
1 files changed, 0 insertions, 883 deletions
diff --git a/ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java b/ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java
deleted file mode 100644
index f207567..0000000
--- a/ddms/libs/ddmlib/src/com/android/ddmlib/SyncService.java
+++ /dev/null
@@ -1,883 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.ddmlib;
-
-import com.android.ddmlib.AdbHelper.AdbResponse;
-import com.android.ddmlib.FileListingService.FileEntry;
-import com.android.ddmlib.SyncException.SyncError;
-import com.android.ddmlib.utils.ArrayHelper;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.InetSocketAddress;
-import java.nio.channels.SocketChannel;
-import java.util.ArrayList;
-
-/**
- * Sync service class to push/pull to/from devices/emulators, through the debug bridge.
- * <p/>
- * To get a {@link SyncService} object, use {@link Device#getSyncService()}.
- */
-public final class SyncService {
-
- private final static byte[] ID_OKAY = { 'O', 'K', 'A', 'Y' };
- private final static byte[] ID_FAIL = { 'F', 'A', 'I', 'L' };
- private final static byte[] ID_STAT = { 'S', 'T', 'A', 'T' };
- private final static byte[] ID_RECV = { 'R', 'E', 'C', 'V' };
- private final static byte[] ID_DATA = { 'D', 'A', 'T', 'A' };
- private final static byte[] ID_DONE = { 'D', 'O', 'N', 'E' };
- private final static byte[] ID_SEND = { 'S', 'E', 'N', 'D' };
-// private final static byte[] ID_LIST = { 'L', 'I', 'S', 'T' };
-// private final static byte[] ID_DENT = { 'D', 'E', 'N', 'T' };
-
- private final static NullSyncProgresMonitor sNullSyncProgressMonitor =
- new NullSyncProgresMonitor();
-
- private final static int S_ISOCK = 0xC000; // type: symbolic link
- private final static int S_IFLNK = 0xA000; // type: symbolic link
- private final static int S_IFREG = 0x8000; // type: regular file
- private final static int S_IFBLK = 0x6000; // type: block device
- private final static int S_IFDIR = 0x4000; // type: directory
- private final static int S_IFCHR = 0x2000; // type: character device
- private final static int S_IFIFO = 0x1000; // type: fifo
-/*
- private final static int S_ISUID = 0x0800; // set-uid bit
- private final static int S_ISGID = 0x0400; // set-gid bit
- private final static int S_ISVTX = 0x0200; // sticky bit
- private final static int S_IRWXU = 0x01C0; // user permissions
- private final static int S_IRUSR = 0x0100; // user: read
- private final static int S_IWUSR = 0x0080; // user: write
- private final static int S_IXUSR = 0x0040; // user: execute
- private final static int S_IRWXG = 0x0038; // group permissions
- private final static int S_IRGRP = 0x0020; // group: read
- private final static int S_IWGRP = 0x0010; // group: write
- private final static int S_IXGRP = 0x0008; // group: execute
- private final static int S_IRWXO = 0x0007; // other permissions
- private final static int S_IROTH = 0x0004; // other: read
- private final static int S_IWOTH = 0x0002; // other: write
- private final static int S_IXOTH = 0x0001; // other: execute
-*/
-
- private final static int SYNC_DATA_MAX = 64*1024;
- private final static int REMOTE_PATH_MAX_LENGTH = 1024;
-
- /**
- * Classes which implement this interface provide methods that deal
- * with displaying transfer progress.
- */
- public interface ISyncProgressMonitor {
- /**
- * Sent when the transfer starts
- * @param totalWork the total amount of work.
- */
- public void start(int totalWork);
- /**
- * Sent when the transfer is finished or interrupted.
- */
- public void stop();
- /**
- * Sent to query for possible cancellation.
- * @return true if the transfer should be stopped.
- */
- public boolean isCanceled();
- /**
- * Sent when a sub task is started.
- * @param name the name of the sub task.
- */
- public void startSubTask(String name);
- /**
- * Sent when some progress have been made.
- * @param work the amount of work done.
- */
- public void advance(int work);
- }
-
- /**
- * A Sync progress monitor that does nothing
- */
- private static class NullSyncProgresMonitor implements ISyncProgressMonitor {
- @Override
- public void advance(int work) {
- }
- @Override
- public boolean isCanceled() {
- return false;
- }
-
- @Override
- public void start(int totalWork) {
- }
- @Override
- public void startSubTask(String name) {
- }
- @Override
- public void stop() {
- }
- }
-
- private InetSocketAddress mAddress;
- private Device mDevice;
- private SocketChannel mChannel;
-
- /**
- * Buffer used to send data. Allocated when needed and reused afterward.
- */
- private byte[] mBuffer;
-
- /**
- * Creates a Sync service object.
- * @param address The address to connect to
- * @param device the {@link Device} that the service connects to.
- */
- SyncService(InetSocketAddress address, Device device) {
- mAddress = address;
- mDevice = device;
- }
-
- /**
- * Opens the sync connection. This must be called before any calls to push[File] / pull[File].
- * @return true if the connection opened, false if adb refuse the connection. This can happen
- * if the {@link Device} is invalid.
- * @throws TimeoutException in case of timeout on the connection.
- * @throws AdbCommandRejectedException if adb rejects the command
- * @throws IOException If the connection to adb failed.
- */
- boolean openSync() throws TimeoutException, AdbCommandRejectedException, IOException {
- try {
- mChannel = SocketChannel.open(mAddress);
- mChannel.configureBlocking(false);
-
- // target a specific device
- AdbHelper.setDevice(mChannel, mDevice);
-
- byte[] request = AdbHelper.formAdbRequest("sync:"); //$NON-NLS-1$
- AdbHelper.write(mChannel, request, -1, DdmPreferences.getTimeOut());
-
- AdbResponse resp = AdbHelper.readAdbResponse(mChannel, false /* readDiagString */);
-
- if (resp.okay == false) {
- Log.w("ddms", "Got unhappy response from ADB sync req: " + resp.message);
- mChannel.close();
- mChannel = null;
- return false;
- }
- } catch (TimeoutException e) {
- if (mChannel != null) {
- try {
- mChannel.close();
- } catch (IOException e2) {
- // we want to throw the original exception, so we ignore this one.
- }
- mChannel = null;
- }
-
- throw e;
- } catch (IOException e) {
- if (mChannel != null) {
- try {
- mChannel.close();
- } catch (IOException e2) {
- // we want to throw the original exception, so we ignore this one.
- }
- mChannel = null;
- }
-
- throw e;
- }
-
- return true;
- }
-
- /**
- * Closes the connection.
- */
- public void close() {
- if (mChannel != null) {
- try {
- mChannel.close();
- } catch (IOException e) {
- // nothing to be done really...
- }
- mChannel = null;
- }
- }
-
- /**
- * Returns a sync progress monitor that does nothing. This allows background tasks that don't
- * want/need to display ui, to pass a valid {@link ISyncProgressMonitor}.
- * <p/>This object can be reused multiple times and can be used by concurrent threads.
- */
- public static ISyncProgressMonitor getNullProgressMonitor() {
- return sNullSyncProgressMonitor;
- }
-
- /**
- * Pulls file(s) or folder(s).
- * @param entries the remote item(s) to pull
- * @param localPath The local destination. If the entries count is > 1 or
- * if the unique entry is a folder, this should be a folder.
- * @param monitor The progress monitor. Cannot be null.
- * @throws SyncException
- * @throws IOException
- * @throws TimeoutException
- *
- * @see FileListingService.FileEntry
- * @see #getNullProgressMonitor()
- */
- public void pull(FileEntry[] entries, String localPath, ISyncProgressMonitor monitor)
- throws SyncException, IOException, TimeoutException {
-
- // first we check the destination is a directory and exists
- File f = new File(localPath);
- if (f.exists() == false) {
- throw new SyncException(SyncError.NO_DIR_TARGET);
- }
- if (f.isDirectory() == false) {
- throw new SyncException(SyncError.TARGET_IS_FILE);
- }
-
- // get a FileListingService object
- FileListingService fls = new FileListingService(mDevice);
-
- // compute the number of file to move
- int total = getTotalRemoteFileSize(entries, fls);
-
- // start the monitor
- monitor.start(total);
-
- doPull(entries, localPath, fls, monitor);
-
- monitor.stop();
- }
-
- /**
- * Pulls a single file.
- * @param remote the remote file
- * @param localFilename The local destination.
- * @param monitor The progress monitor. Cannot be null.
- *
- * @throws IOException in case of an IO exception.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- * @throws SyncException in case of a sync exception.
- *
- * @see FileListingService.FileEntry
- * @see #getNullProgressMonitor()
- */
- public void pullFile(FileEntry remote, String localFilename, ISyncProgressMonitor monitor)
- throws IOException, SyncException, TimeoutException {
- int total = remote.getSizeValue();
- monitor.start(total);
-
- doPullFile(remote.getFullPath(), localFilename, monitor);
-
- monitor.stop();
- }
-
- /**
- * Pulls a single file.
- * <p/>Because this method just deals with a String for the remote file instead of a
- * {@link FileEntry}, the size of the file being pulled is unknown and the
- * {@link ISyncProgressMonitor} will not properly show the progress
- * @param remoteFilepath the full path to the remote file
- * @param localFilename The local destination.
- * @param monitor The progress monitor. Cannot be null.
- *
- * @throws IOException in case of an IO exception.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- * @throws SyncException in case of a sync exception.
- *
- * @see #getNullProgressMonitor()
- */
- public void pullFile(String remoteFilepath, String localFilename,
- ISyncProgressMonitor monitor) throws TimeoutException, IOException, SyncException {
- Integer mode = readMode(remoteFilepath);
- if (mode == null) {
- // attempts to download anyway
- } else if (mode == 0) {
- throw new SyncException(SyncError.NO_REMOTE_OBJECT);
- }
-
- monitor.start(0);
- //TODO: use the {@link FileListingService} to get the file size.
-
- doPullFile(remoteFilepath, localFilename, monitor);
-
- monitor.stop();
- }
-
- /**
- * Push several files.
- * @param local An array of loca files to push
- * @param remote the remote {@link FileEntry} representing a directory.
- * @param monitor The progress monitor. Cannot be null.
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- public void push(String[] local, FileEntry remote, ISyncProgressMonitor monitor)
- throws SyncException, IOException, TimeoutException {
- if (remote.isDirectory() == false) {
- throw new SyncException(SyncError.REMOTE_IS_FILE);
- }
-
- // make a list of File from the list of String
- ArrayList<File> files = new ArrayList<File>();
- for (String path : local) {
- files.add(new File(path));
- }
-
- // get the total count of the bytes to transfer
- File[] fileArray = files.toArray(new File[files.size()]);
- int total = getTotalLocalFileSize(fileArray);
-
- monitor.start(total);
-
- doPush(fileArray, remote.getFullPath(), monitor);
-
- monitor.stop();
- }
-
- /**
- * Push a single file.
- * @param local the local filepath.
- * @param remote The remote filepath.
- * @param monitor The progress monitor. Cannot be null.
- *
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- public void pushFile(String local, String remote, ISyncProgressMonitor monitor)
- throws SyncException, IOException, TimeoutException {
- File f = new File(local);
- if (f.exists() == false) {
- throw new SyncException(SyncError.NO_LOCAL_FILE);
- }
-
- if (f.isDirectory()) {
- throw new SyncException(SyncError.LOCAL_IS_DIRECTORY);
- }
-
- monitor.start((int)f.length());
-
- doPushFile(local, remote, monitor);
-
- monitor.stop();
- }
-
- /**
- * compute the recursive file size of all the files in the list. Folder
- * have a weight of 1.
- * @param entries
- * @param fls
- * @return
- */
- private int getTotalRemoteFileSize(FileEntry[] entries, FileListingService fls) {
- int count = 0;
- for (FileEntry e : entries) {
- int type = e.getType();
- if (type == FileListingService.TYPE_DIRECTORY) {
- // get the children
- FileEntry[] children = fls.getChildren(e, false, null);
- count += getTotalRemoteFileSize(children, fls) + 1;
- } else if (type == FileListingService.TYPE_FILE) {
- count += e.getSizeValue();
- }
- }
-
- return count;
- }
-
- /**
- * compute the recursive file size of all the files in the list. Folder
- * have a weight of 1.
- * This does not check for circular links.
- * @param files
- * @return
- */
- private int getTotalLocalFileSize(File[] files) {
- int count = 0;
-
- for (File f : files) {
- if (f.exists()) {
- if (f.isDirectory()) {
- return getTotalLocalFileSize(f.listFiles()) + 1;
- } else if (f.isFile()) {
- count += f.length();
- }
- }
- }
-
- return count;
- }
-
- /**
- * Pulls multiple files/folders recursively.
- * @param entries The list of entry to pull
- * @param localPath the localpath to a directory
- * @param fileListingService a FileListingService object to browse through remote directories.
- * @param monitor the progress monitor. Must be started already.
- *
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- private void doPull(FileEntry[] entries, String localPath,
- FileListingService fileListingService,
- ISyncProgressMonitor monitor) throws SyncException, IOException, TimeoutException {
-
- for (FileEntry e : entries) {
- // check if we're cancelled
- if (monitor.isCanceled() == true) {
- throw new SyncException(SyncError.CANCELED);
- }
-
- // get type (we only pull directory and files for now)
- int type = e.getType();
- if (type == FileListingService.TYPE_DIRECTORY) {
- monitor.startSubTask(e.getFullPath());
- String dest = localPath + File.separator + e.getName();
-
- // make the directory
- File d = new File(dest);
- d.mkdir();
-
- // then recursively call the content. Since we did a ls command
- // to get the number of files, we can use the cache
- FileEntry[] children = fileListingService.getChildren(e, true, null);
- doPull(children, dest, fileListingService, monitor);
- monitor.advance(1);
- } else if (type == FileListingService.TYPE_FILE) {
- monitor.startSubTask(e.getFullPath());
- String dest = localPath + File.separator + e.getName();
- doPullFile(e.getFullPath(), dest, monitor);
- }
- }
- }
-
- /**
- * Pulls a remote file
- * @param remotePath the remote file (length max is 1024)
- * @param localPath the local destination
- * @param monitor the monitor. The monitor must be started already.
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- private void doPullFile(String remotePath, String localPath,
- ISyncProgressMonitor monitor) throws IOException, SyncException, TimeoutException {
- byte[] msg = null;
- byte[] pullResult = new byte[8];
-
- final int timeOut = DdmPreferences.getTimeOut();
-
- try {
- byte[] remotePathContent = remotePath.getBytes(AdbHelper.DEFAULT_ENCODING);
-
- if (remotePathContent.length > REMOTE_PATH_MAX_LENGTH) {
- throw new SyncException(SyncError.REMOTE_PATH_LENGTH);
- }
-
- // create the full request message
- msg = createFileReq(ID_RECV, remotePathContent);
-
- // and send it.
- AdbHelper.write(mChannel, msg, -1, timeOut);
-
- // read the result, in a byte array containing 2 ints
- // (id, size)
- AdbHelper.read(mChannel, pullResult, -1, timeOut);
-
- // check we have the proper data back
- if (checkResult(pullResult, ID_DATA) == false &&
- checkResult(pullResult, ID_DONE) == false) {
- throw new SyncException(SyncError.TRANSFER_PROTOCOL_ERROR,
- readErrorMessage(pullResult, timeOut));
- }
- } catch (UnsupportedEncodingException e) {
- throw new SyncException(SyncError.REMOTE_PATH_ENCODING, e);
- }
-
- // access the destination file
- File f = new File(localPath);
-
- // create the stream to write in the file. We use a new try/catch block to differentiate
- // between file and network io exceptions.
- FileOutputStream fos = null;
- try {
- fos = new FileOutputStream(f);
-
- // the buffer to read the data
- byte[] data = new byte[SYNC_DATA_MAX];
-
- // loop to get data until we're done.
- while (true) {
- // check if we're cancelled
- if (monitor.isCanceled() == true) {
- throw new SyncException(SyncError.CANCELED);
- }
-
- // if we're done, we stop the loop
- if (checkResult(pullResult, ID_DONE)) {
- break;
- }
- if (checkResult(pullResult, ID_DATA) == false) {
- // hmm there's an error
- throw new SyncException(SyncError.TRANSFER_PROTOCOL_ERROR,
- readErrorMessage(pullResult, timeOut));
- }
- int length = ArrayHelper.swap32bitFromArray(pullResult, 4);
- if (length > SYNC_DATA_MAX) {
- // buffer overrun!
- // error and exit
- throw new SyncException(SyncError.BUFFER_OVERRUN);
- }
-
- // now read the length we received
- AdbHelper.read(mChannel, data, length, timeOut);
-
- // get the header for the next packet.
- AdbHelper.read(mChannel, pullResult, -1, timeOut);
-
- // write the content in the file
- fos.write(data, 0, length);
-
- monitor.advance(length);
- }
-
- fos.flush();
- } catch (IOException e) {
- Log.e("ddms", String.format("Failed to open local file %s for writing, Reason: %s",
- f.getAbsolutePath(), e.toString()));
- throw new SyncException(SyncError.FILE_WRITE_ERROR);
- } finally {
- if (fos != null) {
- fos.close();
- }
- }
- }
-
-
- /**
- * Push multiple files
- * @param fileArray
- * @param remotePath
- * @param monitor
- *
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- private void doPush(File[] fileArray, String remotePath, ISyncProgressMonitor monitor)
- throws SyncException, IOException, TimeoutException {
- for (File f : fileArray) {
- // check if we're canceled
- if (monitor.isCanceled() == true) {
- throw new SyncException(SyncError.CANCELED);
- }
- if (f.exists()) {
- if (f.isDirectory()) {
- // append the name of the directory to the remote path
- String dest = remotePath + "/" + f.getName(); // $NON-NLS-1S
- monitor.startSubTask(dest);
- doPush(f.listFiles(), dest, monitor);
-
- monitor.advance(1);
- } else if (f.isFile()) {
- // append the name of the file to the remote path
- String remoteFile = remotePath + "/" + f.getName(); // $NON-NLS-1S
- monitor.startSubTask(remoteFile);
- doPushFile(f.getAbsolutePath(), remoteFile, monitor);
- }
- }
- }
- }
-
- /**
- * Push a single file
- * @param localPath the local file to push
- * @param remotePath the remote file (length max is 1024)
- * @param monitor the monitor. The monitor must be started already.
- *
- * @throws SyncException if file could not be pushed
- * @throws IOException in case of I/O error on the connection.
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- private void doPushFile(String localPath, String remotePath,
- ISyncProgressMonitor monitor) throws SyncException, IOException, TimeoutException {
- FileInputStream fis = null;
- byte[] msg;
-
- final int timeOut = DdmPreferences.getTimeOut();
-
- try {
- byte[] remotePathContent = remotePath.getBytes(AdbHelper.DEFAULT_ENCODING);
-
- if (remotePathContent.length > REMOTE_PATH_MAX_LENGTH) {
- throw new SyncException(SyncError.REMOTE_PATH_LENGTH);
- }
-
- File f = new File(localPath);
-
- // create the stream to read the file
- fis = new FileInputStream(f);
-
- // create the header for the action
- msg = createSendFileReq(ID_SEND, remotePathContent, 0644);
-
- // and send it. We use a custom try/catch block to make the difference between
- // file and network IO exceptions.
- AdbHelper.write(mChannel, msg, -1, timeOut);
-
- // create the buffer used to read.
- // we read max SYNC_DATA_MAX, but we need 2 4 bytes at the beginning.
- if (mBuffer == null) {
- mBuffer = new byte[SYNC_DATA_MAX + 8];
- }
- System.arraycopy(ID_DATA, 0, mBuffer, 0, ID_DATA.length);
-
- // look while there is something to read
- while (true) {
- // check if we're canceled
- if (monitor.isCanceled() == true) {
- throw new SyncException(SyncError.CANCELED);
- }
-
- // read up to SYNC_DATA_MAX
- int readCount = fis.read(mBuffer, 8, SYNC_DATA_MAX);
-
- if (readCount == -1) {
- // we reached the end of the file
- break;
- }
-
- // now send the data to the device
- // first write the amount read
- ArrayHelper.swap32bitsToArray(readCount, mBuffer, 4);
-
- // now write it
- AdbHelper.write(mChannel, mBuffer, readCount+8, timeOut);
-
- // and advance the monitor
- monitor.advance(readCount);
- }
- } catch (UnsupportedEncodingException e) {
- throw new SyncException(SyncError.REMOTE_PATH_ENCODING, e);
- } finally {
- // close the local file
- if (fis != null) {
- fis.close();
- }
- }
-
- // create the DONE message
- long time = System.currentTimeMillis() / 1000;
- msg = createReq(ID_DONE, (int)time);
-
- // and send it.
- AdbHelper.write(mChannel, msg, -1, timeOut);
-
- // read the result, in a byte array containing 2 ints
- // (id, size)
- byte[] result = new byte[8];
- AdbHelper.read(mChannel, result, -1 /* full length */, timeOut);
-
- if (checkResult(result, ID_OKAY) == false) {
- throw new SyncException(SyncError.TRANSFER_PROTOCOL_ERROR,
- readErrorMessage(result, timeOut));
- }
- }
-
- /**
- * Reads an error message from the opened {@link #mChannel}.
- * @param result the current adb result. Must contain both FAIL and the length of the message.
- * @param timeOut
- * @return
- * @throws TimeoutException in case of a timeout reading responses from the device.
- * @throws IOException
- */
- private String readErrorMessage(byte[] result, final int timeOut) throws TimeoutException,
- IOException {
- if (checkResult(result, ID_FAIL)) {
- int len = ArrayHelper.swap32bitFromArray(result, 4);
-
- if (len > 0) {
- AdbHelper.read(mChannel, mBuffer, len, timeOut);
-
- String message = new String(mBuffer, 0, len);
- Log.e("ddms", "transfer error: " + message);
-
- return message;
- }
- }
-
- return null;
- }
-
- /**
- * Returns the mode of the remote file.
- * @param path the remote file
- * @return an Integer containing the mode if all went well or null
- * otherwise
- * @throws IOException
- * @throws TimeoutException in case of a timeout reading responses from the device.
- */
- private Integer readMode(String path) throws TimeoutException, IOException {
- // create the stat request message.
- byte[] msg = createFileReq(ID_STAT, path);
-
- AdbHelper.write(mChannel, msg, -1 /* full length */, DdmPreferences.getTimeOut());
-
- // read the result, in a byte array containing 4 ints
- // (id, mode, size, time)
- byte[] statResult = new byte[16];
- AdbHelper.read(mChannel, statResult, -1 /* full length */, DdmPreferences.getTimeOut());
-
- // check we have the proper data back
- if (checkResult(statResult, ID_STAT) == false) {
- return null;
- }
-
- // we return the mode (2nd int in the array)
- return ArrayHelper.swap32bitFromArray(statResult, 4);
- }
-
- /**
- * Create a command with a code and an int values
- * @param command
- * @param value
- * @return
- */
- private static byte[] createReq(byte[] command, int value) {
- byte[] array = new byte[8];
-
- System.arraycopy(command, 0, array, 0, 4);
- ArrayHelper.swap32bitsToArray(value, array, 4);
-
- return array;
- }
-
- /**
- * Creates the data array for a stat request.
- * @param command the 4 byte command (ID_STAT, ID_RECV, ...)
- * @param path The path of the remote file on which to execute the command
- * @return the byte[] to send to the device through adb
- */
- private static byte[] createFileReq(byte[] command, String path) {
- byte[] pathContent = null;
- try {
- pathContent = path.getBytes(AdbHelper.DEFAULT_ENCODING);
- } catch (UnsupportedEncodingException e) {
- return null;
- }
-
- return createFileReq(command, pathContent);
- }
-
- /**
- * Creates the data array for a file request. This creates an array with a 4 byte command + the
- * remote file name.
- * @param command the 4 byte command (ID_STAT, ID_RECV, ...).
- * @param path The path, as a byte array, of the remote file on which to
- * execute the command.
- * @return the byte[] to send to the device through adb
- */
- private static byte[] createFileReq(byte[] command, byte[] path) {
- byte[] array = new byte[8 + path.length];
-
- System.arraycopy(command, 0, array, 0, 4);
- ArrayHelper.swap32bitsToArray(path.length, array, 4);
- System.arraycopy(path, 0, array, 8, path.length);
-
- return array;
- }
-
- private static byte[] createSendFileReq(byte[] command, byte[] path, int mode) {
- // make the mode into a string
- String modeStr = "," + (mode & 0777); // $NON-NLS-1S
- byte[] modeContent = null;
- try {
- modeContent = modeStr.getBytes(AdbHelper.DEFAULT_ENCODING);
- } catch (UnsupportedEncodingException e) {
- return null;
- }
-
- byte[] array = new byte[8 + path.length + modeContent.length];
-
- System.arraycopy(command, 0, array, 0, 4);
- ArrayHelper.swap32bitsToArray(path.length + modeContent.length, array, 4);
- System.arraycopy(path, 0, array, 8, path.length);
- System.arraycopy(modeContent, 0, array, 8 + path.length, modeContent.length);
-
- return array;
-
-
- }
-
- /**
- * Checks the result array starts with the provided code
- * @param result The result array to check
- * @param code The 4 byte code.
- * @return true if the code matches.
- */
- private static boolean checkResult(byte[] result, byte[] code) {
- if (result[0] != code[0] ||
- result[1] != code[1] ||
- result[2] != code[2] ||
- result[3] != code[3]) {
- return false;
- }
-
- return true;
-
- }
-
- private static int getFileType(int mode) {
- if ((mode & S_ISOCK) == S_ISOCK) {
- return FileListingService.TYPE_SOCKET;
- }
-
- if ((mode & S_IFLNK) == S_IFLNK) {
- return FileListingService.TYPE_LINK;
- }
-
- if ((mode & S_IFREG) == S_IFREG) {
- return FileListingService.TYPE_FILE;
- }
-
- if ((mode & S_IFBLK) == S_IFBLK) {
- return FileListingService.TYPE_BLOCK;
- }
-
- if ((mode & S_IFDIR) == S_IFDIR) {
- return FileListingService.TYPE_DIRECTORY;
- }
-
- if ((mode & S_IFCHR) == S_IFCHR) {
- return FileListingService.TYPE_CHARACTER;
- }
-
- if ((mode & S_IFIFO) == S_IFIFO) {
- return FileListingService.TYPE_FIFO;
- }
-
- return FileListingService.TYPE_OTHER;
- }
-}