Bmgr.java revision d23d7f2d12c20314e1e8ff206fafc8f21745ca2d
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
19ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tateimport android.backup.IBackupManager;
205e8a4b842c20dd47b82e9915f1bd730ee1b0d46dJoe Onoratoimport android.backup.IRestoreObserver;
21ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tateimport android.backup.IRestoreSession;
22ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tateimport android.backup.RestoreSet;
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 {
257ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            RestoreSet[] sets = mRestore.getAvailableRestoreSets();
258f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            if (sets == null || sets.length == 0) {
259ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate                System.out.println("No restore sets available");
260ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            } else {
261c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                printRestoreSets(sets);
262ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            }
263ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        } catch (RemoteException e) {
264ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(e.toString());
265ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            System.err.println(TRANSPORT_NOT_RUNNING_ERR);
266ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
267ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
268ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
269c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate    private void printRestoreSets(RestoreSet[] sets) {
270c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate        for (RestoreSet s : sets) {
271c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            System.out.println("  " + s.token + " : " + s.name);
272c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate        }
273c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate    }
274c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate
2754a64bded06a0299785c295a975e2818308eb53e2Joe Onorato    class RestoreObserver extends IRestoreObserver.Stub {
2764a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        boolean done;
2774a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        public void restoreStarting(int numPackages) {
2784a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            System.out.println("restoreStarting: " + numPackages + " packages");
2794a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        }
2804a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
2814a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        public void onUpdate(int nowBeingRestored) {
2824a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            System.out.println("onUpdate: " + nowBeingRestored);
2834a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        }
2844a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
2854a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        public void restoreFinished(int error) {
2864a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            System.out.println("restoreFinished: " + error);
2874a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            synchronized (this) {
2884a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                done = true;
2894a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                this.notify();
2904a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            }
2914a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        }
2924a64bded06a0299785c295a975e2818308eb53e2Joe Onorato    }
2934a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
294f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate    private void doRestore() {
295156411df4627336b246db78cddca8248ed615b67Dan Egnor        long token;
296f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        try {
297156411df4627336b246db78cddca8248ed615b67Dan Egnor            token = Long.parseLong(nextArg());
298f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        } catch (NumberFormatException e) {
299f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            showUsage();
300f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            return;
301f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
302f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
3034a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        RestoreObserver observer = new RestoreObserver();
3044a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
305f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        try {
306c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            boolean didRestore = false;
3079171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate            String curTransport = mBmgr.getCurrentTransport();
308f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            mRestore = mBmgr.beginRestoreSession(curTransport);
309f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            if (mRestore == null) {
310f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                System.err.println(BMGR_NOT_RUNNING_ERR);
311f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                return;
312f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            }
313f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            RestoreSet[] sets = mRestore.getAvailableRestoreSets();
314f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            for (RestoreSet s : sets) {
315f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                if (s.token == token) {
316f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                    System.out.println("Scheduling restore: " + s.name);
3174a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                    mRestore.performRestore(token, observer);
318c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    didRestore = true;
319f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                    break;
320f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate                }
321f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            }
322c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            if (!didRestore) {
323c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                if (sets == null || sets.length == 0) {
324c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    System.out.println("No available restore sets; no restore performed");
325c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                } else {
326c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    System.out.println("No matching restore set token.  Available sets:");
327c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                    printRestoreSets(sets);
328c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate                }
329c73a218c2663e6ae3ec8a9ab8b9524f95702ade9Christopher Tate            }
330f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            mRestore.endRestoreSession();
331f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        } catch (RemoteException e) {
332f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            System.err.println(e.toString());
333f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate            System.err.println(BMGR_NOT_RUNNING_ERR);
334f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate        }
3354a64bded06a0299785c295a975e2818308eb53e2Joe Onorato
3364a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        // now wait for it to be done
3374a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        synchronized (observer) {
3384a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            while (!observer.done) {
3394a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                try {
3404a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                    observer.wait();
3414a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                } catch (InterruptedException ex) {
3424a64bded06a0299785c295a975e2818308eb53e2Joe Onorato                }
3434a64bded06a0299785c295a975e2818308eb53e2Joe Onorato            }
3444a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        }
3454a64bded06a0299785c295a975e2818308eb53e2Joe Onorato        System.out.println("done");
346f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate    }
347f68eb500f99361541049e09eb7f9ddd6f4ef4efaChristopher Tate
348ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private String nextArg() {
349ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        if (mNextArg >= mArgs.length) {
350ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate            return null;
351ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        }
352ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        String arg = mArgs[mNextArg];
353ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        mNextArg++;
354ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        return arg;
355ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
356ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate
357ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    private static void showUsage() {
358ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("usage: bmgr [backup|restore|list|transport|run]");
3599171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr backup PACKAGE");
3606ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("       bmgr enable BOOL");
3616ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("       bmgr enabled");
3629171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr list transports");
363ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("       bmgr list sets");
3649171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr transport WHICH");
3659171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("       bmgr restore TOKEN");
366ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate        System.err.println("       bmgr run");
367d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("       bmgr wipe PACKAGE");
3689171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3699171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'backup' command schedules a backup pass for the named package.");
3709171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("Note that the backup pass will effectively be a no-op if the package");
3719171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("does not actually have changed data to store.");
3729171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3736ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("The 'enable' command enables or disables the entire backup mechanism.");
3746ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("If the argument is 'true' it will be enabled, otherwise it will be");
3756ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("disabled.  When disabled, neither backup or restore operations will");
3766ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("be performed.");
3776ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("");
3786ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("The 'enabled' command reports the current enabled/disabled state of");
3796ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("the backup mechanism.");
3806ef58a1509b9d3348a33ca5686917796c2759aa5Christopher Tate        System.err.println("");
3819171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'list transports' command reports the names of the backup transports");
3829171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("currently available on the device.  These names can be passed as arguments");
3839171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("to the 'transport' command.  The currently selected transport is indicated");
3849171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("with a '*' character.");
3859171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3869171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'list sets' command reports the token and name of each restore set");
3879171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("available to the device via the current transport.");
3889171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3899171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'transport' command designates the named transport as the currently");
3909171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("active one.  This setting is persistent across reboots.");
3919171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3929171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'restore' command initiates a restore operation, using the restore set");
3939171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("from the current transport whose token matches the argument.");
3949171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("");
3959171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("The 'run' command causes any scheduled backup operation to be initiated");
3969171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("immediately, without the usual waiting period for batching together");
3979171749700853305f3e6abbcdbd9e02f3a71d459Christopher Tate        System.err.println("data changes.");
398d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("");
399d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("The 'wipe' command causes all backed-up data for the given package to be");
400d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("erased from the current transport's storage.  The next backup operation");
401d23d7f2d12c20314e1e8ff206fafc8f21745ca2dChristopher Tate        System.err.println("that the given application performs will rewrite its entire data set.");
402ace7f094bf07bbd90cb998b9462e4f2d101a498cChristopher Tate    }
4035e8a4b842c20dd47b82e9915f1bd730ee1b0d46dJoe Onorato}
404