blob: 070727067d7b85aa91df0753da8b59afb18a2502 [file] [log] [blame]
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.wifi.nan;
import android.net.wifi.nan.ConfigRequest;
import android.net.wifi.nan.IWifiNanEventListener;
import android.net.wifi.nan.IWifiNanSessionListener;
import android.net.wifi.nan.WifiNanEventListener;
import android.os.RemoteException;
import android.util.Log;
import android.util.SparseArray;
import java.io.FileDescriptor;
import java.io.PrintWriter;
public class WifiNanClientState {
private static final String TAG = "WifiNanClientState";
private static final boolean DBG = false;
private static final boolean VDBG = false; // STOPSHIP if true
/* package */ static final int CLUSTER_CHANGE_EVENT_STARTED = 0;
/* package */ static final int CLUSTER_CHANGE_EVENT_JOINED = 1;
private IWifiNanEventListener mListener;
private int mEvents;
private final SparseArray<WifiNanSessionState> mSessions = new SparseArray<>();
private int mUid;
private ConfigRequest mConfigRequest;
public WifiNanClientState(int uid, IWifiNanEventListener listener, int events) {
mUid = uid;
mListener = listener;
mEvents = events;
}
public void destroy() {
mListener = null;
for (int i = 0; i < mSessions.size(); ++i) {
mSessions.valueAt(i).destroy();
}
mSessions.clear();
mConfigRequest = null;
}
public void setConfigRequest(ConfigRequest configRequest) {
mConfigRequest = configRequest;
}
public ConfigRequest getConfigRequest() {
return mConfigRequest;
}
public int getUid() {
return mUid;
}
public WifiNanSessionState getNanSessionStateForPubSubId(int pubSubId) {
for (int i = 0; i < mSessions.size(); ++i) {
WifiNanSessionState session = mSessions.valueAt(i);
if (session.isPubSubIdSession(pubSubId)) {
return session;
}
}
return null;
}
public void createSession(int sessionId, IWifiNanSessionListener listener, int events) {
WifiNanSessionState session = mSessions.get(sessionId);
if (session != null) {
Log.e(TAG, "createSession: sessionId already exists (replaced) - " + sessionId);
}
mSessions.put(sessionId, new WifiNanSessionState(sessionId, listener, events));
}
public void destroySession(int sessionId) {
WifiNanSessionState session = mSessions.get(sessionId);
if (session == null) {
Log.e(TAG, "destroySession: sessionId doesn't exist - " + sessionId);
return;
}
mSessions.delete(sessionId);
session.destroy();
}
public WifiNanSessionState getSession(int sessionId) {
return mSessions.get(sessionId);
}
public void onConfigCompleted(ConfigRequest completedConfig) {
if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_CONFIG_COMPLETED) != 0) {
try {
mListener.onConfigCompleted(completedConfig);
} catch (RemoteException e) {
Log.w(TAG, "onConfigCompleted: RemoteException - ignored: " + e);
}
}
}
public void onConfigFailed(ConfigRequest failedConfig, int reason) {
if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_CONFIG_FAILED) != 0) {
try {
mListener.onConfigFailed(failedConfig, reason);
} catch (RemoteException e) {
Log.w(TAG, "onConfigFailed: RemoteException - ignored: " + e);
}
}
}
public int onNanDown(int reason) {
if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_NAN_DOWN) != 0) {
try {
mListener.onNanDown(reason);
} catch (RemoteException e) {
Log.w(TAG, "onNanDown: RemoteException - ignored: " + e);
}
return 1;
}
return 0;
}
public int onInterfaceAddressChange(byte[] mac) {
if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_IDENTITY_CHANGED) != 0) {
try {
mListener.onIdentityChanged();
} catch (RemoteException e) {
Log.w(TAG, "onIdentityChanged: RemoteException - ignored: " + e);
}
return 1;
}
return 0;
}
public int onClusterChange(int flag, byte[] mac) {
if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_IDENTITY_CHANGED) != 0) {
try {
mListener.onIdentityChanged();
} catch (RemoteException e) {
Log.w(TAG, "onIdentityChanged: RemoteException - ignored: " + e);
}
return 1;
}
return 0;
}
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("NanClientState:");
pw.println(" mUid: " + mUid);
pw.println(" mConfigRequest: " + mConfigRequest);
pw.println(" mListener: " + mListener);
pw.println(" mEvents: " + mEvents);
pw.println(" mSessions: [" + mSessions + "]");
for (int i = 0; i < mSessions.size(); ++i) {
mSessions.valueAt(i).dump(fd, pw, args);
}
}
}