📄 showtree.java
字号:
// FIXME: can print interface class details
indentLine (indent, "</" + intf.getInterfaceClassName () + ">");
}
private static void printEndpoint (int indent, Endpoint e)
{
if (e == null) {
indentLine (indent, "<!-- endpoint not available -->");
return;
}
indentLine (indent, "<endpoint addr='"
+ e.getEndpointAddress ()
+ "' direction='"
+ (e.isInput () ? "in" : "out")
+ "' type='"
+ e.getType ()
+ "'");
indentLine (indent + 4, "attributes='"
+ Integer.toHexString (e.getAttributes ())
+ "' maxpacket='"
+ e.getMaxPacketSize ()
+ "' interval='"
+ e.getInterval ()
// XXX two "extra" bytes in audio endpoints ...
+ "'/>");
maybePrintDescriptors (indent, e.nextDescriptor ());
}
// call this to print anything between one descriptor and
// the next interface or endpoint (or end of configuration)
private static void maybePrintDescriptors (int indent, Descriptor d)
{
while (d != null) {
switch (d.getDescriptorType ()) {
case Descriptor.TYPE_INTERFACE:
case Descriptor.TYPE_ENDPOINT:
return;
default:
indentLine (indent, "<descriptor type='"
+ d.getDescriptorType ()
+ "' length='"
+ d.getLength ()
+ "'/>");
// dumping contents could be useful too
d = d.nextDescriptor ();
}
}
}
// let's try some intelligence with some devices
private static void maybePrintDeviceDetails (
int indent,
DeviceDescriptor info
)
{
indent += 8;
// FIXME: use external config data; XML format
if (info.getDeviceClass () == Descriptor.CLASS_HUB)
printHubDetails (indent, info.getDevice ());
else if (info.getVendorId () == 0x040a)
printKodakDetails (indent, info);
else if (info.getVendorId () == 0x0841)
printDiamondDetails (indent, info);
}
private static void printHubDetails (int indent, Device dev)
{
try {
Hub h = new Hub (dev);
int ports = h.getNumPorts ();
indentLine (indent,
(h.isRootHub () ? "Root " : "")
+ "Hub, "
+ ports
+ " ports"
);
indentLine (indent,
"overcurrent protection: "
+ h.getOverCurrentMode ()
);
indentLine (indent,
"power switching: "
+ h.getPowerSwitchingMode ()
);
if (h.isCompound ())
indentLine (indent, "Part of a compound device");
// not showing POTPGT, or hub's own current draw
indent -= 4;
indentLine (indent, "");
for (int i = 1; i <= ports; i++) {
Device child = dev.getChild (i);
if (child == null)
continue;
indentLine (indent, "<!-- Port "
+ i
+ (h.isRemovable (i) ? "" : " is built-in.")
+ " -->");
printDevice (indent, child);
}
} catch (IOException e) {
e.printStackTrace (System.out);
}
}
private static void printKodakDetails (int indent, DeviceDescriptor info)
{
String type;
switch (info.getProductId ()) {
//
// "Taka" serial/usb protocol, dating back to DC-50
//
case 0x0120: type = "dc240"; break;
case 0x0130: type = "dc280"; break;
case 0x0131: type = "dc5000"; break;
case 0x0132: type = "dc3400"; break;
//
// DigitaOS serial/usb protocol isn't Kodak-proprietary.
// Also used by HP PhotoSmart C500
//
case 0x0100: // dc220
case 0x0110: // dc260
case 0x0111: // dc265
case 0x0112: // dc290
indentLine (indent, "http://ods.sourceforge.net/");
return;
//
// There are many other old serial protocols that have been
// brought forward into USB. One hopes that vendor-neutral
// standards will start to really catch on.
//
//
// PTP protocol -- based on an ISO draft, intended to
// be neutral with respect to vendor and protocol. New.
//
// Doesn't have serial line legacy features.
//
case 0x0121: // dc240 with PTP prototype firmware
case 0x0160: // dc4800
indentLine (indent, "http://jphoto.sourceforge.net/");
// FIXME: if jPhoto is available it should
// be able to plug itself in ...
return;
default:
indentLine (indent, "I don't know about this product.");
return;
}
indentLine (indent, "I can talk to a " + type + " ...");
try {
Kodak camera = new Kodak (info.getDevice ());
indentLine (indent, "Current camera status: ");
camera.printSomeStatus (indent);
} catch (IOException e) {
indentLine (indent, "... but I can't do it just now.");
indentLine (indent, e.getMessage ());
} catch (Exception e) {
e.printStackTrace (System.out);
}
}
private static void showStorage (int indent, Rio500 rio, boolean external)
throws IOException
{
Rio500.MemoryStatus mem;
int temp;
indentLine (indent, external ? "SmartMedia" : "Built-in Memory");
indent += 2;
temp = rio.getFreeMemory (external);
indentLine (indent, "Available Memory in bytes: "
+ (temp / (1024 * 1024))
+ "."
+ ((10 * (temp % (1024 * 1024))) / (1024 * 1024))
+ " MB, "
);
mem = rio.getMemoryStatus (external);
temp = mem.getBlockCount ();
if (temp != 0)
temp = ((temp - mem.getNumUnusedBlocks ()) * 100) / temp;
else
temp = 1000;
indentLine (indent, "Memory status: "
+ mem.getBlockCount () + " Blocks, "
+ mem.getBlockSize () + " bytes each, "
+ mem.getNumUnusedBlocks () + " blocks unused "
+ temp + "% full "
);
indentLine (indent, "First free block at 0x"
+ Integer.toHexString (mem.getFirstFreeBlock ())
);
// dump folders and their contents
Rio500.FolderEntry folders [] = rio.getFolders (external);
for (int i = 0; i < folders.length; i++) {
Rio500.FolderEntry f = folders [i];
indentLine (indent, "Folder # "
+ i
+ ", offset = 0x"
+ Integer.toHexString (f.getOffset ())
+ ", name1 = "
+ f.getName1 ()
// + ", name2 = "
// + f.getName2 ()
+ ", entries = "
+ f.getSongCount ()
);
indent += 2;
try {
Rio500.SongEntry songs [] = f.getSongs ();
for (int j = 0; j < songs.length; j++) {
Rio500.SongEntry s = songs [j];
indentLine (indent, "Song # "
+ j
+ ", offset = 0x"
+ Integer.toHexString (s.getOffset ())
+ ", kbytes = "
+ (s.getLength () / 1024)
);
indentLine (indent + 4, "name1 = "
+ s.getName1 ()
// + ", name2 = "
// + s.getName2 ()
);
}
} catch (Exception e) {
e.printStackTrace ();
}
indent -= 2;
}
}
private static void printDiamondDetails (int indent, DeviceDescriptor info)
{
Device dev = info.getDevice ();
if (info.getProductId () != 0x0001) {
indentLine (indent, "That's not a Rio 500 ...");
return;
}
Rio500 rio = null;
try {
indentLine (indent, "Rio 500 Status: ");
indent += 2;
rio = new Rio500 (dev);
rio.start ();
// basic memory statistics
showStorage (indent, rio, false);
if (rio.hasExternalMemory ())
showStorage (indent, rio, true);
} catch (Exception e) {
e.printStackTrace (System.out);
return;
} finally {
if (rio != null)
rio.finish ();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -