The SWORD Project  1.9.0.svnversion
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
FTPLibFTPTransport Class Reference

#include <ftplibftpt.h>

+ Inheritance diagram for FTPLibFTPTransport:
+ Collaboration diagram for FTPLibFTPTransport:

Public Member Functions

int copyDirectory (const char *urlPrefix, const char *dir, const char *dest, const char *suffix)
 
 FTPLibFTPTransport (const char *host, StatusReporter *statusReporter=0)
 
virtual std::vector< struct
DirEntry
getDirList (const char *dirURL)
 
long getTimeoutMillis ()
 
char getURL (const char *destPath, const char *sourceURL, SWBuf *destBuf=0)
 
bool isPassive ()
 
bool isUnverifiedPeerAllowed ()
 
virtual char putURL (const char *destURL, const char *sourcePath, SWBuf *sourceBuf=0)
 
void setPassive (bool passive)
 
void setPasswd (const char *passwd)
 
void setTimeoutMillis (long timeoutMillis)
 
void setUnverifiedPeerAllowed (bool val)
 
void setUser (const char *user)
 
void terminate ()
 
 ~FTPLibFTPTransport ()
 

Protected Attributes

SWBuf host
 
SWBuf p
 
bool passive
 
StatusReporterstatusReporter
 
bool term
 
long timeoutMillis
 
SWBuf u
 
bool unverifiedPeerAllowed
 

Private Member Functions

char assureLoggedIn ()
 

Private Attributes

netbufftpConnection
 

Detailed Description

Definition at line 34 of file ftplibftpt.h.

Constructor & Destructor Documentation

FTPLibFTPTransport::FTPLibFTPTransport ( const char *  host,
StatusReporter statusReporter = 0 
)

Definition at line 94 of file ftplibftpt.cpp.

94  : RemoteTransport(host, sr) {
95 
96  ftpConnection = 0;
97 }
netbuf * ftpConnection
Definition: ftplibftpt.h:35
RemoteTransport(const char *host, StatusReporter *statusReporter=0)
Definition: remotetrans.cpp:62
FTPLibFTPTransport::~FTPLibFTPTransport ( )

Definition at line 100 of file ftplibftpt.cpp.

100  {
101  if (ftpConnection)
103 }
GLOBALDEF void FtpQuit(netbuf *nControl)
Definition: ftplib.c:1414
netbuf * ftpConnection
Definition: ftplibftpt.h:35

Member Function Documentation

char FTPLibFTPTransport::assureLoggedIn ( )
private

Definition at line 106 of file ftplibftpt.cpp.

106  {
107  char retVal = 0;
108  if (ftpConnection == 0) {
109 SWLOGD("connecting to host: %s...\n", host.c_str());
110  if (FtpConnect(host, &ftpConnection)) {
113 
114 SWLOGD("connected. logging in...\n");
115  if (FtpLogin(u.c_str(), p.c_str(), ftpConnection)) {
116 SWLOGD("logged in.\n");
117  retVal = 0;
118  }
119  else {
120  SWLog::getSystemLog()->logError("Failed to login to %s\n", host.c_str());
121  retVal = -2;
122  }
123  }
124  else {
125  SWLog::getSystemLog()->logError("Failed to connect to %s\n", host.c_str());
126  retVal = -2;
127  }
128  }
129  return retVal;
130 }
static SWLog * getSystemLog()
Definition: swlog.cpp:53
#define FTPLIB_PORT
Definition: ftplib.h:57
GLOBALDEF int FtpConnect(const char *host, netbuf **nControl)
Definition: ftplib.c:444
GLOBALDEF int FtpOptions(int opt, long val, netbuf *nControl)
Definition: ftplib.c:604
GLOBALDEF int FtpLogin(const char *user, const char *pass, netbuf *nControl)
Definition: ftplib.c:675
netbuf * ftpConnection
Definition: ftplibftpt.h:35
const char * c_str() const
Definition: swbuf.h:158
#define FTPLIB_PASSIVE
Definition: ftplib.h:56
void logError(const char *fmt,...) const
Definition: swlog.cpp:87
#define FTPLIB_IDLETIME
Definition: ftplib.h:61
#define FTPLIB_CONNMODE
Definition: ftplib.h:59
#define SWLOGD(...)
Definition: defs.h:187
int RemoteTransport::copyDirectory ( const char *  urlPrefix,
const char *  dir,
const char *  dest,
const char *  suffix 
)
inherited

network copy recursively a remote directly

Returns
error status 0: OK; -1: operation error, -2: connection error; -3: user requested termination

Definition at line 140 of file remotetrans.cpp.

