From: <kp...@us...> - 2006-09-25 19:57:15
|
Revision: 7128 http://svn.sourceforge.net/jedit/?rev=7128&view=rev Author: kpouer Date: 2006-09-25 12:56:53 -0700 (Mon, 25 Sep 2006) Log Message: ----------- Added Paths: ----------- jEdit/trunk/org/gjt/sp/jedit/bufferio/ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferAutosaveRequest.java jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferIORequest.java jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferInsertRequest.java jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferLoadRequest.java jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferSaveRequest.java jEdit/trunk/org/gjt/sp/jedit/bufferio/MarkersSaveRequest.java Removed Paths: ------------- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferAutosaveRequest.java jEdit/trunk/org/gjt/sp/jedit/buffer/BufferIORequest.java jEdit/trunk/org/gjt/sp/jedit/buffer/BufferInsertRequest.java jEdit/trunk/org/gjt/sp/jedit/buffer/BufferLoadRequest.java jEdit/trunk/org/gjt/sp/jedit/buffer/BufferSaveRequest.java jEdit/trunk/org/gjt/sp/jedit/buffer/MarkersSaveRequest.java Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/BufferAutosaveRequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferAutosaveRequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/BufferAutosaveRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,97 +0,0 @@ -/* - * BufferAutosaveRequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2005 Slava Pestov - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import java.io.*; -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.jedit.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A buffer autosave request. - * @author Slava Pestov - * @version $Id$ - */ -public class BufferAutosaveRequest extends BufferIORequest -{ - //{{{ BufferAutosaveRequest constructor - /** - * Creates a new buffer I/O request. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public BufferAutosaveRequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - super(view,buffer,session,vfs,path); - } //}}} - - //{{{ run() method - public void run() - { - OutputStream out = null; - - try - { - String[] args = { vfs.getFileName(path) }; - setStatus(jEdit.getProperty("vfs.status.autosave",args)); - - // the entire save operation can be aborted... - setAbortable(true); - - try - { - //buffer.readLock(); - - if(!buffer.isDirty()) - { - // buffer has been saved while we - // were waiting. - return; - } - - out = vfs._createOutputStream(session,path,view); - if(out == null) - return; - - write(buffer,out); - } - catch(Exception e) - { - } - //finally - //{ - //buffer.readUnlock(); - //} - } - catch(WorkThread.Abort a) - { - IOUtilities.closeQuietly(out); - } - } //}}} -} Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/BufferIORequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferIORequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/BufferIORequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,414 +0,0 @@ -/* - * BufferIORequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2004 Slava Pestov - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import javax.swing.text.Segment; -import java.io.*; -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.jedit.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A buffer I/O request. - * @author Slava Pestov - * @version $Id$ - */ -public abstract class BufferIORequest extends WorkRequest -{ - //{{{ Constants - public static final int UTF8_MAGIC_1 = 0xef; - public static final int UTF8_MAGIC_2 = 0xbb; - public static final int UTF8_MAGIC_3 = 0xbf; - - /** - * Magic numbers used for auto-detecting Unicode and GZIP files. - */ - public static final int GZIP_MAGIC_1 = 0x1f; - public static final int GZIP_MAGIC_2 = 0x8b; - public static final int UNICODE_MAGIC_1 = 0xfe; - public static final int UNICODE_MAGIC_2 = 0xff; - - /** - * Length of longest XML PI used for encoding detection.<p> - * <?xml version="1.0" encoding="................"?> - */ - public static final int XML_PI_LENGTH = 50; - - /** - * Size of I/O buffers. - */ - public static final int IOBUFSIZE = 32768; - - /** - * Number of lines per progress increment. - */ - public static final int PROGRESS_INTERVAL = 300; - - public static final String LOAD_DATA = "BufferIORequest__loadData"; - public static final String END_OFFSETS = "BufferIORequest__endOffsets"; - public static final String NEW_PATH = "BufferIORequest__newPath"; - - /** - * Buffer boolean property set when an error occurs. - */ - public static final String ERROR_OCCURRED = "BufferIORequest__error"; - - //}}} - - //{{{ BufferIORequest constructor - /** - * Creates a new buffer I/O request. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public BufferIORequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - this.view = view; - this.buffer = buffer; - this.session = session; - this.vfs = vfs; - this.path = path; - - markersPath = vfs.getParentOfPath(path) - + '.' + vfs.getFileName(path) - + ".marks"; - } //}}} - - //{{{ toString() method - public String toString() - { - return getClass().getName() + "[" + buffer + "]"; - } //}}} - - //{{{ Private members - - //{{{ Instance variables - protected View view; - protected Buffer buffer; - protected Object session; - protected VFS vfs; - protected String path; - protected String markersPath; - //}}} - - //{{{ autodetect() method - /** - * Tries to detect if the stream is gzipped, and if it has an encoding - * specified with an XML PI. - */ - protected Reader autodetect(InputStream in) throws IOException - { - return MiscUtilities.autodetect(in, buffer); - } //}}} - - //{{{ read() method - protected SegmentBuffer read(Reader in, long length, - boolean insert) throws IOException - { - /* we guess an initial size for the array */ - IntegerArray endOffsets = new IntegerArray( - Math.max(1,(int)(length / 50))); - - // only true if the file size is known - boolean trackProgress = (!buffer.isTemporary() && length != 0); - - if(trackProgress) - { - setMaximum(length); - setValue(0); - } - - // if the file size is not known, start with a resonable - // default buffer size - if(length == 0) - length = IOBUFSIZE; - - SegmentBuffer seg = new SegmentBuffer((int)length + 1); - - char[] buf = new char[IOBUFSIZE]; - - // Number of characters in 'buf' array. - // InputStream.read() doesn't always fill the - // array (eg, the file size is not a multiple of - // IOBUFSIZE, or it is a GZipped file, etc) - int len; - - // True if a \n was read after a \r. Usually - // means this is a DOS/Windows file - boolean CRLF = false; - - // A \r was read, hence a MacOS file - boolean CROnly = false; - - // Was the previous read character a \r? - // If we read a \n and this is true, we assume - // we have a DOS/Windows file - boolean lastWasCR = false; - - // Number of lines read. Every 100 lines, we update the - // progress bar - int lineCount = 0; - - while((len = in.read(buf,0,buf.length)) != -1) - { - // Offset of previous line, relative to - // the start of the I/O buffer (NOT - // relative to the start of the document) - int lastLine = 0; - - for(int i = 0; i < len; i++) - { - // Look for line endings. - switch(buf[i]) - { - case '\r': - // If we read a \r and - // lastWasCR is also true, - // it is probably a Mac file - // (\r\r in stream) - if(lastWasCR) - { - CROnly = true; - CRLF = false; - } - // Otherwise set a flag, - // so that \n knows that last - // was a \r - else - { - lastWasCR = true; - } - - // Insert a line - seg.append(buf,lastLine,i - - lastLine); - seg.append('\n'); - endOffsets.add(seg.count); - if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0) - setValue(seg.count); - - // This is i+1 to take the - // trailing \n into account - lastLine = i + 1; - break; - case '\n': - // If lastWasCR is true, - // we just read a \r followed - // by a \n. We specify that - // this is a Windows file, - // but take no further - // action and just ignore - // the \r. - if(lastWasCR) - { - CROnly = false; - CRLF = true; - lastWasCR = false; - // Bump lastLine so - // that the next line - // doesn't erronously - // pick up the \r - lastLine = i + 1; - } - // Otherwise, we found a \n - // that follows some other - // character, hence we have - // a Unix file - else - { - CROnly = false; - CRLF = false; - seg.append(buf,lastLine, - i - lastLine); - seg.append('\n'); - endOffsets.add(seg.count); - if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0) - setValue(seg.count); - lastLine = i + 1; - } - break; - default: - // If we find some other - // character that follows - // a \r, so it is not a - // Windows file, and probably - // a Mac file - if(lastWasCR) - { - CROnly = true; - CRLF = false; - lastWasCR = false; - } - break; - } - } - - if(trackProgress) - setValue(seg.count); - - // Add remaining stuff from buffer - seg.append(buf,lastLine,len - lastLine); - } - - setAbortable(false); - - String lineSeparator; - if(seg.count == 0) - { - // fix for "[ 865589 ] 0-byte files should open using - // the default line seperator" - lineSeparator = jEdit.getProperty( - "buffer.lineSeparator", - System.getProperty("line.separator")); - } - else if(CRLF) - lineSeparator = "\r\n"; - else if(CROnly) - lineSeparator = "\r"; - else - lineSeparator = "\n"; - - in.close(); - - // Chop trailing newline and/or ^Z (if any) - int bufferLength = seg.count; - if(bufferLength != 0) - { - char ch = seg.array[bufferLength - 1]; - if(ch == 0x1a /* DOS ^Z */) - seg.count--; - } - - buffer.setBooleanProperty(Buffer.TRAILING_EOL,false); - if(bufferLength != 0 && jEdit.getBooleanProperty("stripTrailingEOL")) - { - char ch = seg.array[bufferLength - 1]; - if(ch == '\n') - { - buffer.setBooleanProperty(Buffer.TRAILING_EOL,true); - seg.count--; - endOffsets.setSize(endOffsets.getSize() - 1); - } - } - - // add a line marker at the end for proper offset manager - // operation - endOffsets.add(seg.count + 1); - - // to avoid having to deal with read/write locks and such, - // we insert the loaded data into the buffer in the - // post-load cleanup runnable, which runs in the AWT thread. - if(!insert) - { - buffer.setProperty(LOAD_DATA,seg); - buffer.setProperty(END_OFFSETS,endOffsets); - buffer.setProperty(NEW_PATH,path); - if(lineSeparator != null) - buffer.setProperty(Buffer.LINESEP,lineSeparator); - } - - // used in insert() - return seg; - } //}}} - - //{{{ write() method - protected void write(Buffer buffer, OutputStream _out) - throws IOException - { - BufferedWriter out = null; - - try - { - String encoding = buffer.getStringProperty(Buffer.ENCODING); - if(encoding.equals(MiscUtilities.UTF_8_Y)) - { - // not supported by Java... - _out.write(UTF8_MAGIC_1); - _out.write(UTF8_MAGIC_2); - _out.write(UTF8_MAGIC_3); - _out.flush(); - encoding = "UTF-8"; - } - else if (encoding.equals("UTF-16LE")) - { - _out.write(UNICODE_MAGIC_2); - _out.write(UNICODE_MAGIC_1); - _out.flush(); - } - else if (encoding.equals("UTF-16BE")) - { - _out.write(UNICODE_MAGIC_1); - _out.write(UNICODE_MAGIC_2); - _out.flush(); - } - out = new BufferedWriter( - new OutputStreamWriter(_out,encoding), - IOBUFSIZE); - - Segment lineSegment = new Segment(); - String newline = buffer.getStringProperty(Buffer.LINESEP); - if(newline == null) - newline = System.getProperty("line.separator"); - - setMaximum(buffer.getLineCount() / PROGRESS_INTERVAL); - setValue(0); - - int i = 0; - while(i < buffer.getLineCount()) - { - buffer.getLineText(i,lineSegment); - out.write(lineSegment.array,lineSegment.offset, - lineSegment.count); - - if(i != buffer.getLineCount() - 1) - { - out.write(newline); - } - - if(++i % PROGRESS_INTERVAL == 0) - setValue(i / PROGRESS_INTERVAL); - } - - if(jEdit.getBooleanProperty("stripTrailingEOL") - && buffer.getBooleanProperty(Buffer.TRAILING_EOL)) - { - out.write(newline); - } - } - finally - { - if(out != null) - out.close(); - else - _out.close(); - } - } //}}} - - //}}} -} Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/BufferInsertRequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferInsertRequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/BufferInsertRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,129 +0,0 @@ -/* - * BufferInsertRequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2005 Slava Pestov - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import java.io.*; -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.jedit.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A buffer insert request. - * @author Slava Pestov - * @version $Id$ - */ -public class BufferInsertRequest extends BufferIORequest -{ - //{{{ BufferInsertRequest constructor - /** - * Creates a new buffer I/O request. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public BufferInsertRequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - super(view,buffer,session,vfs,path); - } //}}} - - //{{{ run() method - public void run() - { - InputStream in = null; - - try - { - try - { - String[] args = { vfs.getFileName(path) }; - setStatus(jEdit.getProperty("vfs.status.load",args)); - setAbortable(true); - - path = vfs._canonPath(session,path,view); - - VFSFile entry = vfs._getFile( - session,path,view); - long length; - if(entry != null) - length = entry.getLength(); - else - length = 0L; - - in = vfs._createInputStream(session,path,false,view); - if(in == null) - return; - - final SegmentBuffer seg = read( - autodetect(in),length,true); - - /* we don't do this in Buffer.insert() so that - we can insert multiple files at once */ - VFSManager.runInAWTThread(new Runnable() - { - public void run() - { - view.getTextArea().setSelectedText( - seg.toString()); - } - }); - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - String[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.read-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } - catch(WorkThread.Abort a) - { - IOUtilities.closeQuietly(in); - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - finally - { - try - { - vfs._endVFSSession(session,view); - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - String[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.read-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(WorkThread.Abort a) - { - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } - } //}}} -} Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/BufferLoadRequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferLoadRequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/BufferLoadRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,204 +0,0 @@ -/* - * BufferLoadRequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2005 Slava Pestov - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import java.io.*; -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.jedit.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A buffer load request. - * @author Slava Pestov - * @version $Id$ - */ -public class BufferLoadRequest extends BufferIORequest -{ - //{{{ BufferLoadRequest constructor - /** - * Creates a new buffer I/O request. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public BufferLoadRequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - super(view,buffer,session,vfs,path); - } //}}} - - //{{{ run() method - public void run() - { - InputStream in = null; - - try - { - try - { - String[] args = { vfs.getFileName(path) }; - setAbortable(true); - if(!buffer.isTemporary()) - { - setStatus(jEdit.getProperty("vfs.status.load",args)); - setValue(0L); - } - - path = vfs._canonPath(session,path,view); - - VFSFile entry = vfs._getFile( - session,path,view); - long length; - if(entry != null) - length = entry.getLength(); - else - length = 0L; - - in = vfs._createInputStream(session,path, - false,view); - if(in == null) - return; - - read(autodetect(in),length,false); - buffer.setNewFile(false); - } - catch(CharConversionException ch) - { - Log.log(Log.ERROR,this,ch); - Object[] pp = { buffer.getProperty(JEditBuffer.ENCODING), - ch.toString() }; - VFSManager.error(view,path,"ioerror.encoding-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(UnsupportedEncodingException uu) - { - Log.log(Log.ERROR,this,uu); - Object[] pp = { buffer.getProperty(JEditBuffer.ENCODING), - uu.toString() }; - VFSManager.error(view,path,"ioerror.encoding-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - Object[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.read-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(OutOfMemoryError oom) - { - Log.log(Log.ERROR,this,oom); - VFSManager.error(view,path,"out-of-memory-error",null); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - - if(jEdit.getBooleanProperty("persistentMarkers")) - { - try - { - String[] args = { vfs.getFileName(path) }; - if(!buffer.isTemporary()) - setStatus(jEdit.getProperty("vfs.status.load-markers",args)); - setAbortable(true); - - in = vfs._createInputStream(session,markersPath,true,view); - if(in != null) - readMarkers(buffer,in); - } - catch(IOException io) - { - // ignore - } - } - } - catch(WorkThread.Abort a) - { - IOUtilities.closeQuietly(in); - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - finally - { - try - { - vfs._endVFSSession(session,view); - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - String[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.read-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(WorkThread.Abort a) - { - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } - } //}}} - - //{{{ readMarkers() method - private static void readMarkers(Buffer buffer, InputStream _in) - throws IOException - { - // For `reload' command - buffer.removeAllMarkers(); - - BufferedReader in = new BufferedReader(new InputStreamReader(_in)); - - try - { - String line; - while((line = in.readLine()) != null) - { - // malformed marks file? - if(line.length() == 0) - continue; - - // compatibility kludge for jEdit 3.1 and earlier - if(line.charAt(0) != '!') - continue; - - - char shortcut = line.charAt(1); - int start = line.indexOf(';'); - int end = line.indexOf(';',start + 1); - int position = Integer.parseInt(line.substring(start + 1,end)); - buffer.addMarker(shortcut,position); - } - buffer.setMarkersChanged(false); - } - finally - { - in.close(); - } - } //}}} -} Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/BufferSaveRequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/BufferSaveRequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/BufferSaveRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,202 +0,0 @@ -/* - * BufferSaveRequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * Copyright (C) 2000, 2005 Slava Pestov - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import java.io.*; -import java.util.zip.*; -import java.util.List; - -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.jedit.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A buffer save request. - * @author Slava Pestov - * @version $Id$ - */ -public class BufferSaveRequest extends BufferIORequest -{ - //{{{ BufferSaveRequest constructor - /** - * Creates a new buffer I/O request. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public BufferSaveRequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - super(view,buffer,session,vfs,path); - } //}}} - - //{{{ run() method - public void run() - { - OutputStream out = null; - - boolean vfsRenameCap = (vfs.getCapabilities() & - VFS.RENAME_CAP) != 0; - - boolean overwriteReadOnly = buffer.getBooleanProperty("overwriteReadonly"); - - /* if the VFS supports renaming files, we first - * save to #<filename>#save#, then rename that - * to <filename>, so that if the save fails, - * data will not be lost. - * - * as of 4.1pre7 we now call vfs.getTwoStageSaveName() - * instead of constructing the path directly - * since some VFS's might not allow # in filenames. - */ - - boolean twoStageSave = overwriteReadOnly || - (vfsRenameCap && - jEdit.getBooleanProperty("twoStageSave")); - - try - { - String[] args = { vfs.getFileName(path) }; - setStatus(jEdit.getProperty("vfs.status.save",args)); - - // the entire save operation can be aborted... - setAbortable(true); - - path = vfs._canonPath(session,path,view); - if(!MiscUtilities.isURL(path)) - path = MiscUtilities.resolveSymlinks(path); - - - // Only backup once per session - if(buffer.getProperty(Buffer.BACKED_UP) == null - || jEdit.getBooleanProperty("backupEverySave")) - { - vfs._backup(session,path,view); - buffer.setBooleanProperty(Buffer.BACKED_UP,true); - } - - String savePath; - if(twoStageSave) - { - savePath = vfs.getTwoStageSaveName(path); - if (savePath == null) - { - twoStageSave = false; - savePath = path; - } - } - else - savePath = path; - - out = vfs._createOutputStream(session,savePath,view); - - try - { - // this must be after the stream is created or - // we deadlock with SSHTools. - buffer.readLock(); - if(out != null) - { - // Can't use buffer.getName() here because - // it is not changed until the save is - // complete - if(path.endsWith(".gz")) - buffer.setBooleanProperty(Buffer.GZIPPED,true); - else if (buffer.getName().endsWith(".gz")) - { - // The path do not ends with gz. - // The buffer name was .gz. - // So it means it's blabla.txt.gz -> blabla.txt, I remove - // the gz property - buffer.setBooleanProperty(Buffer.GZIPPED, false); - } - - if(buffer.getBooleanProperty(Buffer.GZIPPED)) - out = new GZIPOutputStream(out); - - write(buffer,out); - - if(twoStageSave) - { - if(!vfs._rename(session,savePath,path,view)) - throw new IOException("Rename failed: " + savePath); - } - - } - else - buffer.setBooleanProperty(ERROR_OCCURRED,true); - - if(!twoStageSave) - VFSManager.sendVFSUpdate(vfs,path,true); - } - finally - { - buffer.readUnlock(); - } - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - String[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.write-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(WorkThread.Abort a) - { - IOUtilities.closeQuietly(out); - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - finally - { - try - { - vfs._saveComplete(session,buffer,path,view); - if( twoStageSave ) - { - vfs._finishTwoStageSave(session,buffer,path,view); - } - // clean up left-over markers file - if(!jEdit.getBooleanProperty("persistentMarkers")) - vfs._delete(session,buffer.getMarkersPath(vfs),view); - vfs._endVFSSession(session,view); - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - String[] pp = { io.toString() }; - VFSManager.error(view,path,"ioerror.write-error",pp); - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - catch(WorkThread.Abort a) - { - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } - } //}}} -} Deleted: jEdit/trunk/org/gjt/sp/jedit/buffer/MarkersSaveRequest.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/buffer/MarkersSaveRequest.java 2006-09-25 19:21:13 UTC (rev 7127) +++ jEdit/trunk/org/gjt/sp/jedit/buffer/MarkersSaveRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -1,155 +0,0 @@ -/* {{{ MarkersSaveRequest.java - I/O request - * :tabSize=8:indentSize=8:noTabs=false: - * :folding=explicit:collapseFolds=1: - * - * based on jEdit.buffer.BufferSaveRequest (Copyright (C) 2000, 2005 Slava Pestov) - * Copyright (C) 2005 Martin Raspe - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; - -//{{{ Imports -import java.io.*; -import java.util.Vector; -import org.gjt.sp.jedit.*; -import org.gjt.sp.jedit.io.*; -import org.gjt.sp.util.*; -//}}} - -/** - * A save request for markers. Factored out from BufferSaveRequest.java - * - * @author Martin Raspe - * @created May 20, 2005 - * @modified $Date: 2006/03/10 12:49:17 $ by $Author: hertzhaft $ - */ - -public class MarkersSaveRequest extends WorkRequest -{ - //{{{ Constants - public static final String ERROR_OCCURRED = "MarkersSaveRequest__error"; - //}}} - - //{{{ MarkersSaveRequest constructor - /** - * Creates a new I/O request for markers. - * @param view The view - * @param buffer The buffer - * @param session The VFS session - * @param vfs The VFS - * @param path The path - */ - public MarkersSaveRequest(View view, Buffer buffer, - Object session, VFS vfs, String path) - { - this.view = view; - this.buffer = buffer; - this.session = session; - this.vfs = vfs; - this.path = path; - this.markersPath = buffer.getMarkersPath(vfs); - - } //}}} - - //{{{ run() method - public void run() - { - OutputStream out = null; - - try - { - // the entire save operation can be aborted... - setAbortable(true); - try - { - // We only save markers to VFS's that support deletion. - // Otherwise, we will accumilate stale marks files. - if((vfs.getCapabilities() & VFS.DELETE_CAP) != 0) - { - if(buffer.getMarkers().isEmpty()) - vfs._delete(session,markersPath,view); - else - { - String[] args = { vfs.getFileName(path) }; - setStatus(jEdit.getProperty("vfs.status.save-markers",args)); - setValue(0); - out = vfs._createOutputStream(session,markersPath,view); - if(out != null) - writeMarkers(out); - } - } - } - catch(IOException io) - { - Log.log(Log.ERROR,this,io); - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } - catch(WorkThread.Abort a) - { - if(out != null) - { - try - { - out.close(); - } - catch(IOException io) - { - } - } - - buffer.setBooleanProperty(ERROR_OCCURRED,true); - } - } //}}} - - //{{{ writeMarkers() method - private void writeMarkers(OutputStream out) - throws IOException - { - Writer o = new BufferedWriter(new OutputStreamWriter(out)); - try - { - Vector markers = buffer.getMarkers(); - for(int i = 0; i < markers.size(); i++) - { - Marker marker = (Marker)markers.elementAt(i); - o.write('!'); - o.write(marker.getShortcut()); - o.write(';'); - - String pos = String.valueOf(marker.getPosition()); - o.write(pos); - o.write(';'); - o.write(pos); - o.write('\n'); - } - } - finally - { - o.close(); - } - } //}}} - - //{{{ Instance variables - protected View view; - protected Buffer buffer; - protected Object session; - protected VFS vfs; - protected String path; - protected String markersPath; - //}}} - -} Copied: jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferAutosaveRequest.java (from rev 7127, jEdit/trunk/org/gjt/sp/jedit/buffer/BufferAutosaveRequest.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferAutosaveRequest.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferAutosaveRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -0,0 +1,97 @@ +/* + * BufferAutosaveRequest.java - I/O request + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2000, 2005 Slava Pestov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; + +//{{{ Imports +import java.io.*; +import org.gjt.sp.jedit.io.*; +import org.gjt.sp.jedit.*; +import org.gjt.sp.util.*; +//}}} + +/** + * A buffer autosave request. + * @author Slava Pestov + * @version $Id$ + */ +public class BufferAutosaveRequest extends BufferIORequest +{ + //{{{ BufferAutosaveRequest constructor + /** + * Creates a new buffer I/O request. + * @param view The view + * @param buffer The buffer + * @param session The VFS session + * @param vfs The VFS + * @param path The path + */ + public BufferAutosaveRequest(View view, Buffer buffer, + Object session, VFS vfs, String path) + { + super(view,buffer,session,vfs,path); + } //}}} + + //{{{ run() method + public void run() + { + OutputStream out = null; + + try + { + String[] args = { vfs.getFileName(path) }; + setStatus(jEdit.getProperty("vfs.status.autosave",args)); + + // the entire save operation can be aborted... + setAbortable(true); + + try + { + //buffer.readLock(); + + if(!buffer.isDirty()) + { + // buffer has been saved while we + // were waiting. + return; + } + + out = vfs._createOutputStream(session,path,view); + if(out == null) + return; + + write(buffer,out); + } + catch(Exception e) + { + } + //finally + //{ + //buffer.readUnlock(); + //} + } + catch(WorkThread.Abort a) + { + IOUtilities.closeQuietly(out); + } + } //}}} +} Copied: jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferIORequest.java (from rev 7127, jEdit/trunk/org/gjt/sp/jedit/buffer/BufferIORequest.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferIORequest.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferIORequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -0,0 +1,414 @@ +/* + * BufferIORequest.java - I/O request + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2000, 2004 Slava Pestov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; + +//{{{ Imports +import javax.swing.text.Segment; +import java.io.*; +import org.gjt.sp.jedit.io.*; +import org.gjt.sp.jedit.*; +import org.gjt.sp.util.*; +//}}} + +/** + * A buffer I/O request. + * @author Slava Pestov + * @version $Id$ + */ +public abstract class BufferIORequest extends WorkRequest +{ + //{{{ Constants + public static final int UTF8_MAGIC_1 = 0xef; + public static final int UTF8_MAGIC_2 = 0xbb; + public static final int UTF8_MAGIC_3 = 0xbf; + + /** + * Magic numbers used for auto-detecting Unicode and GZIP files. + */ + public static final int GZIP_MAGIC_1 = 0x1f; + public static final int GZIP_MAGIC_2 = 0x8b; + public static final int UNICODE_MAGIC_1 = 0xfe; + public static final int UNICODE_MAGIC_2 = 0xff; + + /** + * Length of longest XML PI used for encoding detection.<p> + * <?xml version="1.0" encoding="................"?> + */ + public static final int XML_PI_LENGTH = 50; + + /** + * Size of I/O buffers. + */ + public static final int IOBUFSIZE = 32768; + + /** + * Number of lines per progress increment. + */ + public static final int PROGRESS_INTERVAL = 300; + + public static final String LOAD_DATA = "BufferIORequest__loadData"; + public static final String END_OFFSETS = "BufferIORequest__endOffsets"; + public static final String NEW_PATH = "BufferIORequest__newPath"; + + /** + * Buffer boolean property set when an error occurs. + */ + public static final String ERROR_OCCURRED = "BufferIORequest__error"; + + //}}} + + //{{{ BufferIORequest constructor + /** + * Creates a new buffer I/O request. + * @param view The view + * @param buffer The buffer + * @param session The VFS session + * @param vfs The VFS + * @param path The path + */ + public BufferIORequest(View view, Buffer buffer, + Object session, VFS vfs, String path) + { + this.view = view; + this.buffer = buffer; + this.session = session; + this.vfs = vfs; + this.path = path; + + markersPath = vfs.getParentOfPath(path) + + '.' + vfs.getFileName(path) + + ".marks"; + } //}}} + + //{{{ toString() method + public String toString() + { + return getClass().getName() + "[" + buffer + "]"; + } //}}} + + //{{{ Private members + + //{{{ Instance variables + protected View view; + protected Buffer buffer; + protected Object session; + protected VFS vfs; + protected String path; + protected String markersPath; + //}}} + + //{{{ autodetect() method + /** + * Tries to detect if the stream is gzipped, and if it has an encoding + * specified with an XML PI. + */ + protected Reader autodetect(InputStream in) throws IOException + { + return MiscUtilities.autodetect(in, buffer); + } //}}} + + //{{{ read() method + protected SegmentBuffer read(Reader in, long length, + boolean insert) throws IOException + { + /* we guess an initial size for the array */ + IntegerArray endOffsets = new IntegerArray( + Math.max(1,(int)(length / 50))); + + // only true if the file size is known + boolean trackProgress = (!buffer.isTemporary() && length != 0); + + if(trackProgress) + { + setMaximum(length); + setValue(0); + } + + // if the file size is not known, start with a resonable + // default buffer size + if(length == 0) + length = IOBUFSIZE; + + SegmentBuffer seg = new SegmentBuffer((int)length + 1); + + char[] buf = new char[IOBUFSIZE]; + + // Number of characters in 'buf' array. + // InputStream.read() doesn't always fill the + // array (eg, the file size is not a multiple of + // IOBUFSIZE, or it is a GZipped file, etc) + int len; + + // True if a \n was read after a \r. Usually + // means this is a DOS/Windows file + boolean CRLF = false; + + // A \r was read, hence a MacOS file + boolean CROnly = false; + + // Was the previous read character a \r? + // If we read a \n and this is true, we assume + // we have a DOS/Windows file + boolean lastWasCR = false; + + // Number of lines read. Every 100 lines, we update the + // progress bar + int lineCount = 0; + + while((len = in.read(buf,0,buf.length)) != -1) + { + // Offset of previous line, relative to + // the start of the I/O buffer (NOT + // relative to the start of the document) + int lastLine = 0; + + for(int i = 0; i < len; i++) + { + // Look for line endings. + switch(buf[i]) + { + case '\r': + // If we read a \r and + // lastWasCR is also true, + // it is probably a Mac file + // (\r\r in stream) + if(lastWasCR) + { + CROnly = true; + CRLF = false; + } + // Otherwise set a flag, + // so that \n knows that last + // was a \r + else + { + lastWasCR = true; + } + + // Insert a line + seg.append(buf,lastLine,i - + lastLine); + seg.append('\n'); + endOffsets.add(seg.count); + if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0) + setValue(seg.count); + + // This is i+1 to take the + // trailing \n into account + lastLine = i + 1; + break; + case '\n': + // If lastWasCR is true, + // we just read a \r followed + // by a \n. We specify that + // this is a Windows file, + // but take no further + // action and just ignore + // the \r. + if(lastWasCR) + { + CROnly = false; + CRLF = true; + lastWasCR = false; + // Bump lastLine so + // that the next line + // doesn't erronously + // pick up the \r + lastLine = i + 1; + } + // Otherwise, we found a \n + // that follows some other + // character, hence we have + // a Unix file + else + { + CROnly = false; + CRLF = false; + seg.append(buf,lastLine, + i - lastLine); + seg.append('\n'); + endOffsets.add(seg.count); + if(trackProgress && lineCount++ % PROGRESS_INTERVAL == 0) + setValue(seg.count); + lastLine = i + 1; + } + break; + default: + // If we find some other + // character that follows + // a \r, so it is not a + // Windows file, and probably + // a Mac file + if(lastWasCR) + { + CROnly = true; + CRLF = false; + lastWasCR = false; + } + break; + } + } + + if(trackProgress) + setValue(seg.count); + + // Add remaining stuff from buffer + seg.append(buf,lastLine,len - lastLine); + } + + setAbortable(false); + + String lineSeparator; + if(seg.count == 0) + { + // fix for "[ 865589 ] 0-byte files should open using + // the default line seperator" + lineSeparator = jEdit.getProperty( + "buffer.lineSeparator", + System.getProperty("line.separator")); + } + else if(CRLF) + lineSeparator = "\r\n"; + else if(CROnly) + lineSeparator = "\r"; + else + lineSeparator = "\n"; + + in.close(); + + // Chop trailing newline and/or ^Z (if any) + int bufferLength = seg.count; + if(bufferLength != 0) + { + char ch = seg.array[bufferLength - 1]; + if(ch == 0x1a /* DOS ^Z */) + seg.count--; + } + + buffer.setBooleanProperty(Buffer.TRAILING_EOL,false); + if(bufferLength != 0 && jEdit.getBooleanProperty("stripTrailingEOL")) + { + char ch = seg.array[bufferLength - 1]; + if(ch == '\n') + { + buffer.setBooleanProperty(Buffer.TRAILING_EOL,true); + seg.count--; + endOffsets.setSize(endOffsets.getSize() - 1); + } + } + + // add a line marker at the end for proper offset manager + // operation + endOffsets.add(seg.count + 1); + + // to avoid having to deal with read/write locks and such, + // we insert the loaded data into the buffer in the + // post-load cleanup runnable, which runs in the AWT thread. + if(!insert) + { + buffer.setProperty(LOAD_DATA,seg); + buffer.setProperty(END_OFFSETS,endOffsets); + buffer.setProperty(NEW_PATH,path); + if(lineSeparator != null) + buffer.setProperty(Buffer.LINESEP,lineSeparator); + } + + // used in insert() + return seg; + } //}}} + + //{{{ write() method + protected void write(Buffer buffer, OutputStream _out) + throws IOException + { + BufferedWriter out = null; + + try + { + String encoding = buffer.getStringProperty(Buffer.ENCODING); + if(encoding.equals(MiscUtilities.UTF_8_Y)) + { + // not supported by Java... + _out.write(UTF8_MAGIC_1); + _out.write(UTF8_MAGIC_2); + _out.write(UTF8_MAGIC_3); + _out.flush(); + encoding = "UTF-8"; + } + else if (encoding.equals("UTF-16LE")) + { + _out.write(UNICODE_MAGIC_2); + _out.write(UNICODE_MAGIC_1); + _out.flush(); + } + else if (encoding.equals("UTF-16BE")) + { + _out.write(UNICODE_MAGIC_1); + _out.write(UNICODE_MAGIC_2); + _out.flush(); + } + out = new BufferedWriter( + new OutputStreamWriter(_out,encoding), + IOBUFSIZE); + + Segment lineSegment = new Segment(); + String newline = buffer.getStringProperty(Buffer.LINESEP); + if(newline == null) + newline = System.getProperty("line.separator"); + + setMaximum(buffer.getLineCount() / PROGRESS_INTERVAL); + setValue(0); + + int i = 0; + while(i < buffer.getLineCount()) + { + buffer.getLineText(i,lineSegment); + out.write(lineSegment.array,lineSegment.offset, + lineSegment.count); + + if(i != buffer.getLineCount() - 1) + { + out.write(newline); + } + + if(++i % PROGRESS_INTERVAL == 0) + setValue(i / PROGRESS_INTERVAL); + } + + if(jEdit.getBooleanProperty("stripTrailingEOL") + && buffer.getBooleanProperty(Buffer.TRAILING_EOL)) + { + out.write(newline); + } + } + finally + { + if(out != null) + out.close(); + else + _out.close(); + } + } //}}} + + //}}} +} Copied: jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferInsertRequest.java (from rev 7127, jEdit/trunk/org/gjt/sp/jedit/buffer/BufferInsertRequest.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferInsertRequest.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferInsertRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -0,0 +1,129 @@ +/* + * BufferInsertRequest.java - I/O request + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2000, 2005 Slava Pestov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; + +//{{{ Imports +import java.io.*; +import org.gjt.sp.jedit.io.*; +import org.gjt.sp.jedit.*; +import org.gjt.sp.util.*; +//}}} + +/** + * A buffer insert request. + * @author Slava Pestov + * @version $Id$ + */ +public class BufferInsertRequest extends BufferIORequest +{ + //{{{ BufferInsertRequest constructor + /** + * Creates a new buffer I/O request. + * @param view The view + * @param buffer The buffer + * @param session The VFS session + * @param vfs The VFS + * @param path The path + */ + public BufferInsertRequest(View view, Buffer buffer, + Object session, VFS vfs, String path) + { + super(view,buffer,session,vfs,path); + } //}}} + + //{{{ run() method + public void run() + { + InputStream in = null; + + try + { + try + { + String[] args = { vfs.getFileName(path) }; + setStatus(jEdit.getProperty("vfs.status.load",args)); + setAbortable(true); + + path = vfs._canonPath(session,path,view); + + VFSFile entry = vfs._getFile( + session,path,view); + long length; + if(entry != null) + length = entry.getLength(); + else + length = 0L; + + in = vfs._createInputStream(session,path,false,view); + if(in == null) + return; + + final SegmentBuffer seg = read( + autodetect(in),length,true); + + /* we don't do this in Buffer.insert() so that + we can insert multiple files at once */ + VFSManager.runInAWTThread(new Runnable() + { + public void run() + { + view.getTextArea().setSelectedText( + seg.toString()); + } + }); + } + catch(IOException io) + { + Log.log(Log.ERROR,this,io); + String[] pp = { io.toString() }; + VFSManager.error(view,path,"ioerror.read-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + } + catch(WorkThread.Abort a) + { + IOUtilities.closeQuietly(in); + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + finally + { + try + { + vfs._endVFSSession(session,view); + } + catch(IOException io) + { + Log.log(Log.ERROR,this,io); + String[] pp = { io.toString() }; + VFSManager.error(view,path,"ioerror.read-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + catch(WorkThread.Abort a) + { + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + } + } //}}} +} Copied: jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferLoadRequest.java (from rev 7127, jEdit/trunk/org/gjt/sp/jedit/buffer/BufferLoadRequest.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferLoadRequest.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferLoadRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -0,0 +1,204 @@ +/* + * BufferLoadRequest.java - I/O request + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2000, 2005 Slava Pestov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; + +//{{{ Imports +import java.io.*; +import org.gjt.sp.jedit.io.*; +import org.gjt.sp.jedit.*; +import org.gjt.sp.util.*; +//}}} + +/** + * A buffer load request. + * @author Slava Pestov + * @version $Id$ + */ +public class BufferLoadRequest extends BufferIORequest +{ + //{{{ BufferLoadRequest constructor + /** + * Creates a new buffer I/O request. + * @param view The view + * @param buffer The buffer + * @param session The VFS session + * @param vfs The VFS + * @param path The path + */ + public BufferLoadRequest(View view, Buffer buffer, + Object session, VFS vfs, String path) + { + super(view,buffer,session,vfs,path); + } //}}} + + //{{{ run() method + public void run() + { + InputStream in = null; + + try + { + try + { + String[] args = { vfs.getFileName(path) }; + setAbortable(true); + if(!buffer.isTemporary()) + { + setStatus(jEdit.getProperty("vfs.status.load",args)); + setValue(0L); + } + + path = vfs._canonPath(session,path,view); + + VFSFile entry = vfs._getFile( + session,path,view); + long length; + if(entry != null) + length = entry.getLength(); + else + length = 0L; + + in = vfs._createInputStream(session,path, + false,view); + if(in == null) + return; + + read(autodetect(in),length,false); + buffer.setNewFile(false); + } + catch(CharConversionException ch) + { + Log.log(Log.ERROR,this,ch); + Object[] pp = { buffer.getProperty(JEditBuffer.ENCODING), + ch.toString() }; + VFSManager.error(view,path,"ioerror.encoding-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + catch(UnsupportedEncodingException uu) + { + Log.log(Log.ERROR,this,uu); + Object[] pp = { buffer.getProperty(JEditBuffer.ENCODING), + uu.toString() }; + VFSManager.error(view,path,"ioerror.encoding-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + catch(IOException io) + { + Log.log(Log.ERROR,this,io); + Object[] pp = { io.toString() }; + VFSManager.error(view,path,"ioerror.read-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + catch(OutOfMemoryError oom) + { + Log.log(Log.ERROR,this,oom); + VFSManager.error(view,path,"out-of-memory-error",null); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + + if(jEdit.getBooleanProperty("persistentMarkers")) + { + try + { + String[] args = { vfs.getFileName(path) }; + if(!buffer.isTemporary()) + setStatus(jEdit.getProperty("vfs.status.load-markers",args)); + setAbortable(true); + + in = vfs._createInputStream(session,markersPath,true,view); + if(in != null) + readMarkers(buffer,in); + } + catch(IOException io) + { + // ignore + } + } + } + catch(WorkThread.Abort a) + { + IOUtilities.closeQuietly(in); + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + finally + { + try + { + vfs._endVFSSession(session,view); + } + catch(IOException io) + { + Log.log(Log.ERROR,this,io); + String[] pp = { io.toString() }; + VFSManager.error(view,path,"ioerror.read-error",pp); + + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + catch(WorkThread.Abort a) + { + buffer.setBooleanProperty(ERROR_OCCURRED,true); + } + } + } //}}} + + //{{{ readMarkers() method + private static void readMarkers(Buffer buffer, InputStream _in) + throws IOException + { + // For `reload' command + buffer.removeAllMarkers(); + + BufferedReader in = new BufferedReader(new InputStreamReader(_in)); + + try + { + String line; + while((line = in.readLine()) != null) + { + // malformed marks file? + if(line.length() == 0) + continue; + + // compatibility kludge for jEdit 3.1 and earlier + if(line.charAt(0) != '!') + continue; + + + char shortcut = line.charAt(1); + int start = line.indexOf(';'); + int end = line.indexOf(';',start + 1); + int position = Integer.parseInt(line.substring(start + 1,end)); + buffer.addMarker(shortcut,position); + } + buffer.setMarkersChanged(false); + } + finally + { + in.close(); + } + } //}}} +} Copied: jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferSaveRequest.java (from rev 7127, jEdit/trunk/org/gjt/sp/jedit/buffer/BufferSaveRequest.java) =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferSaveRequest.java (rev 0) +++ jEdit/trunk/org/gjt/sp/jedit/bufferio/BufferSaveRequest.java 2006-09-25 19:56:53 UTC (rev 7128) @@ -0,0 +1,202 @@ +/* + * BufferSaveRequest.java - I/O request + * :tabSize=8:indentSize=8:noTabs=false: + * :folding=explicit:collapseFolds=1: + * + * Copyright (C) 2000, 2005 Slava Pestov + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or 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 General Public License for more details. + * + * You should have received a copy of the GNU 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 org.gjt.sp.jedit.buffer; + +//{{{ Imports +import java.io.*; +import java.util.zip.*; +import java.util.List; + +import org.gjt.sp.jedit.io.*; +import org.gjt.sp.jedit.*; +import org.gjt.sp.util.*; +//}}} + +/** + * A buffer save request. + * @author Slava Pestov + * @version $Id$ + */ +public class BufferSaveRequest extends BufferIORequest +{ + //{{{ BufferSaveRequest constructor + /** + * Creates a new buffer I/O request. + * @param view The view + * @param buffer The buffer + * @param session The VFS session + * @param vfs The VFS + * @param path The path + */ + public BufferSaveRequest(View view, Buffer buffer, + Object session, VFS vfs, String path) + { + super(view,buffer,session,vfs,path); + } //}}} + + //{{{ run() method + public void run() + { + OutputStream out = null; + + boolean vfsRenameCap = (vfs.getCapabilities() & + VFS.RENAME_CAP) != 0; + + boolean overwriteReadOnly = buffer.getBooleanProperty("overwriteReadonly"); + + /* if the VFS supports renaming files, we first + * save to #<filename>#save#, then rename that + * to <filename>, so that if the save fails, + * data will not be lost. + * + * as of 4.1pre7 we now call vfs.getTwoStageSaveName() + * instead of constructing the path directly + * since some VFS's might not allow # in filenames. + */ + + boolean twoStageSave = overwriteReadOnly || + (vfsRenameCap && + jEdit.getBooleanProperty("twoStageSave")); + + try + { + String[] args = { vfs.getFileName(path) }; + setStatus(jEdit.getProperty("vfs.status.save",args)); + + // the entire save operation can be aborted... + setAbortable(true); + + path = vfs._canonPath(session,path,view); + if(!MiscUtilities.isURL(path)) + path = MiscUtilities.resolveSymlinks(path); + + + // Only backup once per session + if(buffer.getProperty(Buffer.BACKED_UP) == null + || jEdit.getBooleanProperty("backupEverySave")) + { + vfs._backup(session,path,view); + buffer.setBooleanProperty(Buffer.BACKED_UP,true); + } + + String savePath; + if(twoStageSave) + { + savePath = vfs.getTwoStageSaveName(path); + if (savePath == null) + { + twoStageSave = false; + savePath = path; + } + } + else + savePath = path; + + out = vfs._createOutputStream(session,savePath,view); + + try + { + // this must be after the stream is created or + // we deadlock with SSHTools. + buffer.readLock(); + if(out != null) + { + // Can't use buffer.getName() here because + // it is not changed until the save is + // complete + if(path.endsWith(".gz")) + buffer.setBooleanProperty(Buffer.GZIPPED,true); + else if (buffer.getName().endsWith(".gz")) + { + // The path do not ends with gz. + // The buffer name was .gz. + // So it means it's blabla.txt.gz -> blabla.txt, I remove + // the gz prop... [truncated message content] |