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