140  {
141 SWLOGD("RemoteTransport::copyDirectory");
142  int retVal = 0;
143 
144  SWBuf url = SWBuf(urlPrefix) + SWBuf(dir);
145  removeTrailingSlash(url);
146  url += '/';
147 
148 SWLOGD("NetTransport: getting dir %s\n", url.c_str());
149  vector<struct DirEntry> dirList = getDirList(url.c_str());
150 
151  if (!dirList.size()) {
152  SWLog::getSystemLog()->logWarning("NetTransport: failed to read dir %s\n", url.c_str());
153  return -1;
154  }
155 
156  // append files in sub directories and calculate total download size
157  unsigned int i = 0;
158  long totalBytes = 0;
159  for (;;) {
160  if (i == dirList.size())
161  break;
162 
163  struct DirEntry &e = dirList.at(i);
164 
165  if (e.isDirectory) {
166  SWBuf name(e.name); // &e will be invalidated after first insertion
167  vector<struct DirEntry> sd = getDirList((url + name + '/').c_str());
168  for (unsigned int ii = 0; ii < sd.size(); ii++) {
169  sd[ii].name = name + '/' + sd[ii].name;
170  dirList.push_back(sd[ii]);
171  }
172  dirList.erase(dirList.begin() + i);
173  }
174  else {
175  totalBytes += e.size;
176  i++;
177  }
178  }
179 
180  long completedBytes = 0;
181  for (i = 0; i < dirList.size(); i++) {
182  struct DirEntry &dirEntry = dirList[i];
183  SWBuf buffer = (SWBuf)dest;
184  removeTrailingSlash(buffer);
185  buffer += "/";
186  buffer += dirEntry.name;
187  if (!strcmp(&buffer.c_str()[buffer.length()-strlen(suffix)], suffix)) {
188  SWBuf buffer2 = "Downloading (";
189  buffer2.appendFormatted("%d", i+1);
190  buffer2 += " of ";
191  buffer2.appendFormatted("%d", dirList.size());
192  buffer2 += "): ";
193  buffer2 += dirEntry.name;
194  if (statusReporter)
195  statusReporter->preStatus(totalBytes, completedBytes, buffer2.c_str());
196  FileMgr::createParent(buffer.c_str()); // make sure parent directory exists
197  SWTRY {
198  SWBuf url = (SWBuf)urlPrefix + (SWBuf)dir;
199  removeTrailingSlash(url);
200  url += "/";
201  url += dirEntry.name;
202  retVal = getURL(buffer.c_str(), url.c_str());
203  if (retVal) {
204  SWLog::getSystemLog()->logWarning("copyDirectory: failed to get file %s\n", url.c_str());
205  return retVal;
206  }
207  completedBytes += dirEntry.size;
208  }
209  SWCATCH (...) {}
210  if (term) {
211  retVal = -3;
212  break;
213  }
214  }
215  }
216  return retVal;
217 }
bool isDirectory
Definition: filemgr.h:43
SWBuf & appendFormatted(const char *format,...)
Definition: swbuf.cpp:81
Definition: swbuf.h:47
unsigned long length() const
Definition: swbuf.h:197
unsigned long size
Definition: filemgr.h:42
static SWLog * getSystemLog()
Definition: swlog.cpp:53
virtual char getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf=0)
Definition: remotetrans.cpp:78
preg buffer
Definition: regex.c:8089
#define SWTRY
Definition: defs.h:57
#define SWCATCH(x)
Definition: defs.h:58
const char * c_str() const
Definition: swbuf.h:158
SWBuf name
Definition: filemgr.h:41
virtual void preStatus(long totalBytes, long completedBytes, const char *message)
Definition: remotetrans.cpp:54
static void removeTrailingSlash(SWBuf &buf)
Definition: installmgr.cpp:57
static int createParent(const char *pName)
Definition: filemgr.cpp:426
void logWarning(const char *fmt,...) const
Definition: swlog.cpp:74
virtual std::vector< struct DirEntry > getDirList(const char *dirURL)
Definition: remotetrans.cpp:92
#define SWLOGD(...)
Definition: defs.h:187
StatusReporter * statusReporter
Definition: remotetrans.h:59
vector< struct DirEntry > RemoteTransport::getDirList ( const char *  dirURL)
virtualinherited

Reimplemented in CURLHTTPTransport.

Definition at line 92 of file remotetrans.cpp.

