[sword-svn] r2803 - in trunk: . include src/mgr src/modules/filters utilities

scribe at crosswire.org scribe at crosswire.org
Wed May 29 20:43:52 MST 2013


Author: scribe
Date: 2013-05-29 20:43:52 -0700 (Wed, 29 May 2013)
New Revision: 2803

Added:
   trunk/include/remotetrans.h
   trunk/src/mgr/remotetrans.cpp
Removed:
   trunk/include/ftptrans.h
   trunk/src/mgr/ftptrans.cpp
Modified:
   trunk/include/Makefile.am
   trunk/include/curlftpt.h
   trunk/include/curlhttpt.h
   trunk/include/ftplibftpt.h
   trunk/include/installmgr.h
   trunk/include/osiswebif.h
   trunk/include/osisxhtml.h
   trunk/src/mgr/Makefile.am
   trunk/src/mgr/curlftpt.cpp
   trunk/src/mgr/curlhttpt.cpp
   trunk/src/mgr/installmgr.cpp
   trunk/src/modules/filters/osiswebif.cpp
   trunk/src/modules/filters/osisxhtml.cpp
   trunk/usrinst.sh
   trunk/utilities/installmgr.cpp
Log:
Added better whitespace handling for block tags by supressing multiple vspace
Renamed 'ftp' stuff to more generic 'remote' because we support http, https now and who knows what in the future.
Added detection of /usr/lib64 to be a little smarter about when to set the libdir to this.



Modified: trunk/include/Makefile.am
===================================================================
--- trunk/include/Makefile.am	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/Makefile.am	2013-05-30 03:43:52 UTC (rev 2803)
@@ -16,7 +16,7 @@
 pkginclude_HEADERS += $(swincludedir)/versificationmgr.h
 pkginclude_HEADERS += $(swincludedir)/flatapi.h
 pkginclude_HEADERS += $(swincludedir)/ftpparse.h
-pkginclude_HEADERS += $(swincludedir)/ftptrans.h
+pkginclude_HEADERS += $(swincludedir)/remotetrans.h
 pkginclude_HEADERS += $(swincludedir)/ftplibftpt.h
 pkginclude_HEADERS += $(swincludedir)/ftplib.h
 

Modified: trunk/include/curlftpt.h
===================================================================
--- trunk/include/curlftpt.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/curlftpt.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -22,7 +22,7 @@
 #define CURLFTPT_H
 
 #include <defs.h>
-#include <ftptrans.h>
+#include <remotetrans.h>
 
 SWORD_NAMESPACE_START
 
@@ -36,7 +36,7 @@
 };
 
 
