Bmgr.java revision 1398e27bb0f5768cbbd5b9d9fd7c8675da63ccb0
1ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate/* 2ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * Copyright (C) 2009 The Android Open Source Project 3ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * 4ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * Licensed under the Apache License, Version 2.0 (the "License"); 5ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * you may not use this file except in compliance with the License. 6ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * You may obtain a copy of the License at 7ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * 8ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * http://www.apache.org/licenses/LICENSE-2.0 9ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * 10ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * Unless required by applicable law or agreed to in writing, software 11ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * distributed under the License is distributed on an "AS IS" BASIS, 12ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * See the License for the specific language governing permissions and 14ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate * limitations under the License. 15ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate */ 16ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 17ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tatepackage com.android.commands.bmgr; 18ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 194528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.RestoreSet; 204528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.IBackupManager; 214528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.IRestoreObserver; 224528186e0d65fc68ef0dd1941aa2ac8aefcd55a3Christopher Tateimport android.app.backup.IRestoreSession; 23ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tateimport android.os.RemoteException; 24ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tateimport android.os.ServiceManager; 25ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 26ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tatepublic final class Bmgr { 27ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate IBackupManager mBmgr; 28ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate IRestoreSession mRestore; 29ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 30ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate static final String BMGR_NOT_RUNNING_ERR = 31ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate "Error: Could not access the Backup Manager. Is the system running?"; 32ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate static final String TRANSPORT_NOT_RUNNING_ERR = 33ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate "Error: Could not access the backup transport. Is the system running?"; 34ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 35ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private String[] mArgs; 36ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private int mNextArg; 37ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private String mCurArgData; 38ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 39ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate public static void main(String[] args) { 40f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate try { 41f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate new Bmgr().run(args); 42f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } catch (Exception e) { 43f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate System.err.println("Exception caught:"); 44f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate e.printStackTrace(); 45f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 46ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 47f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate 48ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate public void run(String[] args) { 49ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate boolean validCommand = false; 50ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if (args.length < 1) { 51ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate showUsage(); 52ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 53ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 54ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 55ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup")); 56ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if (mBmgr == null) { 57ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 58ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 59ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 60ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 61ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mArgs = args; 62ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate String op = args[0]; 63ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mNextArg = 1; 64ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 656ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate if ("enabled".equals(op)) { 666ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate doEnabled(); 676ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate return; 686ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 696ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 706ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate if ("enable".equals(op)) { 716ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate doEnable(); 726ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate return; 736ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 746ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 75ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("run".equals(op)) { 76ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate doRun(); 77ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 78ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 79ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 80ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("backup".equals(op)) { 81ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate doBackup(); 82ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 83ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 84ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 85ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("list".equals(op)) { 86ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate doList(); 87ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 88ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 89f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate 90f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate if ("restore".equals(op)) { 91f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate doRestore(); 92f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate return; 93f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 94abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate 95abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate if ("transport".equals(op)) { 96abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate doTransport(); 97abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate return; 98abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate } 99abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate 100d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate if ("wipe".equals(op)) { 101d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate doWipe(); 102d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate return; 103d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate } 104d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate 105abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate System.err.println("Unknown command"); 106abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate showUsage(); 107ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 108ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 1096ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate private String enableToString(boolean enabled) { 1106ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate return enabled ? "enabled" : "disabled"; 1116ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1126ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 1136ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate private void doEnabled() { 1146ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate try { 1156ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate boolean isEnabled = mBmgr.isBackupEnabled(); 1166ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.out.println("Backup Manager currently " 1176ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate + enableToString(isEnabled)); 1186ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } catch (RemoteException e) { 1196ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(e.toString()); 1206ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 1216ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1226ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1236ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 1246ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate private void doEnable() { 1256ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate String arg = nextArg(); 1266ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate if (arg == null) { 1276ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate showUsage(); 1286ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate return; 1296ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1306ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 1316ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate try { 1326ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate boolean enable = Boolean.parseBoolean(arg); 1336ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate mBmgr.setBackupEnabled(enable); 1346ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.out.println("Backup Manager now " + enableToString(enable)); 1356ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } catch (NumberFormatException e) { 1366ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate showUsage(); 1376ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate return; 1386ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } catch (RemoteException e) { 1396ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(e.toString()); 1406ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 1416ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1426ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate } 1436ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate 144ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private void doRun() { 145ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate try { 146ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mBmgr.backupNow(); 147ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } catch (RemoteException e) { 148ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(e.toString()); 149ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 150ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 151ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 152ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 153ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private void doBackup() { 154ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate boolean isFull = false; 155ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate String pkg = nextArg(); 156ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("-f".equals(pkg)) { 157ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate isFull = true; 158ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate pkg = nextArg(); 159ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 160ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 161ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if (pkg == null || pkg.startsWith("-")) { 162ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate showUsage(); 163ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 164ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 165ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 166ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate try { 167ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate // !!! TODO: handle full backup 168ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mBmgr.dataChanged(pkg); 169ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } catch (RemoteException e) { 170ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(e.toString()); 171ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 172ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 173ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 174ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 175abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate private void doTransport() { 176abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate try { 1779171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String which = nextArg(); 1789171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String old = mBmgr.selectBackupTransport(which); 1799171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate if (old == null) { 1809171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.out.println("Unknown transport '" + which 1819171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate + "' specified; no changes made."); 1829171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } else { 1839171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.out.println("Selected transport " + which + " (formerly " + old + ")"); 1849171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } 185abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate } catch (RemoteException e) { 186abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate System.err.println(e.toString()); 187abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 188abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate } 189abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate } 190abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate 191d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate private void doWipe() { 192d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate String pkg = nextArg(); 193d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate if (pkg == null) { 194d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate showUsage(); 195d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate return; 196d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate } 197d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate 198d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate try { 199d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate mBmgr.clearBackupData(pkg); 200d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.out.println("Wiped backup data for " + pkg); 201d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate } catch (RemoteException e) { 202d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println(e.toString()); 203d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 204d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate } 205d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate } 206d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate 207ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private void doList() { 208ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate String arg = nextArg(); // sets, transports, packages set# 209ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("transports".equals(arg)) { 210ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate doListTransports(); 211ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return; 212ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 213ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 214ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate // The rest of the 'list' options work with a restore session on the current transport 215ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate try { 2169171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String curTransport = mBmgr.getCurrentTransport(); 217ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mRestore = mBmgr.beginRestoreSession(curTransport); 218f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate if (mRestore == null) { 219f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 220f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate return; 221f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 222ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 223ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if ("sets".equals(arg)) { 224ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate doListRestoreSets(); 2259171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } else if ("transports".equals(arg)) { 2269171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate doListTransports(); 227ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 228ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 229ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mRestore.endRestoreSession(); 230ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } catch (RemoteException e) { 231ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(e.toString()); 232ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 233ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 234ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 235ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 236ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private void doListTransports() { 2379171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate try { 2389171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String current = mBmgr.getCurrentTransport(); 2399171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String[] transports = mBmgr.listAllTransports(); 2409171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate if (transports == null || transports.length == 0) { 2419171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.out.println("No transports available."); 2429171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate return; 2439171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } 2449171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate 2459171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate for (String t : transports) { 2469171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String pad = (t.equals(current)) ? " * " : " "; 2479171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.out.println(pad + t); 2489171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } 2499171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } catch (RemoteException e) { 2509171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(e.toString()); 2519171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 2529171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate } 253ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 254ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 255ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private void doListRestoreSets() { 256ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate try { 2572d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate RestoreObserver observer = new RestoreObserver(); 2582d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate int err = mRestore.getAvailableRestoreSets(observer); 2592d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate if (err != 0) { 2602d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate System.out.println("Unable to request restore sets"); 261ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } else { 2622d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate observer.waitForCompletion(); 2632d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate printRestoreSets(observer.sets); 264ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 265ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } catch (RemoteException e) { 266ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(e.toString()); 267ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(TRANSPORT_NOT_RUNNING_ERR); 268ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 269ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 270ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 271c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate private void printRestoreSets(RestoreSet[] sets) { 272c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate for (RestoreSet s : sets) { 27377095d49f203eed6a6742f2605ca319e7360af32Christian Sonntag System.out.println(" " + Long.toHexString(s.token) + " : " + s.name); 274c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate } 275c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate } 276c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate 2774a64bded06a0299785c295a975e2818308eb53e2Joe Onorato class RestoreObserver extends IRestoreObserver.Stub { 2784a64bded06a0299785c295a975e2818308eb53e2Joe Onorato boolean done; 2792d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate RestoreSet[] sets = null; 2802d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate 2812d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate public void restoreSetsAvailable(RestoreSet[] result) { 2822d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate synchronized (this) { 2832d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate sets = result; 2842d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate done = true; 2852d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate this.notify(); 2862d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate } 2872d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate } 2882d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate 2894a64bded06a0299785c295a975e2818308eb53e2Joe Onorato public void restoreStarting(int numPackages) { 2904a64bded06a0299785c295a975e2818308eb53e2Joe Onorato System.out.println("restoreStarting: " + numPackages + " packages"); 2914a64bded06a0299785c295a975e2818308eb53e2Joe Onorato } 2924a64bded06a0299785c295a975e2818308eb53e2Joe Onorato 2939c3cee9824026764275e4d84ba9b5d9fdc5da690Christopher Tate public void onUpdate(int nowBeingRestored, String currentPackage) { 2949c3cee9824026764275e4d84ba9b5d9fdc5da690Christopher Tate System.out.println("onUpdate: " + nowBeingRestored + " = " + currentPackage); 2954a64bded06a0299785c295a975e2818308eb53e2Joe Onorato } 2964a64bded06a0299785c295a975e2818308eb53e2Joe Onorato 2974a64bded06a0299785c295a975e2818308eb53e2Joe Onorato public void restoreFinished(int error) { 2984a64bded06a0299785c295a975e2818308eb53e2Joe Onorato System.out.println("restoreFinished: " + error); 2994a64bded06a0299785c295a975e2818308eb53e2Joe Onorato synchronized (this) { 3004a64bded06a0299785c295a975e2818308eb53e2Joe Onorato done = true; 3014a64bded06a0299785c295a975e2818308eb53e2Joe Onorato this.notify(); 3024a64bded06a0299785c295a975e2818308eb53e2Joe Onorato } 3034a64bded06a0299785c295a975e2818308eb53e2Joe Onorato } 3047d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate 3057d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate public void waitForCompletion() { 3067d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate // The restoreFinished() callback will throw the 'done' flag; we 3077d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate // just sit and wait on that notification. 3087d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate synchronized (this) { 3097d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate while (!this.done) { 3107d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate try { 3117d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate this.wait(); 3127d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } catch (InterruptedException ex) { 3137d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3147d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3157d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3167d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3174a64bded06a0299785c295a975e2818308eb53e2Joe Onorato } 3184a64bded06a0299785c295a975e2818308eb53e2Joe Onorato 319f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate private void doRestore() { 3207d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate String arg = nextArg(); 3217d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate if (arg.indexOf('.') >= 0) { 3227d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate // it's a package name 3237d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate doRestorePackage(arg); 3247d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } else { 3257d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate try { 326485c3a16cef38136a821e79a5fe37df4e1779d28Christian Sonntag long token = Long.parseLong(arg, 16); 3277d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate doRestoreAll(token); 3287d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } catch (NumberFormatException e) { 3297d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate showUsage(); 3307d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate return; 3317d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3327d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3337d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate 3347d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.out.println("done"); 3357d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3367d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate 3377d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate private void doRestorePackage(String pkg) { 338f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate try { 3397d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate String curTransport = mBmgr.getCurrentTransport(); 3407d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate mRestore = mBmgr.beginRestoreSession(curTransport); 3417d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate if (mRestore == null) { 3427d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 3437d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate return; 3447d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3457d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate 3467d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate RestoreObserver observer = new RestoreObserver(); 3477d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate int err = mRestore.restorePackage(pkg, observer); 3487d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate if (err == 0) { 3497d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate // Off and running -- wait for the restore to complete 3507d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate observer.waitForCompletion(); 3517d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } else { 3527d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("Unable to restore package " + pkg); 3537d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 3547d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate 3557d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate // And finally shut down the session 3567d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate mRestore.endRestoreSession(); 3577d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } catch (RemoteException e) { 3587d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println(e.toString()); 3597d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 360f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 3617d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate } 362f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate 3637d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate private void doRestoreAll(long token) { 3644a64bded06a0299785c295a975e2818308eb53e2Joe Onorato RestoreObserver observer = new RestoreObserver(); 3654a64bded06a0299785c295a975e2818308eb53e2Joe Onorato 366f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate try { 367c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate boolean didRestore = false; 3689171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate String curTransport = mBmgr.getCurrentTransport(); 369f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate mRestore = mBmgr.beginRestoreSession(curTransport); 370f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate if (mRestore == null) { 371f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 372f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate return; 373f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 3742d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate RestoreSet[] sets = null; 3752d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate int err = mRestore.getAvailableRestoreSets(observer); 3761398e27bb0f5768cbbd5b9d9fd7c8675da63ccb0Christopher Tate if (err == 0) { 3772d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate observer.waitForCompletion(); 3782d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate sets = observer.sets; 37984780f56f441deb4ff736987986daeaf64db17a4Christopher Tate for (RestoreSet s : sets) { 38084780f56f441deb4ff736987986daeaf64db17a4Christopher Tate if (s.token == token) { 38184780f56f441deb4ff736987986daeaf64db17a4Christopher Tate System.out.println("Scheduling restore: " + s.name); 3828472581aa32eee1368de379c2c079ea0a66baa3cChristopher Tate didRestore = (mRestore.restoreAll(token, observer) == 0); 38384780f56f441deb4ff736987986daeaf64db17a4Christopher Tate break; 38484780f56f441deb4ff736987986daeaf64db17a4Christopher Tate } 385f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 386f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 387c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate if (!didRestore) { 388c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate if (sets == null || sets.length == 0) { 389c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate System.out.println("No available restore sets; no restore performed"); 390c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate } else { 391c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate System.out.println("No matching restore set token. Available sets:"); 392c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate printRestoreSets(sets); 393c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate } 394c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate } 39508e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate 3960e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate // if we kicked off a restore successfully, we have to wait for it 3970e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate // to complete before we can shut down the restore session safely 3980e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate if (didRestore) { 3997d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate observer.waitForCompletion(); 40008e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate } 40108e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate 40208e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate // once the restore has finished, close down the session and we're done 403f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate mRestore.endRestoreSession(); 404f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } catch (RemoteException e) { 405f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate System.err.println(e.toString()); 406f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate System.err.println(BMGR_NOT_RUNNING_ERR); 407f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 408f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate } 409f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate 410ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private String nextArg() { 411ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate if (mNextArg >= mArgs.length) { 412ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return null; 413ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 414ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate String arg = mArgs[mNextArg]; 415ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate mNextArg++; 416ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate return arg; 417ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 418ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate 419ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate private static void showUsage() { 420ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println("usage: bmgr [backup|restore|list|transport|run]"); 4219171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(" bmgr backup PACKAGE"); 4226ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(" bmgr enable BOOL"); 4236ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(" bmgr enabled"); 4249171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(" bmgr list transports"); 425ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(" bmgr list sets"); 4269171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(" bmgr transport WHICH"); 4279171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(" bmgr restore TOKEN"); 4287d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println(" bmgr restore PACKAGE"); 429ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate System.err.println(" bmgr run"); 430d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println(" bmgr wipe PACKAGE"); 4319171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4329171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("The 'backup' command schedules a backup pass for the named package."); 4339171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("Note that the backup pass will effectively be a no-op if the package"); 4349171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("does not actually have changed data to store."); 4359171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4366ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("The 'enable' command enables or disables the entire backup mechanism."); 4376ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("If the argument is 'true' it will be enabled, otherwise it will be"); 4386ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("disabled. When disabled, neither backup or restore operations will"); 4396ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("be performed."); 4406ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(""); 4416ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("The 'enabled' command reports the current enabled/disabled state of"); 4426ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println("the backup mechanism."); 4436ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate System.err.println(""); 4449171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("The 'list transports' command reports the names of the backup transports"); 4459171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("currently available on the device. These names can be passed as arguments"); 4469171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("to the 'transport' command. The currently selected transport is indicated"); 4479171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("with a '*' character."); 4489171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4499171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("The 'list sets' command reports the token and name of each restore set"); 4509171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("available to the device via the current transport."); 4519171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4529171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("The 'transport' command designates the named transport as the currently"); 4539171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("active one. This setting is persistent across reboots."); 4549171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4557d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("The 'restore' command when given a restore token initiates a full-system"); 4567d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("restore operation from the currently active transport. It will deliver"); 4577d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("the restore set designated by the TOKEN argument to each application"); 4587d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("that had contributed data to that restore set."); 4597d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println(""); 4607d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("The 'restore' command when given a package name intiates a restore of"); 4617d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("just that one package according to the restore set selection algorithm"); 4627d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate System.err.println("used by the RestoreSession.restorePackage() method."); 4639171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println(""); 4649171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("The 'run' command causes any scheduled backup operation to be initiated"); 4659171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("immediately, without the usual waiting period for batching together"); 4669171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate System.err.println("data changes."); 467d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println(""); 468d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println("The 'wipe' command causes all backed-up data for the given package to be"); 469d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println("erased from the current transport's storage. The next backup operation"); 470d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate System.err.println("that the given application performs will rewrite its entire data set."); 471ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate } 4725e8a4b842c20dd47b82e9915f1bd730ee1b0d46dJoe Onorato} 473