92  {
93 
94 SWLOGD("RemoteTransport::getDirList(%s)", dirURL);
95  vector<struct DirEntry> dirList;
96 
97  SWBuf dirBuf;
98  if (!getURL("", dirURL, &dirBuf)) {
99  char *start = dirBuf.getRawData();
100  char *end = start;
101  while (start < (dirBuf.getRawData()+dirBuf.size())) {
102  struct ftpparse item;
103  bool looking = true;
104  for (end = start; *end; end++) {
105  if (looking) {
106  if ((*end == 10) || (*end == 13)) {
107  *end = 0;
108  looking = false;
109  }
110  }
111  else if ((*end != 10) && (*end != 13))
112  break;
113  }
114 SWLOGD("getDirList: parsing item %s(%d)\n", start, end-start);
115  int status = ftpparse(&item, start, (int)(end - start));
116  // in ftpparse.h, there is a warning that name is not necessarily null terminated
117  SWBuf name;
118  name.append(item.name, item.namelen);
119 SWLOGD("getDirList: got item %s\n", name.c_str());
120  if (status && name != "." && name != "..") {
121  struct DirEntry i;
122  i.name = name;
123  i.size = item.size;
124  i.isDirectory = (item.flagtrycwd == 1);
125  dirList.push_back(i);
126  }
127  start = end;
128  }
129  }
130  else {
131  SWLog::getSystemLog()->logWarning("getDirList: failed to get dir %s\n", dirURL);
132  }
133  return dirList;
134 }
Definition: swbuf.h:47
static SWLog * getSystemLog()
Definition: swlog.cpp:53
char * name
Definition: ftpparse.h:21
virtual char getURL(const char *destPath, const char *sourceURL, SWBuf *destBuf=0)
Definition: remotetrans.cpp:78
char * getRawData()
Definition: swbuf.h:379
const char * c_str() const
Definition: swbuf.h:158
SWBuf & append(const char *str, long max=-1)
Definition: swbuf.h:274
SWBuf name
Definition: filemgr.h:41
unsigned long size() const
Definition: swbuf.h:185
void logWarning(const char *fmt,...) const
Definition: swlog.cpp:74
int ftpparse(struct ftpparse *fp, char *buf, int len)
Definition: ftpparse.c:144
#define SWLOGD(...)
Definition: defs.h:187
long RemoteTransport::getTimeoutMillis ( )
inlineinherited

Definition at line 94 of file remotetrans.h.

94 { return timeoutMillis; }
char FTPLibFTPTransport::getURL ( const char *  destPath,
const char *  sourceURL,
SWBuf destBuf = 0 
)
virtual

Reimplemented from RemoteTransport.

Definition at line 133 of file ftplibftpt.cpp.

