package com.sun.slp;
import java.util.*;
import java.io.*;
class SDAAdvert extends SrvLocMsgImpl {
SDAAdvert(SrvLocHeader hdr,
short xid,
long timestamp,
ServiceURL url,
Vector scopes,
Vector attrs)
throws ServiceLocationException {
try {
this.hdr = (SrvLocHeader)hdr.clone();
} catch (CloneNotSupportedException ex) {
}
this.hdr.xid = xid;
this.hdr.functionCode = SrvLocHeader.DAAdvert;
this.hdr.mcast = false;
this.hdr.previousResponders = null;
this.hdr.errCode = ServiceLocationException.OK;
this.hdr.overflow = false;
this.hdr.length = 0;
this.hdr.fresh = false;
this.initialize(timestamp, url, scopes, attrs);
}
void
initialize(long timestamp,
ServiceURL url,
Vector scopes,
Vector attrs)
throws ServiceLocationException {
SLPServerHeaderV2 hdr = (SLPServerHeaderV2)this.hdr;
hdr.scopes = (Vector)scopes.clone();
ServiceType serviceType = url.getServiceType();
if (!serviceType.equals(Defaults.DA_SERVICE_TYPE)) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"sdaadv_nondaurl",
new Object[] {serviceType});
}
if (timestamp < 0) {
throw
new ServiceLocationException(
ServiceLocationException.PARSE_ERROR,
"sdaadv_neg",
new Object[0]);
}
DATable.validateScopes(scopes, hdr.locale);
hdr.scopes = (Vector)scopes;
hdr.escapeScopeStrings(scopes);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String surl = url.toString();
putInt32(hdr, timestamp, baos);
byte[] timestampBytes = baos.toByteArray();
byte[] urlBytes = hdr.putString(surl, baos);
byte[] scopeBytes =
hdr.parseCommaSeparatedListOut(scopes, baos);
byte[] attrBytes = hdr.parseAttributeVectorOut(attrs,
url.getLifetime(),
false,
null,
baos,
false);
String spisString = "";
LinkedList spiList = AuthBlock.getSPIList("sun.net.slp.SPIs");
if (spiList != null && !spiList.isEmpty()) {
StringBuffer spiBuf = new StringBuffer();
spiBuf.append(spiList.getFirst().toString());
for (int i = 1; i < spiList.size(); i++) {
spiBuf.append(',');
spiBuf.append(spiList.get(i).toString());
}
spisString = spiBuf.toString();
}
byte[] spiBytes = hdr.putString(spisString, baos);
Hashtable auth = null;
if (SLPConfig.getSLPConfig().getHasSecurity()) {
Object[] message = new Object[9];
message[0] = timestampBytes;
ByteArrayOutputStream abaos = new ByteArrayOutputStream();
hdr.putInteger(urlBytes.length, abaos);
message[1] = abaos.toByteArray();
message[2] = urlBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(attrBytes.length, abaos);
message[3] = abaos.toByteArray();
message[4] = attrBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(scopeBytes.length, abaos);
message[5] = abaos.toByteArray();
message[6] = scopeBytes;
abaos = new ByteArrayOutputStream();
hdr.putInteger(spiBytes.length, abaos);
message[7] = abaos.toByteArray();
message[8] = spiBytes;
auth =
hdr.getCheckedAuthBlockList(message,
SLPConfig.getSLPConfig().getAdvertHeartbeatTime());
baos.write((byte)(auth.size() & 0xFF));
hdr.nbytes += 1;
AuthBlock.externalizeAll(hdr, auth, baos);
} else {
baos.write((byte)0);
}
hdr.payload = baos.toByteArray();
hdr.constructDescription("DAAdvert",
" timestamp="+timestamp+"\n"+
" URL="+url+"\n"+
" attrs="+attrs+"\n"+
" SPIs="+spisString+"\n"+
" auth block="+AuthBlock.desc(auth) +
"\n");
}
static private void
putInt32(SrvLocHeader hdr, long i, ByteArrayOutputStream baos) {
baos.write((byte) ((i >> 24) & 0xFF));
baos.write((byte) ((i >> 16) & 0xFF));
baos.write((byte) ((i >> 8) & 0xFF));
baos.write((byte) (i & 0XFF));
hdr.nbytes += 4;
}
}