001: /*
002: *
003: *
004: * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: */
026:
027: package javax.microedition.io.file;
028:
029: import com.sun.midp.events.*;
030: import com.sun.midp.security.*;
031:
032: import java.util.Enumeration;
033: import java.util.Vector;
034:
035: import com.sun.midp.io.j2me.file.Protocol;
036:
037: /**
038: * File system event handler.
039: */
040: abstract class FileSystemEventHandlerBase implements EventListener {
041:
042: /**
043: * Inner class to request security token from SecurityInitializer.
044: * SecurityInitializer should be able to check this inner class name.
045: */
046: static private class SecurityTrusted implements
047: ImplicitlyTrustedClass {
048: };
049:
050: /** Security token to allow access to implementation APIs */
051: private static SecurityToken classSecurityToken = SecurityInitializer
052: .requestToken(new SecurityTrusted());
053:
054: /**
055: * The EventListener to receive the MM events.
056: */
057: private static EventListener listener;
058:
059: /**
060: * Default constructor.
061: * Registers current isolate as interested in receiving mount/unmount
062: * events.
063: */
064: public FileSystemEventHandlerBase() {
065: registerListener();
066: }
067:
068: /**
069: * Performs clean up upon object destruction.
070: * Removes current isolate from the list of isolates interested in
071: * receiving mount/unmount events.
072: */
073: private native void finalize();
074:
075: /**
076: * Registers current isolate as interested in receiving mount/unmount
077: * events.
078: */
079: private native void registerListener();
080:
081: /**
082: * Register the event listener in the event queue.
083: *
084: * Security note: access specifier for this method is 'package private'
085: * so only classes from this package can access it.
086: *
087: * @param l <code>EventListener</code> for the MM events.
088: */
089: static void setListener(EventListener l) {
090: // Listener can be set only once.
091: if (listener != null) {
092: return;
093: }
094: listener = l;
095:
096: EventQueue evtq = EventQueue.getEventQueue(classSecurityToken);
097: evtq.registerEventListener(EventTypes.FC_DISKS_CHANGED_EVENT,
098: listener);
099: }
100:
101: /**
102: * Preprocess an event that is being posted to the event queue.
103: * This method will get called in the thread that posted the event.
104: *
105: * @param event event being posted
106: *
107: * @param waitingEvent previous event of this type waiting in the
108: * queue to be processed
109: *
110: * @return <code>true</code> to allow the post to continue,
111: * <code>false</code> to not post the event to the queue
112: */
113: public boolean preprocess(Event event, Event waitingEvent) {
114: if (event.getType() != EventTypes.FC_DISKS_CHANGED_EVENT) {
115: return false;
116: }
117:
118: if (waitingEvent != null) {
119: return false;
120: }
121:
122: return true;
123: }
124:
125: /**
126: * Process an event.
127: * This method will get called in the event queue processing thread.
128: *
129: * @param event event to process
130: */
131: public void process(Event event) {
132: if (event.getType() != EventTypes.FC_DISKS_CHANGED_EVENT) {
133: return;
134: }
135:
136: // Get up-to-date roots list from OS
137: Vector newRoots = Protocol.listRoots();
138:
139: // Get cached roots list from FileSystemRegistry
140: Vector oldRoots = new Vector(newRoots.size() + 1);
141: for (Enumeration e = FileSystemRegistry.listCachedRoots(); e
142: .hasMoreElements();) {
143: oldRoots.addElement(e.nextElement());
144: }
145:
146: // Find all removed roots and notify FileSystemRegistry about them
147: for (int i = 0; i < oldRoots.size(); i++) {
148: String root = (String) oldRoots.elementAt(i);
149: if (!newRoots.contains(root)) {
150: FileSystemRegistry.removeRoot(root);
151: } else {
152: newRoots.removeElement(root);
153: }
154: }
155:
156: // Notify FileSystemRegistry about all added roots if any
157: for (int i = 0; i < newRoots.size(); i++) {
158: String root = (String) newRoots.elementAt(i);
159: FileSystemRegistry.addRoot(root);
160: }
161: }
162: }
|