blob: f0ed03f956f309c061833c8ab07c0ea2085073c2 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_ucb.hxx"
#include <com/sun/star/ucb/OpenMode.hpp>
#include "ftpurl.hxx"
#include "ftploaderthread.hxx"
#include "ftphandleprovider.hxx"
#include "debughelper.hxx"
#include <rtl/memory.h>
#include <vector>
#define TESTEVAL \
if(number_of_errors) \
fprintf(stderr,"errors in %s: %d\n",name,number_of_errors); \
return number_of_errors
namespace ccsu = com::sun::star::ucb;
struct ServerInfo {
rtl::OUString host;
rtl::OUString port;
rtl::OUString username;
rtl::OUString password;
rtl::OUString account;
};
class FTPHandleProviderI
: public ftp::FTPHandleProvider {
public:
FTPHandleProviderI()
: p(new ftp::FTPLoaderThread) {
}
~FTPHandleProviderI() {
delete p;
}
virtual CURL* handle() {
return p->handle();
}
bool forHost(const rtl::OUString& host,
const rtl::OUString& port,
const rtl::OUString& username,
rtl::OUString& password,
rtl::OUString& account)
{
for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
if(host == m_ServerInfo[i].host &&
port == m_ServerInfo[i].port &&
username == m_ServerInfo[i].username ) {
password = m_ServerInfo[i].password;
account = m_ServerInfo[i].account;
return true;
}
return false;
}
virtual bool setHost(const rtl::OUString& host,
const rtl::OUString& port,
const rtl::OUString& username,
const rtl::OUString& password,
const rtl::OUString& account)
{
ServerInfo inf;
inf.host = host;
inf.port = port;
inf.username = username;
inf.password = password;
inf.account = account;
bool present(false);
for(unsigned int i = 0; i < m_ServerInfo.size(); ++i)
if(host == m_ServerInfo[i].host &&
port == m_ServerInfo[i].port) {
m_ServerInfo[i] = inf;
present = true;
}
if(!present)
m_ServerInfo.push_back(inf);
return !present;
}
private:
std::vector<ServerInfo> m_ServerInfo;
ftp::FTPLoaderThread *p;
};
// Here are some test for the parsing of an url.
#define TESTURL \
{ \
ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov); \
if(!url.username().equalsAscii(n)) {\
++number_of_errors; \
err_msg("wrong username: ",url.username()); \
}}
int test_ftpurl(void) {
const char* name = "test_ftpurl";
int number_of_errors = 0;
FTPHandleProviderI prov;
char* ascii,*n,*p;
ascii = "ftp://abi:psswd@host/eins/../drei", n = "abi", p = "psswd";
TESTURL;
ascii = "ftp://:psswd@host:22/eins/../drei", n = "anonymous", p = "psswd";
TESTURL;
ascii = "ftp://host/bla/../../test/", n = "anonymous", p = "";
TESTURL;
TESTEVAL;
}
int test_ftplist(void) {
int number_of_errors = 0;
const char* name = "test_ftplist";
FTPHandleProviderI provider;
ftp::FTPURL url(
rtl::OUString::createFromAscii(
"ftp://abi:psswd@abi-1/dir"),
&provider);
std::vector<ftp::FTPDirentry> vec =
url.list(com::sun::star::ucb::OpenMode::ALL);
if(vec.size() != 3)
++number_of_errors;
if(!(vec[0].m_aName.equalsAscii("dir1") &&
vec[1].m_aName.equalsAscii("dir2") &&
vec[2].m_aName.equalsAscii("file1")))
++number_of_errors;
TESTEVAL;
}
#define TESTPARENT \
{ \
ftp::FTPURL url(rtl::OUString::createFromAscii(ascii),&prov); \
urlStr = url.parent(); \
if(!urlStr.equalsAscii(expect)) \
++number_of_errors; \
}
int test_ftpparent(void) {
int number_of_errors = 0;
const char* name = "test_ftpparent";
FTPHandleProviderI prov;
rtl::OUString urlStr;
char *ascii,*expect;
ascii = "ftp://abi:psswd@abi-1/file";
expect = "ftp://abi:psswd@abi-1/";
TESTPARENT;
ascii = "ftp://abi:psswd@abi-1/dir/../file";
expect = "ftp://abi:psswd@abi-1/";
TESTPARENT;
ascii = "ftp://abi:psswd@abi-1/..";
expect = "ftp://abi:psswd@abi-1/../..";
TESTPARENT;
ascii = "ftp://abi:psswd@abi-1/../../dir";
expect = "ftp://abi:psswd@abi-1/../..";
TESTPARENT;
ascii = "ftp://abi:psswd@abi-1/";
expect = "ftp://abi:psswd@abi-1/..";
TESTPARENT;
TESTEVAL;
}
int test_ftpproperties(void) {
int number_of_errors = 0;
const char* name = "test_ftpproperties";
FTPHandleProviderI provider;
ftp::FTPURL url(
rtl::OUString::createFromAscii(
"ftp://abi:psswd@abi-1/file"),
&provider);
ftp::FTPDirentry ade(url.direntry());
if(!(ade.m_aName.equalsAscii("file") &&
ade.isFile()))
++number_of_errors;
TESTEVAL;
}
int test_ftpopen(void)
{
int number_of_errors = 0;
const char* name = "test_ftpopen";
FTPHandleProviderI provider;
ftp::FTPURL url(
rtl::OUString::createFromAscii(
"ftp://abi:psswd@abi-1/file"),
&provider);
FILE* file = url.open();
if(file) {
int nbuf,ndest;
const int bffsz = 256;
char buff[bffsz];
char *dest = (char*) malloc(sizeof(char));
dest[0] = 0;
do {
rtl_zeroMemory((void*)buff,bffsz);
fread(buff,bffsz-1,1,file);
nbuf = strlen(buff);
ndest = strlen(dest);
dest = (char*)realloc(dest,ndest + nbuf + 1);
strncat(dest,buff,nbuf);
} while(nbuf == bffsz-1);
fclose(file);
const char* expected = "You are now looking at the filecontent.\n";
if(strcmp(expected,dest))
++number_of_errors;
free(dest);
} else
++number_of_errors;
TESTEVAL;
}