133  {
134 
135  char retVal = 0;
136 
137 SWLOGD("FTPLibFTPTransport::getURL(%s, %s, ...);\n", (destPath)?destPath:"(null)", sourceURL);
138  // assert we can login
139  retVal = assureLoggedIn();
140  if (retVal) return retVal;
141 SWLOGD("FTPLibFTPTransport - logged in.\n");
142 
143  SWBuf sourcePath = sourceURL;
144 
145  SWBuf outFile;
146  if (!destBuf) {
147  outFile = destPath;
148  }
149 
150  sourcePath << (6 + host.length()); // shift << "ftp://hostname";
151 SWLOGD("getting file %s to %s\n", sourcePath.c_str(), destBuf ? "*internal buffer*" : outFile.c_str());
152  struct MyProgressData pd;
153  pd.sr = statusReporter;
154  pd.term = &term;
155  pd.totalSize = 0;
156  int fd = 0;
157  if (destBuf) {
160  }
161  else {
162  fd = FileMgr::createPathAndFile(outFile);
165  }
166 
170 
171  if (sourcePath.endsWith("/") || sourcePath.endsWith("\\")) {
172 //SWLOGD("getting test directory %s\n", sourcePath.c_str());
173 // FtpDir(NULL, sourcePath, ftpConnection);
174 SWLOGD("getting real directory %s\n", sourcePath.c_str());
175  retVal = FtpDir(0, sourcePath, ftpConnection) - 1;
176 SWLOGD("got real directory %s to %s\n", sourcePath.c_str(), destBuf ? "*internal buffer*" : outFile.c_str());
177  }
178  else {
179 SWLOGD("getting file %s\n", sourcePath.c_str());
180  int size;
181  FtpSize(sourcePath, &size, FTPLIB_IMAGE, ftpConnection);
182  pd.totalSize = size;
183  retVal = FtpGet(0, sourcePath, FTPLIB_IMAGE, ftpConnection) - 1;
184  }
185  if (fd > 0) FileMgr::closeFile(fd);
186 SWLOGD("FTPLibFTPTransport - returning: %d\n", retVal);
187  return retVal;
188 }
#define FTPLIB_CALLBACK
Definition: ftplib.h:60
Definition: swbuf.h:47
unsigned long length() const
Definition: swbuf.h:197
#define FTPLIB_CALLBACK_WRITER
Definition: ftplib.h:64
#define FTPLIB_IMAGE
Definition: ftplib.h:51
#define FTPLIB_CALLBACK_WRITERARG
Definition: ftplib.h:65
GLOBALDEF int FtpOptions(int opt, long val, netbuf *nControl)
Definition: ftplib.c:604
static void closeFile(int fd)
Definition: filemgr.cpp:491
bool endsWith(const SWBuf &postfix) const
Definition: swbuf.h:501
static int my_fprogress(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
Definition: curlftpt.cpp:81
netbuf * ftpConnection
Definition: ftplibftpt.h:35
GLOBALDEF int FtpGet(const char *outputfile, const char *path, char mode, netbuf *nControl)
Definition: ftplib.c:1354
const char * c_str() const
Definition: swbuf.h:158
GLOBALDEF int FtpDir(const char *outputfile, const char *path, netbuf *nControl)
Definition: ftplib.c:1296
static int my_swbufwriter(netbuf *nControl, void *buffer, size_t size, void *swbuf)
Definition: ftplibftpt.cpp:43
static int my_filewriter(netbuf *nControl, void *buffer, size_t size, void *fd)
Definition: ftplibftpt.cpp:51
GLOBALDEF int FtpSize(const char *path, int *size, char mode, netbuf *nControl)
Definition: ftplib.c:1306
int size
Definition: regex.c:5043
static int createPathAndFile(const char *fName)
Definition: filemgr.cpp:479
#define FTPLIB_CALLBACKARG
Definition: ftplib.h:62
#define SWLOGD(...)
Definition: defs.h:187
StatusReporter * statusReporter
Definition: remotetrans.h:59
#define FTPLIB_CALLBACKBYTES
Definition: ftplib.h:63
bool RemoteTransport::isPassive ( )
inlineinherited

Definition at line 95 of file remotetrans.h.

95 { return passive; }
bool RemoteTransport::isUnverifiedPeerAllowed ( )
inlineinherited

Definition at line 99 of file remotetrans.h.

99 { return unverifiedPeerAllowed; }
bool unverifiedPeerAllowed
Definition: remotetrans.h:63
char RemoteTransport::putURL ( const char *  destURL,
const char *  sourcePath,
SWBuf sourceBuf = 0 
)
virtualinherited

Reimplemented in RTransportGDrive.

Definition at line 85 of file remotetrans.cpp.

85  {
86  SWLog::getSystemLog()->logWarning("RemoteTransport::putURL called but unsupported");
87  char retVal = -1;
88  return retVal;
89 }
static SWLog * getSystemLog()
Definition: swlog.cpp:53
void logWarning(const char *fmt,...) const
Definition: swlog.cpp:74
void RemoteTransport::setPassive ( bool  passive)
inlineinherited

Definition at line 92 of file remotetrans.h.

92 { this->passive = passive; }
void RemoteTransport::setPasswd ( const char *  passwd)
inlineinherited

Definition at line 97 of file remotetrans.h.

97 { p = passwd; }
void RemoteTransport::setTimeoutMillis ( long  timeoutMillis)
inlineinherited

Definition at line 93 of file remotetrans.h.

93 { this->timeoutMillis = timeoutMillis; }
void RemoteTransport::setUnverifiedPeerAllowed ( bool  val)
inlineinherited

Definition at line 98 of file remotetrans.h.

98 { this->unverifiedPeerAllowed = val; }
bool unverifiedPeerAllowed
Definition: remotetrans.h:63
void RemoteTransport::setUser ( const char *  user)
inlineinherited

Definition at line 96 of file remotetrans.h.

96 { u = user; }
void RemoteTransport::terminate ( )
inlineinherited

Definition at line 100 of file remotetrans.h.

100 { term = true; }

Member Data Documentation

netbuf* FTPLibFTPTransport::ftpConnection
private

Definition at line 35 of file ftplibftpt.h.

SWBuf RemoteTransport::host
protectedinherited

Definition at line 64 of file remotetrans.h.

SWBuf RemoteTransport::p
protectedinherited

Definition at line 66 of file remotetrans.h.

bool RemoteTransport::passive
protectedinherited

Definition at line 60 of file remotetrans.h.

StatusReporter* RemoteTransport::statusReporter
protectedinherited

Definition at line 59 of file remotetrans.h.

bool RemoteTransport::term
protectedinherited

Definition at line 62 of file remotetrans.h.

long RemoteTransport::timeoutMillis
protectedinherited

Definition at line 61 of file remotetrans.h.

SWBuf RemoteTransport::u
protectedinherited

Definition at line 65 of file remotetrans.h.

bool RemoteTransport::unverifiedPeerAllowed
protectedinherited

Definition at line 63 of file remotetrans.h.


The documentation for this class was generated from the following files: