Bmgr.java revision 4a627c71ff53a4fca1f961f4b1dcc0461df18a06
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
38ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    public static void main(String[] args) {
39f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        try {
40f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            new Bmgr().run(args);
41f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        } catch (Exception e) {
42f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            System.err.println("Exception caught:");
43f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            e.printStackTrace();
44f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
45ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
46f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
47ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    public void run(String[] args) {
48ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        boolean validCommand = false;
49ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if (args.length < 1) {
50ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            showUsage();
51ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
52ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
53ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
54ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        mBmgr = IBackupManager.Stub.asInterface(ServiceManager.getService("backup"));
55ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if (mBmgr == null) {
56ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
57ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
58ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
59ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
60ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        mArgs = args;
61ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        String op = args[0];
62ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        mNextArg = 1;
63ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
646ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        if ("enabled".equals(op)) {
656ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            doEnabled();
666ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            return;
676ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        }
686ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
696ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        if ("enable".equals(op)) {
706ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            doEnable();
716ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            return;
726ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        }
736ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
74ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if ("run".equals(op)) {
75ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            doRun();
76ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
77ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
78ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
79ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if ("backup".equals(op)) {
80ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            doBackup();
81ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
82ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
83ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
84ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if ("list".equals(op)) {
85ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            doList();
86ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
87ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
88f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
89f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        if ("restore".equals(op)) {
90f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            doRestore();
91f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            return;
92f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
93abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate
94abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        if ("transport".equals(op)) {
95abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate            doTransport();
96abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate            return;
97abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        }
98abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate
99d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        if ("wipe".equals(op)) {
100d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            doWipe();
101d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            return;
102d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        }
103d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate
104abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        System.err.println("Unknown command");
105abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        showUsage();
106ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
107ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
1086ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    private String enableToString(boolean enabled) {
1096ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        return enabled ? "enabled" : "disabled";
1106ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    }
1116ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
1126ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    private void doEnabled() {
1136ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        try {
1146ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            boolean isEnabled = mBmgr.isBackupEnabled();
1156ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.out.println("Backup Manager currently "
1166ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate                    + enableToString(isEnabled));
1176ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        } catch (RemoteException e) {
1186ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.err.println(e.toString());
1196ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
1206ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        }
1216ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    }
1226ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
1236ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    private void doEnable() {
1246ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        String arg = nextArg();
1256ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        if (arg == null) {
1266ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            showUsage();
1276ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            return;
1286ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        }
1296ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
1306ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        try {
1316ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            boolean enable = Boolean.parseBoolean(arg);
1326ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            mBmgr.setBackupEnabled(enable);
1336ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.out.println("Backup Manager now " + enableToString(enable));
1346ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        } catch (NumberFormatException e) {
1356ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            showUsage();
1366ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            return;
1376ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        } catch (RemoteException e) {
1386ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.err.println(e.toString());
1396ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
1406ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        }
1416ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate    }
1426ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate
143ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private void doRun() {
144ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        try {
145ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            mBmgr.backupNow();
146ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        } catch (RemoteException e) {
147ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(e.toString());
148ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
149ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
150ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
151ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
152ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private void doBackup() {
153ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        String pkg = nextArg();
1544a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate        if (pkg == null) {
155ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            showUsage();
156ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
157ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
158ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
159ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        try {
160ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            mBmgr.dataChanged(pkg);
161ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        } catch (RemoteException e) {
162ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(e.toString());
163ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
164ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
165ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
166ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
167abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate    private void doTransport() {
168abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        try {
1699171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            String which = nextArg();
1707e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate            if (which == null) {
1717e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate                showUsage();
1727e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate                return;
1737e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate            }
1747e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate
1759171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            String old = mBmgr.selectBackupTransport(which);
1769171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            if (old == null) {
1779171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                System.out.println("Unknown transport '" + which
1789171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                        + "' specified; no changes made.");
1799171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            } else {
1809171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                System.out.println("Selected transport " + which + " (formerly " + old + ")");
1819171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            }
182abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        } catch (RemoteException e) {
183abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate            System.err.println(e.toString());
184abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
185abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate        }
186abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate    }
187abce4e8714bed26a2b37b20ad3f02cf619d71c9aChristopher Tate
188d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate    private void doWipe() {
189d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        String pkg = nextArg();
190d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        if (pkg == null) {
191d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            showUsage();
192d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            return;
193d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        }
194d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate
195d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        try {
196d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            mBmgr.clearBackupData(pkg);
197d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            System.out.println("Wiped backup data for " + pkg);
198d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        } catch (RemoteException e) {
199d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            System.err.println(e.toString());
200d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
201d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        }
202d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate    }
203d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate
204ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private void doList() {
205ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        String arg = nextArg();     // sets, transports, packages set#
206ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if ("transports".equals(arg)) {
207ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            doListTransports();
208ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return;
209ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
210ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
211ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        // The rest of the 'list' options work with a restore session on the current transport
212ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        try {
21344ab8453e1c4c46790f792a46d026fa1017d8cfeChris Tate            mRestore = mBmgr.beginRestoreSession(null, null);
214f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            if (mRestore == null) {
215f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                System.err.println(BMGR_NOT_RUNNING_ERR);
216f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                return;
217f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            }
218ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
219ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            if ("sets".equals(arg)) {
220ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate                doListRestoreSets();
2219171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            } else if ("transports".equals(arg)) {
2229171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                doListTransports();
223ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            }
224ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
225ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            mRestore.endRestoreSession();
226ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        } catch (RemoteException e) {
227ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(e.toString());
228ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
229ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
230ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
231ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
232ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private void doListTransports() {
2339171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        try {
2349171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            String current = mBmgr.getCurrentTransport();
2359171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            String[] transports = mBmgr.listAllTransports();
2369171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            if (transports == null || transports.length == 0) {
2379171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                System.out.println("No transports available.");
2389171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                return;
2399171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            }
2409171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate
2419171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            for (String t : transports) {
2429171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                String pad = (t.equals(current)) ? "  * " : "    ";
2439171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate                System.out.println(pad + t);
2449171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            }
2459171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        } catch (RemoteException e) {
2469171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            System.err.println(e.toString());
2479171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
2489171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        }
249ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
250ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
251ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private void doListRestoreSets() {
252ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        try {
2532d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate            RestoreObserver observer = new RestoreObserver();
2542d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate            int err = mRestore.getAvailableRestoreSets(observer);
2552d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate            if (err != 0) {
2562d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate                System.out.println("Unable to request restore sets");
257ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            } else {
2582d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate                observer.waitForCompletion();
2592d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate                printRestoreSets(observer.sets);
260ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            }
261ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        } catch (RemoteException e) {
262ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(e.toString());
263ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(TRANSPORT_NOT_RUNNING_ERR);
264ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
265ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
266ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
267c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate    private void printRestoreSets(RestoreSet[] sets) {
26804686f428995fde3f6f5f5f12ccdd135f885ac84Fabrice Di Meglio        if (sets == null || sets.length == 0) {
26904686f428995fde3f6f5f5f12ccdd135f885ac84Fabrice Di Meglio            System.out.println("No restore sets");
27004686f428995fde3f6f5f5f12ccdd135f885ac84Fabrice Di Meglio            return;
27104686f428995fde3f6f5f5f12ccdd135f885ac84Fabrice Di Meglio        }
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();
3217e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate        if (arg == null) {
3227e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate            showUsage();
3237e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate            return;
3247e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate        }
3257e76ff1c409bc22e89ed09ef90161164dae40838Christopher Tate
3267d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        if (arg.indexOf('.') >= 0) {
3277d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            // it's a package name
3287d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            doRestorePackage(arg);
3297d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        } else {
3307d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            try {
331485c3a16cef38136a821e79a5fe37df4e1779d28Christian Sonntag                long token = Long.parseLong(arg, 16);
3327d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                doRestoreAll(token);
3337d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            } catch (NumberFormatException e) {
3347d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                showUsage();
3357d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                return;
3367d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            }
3377d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        }
3387d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate
3397d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.out.println("done");
3407d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate    }
3417d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate
3427d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate    private void doRestorePackage(String pkg) {
343f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        try {
34444ab8453e1c4c46790f792a46d026fa1017d8cfeChris Tate            mRestore = mBmgr.beginRestoreSession(pkg, null);
3457d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            if (mRestore == null) {
3467d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                System.err.println(BMGR_NOT_RUNNING_ERR);
3477d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                return;
3487d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            }
3497d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate
3507d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            RestoreObserver observer = new RestoreObserver();
3517d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            int err = mRestore.restorePackage(pkg, observer);
3527d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            if (err == 0) {
3537d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                // Off and running -- wait for the restore to complete
3547d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                observer.waitForCompletion();
3557d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            } else {
3567d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                System.err.println("Unable to restore package " + pkg);
3577d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            }
3587d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate
3597d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            // And finally shut down the session
3607d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            mRestore.endRestoreSession();
3617d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        } catch (RemoteException e) {
3627d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            System.err.println(e.toString());
3637d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
364f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
3657d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate    }
366f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
3677d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate    private void doRestoreAll(long token) {
3684a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        RestoreObserver observer = new RestoreObserver();
3694a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
370f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        try {
371c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            boolean didRestore = false;
37244ab8453e1c4c46790f792a46d026fa1017d8cfeChris Tate            mRestore = mBmgr.beginRestoreSession(null, null);
373f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            if (mRestore == null) {
374f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                System.err.println(BMGR_NOT_RUNNING_ERR);
375f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                return;
376f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            }
3772d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate            RestoreSet[] sets = null;
3782d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate            int err = mRestore.getAvailableRestoreSets(observer);
3791398e27bb0f5768cbbd5b9d9fd7c8675da63ccb0Christopher Tate            if (err == 0) {
3802d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate                observer.waitForCompletion();
3812d449afe3d075020bdd1115bcc15c9383cbce122Christopher Tate                sets = observer.sets;
3827a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                if (sets != null) {
3837a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                    for (RestoreSet s : sets) {
3847a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                        if (s.token == token) {
3857a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                            System.out.println("Scheduling restore: " + s.name);
3867a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                            didRestore = (mRestore.restoreAll(token, observer) == 0);
3877a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                            break;
3887a0fc8776782a18374ec6e3b4418027c3c685b1aChris Tate                        }
38984780f56f441deb4ff736987986daeaf64db17a4Christopher Tate                    }
390f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                }
391f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            }
392c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            if (!didRestore) {
393c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                if (sets == null || sets.length == 0) {
394c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    System.out.println("No available restore sets; no restore performed");
395c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                } else {
396c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    System.out.println("No matching restore set token.  Available sets:");
397c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    printRestoreSets(sets);
398c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                }
399c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            }
40008e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate
4010e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate            // if we kicked off a restore successfully, we have to wait for it
4020e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate            // to complete before we can shut down the restore session safely
4030e0b4ae5bc5c652c8339d71ed9667e1e37baaa03Christopher Tate            if (didRestore) {
4047d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate                observer.waitForCompletion();
40508e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate            }
40608e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate
40708e40b858e8a3266c5519a83fda6f7505f1c14dbChristopher Tate            // once the restore has finished, close down the session and we're done
408f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            mRestore.endRestoreSession();
409f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        } catch (RemoteException e) {
410f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            System.err.println(e.toString());
411f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
412f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
413f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate    }
414f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
415ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private String nextArg() {
416ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if (mNextArg >= mArgs.length) {
417ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return null;
418ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
419ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        String arg = mArgs[mNextArg];
420ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        mNextArg++;
421ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        return arg;
422ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
423ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
424ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private static void showUsage() {
425ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("usage: bmgr [backup|restore|list|transport|run]");
4269171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr backup PACKAGE");
4276ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("       bmgr enable BOOL");
4286ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("       bmgr enabled");
4299171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr list transports");
430ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("       bmgr list sets");
4319171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr transport WHICH");
4329171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr restore TOKEN");
4337d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("       bmgr restore PACKAGE");
434ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("       bmgr run");
435d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("       bmgr wipe PACKAGE");
4369171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4379171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'backup' command schedules a backup pass for the named package.");
4389171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("Note that the backup pass will effectively be a no-op if the package");
4399171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("does not actually have changed data to store.");
4409171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4416ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("The 'enable' command enables or disables the entire backup mechanism.");
4426ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("If the argument is 'true' it will be enabled, otherwise it will be");
4436ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("disabled.  When disabled, neither backup or restore operations will");
4446ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("be performed.");
4456ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("");
4466ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("The 'enabled' command reports the current enabled/disabled state of");
4476ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("the backup mechanism.");
4486ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("");
4499171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'list transports' command reports the names of the backup transports");
4509171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("currently available on the device.  These names can be passed as arguments");
4519171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("to the 'transport' command.  The currently selected transport is indicated");
4529171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("with a '*' character.");
4539171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4549171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'list sets' command reports the token and name of each restore set");
4559171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("available to the device via the current transport.");
4569171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4579171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'transport' command designates the named transport as the currently");
4589171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("active one.  This setting is persistent across reboots.");
4599171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4607d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("The 'restore' command when given a restore token initiates a full-system");
4617d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("restore operation from the currently active transport.  It will deliver");
4627d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("the restore set designated by the TOKEN argument to each application");
4637d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("that had contributed data to that restore set.");
4647d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("");
4657d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("The 'restore' command when given a package name intiates a restore of");
4667d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("just that one package according to the restore set selection algorithm");
4677d411a3b947ba82d1d57f73c0fa698c3b9c95892Christopher Tate        System.err.println("used by the RestoreSession.restorePackage() method.");
4689171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
4699171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
4709171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("immediately, without the usual waiting period for batching together");
4719171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("data changes.");
472d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("");
473d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("The 'wipe' command causes all backed-up data for the given package to be");
474d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("erased from the current transport's storage.  The next backup operation");
475d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("that the given application performs will rewrite its entire data set.");
476ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
4775e8a4b842c20dd47b82e9915f1bd730ee1b0d46dJoe Onorato}
478