-class SWDLLEXPORT CURLFTPTransport : public FTPTransport {
+class SWDLLEXPORT CURLFTPTransport : public RemoteTransport {
 	CURL *session;
 
 public:

Modified: trunk/include/curlhttpt.h
===================================================================
--- trunk/include/curlhttpt.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/curlhttpt.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -22,7 +22,7 @@
 #define CURLHTTPT_H
 
 #include <defs.h>
-#include <ftptrans.h>
+#include <remotetrans.h>
 
 SWORD_NAMESPACE_START
 
@@ -36,7 +36,7 @@
 };
 
 
-class SWDLLEXPORT CURLHTTPTransport : public FTPTransport {
+class SWDLLEXPORT CURLHTTPTransport : public RemoteTransport {
 	CURL *session;
 
 public:

Modified: trunk/include/ftplibftpt.h
===================================================================
--- trunk/include/ftplibftpt.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/ftplibftpt.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -22,7 +22,7 @@
 #define FTPLIBFTPT_H
 
 #include <defs.h>
-#include <ftptrans.h>
+#include <remotetrans.h>
 
 typedef struct NetBuf netbuf;
 
@@ -37,7 +37,7 @@
 };
 
 
-class SWDLLEXPORT FTPLibFTPTransport : public FTPTransport {
+class SWDLLEXPORT FTPLibFTPTransport : public RemoteTransport {
 	netbuf *ftpConnection;
 
 	char assureLoggedIn();

Deleted: trunk/include/ftptrans.h
===================================================================
--- trunk/include/ftptrans.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/ftptrans.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -1,84 +0,0 @@
-/******************************************************************************
-*  ftptrans.h  - code for FTP Transport
-*
-* $Id: swbuf.h 2218 2008-12-23 09:33:38Z scribe $
-*
-* Copyright 2009 CrossWire Bible Society (http://www.crosswire.org)
-*	CrossWire Bible Society
-*	P. O. Box 2528
-*	Tempe, AZ  85280-2528
-*
-* 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 version 2.
-*
-* 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.
-*
-*/
-
-// TODO: Rename this to RemoteTransport in 1.7.x
-
-#ifndef FTPTRANS_H
-#define FTPTRANS_H
-
-#include <vector>
-#include <defs.h>
-#include <swbuf.h>
-
-
-SWORD_NAMESPACE_START
-
-/** Class for reporting status
-*/
-class SWDLLEXPORT StatusReporter {
-public:
-	virtual ~StatusReporter() {};
-	/** Messages before stages of a batch download */
-	virtual void preStatus(long totalBytes, long completedBytes, const char *message);
-
-	/** frequently called throughout a download, to report status */
-	virtual void statusUpdate(double dtTotal, double dlNow);
-};
-
-
-/** TODO: document
-* A base class to be used for reimplementation of network services.
-*/
-class SWDLLEXPORT FTPTransport {	// TODO: rename to more generic RemoteTransport
-
-protected:
-	StatusReporter *statusReporter;
-	bool passive;
-	bool term;
-	SWBuf host;
-	SWBuf u;
-	SWBuf p;
-
-public:
-	FTPTransport(const char *host, StatusReporter *statusReporter = 0);
-	virtual ~FTPTransport();
-
-	/***********
-	 * override this method in your real impl
-	 *
-	 * if destBuf then write to buffer instead of file
-	 */
-	virtual char getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf = 0);
-
-
-	int copyDirectory(const char *urlPrefix, const char *dir, const char *dest, const char *suffix);
-
-	virtual std::vector<struct DirEntry> getDirList(const char *dirURL);
-	void setPassive(bool passive) { this->passive = passive; }
-	void setUser(const char *user) { u = user; }
-	void setPasswd(const char *passwd) { p = passwd; }
-	void terminate() { term = true; }
-};
-
-
-SWORD_NAMESPACE_END
-
-#endif

Modified: trunk/include/installmgr.h
===================================================================
--- trunk/include/installmgr.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/installmgr.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -11,7 +11,7 @@
 class SWMgr;
 class SWModule;
 class SWConfig;
-class FTPTransport;
+class RemoteTransport;
 class StatusReporter;
 
 /** A remote installation source configuration
@@ -55,19 +55,19 @@
 	bool passive;
 	SWBuf u, p;
 
-	/** override this method and provide your own custom FTPTransport subclass
+	/** override this method and provide your own custom RemoteTransport subclass
          */
-	virtual FTPTransport *createFTPTransport(const char *host, StatusReporter *statusReporter);
+	virtual RemoteTransport *createFTPTransport(const char *host, StatusReporter *statusReporter);
 
-	/** override this method and provide your own custom HTTP RemoteTransport (still called FTPTransport in pre 1.7.x) subclass
+	/** override this method and provide your own custom HTTP RemoteTransport
          */
-	virtual FTPTransport *createHTTPTransport(const char *host, StatusReporter *statusReporter);
+	virtual RemoteTransport *createHTTPTransport(const char *host, StatusReporter *statusReporter);
 
 
 	/** we have a transport member to set as current running transport so we
 	 *  can ask it to terminate below, if user requests
          */
-	FTPTransport *transport;
+	RemoteTransport *transport;
 
 public:
 
@@ -109,9 +109,9 @@
          */
 	virtual int removeModule(SWMgr *manager, const char *modName);
 
-        /** mostly an internally used method to ftp download from an remote source to a local destination
+        /** mostly an internally used method to remote download from a remote source to a local destination
          */
-	virtual int ftpCopy(InstallSource *is, const char *src, const char *dest, bool dirTransfer = false, const char *suffix = "");
+	virtual int remoteCopy(InstallSource *is, const char *src, const char *dest, bool dirTransfer = false, const char *suffix = "");
 
         /** call to install a module from a local path (fromLocation) or remote InstallSource (is) (leave the other 0)
          */

Modified: trunk/include/osiswebif.h
===================================================================
--- trunk/include/osiswebif.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/osiswebif.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -34,7 +34,6 @@
 
 protected:
 	virtual bool handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData);
-	virtual BasicFilterUserData *createUserData(const SWModule *module, const SWKey *key);
 public:
 	OSISWEBIF();
 	void setJavascript(bool mode) { javascript = mode; }

Modified: trunk/include/osisxhtml.h
===================================================================
--- trunk/include/osisxhtml.h	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/include/osisxhtml.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -32,30 +32,34 @@
 	bool morphFirst;
 	bool renderNoteNumbers;
 protected:
+
+	class TagStack;
 	// used by derived classes so we have it in the header
-	class TagStacks;
-	class SWDLLEXPORT MyUserData : public BasicFilterUserData {
+	virtual BasicFilterUserData *createUserData(const SWModule *module, const SWKey *key);
+	virtual bool handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData);
+
+
+	class MyUserData : public BasicFilterUserData {
 	public:
 		bool osisQToTick;
-		bool inBold;	// TODO: obsolete. left for binary compat for 1.6.x
 		bool inXRefNote;
 		bool BiblicalText;
 		int suspendLevel;
 		SWBuf wordsOfChristStart;
 		SWBuf wordsOfChristEnd;
-                TagStacks *tagStacks;	// TODO: modified to wrap all TagStacks necessary for this filter until 1.7.x
-//                TagStack *hiStack;	// TODO: commented out for binary compat for 1.6.x	 wrapped in tagStacks until 1.7.x
+		TagStack *quoteStack;
+		TagStack *hiStack;
+		TagStack *titleStack;
+		int consecutiveNewlines;
 		SWBuf lastTransChange;
 		SWBuf w;
 		SWBuf fn;
 		SWBuf version;
+
 		MyUserData(const SWModule *module, const SWKey *key);
 		~MyUserData();
+		void outputNewline(SWBuf &buf);
 	};
-	virtual BasicFilterUserData *createUserData(const SWModule *module, const SWKey *key) {
-		return new MyUserData(module, key);
-	}
-	virtual bool handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData);
 public:
 	OSISXHTML();
 	void setMorphFirst(bool val = true) { morphFirst = val; }

Copied: trunk/include/remotetrans.h (from rev 2799, trunk/include/ftptrans.h)
===================================================================
--- trunk/include/remotetrans.h	                        (rev 0)
+++ trunk/include/remotetrans.h	2013-05-30 03:43:52 UTC (rev 2803)
@@ -0,0 +1,82 @@
+/******************************************************************************
+*  remotetrans.h  - code for Remote Transport
+*
+* $Id: swbuf.h 2218 2008-12-23 09:33:38Z scribe $
+*
+* Copyright 2009 CrossWire Bible Society (http://www.crosswire.org)
+*	CrossWire Bible Society
+*	P. O. Box 2528
+*	Tempe, AZ  85280-2528
+*
+* 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 version 2.
+*
+* 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.
+*
+*/
+
+#ifndef REMOTETRANS_H
+#define REMOTETRANS_H
+
+#include <vector>
+#include <defs.h>
+#include <swbuf.h>
+
+
+SWORD_NAMESPACE_START
+
+/** Class for reporting status
+*/
+class SWDLLEXPORT StatusReporter {
+public:
+	virtual ~StatusReporter() {};
+	/** Messages before stages of a batch download */
+	virtual void preStatus(long totalBytes, long completedBytes, const char *message);
+
+	/** frequently called throughout a download, to report status */
+	virtual void statusUpdate(double dtTotal, double dlNow);
+};
+
+
+/**
+* A base class to be used for reimplementation of network services.
+*/
+class SWDLLEXPORT RemoteTransport {
+
+protected:
+	StatusReporter *statusReporter;
+	bool passive;
+	bool term;
+	SWBuf host;
+	SWBuf u;
+	SWBuf p;
+
+public:
+	RemoteTransport(const char *host, StatusReporter *statusReporter = 0);
+	virtual ~RemoteTransport();
+
+	/***********
+	 * override this method in your real impl
+	 *
+	 * if destBuf then write to buffer instead of file
+	 */
+	virtual char getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf = 0);
+
+
+	int copyDirectory(const char *urlPrefix, const char *dir, const char *dest, const char *suffix);
+
+	virtual std::vector<struct DirEntry> getDirList(const char *dirURL);
+	void setPassive(bool passive) { this->passive = passive; }
+	void setUser(const char *user) { u = user; }
+	void setPasswd(const char *passwd) { p = passwd; }
+	void terminate() { term = true; }
+};
+
+
+SWORD_NAMESPACE_END
+
+#endif

