亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usb.java

?? JAVA 訪問USB JAVA 訪問USB JAVA 訪問USB JAVA 訪問USB JAVA 訪問USB JAVA 訪問USB
?? JAVA
字號:
/*
 * Java USB Library
 * Copyright (C) 2000 by David Brownell
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package usb.linux;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

import usb.core.*;


/**
 * Represents a Universal Serial Bus (USB), which hosts a set of devices.
 * Such buses are largely autoconfiguring.  Aspects such as power
 * management and detailed device configuration involve policy choices,
 * which may be modified after the OS kernel (or other infrastructure)
 * has first set them up.
 *
 * <p> The bus can be examined device by device.  Since devices can be
 * inserted and removed at any time there is no notion of a self-consistent
 * listing snapshot in this API.  Rather than scanning the bus, instead
 * use {@link Host#addUSBListener addUSBListener}
 * with an object that can immediately
 * react to device addition or removal.
 *
 * <p> Note that for consistency with USB itself, bus addresses
 * start at one (not zero). 
 *
 * @see Host
 *
 * @author David Brownell
 * @version $Id: USB.java,v 1.2 2000/12/15 19:02:21 dbrownell Exp $
 */
final class USB implements Bus
{
    /** @serial the host to which this bus is connected */
    final private Host			host;

    // n.b. busfile is like /proc/bus/usb/NNN (decimal)
    final transient private File	busfile;
    final transient private int		busnum;

// FIXME:  root can change over suspend/resume cycle ...
    private transient int		root = -1;

    final transient private Vector	listeners;
    final transient private DeviceImpl	devices [] = new DeviceImpl [127];

    // package private
    USB (File parent, String file, int num, Vector l, Host h)
    throws IOException
    {
	busfile = new File (parent, file);
	busnum = num;
	listeners = l;
	host = h;
    }

    public String toString ()
    {
	StringBuffer buf = new StringBuffer ("{ Linux Bus: ");
	buf.append (busfile.toString ());
	if (root >= 0) {
	    buf.append (" root = ");
	    buf.append (root);
	    buf.append (" id = ");
	    buf.append (getBusId ());
	}
	buf.append ("}");
	return buf.toString ();
    }

    /** Returns the USB host for this bus. */
    public Host getHost ()
	{ return host; }

    /** Returns the number assigned to this bus. */
    public int getBusNum ()
	{ return busnum; }

    /** Returns the root hub of the bus, if it is known yet. */
    public Device getRootHub ()
	{ return (root >= 0) ? devices [root] : null; }

    public String getBusId ()
    {
	if (root < 0)
	    return null;
	return devices [root].getDeviceDescriptor ().getSerial (0);
    }

    /**
     * Returns an object representing the device with the specified
     * address (1 through 127), or null if no such device exists.
     */
    public Device getDevice (int address)
    {
	return devices [address - 1];
    }

    // assemble new tree
    private void newTree (String names [])
    throws SecurityException
    {
	DeviceImpl	hub = null;

	// create devices
	for (int i = 0; i < names.length; i++) {
	    if (devices [i] == null) {
		if (names [i] == null)
		    continue;
		try {
		    File f = new File (busfile, names [i]);
		    devices [i] = new DeviceImpl (this, f, i + 1);
		} catch (IOException e) {
		    if (Linux.debug)
			e.printStackTrace ();
		    else
			System.err.println ("can't create dev: "
			    + e.getMessage ());
		}
	    }
	}

	// update lists of children; find some interior node
	for (int i = 0; i < 127; i++) {
	    if (devices [i] == null)
		continue;
	    if (devices [i].getDeviceDescriptor ()
		    .getDeviceClass () != Descriptor.CLASS_HUB)
		continue;
	    devices [i].updateChildren ();
	    if (hub == null)
		hub = devices [i];
	}

	// walk up from that node to the root
	DeviceImpl 	parent;

	root = -1;
	for ( ; hub != null; hub = parent) {
	    parent = (DeviceImpl) hub.getHub ();
	    if (parent == null) {
		root = hub.getAddress () - 1;
		added (hub);
		break;
	    }
	}
	if (Linux.trace)
	    System.err.println ("Got root: " + this);
    }

