14e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum/*
24e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Copyright (C) 2017 The Android Open Source Project
34e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *
44e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Licensed under the Apache License, Version 2.0 (the "License");
54e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * you may not use this file except in compliance with the License.
64e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * You may obtain a copy of the License at
74e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *
84e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *      http://www.apache.org/licenses/LICENSE-2.0
94e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *
104e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Unless required by applicable law or agreed to in writing, software
114e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * distributed under the License is distributed on an "AS IS" BASIS,
124e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * See the License for the specific language governing permissions and
144e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * limitations under the License.
154e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum */
164e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
174e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumpackage android.net.lowpan;
184e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
194e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumimport android.annotation.NonNull;
204e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumimport android.annotation.Nullable;
216cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaumimport android.net.IpPrefix;
226cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaumimport android.os.DeadObjectException;
234e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaumimport android.os.Handler;
246cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaumimport android.os.Looper;
256cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaumimport android.os.RemoteException;
264e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
274e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum/**
284e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * Commissioning Session.
294e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *
304e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * <p>This class enables a device to learn the credential needed to join a network using a technique
314e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * called "in-band commissioning".
324e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum *
334e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum * @hide
344e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum */
35325b7f5a066bc69c2ad32e1290274d18f40e423bRobert Quattlebaum// @SystemApi
366cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaumpublic class LowpanCommissioningSession {
376cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
386cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private final ILowpanInterface mBinder;
396cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private final LowpanBeaconInfo mBeaconInfo;
406cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private final ILowpanInterfaceListener mInternalCallback = new InternalCallback();
416cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private final Looper mLooper;
426cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private Handler mHandler;
436cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private Callback mCallback = null;
446cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private volatile boolean mIsClosed = false;
454e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
464e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    /**
474e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum     * Callback base class for {@link LowpanCommissioningSession}
484e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum     *
494e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum     * @hide
504e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum     */
51325b7f5a066bc69c2ad32e1290274d18f40e423bRobert Quattlebaum    // @SystemApi
526cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    public abstract static class Callback {
534e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum        public void onReceiveFromCommissioner(@NonNull byte[] packet) {};
544e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
554e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum        public void onClosed() {};
564e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    }
574e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
586cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private class InternalCallback extends ILowpanInterfaceListener.Stub {
596cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
606cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onStateChanged(String value) {
616cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            if (!mIsClosed) {
626cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                switch (value) {
636cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                    case ILowpanInterface.STATE_OFFLINE:
646cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                    case ILowpanInterface.STATE_FAULT:
656cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                        synchronized (LowpanCommissioningSession.this) {
666cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                            lockedCleanup();
676cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                        }
686cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                }
696cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
706cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
716cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
726cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
736cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onReceiveFromCommissioner(byte[] packet) {
746cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            mHandler.post(
756cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                    () -> {
766cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                        synchronized (LowpanCommissioningSession.this) {
776cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                            if (!mIsClosed && (mCallback != null)) {
786cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                                mCallback.onReceiveFromCommissioner(packet);
796cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                            }
806cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                        }
816cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                    });
826cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
836cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
846cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        // We ignore all other callbacks.
856cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
866cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onEnabledChanged(boolean value) {}
876cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
886cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
896cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onConnectedChanged(boolean value) {}
906cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
916cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
926cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onUpChanged(boolean value) {}
936cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
946cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
956cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onRoleChanged(String value) {}
966cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
976cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
986cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onLowpanIdentityChanged(LowpanIdentity value) {}
996cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1006cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
1016cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onLinkNetworkAdded(IpPrefix value) {}
1026cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1036cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
1046cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onLinkNetworkRemoved(IpPrefix value) {}
1056cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1066cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
1076cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onLinkAddressAdded(String value) {}
1086cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1096cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        @Override
1106cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        public void onLinkAddressRemoved(String value) {}
1116cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
1126cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1136cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    LowpanCommissioningSession(
1146cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            ILowpanInterface binder, LowpanBeaconInfo beaconInfo, Looper looper) {
1156cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        mBinder = binder;
1166cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        mBeaconInfo = beaconInfo;
1176cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        mLooper = looper;
1186cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1196cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        if (mLooper != null) {
1206cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            mHandler = new Handler(mLooper);
1216cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        } else {
1226cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            mHandler = new Handler();
1236cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
1246cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1256cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        try {
1266cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            mBinder.addListener(mInternalCallback);
1276cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1286cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        } catch (RemoteException x) {
1296cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            throw x.rethrowAsRuntimeException();
1306cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
1316cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
1326cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1336cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    private void lockedCleanup() {
1346cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        // Note: this method is only called from synchronized contexts.
1356cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1366cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        if (!mIsClosed) {
1376cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            try {
1386cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mBinder.removeListener(mInternalCallback);
1396cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1406cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (DeadObjectException x) {
1416cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                /* We don't care if we receive a DOE at this point.
1426cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 * DOE is as good as success as far as we are concerned.
1436cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 */
1446cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1456cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (RemoteException x) {
1466cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                throw x.rethrowAsRuntimeException();
1476cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
1486cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1496cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            if (mCallback != null) {
1506cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mHandler.post(() -> mCallback.onClosed());
1516cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
1526cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
1536cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1546cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        mCallback = null;
1556cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        mIsClosed = true;
1566cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
1576cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1584e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    /** TODO: doc */
1594e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    @NonNull
1606cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    public LowpanBeaconInfo getBeaconInfo() {
1616cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        return mBeaconInfo;
1626cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
1634e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
1644e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    /** TODO: doc */
1656cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    public void sendToCommissioner(@NonNull byte[] packet) {
1666cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        if (!mIsClosed) {
1676cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            try {
1686cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mBinder.sendToCommissioner(packet);
1696cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1706cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (DeadObjectException x) {
1716cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                /* This method is a best-effort delivery.
1726cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 * We don't care if we receive a DOE at this point.
1736cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 */
1746cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
1756cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (RemoteException x) {
1766cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                throw x.rethrowAsRuntimeException();
1776cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
1786cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
1796cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
1804e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
1814e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    /** TODO: doc */
1826cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    public synchronized void setCallback(@Nullable Callback cb, @Nullable Handler handler) {
1836cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        if (!mIsClosed) {
1846cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            /* This class can be created with or without a default looper.
1856cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * Also, this method can be called with or without a specific
1866cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * handler. If a handler is specified, it is to always be used.
1876cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * Otherwise, if there was a Looper specified when this object
1886cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * was created, we create a new handle based on that looper.
1896cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * Otherwise we just create a default handler object. Since we
1906cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * don't really know how the previous handler was created, we
1916cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * end up always replacing it here. This isn't a huge problem
1926cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             * because this method should be called infrequently.
1936cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum             */
1946cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            if (handler != null) {
1956cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mHandler = handler;
1966cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } else if (mLooper != null) {
1976cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mHandler = new Handler(mLooper);
1986cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } else {
1996cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mHandler = new Handler();
2006cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
2016cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            mCallback = cb;
2026cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
2036cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
2044e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
2054e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum    /** TODO: doc */
2066cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    public synchronized void close() {
2076cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        if (!mIsClosed) {
2086cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            try {
2096cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                mBinder.closeCommissioningSession();
2104e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
2116cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                lockedCleanup();
2124e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum
2136cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (DeadObjectException x) {
2146cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                /* We don't care if we receive a DOE at this point.
2156cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 * DOE is as good as success as far as we are concerned.
2166cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                 */
2176cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum
2186cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            } catch (RemoteException x) {
2196cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum                throw x.rethrowAsRuntimeException();
2206cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum            }
2216cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum        }
2226cfc490ccd8ea0d9ef4d52482ff65471f7631969Robert Quattlebaum    }
2234e0c2195dd999859f4e79cec1884326fb52a5916Robert Quattlebaum}
224