Modified: trunk/src/mgr/Makefile.am
===================================================================
--- trunk/src/mgr/Makefile.am	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/mgr/Makefile.am	2013-05-30 03:43:52 UTC (rev 2803)
@@ -24,7 +24,7 @@
 libsword_la_SOURCES += $(mgrdir)/markupfiltmgr.cpp
 libsword_la_SOURCES += $(mgrdir)/filemgr.cpp
 libsword_la_SOURCES += $(mgrdir)/versificationmgr.cpp
-libsword_la_SOURCES += $(mgrdir)/ftptrans.cpp
+libsword_la_SOURCES += $(mgrdir)/remotetrans.cpp
 libsword_la_SOURCES += $(mgrdir)/swlocale.cpp
 libsword_la_SOURCES += $(mgrdir)/localemgr.cpp
 libsword_la_SOURCES += $(mgrdir)/swcacher.cpp

Modified: trunk/src/mgr/curlftpt.cpp
===================================================================
--- trunk/src/mgr/curlftpt.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/mgr/curlftpt.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -117,7 +117,7 @@
 	return 0;
 }
 
-CURLFTPTransport::CURLFTPTransport(const char *host, StatusReporter *sr) : FTPTransport(host, sr) {
+CURLFTPTransport::CURLFTPTransport(const char *host, StatusReporter *sr) : RemoteTransport(host, sr) {
 	session = (CURL *)curl_easy_init();
 }
 

Modified: trunk/src/mgr/curlhttpt.cpp
===================================================================
--- trunk/src/mgr/curlhttpt.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/mgr/curlhttpt.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -110,7 +110,7 @@
 	return 0;
 }
 
