| package com.android.server.backup.restore; |
| |
| import android.os.ParcelFileDescriptor; |
| |
| import libcore.io.IoUtils; |
| |
| import java.io.FileInputStream; |
| import java.io.InputStream; |
| |
| class FullRestoreEngineThread implements Runnable { |
| |
| FullRestoreEngine mEngine; |
| InputStream mEngineStream; |
| private final boolean mMustKillAgent; |
| |
| FullRestoreEngineThread(FullRestoreEngine engine, ParcelFileDescriptor engineSocket) { |
| mEngine = engine; |
| engine.setRunning(true); |
| // We *do* want this FileInputStream to own the underlying fd, so that |
| // when we are finished with it, it closes this end of the pipe in a way |
| // that signals its other end. |
| mEngineStream = new FileInputStream(engineSocket.getFileDescriptor(), true); |
| // Tell it to be sure to leave the agent instance up after finishing |
| mMustKillAgent = false; |
| } |
| |
| //for adb restore |
| FullRestoreEngineThread(FullRestoreEngine engine, InputStream inputStream) { |
| mEngine = engine; |
| engine.setRunning(true); |
| mEngineStream = inputStream; |
| // philippov: in adb agent is killed after restore. |
| mMustKillAgent = true; |
| } |
| |
| public boolean isRunning() { |
| return mEngine.isRunning(); |
| } |
| |
| public int waitForResult() { |
| return mEngine.waitForResult(); |
| } |
| |
| @Override |
| public void run() { |
| try { |
| while (mEngine.isRunning()) { |
| mEngine.restoreOneFile(mEngineStream, mMustKillAgent, mEngine.mBuffer, |
| mEngine.mOnlyPackage, mEngine.mAllowApks, mEngine.mEphemeralOpToken, |
| mEngine.mMonitor); |
| } |
| } finally { |
| // Because mEngineStream adopted its underlying FD, this also |
| // closes this end of the pipe. |
| IoUtils.closeQuietly(mEngineStream); |
| } |
| } |
| |
| public void handleTimeout() { |
| IoUtils.closeQuietly(mEngineStream); |
| mEngine.handleTimeout(); |
| } |
| } |