    private boolean checkHub (String type, DeviceImpl dev, String relevant [])
    {
	boolean	needUpdate = false;
	boolean reported = false;
	int	ports = dev.getNumPorts ();

	if (type == "add")
	    dev.updateChildren ();

	for (int port = 1; port <= ports; port++) {
	    DeviceImpl		child = (DeviceImpl) dev.getChild (port);
	    int			index;
	    DeviceDescriptor	d;

	    if (child == null)
		continue;
	    index = child.getAddress () - 1;

	    // additions reported from root to leaves
	    if (type == "add" && relevant [index] != null) {
		if (Linux.trace)
		    System.err.println ("checkHub add, "
			+ " dev" + dev.getAddress ()
			+ " [" + port
			+ "] dev" + (index + 1)
			);
		added (child);
		reported = true;
	    }

	    d = child.getDeviceDescriptor ();
	    if (d.getDeviceClass () == d.CLASS_HUB)
		reported = checkHub (type, child, relevant) || reported;

	    // removals reported from leaves to root
	    if (type == "remove" && relevant [index] == null) {
		if (Linux.trace)
		    System.err.println ("checkHub remove, "
			+ " dev" + dev.getAddress ()
			+ " port" + port
			+ "  = dev" + (index + 1)
			);
		removed (child);
		devices [index] = null;
		needUpdate = true;
	    }
	}

	// disconnect now-orphaned nodes
	if (needUpdate)
	    dev.updateChildren ();

	return reported;
    }

    // returns true if changes were detected
    // package private
    boolean scanBus ()
    throws SecurityException
    {
	boolean retval = false;

	// FIXME: when kernel sets mtime of bus directories right, we
	// can optimize: compare mtime against lastTime, and maybe stop.

	synchronized (devices) {
	    String	devs [] = busfile.list ();
	    String	names [] = new String [127];
	    boolean	addAll = false;

	    for (int i = 0; i < devs.length; i++) {
		try {
		    int	index = Integer.parseInt (devs [i]) - 1;
		    names [index] = devs [i];
		} catch (Exception e) {
		    if (Linux.debug)
			System.err.println ("illegal name: "
			    + busfile + "/" + devs [i]);
		}
	    }

	    // init or reinit (e.g. PM-induced restart)
	    if (root < 0 || names [root] == null) {
		newTree (names);
		addAll = true;
	    
	    // flag any removals from existing tree
	    } else
		retval = checkHub ("remove", devices [root], names);

	    // catch any new devices
	    for (int index = 0; index < 127; index++) {
		DeviceImpl	 dev = devices [index];

		if (dev == null) {
		    // new device ... report later
		    if (names [index] != null) {
			try {
			    File f = new File (busfile, names [index]);
			    dev = new DeviceImpl (this, f, index + 1);
			    devices [index] = dev;
			    retval = true;
			} catch (IOException e) {
			    // Maybe:  between the directory scan and
			    // creating the device object, it went away.

			    // Or it doesn't report its descriptors on
			    // demand, like it's supposed to ...

			    if (Linux.debug)
				e.printStackTrace (System.err);
			}
		    }
		    // else: as expected

		} else {
		    // usbdevfs keeps filenames pinned while we
		    // have open file descriptors.  So we know
		    // that if we have a dev, we reported it.
		    if (names [index] != null && !addAll)
			names [index] = null;
		}
	    }

	    // report any additions in order (inside out)
	    // ... for devices not removed from names
	    checkHub ("add", devices [root], names);
	}
	return retval;
    }

    // package private
    void kill ()
    {
	if (Linux.trace)
	    System.err.println ("kill bus" + this);

	// notify any listeners that the bus died, and
	// clear backlinks that we control
	if (listeners.size () > 0) {
	    synchronized (devices) {
		for (int i = 0; i < devices.length; i++) {
		    if (devices [i] == null)
			continue;
		    removed (devices [i]);
		}
	    }
	}
    }

    private void added (DeviceImpl dev)
    {
	if (Linux.trace)
	    System.err.println ("notify add " + dev);

	// call synch'd on devices
	for (int i = 0; i < listeners.size (); i++) {
	    USBListener	listener;
	    listener = (USBListener) listeners.elementAt (i);
	    try { listener.deviceAdded (dev); }
	    catch (Exception e) {
		if (Linux.debug)
		    e.printStackTrace ();
	    }
	}
    }

