/*
* Copyright (C) 2006-2008 Alfresco Software Limited.
*
* This program 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 2
* of the License, or (at your option) any later version.
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
* As a special exception to the terms and conditions of version 2.0 of
* the GPL, you may redistribute this Program in connection with Free/Libre
* and Open Source Software ("FLOSS") applications as described in Alfresco's
* FLOSS exception. You should have recieved a copy of the text describing
* the FLOSS exception, and it is also available here:
* http://www.alfresco.com/legal/licensing"
*/
package org.alfresco.jlan.smb.server;
import java.io.PrintStream;
import org.alfresco.jlan.util.DataPacker;
/**
* Core protocol search resume key.
*
* @author gkspencer
*/
class CoreResumeKey {
// Resume key offsets/lengths
private static final int RESBITS = 0;
private static final int FILENAME = 1;
private static final int RESSERVER = 12;
private static final int RESCONSUMER = 17;
private static final int FILENAMELEN = 11;
private static final int RESSRVLEN = 5;
private static final int RESCONSUMLEN = 4;
public static final int LENGTH = 21;
/**
* Dump the resume key to the specified output stream.
*
* @param out java.io.PrintStream
* @param buf byte[]
* @param pos int
*/
public final static void DumpKey(PrintStream out, byte[] buf, int pos) {
// Output the various resume key fields
out.print("[" + getReservedByte(buf, pos) + ", ");
out.print(getFileName(buf, pos, false) + "]");
}
/**
* Return the consumer area of the resume key.
*
* @return byte[]
*/
public static final byte[] getConsumerArea(byte[] buf, int pos) {
byte[] conArea = new byte[RESCONSUMLEN];
for (int i = 0; i < RESCONSUMLEN; i++)
conArea[i] = buf[pos + RESCONSUMER + i];
return conArea;
}
/**
* Return the file name from the resume key.
*
* @return java.lang.String
*/
public static final String getFileName(byte[] buf, int pos, boolean dot) {
// Check if we should return the file name in 8.3 format
if (dot) {
// Build the 8.3 file name
StringBuffer name = new StringBuffer();
name.append(new String(buf, pos + FILENAMELEN, 8).trim());
name.append(".");
name.append(new String(buf, pos + FILENAMELEN + 8, 3).trim());
return name.toString();
}
// Return the raw string
return new String(buf, pos + FILENAME, FILENAMELEN).trim();
}
/**
* Return the reserved byte from the resume key.
*
* @return byte
*/
public static final byte getReservedByte(byte[] buf, int pos) {
return buf[pos];
}
/**
* Copy the resume key from the buffer to the user buffer.
*
* @param buf byte[]
* @param pos int
* @param key byte[]
*/
public final static void getResumeKey(byte[] buf, int pos, byte[] key) {
// Copy the resume key bytes
System.arraycopy(buf, pos, key, 0, LENGTH);
}
/**
* Return the server area resume key value. This is the search context index in our case.
*
* @return int Server resume key value ( search context index).
*/
public static final int getServerArea(byte[] buf, int pos) {
return DataPacker.getIntelInt(buf, pos + RESSERVER + 1);
}
/**
* Generate a resume key with the specified filename and search context id.
*
* @param buf byte[]
* @param pos
* @param fileName java.lang.String
* @param ctxId int
*/
public final static void putResumeKey(
byte[] buf,
int pos,
String fileName,
int ctxId) {
// Clear the reserved area
buf[pos + RESBITS] = 0x16;
// Put the file name in resume key format
setFileName(buf, pos, fileName);
// Put the server side reserved area
setServerArea(buf, pos, ctxId);
// setServerArea( buf, pos, 0);
}
/**
* Set the consumer reserved area value.
*
* @param conArea byte[]
*/
public static final void setConsumerArea(byte[] buf, int pos, byte[] conArea) {
for (int i = 0; i < RESCONSUMLEN; i++)
buf[pos + RESCONSUMER + i] = conArea[i];
}
/**
* Set the resume key file name string.
*
* @param name java.lang.String
*/
public static final void setFileName(byte[] buf, int pos, String name) {
// Split the file name string
StringBuffer str = new StringBuffer();
int dot = name.indexOf(".");
if (dot != -1) {
str.append(name.substring(0, dot));
while (str.length() < 8)
str.append(" ");
str.append(name.substring(dot + 1, name.length()));
}
else
str.append(name);
// Space fill the file name to 11 characters
while (str.length() < FILENAMELEN)
str.append(" ");
// Pack the file name string into the resume key
DataPacker.putString(str.toString(), buf, pos + FILENAME, false);
}
/**
* Set the resume key reserved byte value.
*
* @param param byte
*/
public static final void setReservedByte(byte[] buf, int pos, byte val) {
buf[pos] = val;
}
/**
* Set the resume key server area value. This is the search context index in our case.
*
* @param srvVal int
*/
public static final void setServerArea(byte[] buf, int pos, int srvVal) {
buf[pos + RESSERVER] = 1;
DataPacker.putIntelInt(srvVal, buf, pos + RESSERVER + 1);
}
}