/*
This file is part of jpcsp.
Jpcsp is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Jpcsp is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Jpcsp. If not, see <http://www.gnu.org/licenses/>.
*/
package jpcsp.network.jpcsp;
import static jpcsp.HLE.Modules.sceNetAdhocctlModule;
import static jpcsp.HLE.modules.sceNetAdhocctl.GROUP_NAME_LENGTH;
import static jpcsp.HLE.modules.sceNetAdhocctl.IBSS_NAME_LENGTH;
import static jpcsp.HLE.modules.sceNetAdhocctl.MAX_GAME_MODE_MACS;
import static jpcsp.HLE.modules.sceNetAdhocctl.NICK_NAME_LENGTH;
import static jpcsp.hardware.Wlan.MAC_ADDRESS_LENGTH;
import java.util.List;
import jpcsp.HLE.kernel.types.pspNetMacAddress;
import jpcsp.HLE.modules.sceNet;
/**
* @author gid15
*
*/
public class JpcspAdhocctlMessage {
protected String nickName;
protected byte[] macAddress = new byte[MAC_ADDRESS_LENGTH];
protected String groupName;
protected String ibss;
protected int mode;
protected int channel;
protected boolean gameModeComplete;
protected byte[][] gameModeMacs;
public JpcspAdhocctlMessage(String nickName, byte[] macAddress, String groupName) {
this.nickName = nickName;
System.arraycopy(macAddress, 0, this.macAddress, 0, this.macAddress.length);
this.groupName = groupName;
ibss = sceNetAdhocctlModule.hleNetAdhocctlGetIBSS();
mode = sceNetAdhocctlModule.hleNetAdhocctlGetMode();
channel = sceNetAdhocctlModule.hleNetAdhocctlGetChannel();
gameModeComplete = false;
gameModeMacs = null;
}
public JpcspAdhocctlMessage(byte[] message, int length) {
int offset = 0;
nickName = copyFromMessage(message, offset, NICK_NAME_LENGTH);
offset += NICK_NAME_LENGTH;
copyFromMessage(message, offset, macAddress);
offset += macAddress.length;
groupName = copyFromMessage(message, offset, GROUP_NAME_LENGTH);
offset += GROUP_NAME_LENGTH;
ibss = copyFromMessage(message, offset, IBSS_NAME_LENGTH);
offset += IBSS_NAME_LENGTH;
mode = copyInt32FromMessage(message, offset);
offset += 4;
channel = copyInt32FromMessage(message, offset);
offset += 4;
gameModeComplete = copyBoolFromMessage(message, offset);
offset++;
int numberGameModeMacs = copyInt32FromMessage(message, offset);
offset += 4;
if (numberGameModeMacs > 0) {
gameModeMacs = copyMacsFromMessage(message, offset, numberGameModeMacs);
offset += MAC_ADDRESS_LENGTH * numberGameModeMacs;
}
}
public void setGameModeComplete(boolean gameModeComplete, List<pspNetMacAddress> requiredGameModeMacs) {
this.gameModeComplete = gameModeComplete;
int numberGameModeMacs = requiredGameModeMacs.size();
gameModeMacs = new byte[numberGameModeMacs][MAC_ADDRESS_LENGTH];
int i = 0;
for (pspNetMacAddress macAddress : requiredGameModeMacs) {
gameModeMacs[i] = macAddress.macAddress;
i++;
}
}
private String copyFromMessage(byte[] message, int offset, int length) {
StringBuilder s = new StringBuilder();
for (int i = 0; i < length; i++) {
byte b = message[offset + i];
if (b == 0) {
break;
}
s.append((char) b);
}
return s.toString();
}
private int copyInt32FromMessage(byte[] message, int offset) {
int n = 0;
for (int i = 0; i < 4; i++) {
n |= (message[offset + i] & 0xFF) << (i * 8);
}
return n;
}
private boolean copyBoolFromMessage(byte[] message, int offset) {
return message[offset] != 0;
}
private void copyFromMessage(byte[] message, int offset, byte[] bytes) {
System.arraycopy(message, offset, bytes, 0, bytes.length);
}
private byte[][] copyMacsFromMessage(byte[] message, int offset, int numberMacs) {
byte[][] macs = new byte[numberMacs][MAC_ADDRESS_LENGTH];
for (int i = 0; i < numberMacs; i++) {
copyFromMessage(message, offset, macs[i]);
offset += macs[i].length;
}
return macs;
}
private void copyToMessage(byte[] message, int offset, String s) {
if (s != null) {
int length = s.length();
for (int i = 0; i < length; i++) {
message[offset + i] = (byte) s.charAt(i);
}
}
}
private void copyToMessage(byte[] message, int offset, byte[] bytes) {
for (int i = 0; i < bytes.length; i++) {
message[offset + i] = bytes[i];
}
}
private void copyInt32ToMessage(byte[] message, int offset, int value) {
for (int i = 0; i < 4; i++) {
message[offset + i] = (byte) (value >> (i * 8));
}
}
private void copyBoolToMessage(byte[] message, int offset, boolean value) {
message[offset] = (byte) (value ? 1 : 0);
}
private void copyMacsToMessage(byte[] message, int offset, byte[][] macs) {
for (int i = 0; i < macs.length; i++) {
copyToMessage(message, offset, macs[i]);
offset += macs[i].length;
}
}
public byte[] getMessage() {
byte[] message = new byte[getMessageLength()];
int offset = 0;
copyToMessage(message, offset, nickName);
offset += NICK_NAME_LENGTH;
copyToMessage(message, offset, macAddress);
offset += macAddress.length;
copyToMessage(message, offset, groupName);
offset += GROUP_NAME_LENGTH;
copyToMessage(message, offset, ibss);
offset += IBSS_NAME_LENGTH;
copyInt32ToMessage(message, offset, mode);
offset += 4;
copyInt32ToMessage(message, offset, channel);
offset += 4;
copyBoolToMessage(message, offset, gameModeComplete);
offset++;
if (gameModeMacs == null) {
copyInt32ToMessage(message, offset, 0);
offset += 4;
} else {
copyInt32ToMessage(message, offset, gameModeMacs.length);
offset += 4;
copyMacsToMessage(message, offset, gameModeMacs);
offset += gameModeMacs.length * MAC_ADDRESS_LENGTH;
}
return message;
}
public static int getMessageLength() {
return NICK_NAME_LENGTH + MAC_ADDRESS_LENGTH + GROUP_NAME_LENGTH + IBSS_NAME_LENGTH + 4 + 4 + 1 + 4 + MAX_GAME_MODE_MACS * MAC_ADDRESS_LENGTH;
}
@Override
public String toString() {
StringBuilder macs = new StringBuilder();
if (gameModeMacs != null) {
macs.append(", gameModeMacs=[");
for (int i = 0; i < gameModeMacs.length; i++) {
if (i > 0) {
macs.append(", ");
}
macs.append(sceNet.convertMacAddressToString(gameModeMacs[i]));
}
macs.append("]");
}
return String.format("JpcspAdhocctlMessage[nickName='%s', macAddress=%s, groupName='%s', IBSS='%s', mode=%d, channel=%d, gameModeComplete=%b%s]", nickName, sceNet.convertMacAddressToString(macAddress), groupName, ibss, mode, channel, gameModeComplete, macs.toString());
}
}