    private void removed (DeviceImpl dev)
    {
	if (Linux.trace)
	    System.err.println ("notify remove " + dev);
	
	// call synch'd on devices
	for (int i = 0; i < listeners.size (); i++) {
	    USBListener	listener;
	    listener = (USBListener) listeners.elementAt (i);
	    try { listener.deviceRemoved (dev); }
	    catch (Exception e) {
		if (Linux.debug)
		    e.printStackTrace ();
	    }
	}
	try { dev.close (); }
	catch (IOException e) { /* ignore */ }
    }

    // package private ... for DeviceImpl.close() only !!
    void removeDev (DeviceImpl dev)
    {
	synchronized (devices) {
	    DeviceImpl	d = devices [dev.getAddress () - 1];
	    int		i;

	    if (d == null || d != dev)
		return;
	    i = d.getAddress () - 1;
	    devices [i] = null;
	    if (root == i) {
		root = -1;
		if (Linux.trace)
		    System.err.println ("bus root hub removed!");
		if (Linux.debug) {
		    for (i = 0; i < 127; i++) {
			if (devices [i] != null)
			    System.err.println ("? addr " + (i + 1)
				    + " present with no root ?");
		    }
		}
	    }
	}
    }


    // XXX Want management operations to put the bus (via root
    // hub) through the various states:  reset, suspend, resume,
    // operational.  We can invoke reset/suspend/resume methods
    // on the root hub ports, but that's not the same thing.

