use of org.openntf.domino.nsfdata.structs.cd.CData in project org.openntf.domino by OpenNTF.
the class AbstractDesignFileResource method getFileDataRaw.
/**
* Reads a FileData Item in RAW-mode
*
* @param itemName
* @return
*/
protected byte[] getFileDataRaw(final String itemName) {
try {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
for (XMLNode rawitemdata : //
getDxl().selectNodes("//item[@name='" + XMLDocument.escapeXPathValue(itemName) + "']/rawitemdata")) {
// $NON-NLS-1$ //$NON-NLS-2$
String rawData = rawitemdata.getText();
byte[] thisData = parseBase64Binary(rawData);
byteStream.write(thisData);
}
if (byteStream.size() > 0) {
byte[] data = byteStream.toByteArray();
CData cdata = new CData(data);
CDObject obj = CDObject.create(cdata);
// Files may be attached either as FILE or as EVENT... (ssjs for example) Damn. This makes everything quite complex
if (obj instanceof CDResourceFile)
return ((CDResourceFile) obj).getFileData();
if (obj instanceof CDResourceEvent)
return ((CDResourceEvent) obj).getFileData();
// $NON-NLS-1$
throw new IllegalStateException("Cannot decode " + obj.getClass().getName());
} else {
byteStream = new ByteArrayOutputStream();
for (XMLNode rawitemdata : //
getDxl().selectNodes("//file[@name='" + XMLDocument.escapeXPathValue(itemName) + "']/filedata")) {
// $NON-NLS-1$ //$NON-NLS-2$
String rawData = rawitemdata.getText();
byte[] thisData = parseBase64Binary(rawData);
byteStream.write(thisData);
}
return byteStream.toByteArray();
}
} catch (IOException ioe) {
DominoUtils.handleException(ioe);
return null;
}
}
use of org.openntf.domino.nsfdata.structs.cd.CData in project org.openntf.domino by OpenNTF.
the class DXLNote method extractFileResource.
// TODO Make sure it works with multiple files
@Override
public void extractFileResource(final String itemName, final java.io.OutputStream os) {
Collection<NSFItem> items = getItems(itemName);
int segmentCount = 0;
int totalSegments = 0;
for (NSFItem item : items) {
if (item instanceof DXLItemComposite) {
CData cdata = ((DXLItemComposite) item).getValue();
int breaker = 0;
for (CDRecord record : cdata) {
if (breaker++ > 1000) {
System.out.println("we went too deep!");
break;
}
if (record instanceof CDFILEHEADER) {
CDFILEHEADER header = (CDFILEHEADER) record;
totalSegments = (int) header.SegCount.get();
segmentCount = 0;
}
if (record instanceof CDFILESEGMENT) {
CDFILESEGMENT seg = (CDFILESEGMENT) record;
ByteBuffer data = ByteBuffer.wrap(seg.getFileData());
data.order(ByteOrder.LITTLE_ENDIAN);
try {
os.write(data.array(), data.position(), data.limit() - data.position());
} catch (IOException e) {
throw new RuntimeException(e);
}
if (++segmentCount >= totalSegments) {
try {
os.flush();
return;
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
}
}
}
Aggregations