/* * CDDL HEADER START * * The contents of this file are subject to the terms of the Common Development * and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at * src/com/vodafone360/people/VODAFONE.LICENSE.txt or * http://github.com/360/360-Engine-for-Android * See the License for the specific language governing permissions and * limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each file and * include the License file at src/com/vodafone360/people/VODAFONE.LICENSE.txt. * If applicable, add the following below this CDDL HEADER, with the fields * enclosed by brackets "[]" replaced with your own identifying information: * Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END * * Copyright 2010 Vodafone Sales & Services Ltd. All rights reserved. * Use is subject to license terms. */ package com.vodafone360.people.service.io.rpg; import java.util.List; import java.io.InputStream; import java.io.IOException; /** * RPG helper functions, Splitting of RPG response data into individual RPG * responses, int <--> byte conversion. */ public class RpgHelper { private static final int RPG_HEADER_LENGTH = RpgHeader.HEADER_LENGTH; /** * Splits an integer into a signed byte-array. * * @param integer The int to convert into bytes. * @return The byte-array containing the bytes of the int. */ protected static final byte[] intToSignedBytes(int integer) { return new byte[] { (byte)(integer >> 24), (byte)(integer >> 16 & 0xFF), (byte)(integer >> 8 & 0xFF), (byte)(integer & 0xFF) }; } /** * Generate int value from 4 signed bytes * * @param byte1 1st (most significant) byte. * @param byte2 2nd byte. * @param byte3 3rd byte. * @param byte4 4th byte. * @return integer value generated from input bytes */ protected static final int signedBytesToInt(byte byte1, byte byte2, byte byte3, byte byte4) { int result = 0; result += (byte1 & 0x000000FF) << 24; result += (byte2 & 0x000000FF) << 16; result += (byte3 & 0x000000FF) << 8; result += (byte4 & 0x000000FF); return result; } /** * Split single RPG response into individual RPG request responses * * @param inputStream byte array containing RPG response * @param msgs array of RPG messages (consisting of RPG header and Hessian * encoded message body) */ public static void splitRpgResponse(InputStream inputStream, List<RpgMessage> msgs) throws IOException { int actual = 0; byte[] header = new byte[RPG_HEADER_LENGTH]; while (actual != -1) { actual = 0; int offset = 0; while (actual != -1 && (offset != RPG_HEADER_LENGTH)) { // extract header info actual = inputStream.read(header, offset, RPG_HEADER_LENGTH - offset); if (actual > 0) offset += actual; } if (offset != RPG_HEADER_LENGTH) { break; } RpgHeader hdr = new RpgHeader(); if (!hdr.extractHeaderInfo(header)) { break; } int payloadLength = hdr.payloadLength(); if (payloadLength != 0) { byte[] body = new byte[payloadLength]; actual = 0; int pos = 0; while (actual != -1 && (pos != payloadLength)) { actual = inputStream.read(body, pos, payloadLength - pos); if (actual > 0) pos += actual; } if (pos != payloadLength) { break; } msgs.add(new RpgMessage(hdr, body)); } else { // no message body just a header msgs.add(new RpgMessage(hdr)); } } } }