    // XXX similarly, PM interactions ... hmmm ...
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品系列免费在线观看| 亚洲精品免费在线| 中文字幕一区二区三区在线不卡 | 日本视频一区二区| 国产一区二区电影| 日本福利一区二区| 精品国产三级a在线观看| 国产精品夫妻自拍| 天堂午夜影视日韩欧美一区二区| 久久疯狂做爰流白浆xx| 99久久久久免费精品国产| 欧美日韩aaaaa| 国产精品午夜春色av| 亚洲成人免费在线观看| 国产精品18久久久久久久久久久久| 91美女视频网站| 精品国产精品一区二区夜夜嗨| 国产精品美女久久久久久久久| 午夜精品福利一区二区三区av| 国产精品一二三在| 7777精品伊人久久久大香线蕉完整版 | 日韩激情在线观看| 成人激情综合网站| 欧美一区二区三区视频免费播放| 国产欧美视频一区二区| 亚洲国产成人高清精品| 成人激情黄色小说| 欧美一卡二卡三卡四卡| 亚洲色图一区二区| 国产老肥熟一区二区三区| 欧美性色综合网| 日本一区二区视频在线观看| 日韩中文字幕区一区有砖一区 | 最新热久久免费视频| 秋霞国产午夜精品免费视频| 色婷婷综合视频在线观看| 久久精品亚洲国产奇米99| 婷婷夜色潮精品综合在线| 91在线观看一区二区| 26uuu亚洲| 青青青爽久久午夜综合久久午夜| 一本色道综合亚洲| 中文字幕第一区第二区| 精品制服美女丁香| 3d动漫精品啪啪| 一区二区三区在线观看视频| 成人精品国产免费网站| 337p日本欧洲亚洲大胆精品| 视频一区在线视频| 在线亚洲一区二区| ...中文天堂在线一区| 国产成人在线观看| 久久久亚洲精品石原莉奈| 奇米888四色在线精品| 欧美日本在线播放| 亚洲一区二区av在线| 色噜噜偷拍精品综合在线| 国产精品二区一区二区aⅴ污介绍| 国产精品中文有码| 久久综合色一综合色88| 久久9热精品视频| 日韩一区二区三区在线视频| 日韩电影免费在线| 在线播放中文字幕一区| 视频一区在线视频| 欧美一区二区三区人| 天天综合日日夜夜精品| 欧美午夜精品理论片a级按摩| 亚洲精品国产品国语在线app| av电影在线不卡| 日韩理论在线观看| 一区二区三区中文在线观看| 樱桃视频在线观看一区| 91亚洲精品乱码久久久久久蜜桃| 欧美国产精品劲爆| 福利电影一区二区| 国产欧美日韩综合精品一区二区| 国产999精品久久| 中文久久乱码一区二区| 成人av电影在线| 亚洲电影欧美电影有声小说| 欧美午夜精品一区二区三区| 亚洲国产中文字幕| 欧美一区二区三区视频| 久久国产精品免费| 久久综合国产精品| av网站一区二区三区| 中文字幕在线观看不卡视频| 色婷婷狠狠综合| 亚洲va欧美va国产va天堂影院| 欧美一区二区网站| 国产在线视频一区二区三区| 国产精品视频一二| 91麻豆国产香蕉久久精品| 亚洲成人av在线电影| 91精品国产麻豆| 国产盗摄视频一区二区三区| 亚洲视频一区二区在线| 欧美在线短视频| 首页国产欧美久久| 久久久另类综合| 99久久夜色精品国产网站| 亚洲国产精品人人做人人爽| 欧美精品一区二区三区久久久| 高清视频一区二区| 亚洲国产成人高清精品| 精品国产一区二区三区av性色| 福利一区在线观看| 亚洲第一精品在线| 久久精品人人爽人人爽| 色8久久精品久久久久久蜜| 捆绑变态av一区二区三区| 国产精品毛片大码女人| 91九色最新地址| 国产一区二区三区| 亚洲精品国产精华液| 欧美大片日本大片免费观看| av在线不卡观看免费观看| 偷拍与自拍一区| 欧美国产国产综合| 91精品国产入口在线| 国产成人a级片| 日韩国产精品91| 自拍偷拍亚洲综合| 日韩视频免费观看高清完整版 | 日本一区免费视频| 在线播放中文一区| 不卡的电视剧免费网站有什么| 亚洲国产日日夜夜| 国产清纯白嫩初高生在线观看91 | 一区二区三区免费在线观看| 日韩精品在线网站| 色婷婷国产精品久久包臀 | 国产日韩成人精品| 欧美老女人在线| youjizz国产精品| 日产精品久久久久久久性色 | 欧洲精品中文字幕| 国产综合色在线| 亚洲成人免费观看| 中文在线免费一区三区高中清不卡| 91麻豆精品国产91久久久久久| av电影天堂一区二区在线| 九九国产精品视频| 亚洲va国产天堂va久久en| 中文字幕综合网| 国产午夜一区二区三区| 日韩一区二区三区高清免费看看| 一本色道久久综合亚洲aⅴ蜜桃| 国产在线麻豆精品观看| 成人精品亚洲人成在线| 91精品国产综合久久精品| 国产在线精品一区二区夜色 | 色播五月激情综合网| 国产电影一区在线| 精品一区精品二区高清| 午夜日韩在线电影| 亚洲欧美一区二区不卡| 国产精品蜜臀av| 久久亚洲一级片| 日韩欧美国产三级| 欧美精品在线视频| 欧美性大战久久久久久久蜜臀 | 亚洲综合999| 亚洲天堂久久久久久久| 国产精品午夜久久| 日本一区二区免费在线| 日韩三级在线免费观看| 在线观看91av| 欧美精品视频www在线观看| 欧美三级一区二区| 欧美系列在线观看| 在线观看日韩毛片| 色婷婷精品久久二区二区蜜臀av| 不卡的电影网站| 99精品欧美一区二区蜜桃免费| 国产成人精品免费网站| 丰满亚洲少妇av| jiyouzz国产精品久久| 大尺度一区二区| 丁香一区二区三区| 成人毛片视频在线观看| 久久综合丝袜日本网| 久久久国产午夜精品| 国产91丝袜在线播放九色| 国产欧美va欧美不卡在线| 日韩午夜激情免费电影| 麻豆成人免费电影| 欧美r级在线观看| 成人av免费在线观看| 夜夜嗨av一区二区三区四季av| 欧美伊人久久久久久久久影院| 婷婷久久综合九色国产成人| 欧美日韩一卡二卡三卡| 麻豆91精品视频| 亚洲欧美日韩一区二区| 欧美日韩精品一区视频| 91蝌蚪国产九色| 久久成人羞羞网站| 国产精品一区在线观看你懂的|