-CURLHTTPTransport::CURLHTTPTransport(const char *host, StatusReporter *sr) : FTPTransport(host, sr) {
+CURLHTTPTransport::CURLHTTPTransport(const char *host, StatusReporter *sr) : RemoteTransport(host, sr) {
 	session = (CURL *)curl_easy_init();
 }
 

Deleted: trunk/src/mgr/ftptrans.cpp
===================================================================
--- trunk/src/mgr/ftptrans.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/mgr/ftptrans.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -1,195 +0,0 @@
- /*****************************************************************************
- * FTPTransport functions
- *
- *
- *
- * Copyright 2009 CrossWire Bible Society (http://www.crosswire.org)
- *	CrossWire Bible Society
- *	P. O. Box 2528
- *	Tempe, AZ  85280-2528
- *
- * 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 version 2.
- *
- * 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.
- *
- */
-
-
- 
-
-#include <ftptrans.h>
-#include <filemgr.h>
-
-#include <fcntl.h>
-#include <dirent.h>
-#include <swlog.h>
-
-extern "C" {
-#include <ftpparse.h>
-}
-
-using std::vector;
-
-
-SWORD_NAMESPACE_START
-
-
-namespace {
-
-void removeTrailingSlash(SWBuf &buf) {
-	int len = buf.size();
-	if ((buf[len-1] == '/')
-	 || (buf[len-1] == '\\'))
-		buf.size(len-1);
-}
-
-};
-
-
-void StatusReporter::preStatus(long totalBytes, long completedBytes, const char *message) {
-}
-
-void StatusReporter::statusUpdate(double dtTotal, double dlNow) {
-}
-
-
-FTPTransport::FTPTransport(const char *host, StatusReporter *statusReporter) {
-	this->statusReporter = statusReporter;
-	this->host = host;
-	u = "ftp";
-	p = "installmgr at user.com";
-	term = false;
-}
-
-
-FTPTransport::~FTPTransport() {
-}
-
-
-// override this method in your real transport class
-char FTPTransport::getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf) {
-	char retVal = 0;
-	return retVal;
-}
-
-
-vector<struct DirEntry> FTPTransport::getDirList(const char *dirURL) {
-
-	vector<struct DirEntry> dirList;
-	
-	SWBuf dirBuf;
-	if (!getURL("", dirURL, &dirBuf)) {
-		char *start = dirBuf.getRawData();
-		char *end = start;
-		while (start < (dirBuf.getRawData()+dirBuf.size())) {
-			struct ftpparse item;
-			bool looking = true;
-			for (end = start; *end; end++) {
-				if (looking) {
-					if ((*end == 10) || (*end == 13)) {
-						*end = 0;
-						looking = false;
-					}
-				}
-				else if ((*end != 10) && (*end != 13))
-					break;
-			}
-			SWLog::getSystemLog()->logWarning("FTPURLGetDir: parsing item %s(%d)\n", start, end-start);
-			int status = ftpparse(&item, start, end - start);
-			// in ftpparse.h, there is a warning that name is not necessarily null terminated
-			SWBuf name;
-			name.append(item.name, item.namelen);
-			SWLog::getSystemLog()->logWarning("FTPURLGetDir: got item %s\n", name.c_str());
-			if (status && name != "." && name != "..") {
-				struct DirEntry i;
-				i.name = name;
-				i.size = item.size;
-				i.isDirectory = (item.flagtrycwd == 1);
-				dirList.push_back(i);
-			}
-			start = end;
-		}
-	}
-	else {
-		SWLog::getSystemLog()->logWarning("FTPURLGetDir: failed to get dir %s\n", dirURL);
-	}
-	return dirList;
-}
-
-
-int FTPTransport::copyDirectory(const char *urlPrefix, const char *dir, const char *dest, const char *suffix) {
-	unsigned int i;
-	int retVal = 0;
-	
-	SWBuf url = SWBuf(urlPrefix) + SWBuf(dir);
-	removeTrailingSlash(url);
-	url += '/';
-	
-	SWLog::getSystemLog()->logWarning("NetTransport: getting dir %s\n", url.c_str());
-	vector<struct DirEntry> dirList = getDirList(url.c_str());
-
-	if (!dirList.size()) {
-		SWLog::getSystemLog()->logWarning("NetTransport: failed to read dir %s\n", url.c_str());
-		return -1;
-	}
-				
-	long totalBytes = 0;
-	for (i = 0; i < dirList.size(); i++)
-		totalBytes += dirList[i].size;
-	long completedBytes = 0;
-	for (i = 0; i < dirList.size(); i++) {
-		struct DirEntry &dirEntry = dirList[i];
-		SWBuf buffer = (SWBuf)dest;
-		removeTrailingSlash(buffer);
-		buffer += "/";
-		buffer += dirEntry.name;
-		if (!strcmp(&buffer.c_str()[buffer.length()-strlen(suffix)], suffix)) {
-			SWBuf buffer2 = "Downloading (";
-			buffer2.appendFormatted("%d", i+1);
-			buffer2 += " of ";
-			buffer2.appendFormatted("%d", dirList.size());
-			buffer2 += "): ";
-			buffer2 += dirEntry.name;
-			if (statusReporter)
-				statusReporter->preStatus(totalBytes, completedBytes, buffer2.c_str());
-			FileMgr::createParent(buffer.c_str());	// make sure parent directory exists
-			SWTRY {
-				SWBuf url = (SWBuf)urlPrefix + (SWBuf)dir;
-				removeTrailingSlash(url);
-				url += "/";
-				url += dirEntry.name; //dont forget the final slash
-				if (!dirEntry.isDirectory) {
-					if (getURL(buffer.c_str(), url.c_str())) {
-						SWLog::getSystemLog()->logWarning("FTPCopy: failed to get file %s\n", url.c_str());
-						return -2;
-					}
-					completedBytes += dirEntry.size;
-				}
-				else {
-					SWBuf subdir = (SWBuf)dir;
-					removeTrailingSlash(subdir);
-					subdir += (SWBuf)"/" + dirEntry.name;
-					if (copyDirectory(urlPrefix, subdir, buffer.c_str(), suffix)) {
-						SWLog::getSystemLog()->logWarning("FTPCopy: failed to get file %s\n", subdir.c_str());
-						return -2;
-					}
-				}
-			}
-			SWCATCH (...) {}
-			if (term) {
-				retVal = -3;
-				break;
-			}
-		}
-	}
-	return retVal;
-}
-
-
-SWORD_NAMESPACE_END
-

Modified: trunk/src/mgr/installmgr.cpp
===================================================================
--- trunk/src/mgr/installmgr.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/mgr/installmgr.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -76,10 +76,10 @@
 const int InstallMgr::MODSTAT_CIPHERED         = 0x010;
 const int InstallMgr::MODSTAT_CIPHERKEYPRESENT = 0x020;
 
-// override this method and provide your own custom FTPTransport subclass
+// override this method and provide your own custom RemoteTransport subclass
 // here we try a couple defaults if sword was compiled with support for them.
 // see these classes for examples of how to make your own
