| At line 1 changed 128 lines | 
| Example source code for a custom protocol handler for the virtual file system. | 
|  | 
| In the user manager, make a new VFS item.  Set its protocol to be CUSTOM, and use a URL like this: | 
|  | 
| CUSTOM_com.myprotocol.VFS_MyProtocol://any_data_you_want_on_the_url/ | 
|  | 
| {{{ | 
| package com.myprotocol; | 
|  | 
| import crushftp.handlers.*; | 
| import java.util.*; | 
| import java.io.*; | 
| import java.text.*; | 
| import crushftp.server.*; | 
|  | 
| public class VFS_MyProtocol | 
| { | 
| VFS uVFS = null; | 
| VRL url = null; | 
| Properties vItem = null; | 
|  | 
| public VFS_MyProtocol(VFS uVFS, String urlStr, Properties vItem) | 
| { | 
| this.uVFS = uVFS; | 
| this.url = new VRL(urlStr); | 
| this.vItem = vItem; | 
| } | 
|  | 
| public Properties get_item(String path) throws Exception | 
| { | 
| if (path.endsWith("/")) path = path.substring(0,path.length()-1); | 
| Properties dir_item = new Properties(); | 
| dir_item.put("url",url+path); | 
| dir_item.put("local","false"); | 
| dir_item.put("protocol", "ftp"); | 
| dir_item.put("type", "FILE"); | 
| dir_item.put("permissions", "drwxrwxrwx"); | 
| dir_item.put("num_items", "0"); | 
| dir_item.put("owner", "owner"); | 
| dir_item.put("group", "group"); | 
| dir_item.put("size", "0"); | 
| dir_item.put("month", "1"); | 
| dir_item.put("day", "1"); | 
| dir_item.put("time_or_year", "12:00"); | 
| dir_item.put("name", "test"); | 
| dir_item.put("local", "false"); | 
| dir_item.put("dir", path); | 
| return dir_item; | 
| } | 
|  | 
| public void getListing(Vector list, String path) throws Exception | 
| { | 
| if (path.startsWith("/")) path = path.substring(1); | 
| Common.debug(2,"ls "+url+path); | 
| } | 
|  | 
| public InputStream getInputStream(Long seekPos, Properties item) throws Exception | 
| { | 
| Common.debug(2,"get "+item.getProperty("url")); | 
|  | 
| InputStream inStream = null; | 
| long skipped = 0; | 
| long amt = seekPos - skipped; | 
| while(skipped < seekPos) | 
| { | 
| long l = inStream.skip(amt); | 
| if (l > 0) skipped += l; | 
| else break; | 
| amt = seekPos - skipped; | 
| } | 
|  | 
| return inStream; | 
| } | 
|  | 
| public OutputStream getOutputStream(Long seekPos, final Properties item) throws Exception | 
| { | 
| Common.debug(2,"put "+item.getProperty("url")); | 
|  | 
| OutputStream outStream = null; | 
|  | 
| return outStream; | 
| } | 
|  | 
| public String doCommand(String command, Properties item) throws Exception | 
| { | 
| Common.debug(2,command +" "+item.getProperty("url")); | 
| String s = ""; | 
| try | 
| { | 
| if (command.toUpperCase().startsWith("DELE")) | 
| { | 
| s = "250 OK"; | 
| } | 
| else if (command.toUpperCase().startsWith("RMD")) | 
| { | 
| s = "250 OK"; | 
| } | 
| else if (command.toUpperCase().startsWith("MKD")) | 
| { | 
| s = "257 OK"; | 
| } | 
| else if (command.toUpperCase().startsWith("MDTM")) | 
| { | 
| SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); | 
| s = "213 " + sdf.format(new Date()); | 
| } | 
| else if (command.toUpperCase().startsWith("SIZE")) | 
| { | 
| s = "213 0"; | 
| } | 
| else s = "200 Ignoring command."; | 
| } | 
| catch(Exception e) | 
| { | 
| Common.debug(1, e); | 
| s = "550 "+e.toString(); | 
| } | 
| return s; | 
| } | 
|  | 
| public Boolean rename(Properties item1, Properties item2) throws Exception | 
| { | 
| Common.debug(2,"rename "+item1.getProperty("url") + "   to   " + item2.getProperty("url")); | 
| return new Boolean(false); | 
| } | 
|  | 
| } | 
| }}} | 
| A custom VFS can be created too.  Contact me for details if you're a java programmer wanting to implement your own VFS.  This might be a VFS based on database records, or other things. |