-FTPTransport *InstallMgr::createFTPTransport(const char *host, StatusReporter *statusReporter) {
+RemoteTransport *InstallMgr::createFTPTransport(const char *host, StatusReporter *statusReporter) {
 #ifdef CURLAVAILABLE
 	return new CURLFTPTransport(host, statusReporter);
 #else
@@ -87,7 +87,7 @@
 #endif
 }
 
-FTPTransport *InstallMgr::createHTTPTransport(const char *host, StatusReporter *statusReporter) {
+RemoteTransport *InstallMgr::createHTTPTransport(const char *host, StatusReporter *statusReporter) {
 #ifdef CURLAVAILABLE
 	return new CURLHTTPTransport(host, statusReporter);
 #else
@@ -298,14 +298,14 @@
 
 
 // TODO: rename to netCopy
-int InstallMgr::ftpCopy(InstallSource *is, const char *src, const char *dest, bool dirTransfer, const char *suffix) {
-SWLog::getSystemLog()->logDebug("netCopy: %s, %s, %s, %c, %s", (is?is->source.c_str():"null"), src, (dest?dest:"null"), (dirTransfer?'t':'f'), (suffix?suffix:"null"));
+int InstallMgr::remoteCopy(InstallSource *is, const char *src, const char *dest, bool dirTransfer, const char *suffix) {
+SWLog::getSystemLog()->logDebug("remoteCopy: %s, %s, %s, %c, %s", (is?is->source.c_str():"null"), src, (dest?dest:"null"), (dirTransfer?'t':'f'), (suffix?suffix:"null"));
 
 	// assert user disclaimer has been confirmed
 	if (!isUserDisclaimerConfirmed()) return -1;
 
 	int retVal = 0;
-	FTPTransport *trans = 0;
+	RemoteTransport *trans = 0;
 	if (is->type == "FTP" 
 #ifdef CURLSFTPAVAILABLE
 		|| is->type == "SFTP"
@@ -377,7 +377,7 @@
 		}
 	}
 	SWTRY {
-		FTPTransport *deleteMe = trans;
+		RemoteTransport *deleteMe = trans;
 		// do this order for threadsafeness
 		// (see terminate())
 		trans = transport = 0;
@@ -434,7 +434,7 @@
 			if (is) {
 				while (fileBegin != fileEnd) {	// netCopy each file first
 					buffer = sourceDir + fileBegin->second.c_str();
-					if (ftpCopy(is, fileBegin->second.c_str(), buffer.c_str())) {
+					if (remoteCopy(is, fileBegin->second.c_str(), buffer.c_str())) {
 						aborted = true;
 						break;	// user aborted
 					}
@@ -494,7 +494,7 @@
 				SWLog::getSystemLog()->logDebug("***** relativePath: %s \n", relativePath.c_str());
 
 				if (is) {
-					if (ftpCopy(is, relativePath.c_str(), absolutePath.c_str(), true)) {
+					if (remoteCopy(is, relativePath.c_str(), absolutePath.c_str(), true)) {
 						aborted = true;	// user aborted
 					}
 				}
@@ -564,7 +564,7 @@
 #ifndef EXCLUDEZLIB
 	SWBuf archive = root + "/mods.d.tar.gz";
 
-	errorCode = ftpCopy(is, "mods.d.tar.gz", archive.c_str(), false);
+	errorCode = remoteCopy(is, "mods.d.tar.gz", archive.c_str(), false);
 	if (!errorCode) { //sucessfully downloaded the tar,gz of module configs
 		FileDesc *fd = FileMgr::getSystemFileMgr()->open(archive.c_str(), FileMgr::RDONLY);
 		untargz(fd->getFd(), root.c_str());
@@ -572,7 +572,7 @@
 	}
 	else
 #endif
-	errorCode = ftpCopy(is, "mods.d", target.c_str(), true, ".conf"); //copy the whole directory
+	errorCode = remoteCopy(is, "mods.d", target.c_str(), true, ".conf"); //copy the whole directory
 
 	is->flush();
 	return errorCode;
@@ -651,7 +651,7 @@
 	InstallSource is("FTP");
 	is.source = "ftp.crosswire.org";
 	is.directory = "/pub/sword";
-	int errorCode = ftpCopy(&is, masterRepoList, masterRepoListPath.c_str(), false);
+	int errorCode = remoteCopy(&is, masterRepoList, masterRepoListPath.c_str(), false);
 	if (!errorCode) { //sucessfully downloaded the repo list
 		SWConfig masterList(masterRepoListPath);
 		SectionMap::iterator sections = masterList.Sections.find("Repos");

Copied: trunk/src/mgr/remotetrans.cpp (from rev 2799, trunk/src/mgr/ftptrans.cpp)
===================================================================
--- trunk/src/mgr/remotetrans.cpp	                        (rev 0)
+++ trunk/src/mgr/remotetrans.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -0,0 +1,195 @@
+ /*****************************************************************************
+ * RemoteTransport functions
+ *
+ *
+ *
+ * Copyright 2009 CrossWire Bible Society (http://www.crosswire.org)
+ *	CrossWire Bible Society
+ *	P. O. Box 2528
+ *	Tempe, AZ  85280-2528
+ *
+ * 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 version 2.
+ *
+ * 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.
+ *
+ */
+
+
+ 
+
+#include <remotetrans.h>
+#include <filemgr.h>
+
+#include <fcntl.h>
+#include <dirent.h>
+#include <swlog.h>
+
+extern "C" {
+#include <ftpparse.h>
+}
+
+using std::vector;
+
+
+SWORD_NAMESPACE_START
+
+
+namespace {
+
+void removeTrailingSlash(SWBuf &buf) {
+	int len = buf.size();
+	if ((buf[len-1] == '/')
+	 || (buf[len-1] == '\\'))
+		buf.size(len-1);
+}
+
+};
+
+
+void StatusReporter::preStatus(long totalBytes, long completedBytes, const char *message) {
+}
+
+void StatusReporter::statusUpdate(double dtTotal, double dlNow) {
+}
+
+
+RemoteTransport::RemoteTransport(const char *host, StatusReporter *statusReporter) {
+	this->statusReporter = statusReporter;
+	this->host = host;
+	u = "ftp";
+	p = "installmgr at user.com";
+	term = false;
+}
+
+
+RemoteTransport::~RemoteTransport() {
+}
+
+
+// override this method in your real transport class
+char RemoteTransport::getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf) {
+	char retVal = 0;
+	return retVal;
+}
+
+
+vector<struct DirEntry> RemoteTransport::getDirList(const char *dirURL) {
+
+	vector<struct DirEntry> dirList;
+	
+	SWBuf dirBuf;
+	if (!getURL("", dirURL, &dirBuf)) {
+		char *start = dirBuf.getRawData();
+		char *end = start;
+		while (start < (dirBuf.getRawData()+dirBuf.size())) {
+			struct ftpparse item;
+			bool looking = true;
+			for (end = start; *end; end++) {
+				if (looking) {
+					if ((*end == 10) || (*end == 13)) {
+						*end = 0;
+						looking = false;
+					}
+				}
+				else if ((*end != 10) && (*end != 13))
+					break;
+			}
+			SWLog::getSystemLog()->logWarning("getDirList: parsing item %s(%d)\n", start, end-start);
+			int status = ftpparse(&item, start, end - start);
+			// in ftpparse.h, there is a warning that name is not necessarily null terminated
+			SWBuf name;
+			name.append(item.name, item.namelen);
+			SWLog::getSystemLog()->logWarning("getDirList: got item %s\n", name.c_str());
+			if (status && name != "." && name != "..") {
+				struct DirEntry i;
+				i.name = name;
+				i.size = item.size;
+				i.isDirectory = (item.flagtrycwd == 1);
+				dirList.push_back(i);
+			}
+			start = end;
+		}
+	}
+	else {
+		SWLog::getSystemLog()->logWarning("getDirList: failed to get dir %s\n", dirURL);
+	}
+	return dirList;
+}
+
+
+int RemoteTransport::copyDirectory(const char *urlPrefix, const char *dir, const char *dest, const char *suffix) {
+	unsigned int i;
+	int retVal = 0;
+	
+	SWBuf url = SWBuf(urlPrefix) + SWBuf(dir);
+	removeTrailingSlash(url);
+	url += '/';
+	
+	SWLog::getSystemLog()->logWarning("NetTransport: getting dir %s\n", url.c_str());
+	vector<struct DirEntry> dirList = getDirList(url.c_str());
+
+	if (!dirList.size()) {
+		SWLog::getSystemLog()->logWarning("NetTransport: failed to read dir %s\n", url.c_str());
+		return -1;
+	}
+				
+	long totalBytes = 0;
+	for (i = 0; i < dirList.size(); i++)
+		totalBytes += dirList[i].size;
+	long completedBytes = 0;
+	for (i = 0; i < dirList.size(); i++) {
+		struct DirEntry &dirEntry = dirList[i];
+		SWBuf buffer = (SWBuf)dest;
+		removeTrailingSlash(buffer);
+		buffer += "/";
+		buffer += dirEntry.name;
+		if (!strcmp(&buffer.c_str()[buffer.length()-strlen(suffix)], suffix)) {
+			SWBuf buffer2 = "Downloading (";
+			buffer2.appendFormatted("%d", i+1);
+			buffer2 += " of ";
+			buffer2.appendFormatted("%d", dirList.size());
+			buffer2 += "): ";
+			buffer2 += dirEntry.name;
+			if (statusReporter)
+				statusReporter->preStatus(totalBytes, completedBytes, buffer2.c_str());
+			FileMgr::createParent(buffer.c_str());	// make sure parent directory exists
+			SWTRY {
+				SWBuf url = (SWBuf)urlPrefix + (SWBuf)dir;
+				removeTrailingSlash(url);
+				url += "/";
+				url += dirEntry.name; //dont forget the final slash
+				if (!dirEntry.isDirectory) {
+					if (getURL(buffer.c_str(), url.c_str())) {
+						SWLog::getSystemLog()->logWarning("copyDirectory: failed to get file %s\n", url.c_str());
+						return -2;
+					}
+					completedBytes += dirEntry.size;
+				}
+				else {
+					SWBuf subdir = (SWBuf)dir;
+					removeTrailingSlash(subdir);
+					subdir += (SWBuf)"/" + dirEntry.name;
+					if (copyDirectory(urlPrefix, subdir, buffer.c_str(), suffix)) {
+						SWLog::getSystemLog()->logWarning("copyDirectory: failed to get file %s\n", subdir.c_str());
+						return -2;
+					}
+				}
+			}
+			SWCATCH (...) {}
+			if (term) {
+				retVal = -3;
+				break;
+			}
+		}
+	}
+	return retVal;
+}
+
+
+SWORD_NAMESPACE_END
+

Modified: trunk/src/modules/filters/osiswebif.cpp
===================================================================
--- trunk/src/modules/filters/osiswebif.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/modules/filters/osiswebif.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -37,12 +37,6 @@
 }
 
 
-BasicFilterUserData *OSISWEBIF::createUserData(const SWModule *module, const SWKey *key) {
-	MyUserData *u = new MyUserData(module, key);
-	return u;
-}
-
-
 bool OSISWEBIF::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) {
 	MyUserData *u = (MyUserData *)userData;
 	SWBuf scratch;

Modified: trunk/src/modules/filters/osisxhtml.cpp
===================================================================
--- trunk/src/modules/filters/osisxhtml.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/src/modules/filters/osisxhtml.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -46,7 +46,6 @@
 
 
 namespace {
-	typedef std::stack<SWBuf> TagStack;
 
 // though this might be slightly slower, possibly causing an extra bool check, this is a renderFilter
 // so speed isn't the absolute highest priority, and this is a very minor possible hit
@@ -87,6 +86,8 @@
 	}
 }
 
+
+
 void processMorph(bool suspendTextPassThru, XMLTag &tag, SWBuf &buf) {
 	const char * attrib;
 	const char *val;
@@ -115,37 +116,14 @@
 		//}
 	}
 }
-}	// end anonymous namespace
 
 
-// TODO: this bridge pattern is to preserve binary compat on 1.6.x
-class OSISXHTML::TagStacks {
-public:
-	TagStack quoteStack;
-	TagStack hiStack;
-	TagStack titleStack;
-};
+}	// end anonymous namespace
 
-OSISXHTML::MyUserData::MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key) {
-	inXRefNote    = false;
-	suspendLevel = 0;
-	tagStacks = new TagStacks();
-	wordsOfChristStart = "<span class=\"wordsOfJesus\"> ";
-	wordsOfChristEnd   = "</span> ";
-	if (module) {
-		osisQToTick = ((!module->getConfigEntry("OSISqToTick")) || (strcmp(module->getConfigEntry("OSISqToTick"), "false")));
-		version = module->getName();
-		BiblicalText = (!strcmp(module->getType(), "Biblical Texts"));
-	}
-	else {
-		osisQToTick = true;	// default
-		version = "";
-	}
+BasicFilterUserData *OSISXHTML::createUserData(const SWModule *module, const SWKey *key) {
+	return new MyUserData(module, key);
 }
 
-OSISXHTML::MyUserData::~MyUserData() {
-	delete tagStacks;
-}
 
 OSISXHTML::OSISXHTML() {
 	setTokenStart("<");
@@ -172,6 +150,38 @@
 	renderNoteNumbers = false;
 }
 
+class OSISXHTML::TagStack : public std::stack<SWBuf> {
+};
+
+OSISXHTML::MyUserData::MyUserData(const SWModule *module, const SWKey *key) : BasicFilterUserData(module, key), quoteStack(new TagStack()), hiStack(new TagStack()), titleStack(new TagStack()) {
+	inXRefNote    = false;
+	suspendLevel = 0;
+	wordsOfChristStart = "<span class=\"wordsOfJesus\"> ";
+	wordsOfChristEnd   = "</span> ";
+	if (module) {
+		osisQToTick = ((!module->getConfigEntry("OSISqToTick")) || (strcmp(module->getConfigEntry("OSISqToTick"), "false")));
+		version = module->getName();
+		BiblicalText = (!strcmp(module->getType(), "Biblical Texts"));
+	}
+	else {
+		osisQToTick = true;	// default
+		version = "";
+	}
+	consecutiveNewlines = 0;
+}
+
+OSISXHTML::MyUserData::~MyUserData() {
+	delete quoteStack;
+	delete hiStack;
+	delete titleStack;
+}
+
+void OSISXHTML::MyUserData::outputNewline(SWBuf &buf) {
+	if (++consecutiveNewlines <= 2) {
+		outText("<br />\n", buf, this);
+		supressAdjacentWhitespace = true;
+	}
+}
 bool OSISXHTML::handleToken(SWBuf &buf, const char *token, BasicFilterUserData *userData) {
 	MyUserData *u = (MyUserData *)userData;
 	SWBuf scratch;
@@ -301,15 +311,13 @@
 		// <p> paragraph and <lg> linegroup tags
 		else if (!strcmp(tag.getName(), "p") || !strcmp(tag.getName(), "lg")) {
 			if ((!tag.isEndTag()) && (!tag.isEmpty())) {	// non-empty start tag
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 			}
 			else if (tag.isEndTag()) {	// end tag
-				outText("<br />\n", buf, u);
-				userData->supressAdjacentWhitespace = true;
+				u->outputNewline(buf);
 			}
 			else {					// empty paragraph break marker
-				outText("<br />\n", buf, u);
-				userData->supressAdjacentWhitespace = true;
+				u->outputNewline(buf);
 			}
 		}
 
@@ -319,12 +327,11 @@
 		else if (tag.isEmpty() && !strcmp(tag.getName(), "div") && tag.getAttribute("type") && !strcmp(tag.getAttribute("type"), "paragraph")) {
 			// <div type="paragraph"  sID... />
 			if (tag.getAttribute("sID")) {	// non-empty start tag
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 			}
 			// <div type="paragraph"  eID... />
 			else if (tag.getAttribute("eID")) {
-				outText("<br />\n", buf, u);
-				userData->supressAdjacentWhitespace = true;
+				u->outputNewline(buf);
 			}
 		}
 
@@ -384,34 +391,32 @@
 		else if (!strcmp(tag.getName(), "l")) {
 			// end line marker
 			if (tag.getAttribute("eID")) {
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 			}
 			// <l/> without eID or sID
 			// Note: this is improper osis. This should be <lb/>
 			else if (tag.isEmpty() && !tag.getAttribute("sID")) {
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 			}
 			// end of the line
 			else if (tag.isEndTag()) {
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 			}
 		}
 
 		// <lb.../>
 		else if (!strcmp(tag.getName(), "lb")) {
-			outText("<br />\n", buf, u);
-			userData->supressAdjacentWhitespace = true;
+				u->outputNewline(buf);
 		}
 		// <milestone type="line"/>
 		// <milestone type="x-p"/>
 		// <milestone type="cQuote" marker="x"/>
 		else if ((!strcmp(tag.getName(), "milestone")) && (tag.getAttribute("type"))) {
 			if (!strcmp(tag.getAttribute("type"), "line")) {
-				outText("<br />\n", buf, u);
+				u->outputNewline(buf);
 				if (tag.getAttribute("subType") && !strcmp(tag.getAttribute("subType"), "x-PM")) {
-					outText("<br />\n", buf, u);
+					u->outputNewline(buf);
 				}
-				userData->supressAdjacentWhitespace = true;
 			}
 			else if (!strcmp(tag.getAttribute("type"),"x-p"))  {
 				if (tag.getAttribute("marker"))
@@ -464,12 +469,12 @@
 					buf += "<h3>";
 					tag.setAttribute("pushed", "h3");
 				}
-				u->tagStacks->titleStack.push(tag.toString());
+				u->titleStack->push(tag.toString());
 			}
 			else if (tag.isEndTag()) {
-				if (!u->tagStacks->titleStack.empty()) {
-					XMLTag tag(u->tagStacks->titleStack.top());
-					u->tagStacks->titleStack.pop();
+				if (!u->titleStack->empty()) {
+					XMLTag tag(u->titleStack->top());
+					u->titleStack->pop();
 					SWBuf pushed = tag.getAttribute("pushed");
 					if (pushed.size()) {
 						buf += (SWBuf)"</" + pushed + ">\n\n";
@@ -477,6 +482,8 @@
 					else {
 						buf += "</h3>\n\n";
 					}
+					++u->consecutiveNewlines;
+					u->supressAdjacentWhitespace = true;
 				}
 			}
 		}
@@ -488,6 +495,8 @@
 			}
 			else if (tag.isEndTag()) {
 				outText("</ul>\n", buf, u);
+				++u->consecutiveNewlines;
+				u->supressAdjacentWhitespace = true;
 			}
 		}
 
@@ -498,6 +507,8 @@
 			}
 			else if (tag.isEndTag()) {
 				outText("</li>\n", buf, u);
+				++u->consecutiveNewlines;
+				u->supressAdjacentWhitespace = true;
 			}
 		}
 		// <catchWord> & <rdg> tags (italicize)
@@ -546,13 +557,13 @@
 				else {	// all other types
 					outText("<i>", buf, u);
 				}
-				u->tagStacks->hiStack.push(tag.toString());
+				u->hiStack->push(tag.toString());
 			}
 			else if (tag.isEndTag()) {
 				SWBuf type = "";
-				if (!u->tagStacks->hiStack.empty()) {
-					XMLTag tag(u->tagStacks->hiStack.top());
-					u->tagStacks->hiStack.pop();
+				if (!u->hiStack->empty()) {
+					XMLTag tag(u->hiStack->top());
+					u->hiStack->pop();
 					type = tag.getAttribute("type");
 					if (!type.length()) type = tag.getAttribute("rend");
 				}
@@ -589,7 +600,7 @@
 			if ((!tag.isEmpty() && !tag.isEndTag()) || (tag.isEmpty() && tag.getAttribute("sID"))) {
 				// if <q> then remember it for the </q>
 				if (!tag.isEmpty()) {
-					u->tagStacks->quoteStack.push(tag.toString());
+					u->quoteStack->push(tag.toString());
 				}
 
 				// Do this first so quote marks are included as WoC
@@ -606,9 +617,9 @@
 			// close </q> or <q eID... />
 			else if ((tag.isEndTag()) || (tag.isEmpty() && tag.getAttribute("eID"))) {
 				// if it is </q> then pop the stack for the attributes
-				if (tag.isEndTag() && !u->tagStacks->quoteStack.empty()) {
-					XMLTag qTag(u->tagStacks->quoteStack.top());
-					u->tagStacks->quoteStack.pop();
+				if (tag.isEndTag() && !u->quoteStack->empty()) {
+					XMLTag qTag(u->quoteStack->top());
+					u->quoteStack->pop();
 
 					type    = qTag.getAttribute("type");
 					who     = qTag.getAttribute("who");
@@ -656,29 +667,28 @@
 		// image
 		else if (!strcmp(tag.getName(), "figure")) {
 			const char *src = tag.getAttribute("src");
-			if (!src)		// assert we have a src attribute
-				return false;
+			if (src) {		// assert we have a src attribute 
+				SWBuf filepath;
+				if (userData->module) {
+					filepath = userData->module->getConfigEntry("AbsoluteDataPath");
+					if ((filepath.size()) && (filepath[filepath.size()-1] != '/') && (src[0] != '/'))
+						filepath += '/';
+				}
+				filepath += src;
 
-			SWBuf filepath;
-			if (userData->module) {
-				filepath = userData->module->getConfigEntry("AbsoluteDataPath");
-				if ((filepath.size()) && (filepath[filepath.size()-1] != '/') && (src[0] != '/'))
-					filepath += '/';
-			}
-			filepath += src;
+				// images become clickable, if the UI supports showImage.
+				outText("<a href=\"passagestudy.jsp?action=showImage&value=", buf, u);
+				outText(URL::encode(filepath.c_str()).c_str(), buf, u);
+				outText("&module=", buf, u);
+				outText(URL::encode(u->version.c_str()).c_str(), buf, u);
+				outText("\">", buf, u);
 
-			// images become clickable, if the UI supports showImage.
-			outText("<a href=\"passagestudy.jsp?action=showImage&value=", buf, u);
-			outText(URL::encode(filepath.c_str()).c_str(), buf, u);
-			outText("&module=", buf, u);
-			outText(URL::encode(u->version.c_str()).c_str(), buf, u);
-			outText("\">", buf, u);
+				outText("<img src=\"file:", buf, u);
+				outText(filepath, buf, u);
+				outText("\" border=\"0\" />", buf, u);
 
-			outText("<img src=\"file:", buf, u);
-			outText(filepath, buf, u);
-			outText("\" border=\"0\" />", buf, u);
-
-			outText("</a>", buf, u);
+				outText("</a>", buf, u);
+			}
 		}
 
 		// ok to leave these in
@@ -708,6 +718,8 @@
 			}
 			else if (tag.isEndTag()) {
 				buf += "</tbody></table>\n";
+				++u->consecutiveNewlines;
+				u->supressAdjacentWhitespace = true;
 			}
 			
 		}
@@ -729,9 +741,11 @@
 			}
 		}
 		else {
-		      return false;  // we still didn't handle token
+			if (!u->supressAdjacentWhitespace) u->consecutiveNewlines = 0;
+			return false;  // we still didn't handle token
 		}
 	}
+	if (!u->supressAdjacentWhitespace) u->consecutiveNewlines = 0;
 	return true;
 }
 

Modified: trunk/usrinst.sh
===================================================================
--- trunk/usrinst.sh	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/usrinst.sh	2013-05-30 03:43:52 UTC (rev 2803)
@@ -21,7 +21,12 @@
 #
 
 OPTIONS="--prefix=/usr $OPTIONS"
-OPTIONS="--libdir=/usr/lib64 $OPTIONS"
+if [ -d /usr/lib64 ]
+then
+	OPTIONS="--libdir=/usr/lib64 $OPTIONS"
+else
+	OPTIONS="--libdir=/usr/lib $OPTIONS"
+fi
 OPTIONS="--sysconfdir=/etc $OPTIONS"
 OPTIONS="--without-conf $OPTIONS"
 OPTIONS="--disable-shared $OPTIONS"

Modified: trunk/utilities/installmgr.cpp
===================================================================
--- trunk/utilities/installmgr.cpp	2013-05-26 13:25:30 UTC (rev 2802)
+++ trunk/utilities/installmgr.cpp	2013-05-30 03:43:52 UTC (rev 2803)
@@ -21,7 +21,7 @@
 
 #include <swmgr.h>
 #include <installmgr.h>
-#include <ftptrans.h>
+#include <remotetrans.h>
 #include <filemgr.h>
 #include <iostream>
 #include <map>




More information about the sword-cvs mailing list