1*cdf0e10cSrcweir /************************************************************************* 2*cdf0e10cSrcweir * 3*cdf0e10cSrcweir * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*cdf0e10cSrcweir * 5*cdf0e10cSrcweir * Copyright 2000, 2010 Oracle and/or its affiliates. 6*cdf0e10cSrcweir * 7*cdf0e10cSrcweir * OpenOffice.org - a multi-platform office productivity suite 8*cdf0e10cSrcweir * 9*cdf0e10cSrcweir * This file is part of OpenOffice.org. 10*cdf0e10cSrcweir * 11*cdf0e10cSrcweir * OpenOffice.org is free software: you can redistribute it and/or modify 12*cdf0e10cSrcweir * it under the terms of the GNU Lesser General Public License version 3 13*cdf0e10cSrcweir * only, as published by the Free Software Foundation. 14*cdf0e10cSrcweir * 15*cdf0e10cSrcweir * OpenOffice.org is distributed in the hope that it will be useful, 16*cdf0e10cSrcweir * but WITHOUT ANY WARRANTY; without even the implied warranty of 17*cdf0e10cSrcweir * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18*cdf0e10cSrcweir * GNU Lesser General Public License version 3 for more details 19*cdf0e10cSrcweir * (a copy is included in the LICENSE file that accompanied this code). 20*cdf0e10cSrcweir * 21*cdf0e10cSrcweir * You should have received a copy of the GNU Lesser General Public License 22*cdf0e10cSrcweir * version 3 along with OpenOffice.org. If not, see 23*cdf0e10cSrcweir * <http://www.openoffice.org/license.html> 24*cdf0e10cSrcweir * for a copy of the LGPLv3 License. 25*cdf0e10cSrcweir * 26*cdf0e10cSrcweir ************************************************************************/ 27*cdf0e10cSrcweir 28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 29*cdf0e10cSrcweir #include "precompiled_ucb.hxx" 30*cdf0e10cSrcweir /************************************************************************** 31*cdf0e10cSrcweir TODO 32*cdf0e10cSrcweir ************************************************************************** 33*cdf0e10cSrcweir 34*cdf0e10cSrcweir *************************************************************************/ 35*cdf0e10cSrcweir 36*cdf0e10cSrcweir #include <memory> 37*cdf0e10cSrcweir #include <rtl/ustrbuf.hxx> 38*cdf0e10cSrcweir #include <com/sun/star/ucb/OpenMode.hpp> 39*cdf0e10cSrcweir #include <string.h> 40*cdf0e10cSrcweir #include <rtl/uri.hxx> 41*cdf0e10cSrcweir 42*cdf0e10cSrcweir #include "ftpstrcont.hxx" 43*cdf0e10cSrcweir #include "ftpurl.hxx" 44*cdf0e10cSrcweir #include "ftphandleprovider.hxx" 45*cdf0e10cSrcweir #include "ftpinpstr.hxx" 46*cdf0e10cSrcweir #include "ftpcfunc.hxx" 47*cdf0e10cSrcweir #include "ftpcontainer.hxx" 48*cdf0e10cSrcweir 49*cdf0e10cSrcweir using namespace ftp; 50*cdf0e10cSrcweir using namespace com::sun::star::ucb; 51*cdf0e10cSrcweir using namespace com::sun::star::uno; 52*cdf0e10cSrcweir using namespace com::sun::star::io; 53*cdf0e10cSrcweir 54*cdf0e10cSrcweir namespace { 55*cdf0e10cSrcweir 56*cdf0e10cSrcweir rtl::OUString encodePathSegment(rtl::OUString const & decoded) { 57*cdf0e10cSrcweir return rtl::Uri::encode( 58*cdf0e10cSrcweir decoded, rtl_UriCharClassPchar, rtl_UriEncodeIgnoreEscapes, 59*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 60*cdf0e10cSrcweir } 61*cdf0e10cSrcweir 62*cdf0e10cSrcweir rtl::OUString decodePathSegment(rtl::OUString const & encoded) { 63*cdf0e10cSrcweir return rtl::Uri::decode( 64*cdf0e10cSrcweir encoded, rtl_UriDecodeWithCharset, RTL_TEXTENCODING_UTF8); 65*cdf0e10cSrcweir } 66*cdf0e10cSrcweir 67*cdf0e10cSrcweir } 68*cdf0e10cSrcweir 69*cdf0e10cSrcweir MemoryContainer::MemoryContainer() 70*cdf0e10cSrcweir : m_nLen(0), 71*cdf0e10cSrcweir m_nWritePos(0), 72*cdf0e10cSrcweir m_pBuffer(0) 73*cdf0e10cSrcweir { 74*cdf0e10cSrcweir } 75*cdf0e10cSrcweir 76*cdf0e10cSrcweir MemoryContainer::~MemoryContainer() 77*cdf0e10cSrcweir { 78*cdf0e10cSrcweir rtl_freeMemory(m_pBuffer); 79*cdf0e10cSrcweir } 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir 82*cdf0e10cSrcweir int MemoryContainer::append( 83*cdf0e10cSrcweir const void* pBuffer, 84*cdf0e10cSrcweir size_t size, 85*cdf0e10cSrcweir size_t nmemb 86*cdf0e10cSrcweir ) throw() 87*cdf0e10cSrcweir { 88*cdf0e10cSrcweir sal_uInt32 nLen = size*nmemb; 89*cdf0e10cSrcweir sal_uInt32 tmp(nLen + m_nWritePos); 90*cdf0e10cSrcweir 91*cdf0e10cSrcweir if(m_nLen < tmp) { // enlarge in steps of multiples of 1K 92*cdf0e10cSrcweir do { 93*cdf0e10cSrcweir m_nLen+=1024; 94*cdf0e10cSrcweir } while(m_nLen < tmp); 95*cdf0e10cSrcweir 96*cdf0e10cSrcweir m_pBuffer = rtl_reallocateMemory(m_pBuffer,m_nLen); 97*cdf0e10cSrcweir } 98*cdf0e10cSrcweir 99*cdf0e10cSrcweir rtl_copyMemory(static_cast<sal_Int8*>(m_pBuffer)+m_nWritePos, 100*cdf0e10cSrcweir pBuffer,nLen); 101*cdf0e10cSrcweir m_nWritePos = tmp; 102*cdf0e10cSrcweir return nLen; 103*cdf0e10cSrcweir } 104*cdf0e10cSrcweir 105*cdf0e10cSrcweir 106*cdf0e10cSrcweir extern "C" { 107*cdf0e10cSrcweir 108*cdf0e10cSrcweir int memory_write(void *buffer,size_t size,size_t nmemb,void *stream) 109*cdf0e10cSrcweir { 110*cdf0e10cSrcweir MemoryContainer *_stream = 111*cdf0e10cSrcweir reinterpret_cast<MemoryContainer*>(stream); 112*cdf0e10cSrcweir 113*cdf0e10cSrcweir if(!_stream) 114*cdf0e10cSrcweir return 0; 115*cdf0e10cSrcweir 116*cdf0e10cSrcweir return _stream->append(buffer,size,nmemb); 117*cdf0e10cSrcweir } 118*cdf0e10cSrcweir 119*cdf0e10cSrcweir } 120*cdf0e10cSrcweir 121*cdf0e10cSrcweir 122*cdf0e10cSrcweir FTPURL::FTPURL(const FTPURL& r) 123*cdf0e10cSrcweir : m_mutex(), 124*cdf0e10cSrcweir m_pFCP(r.m_pFCP), 125*cdf0e10cSrcweir m_aUsername(r.m_aUsername), 126*cdf0e10cSrcweir m_bShowPassword(r.m_bShowPassword), 127*cdf0e10cSrcweir m_aHost(r.m_aHost), 128*cdf0e10cSrcweir m_aPort(r.m_aPort), 129*cdf0e10cSrcweir m_aPathSegmentVec(r.m_aPathSegmentVec) 130*cdf0e10cSrcweir 131*cdf0e10cSrcweir { 132*cdf0e10cSrcweir } 133*cdf0e10cSrcweir 134*cdf0e10cSrcweir 135*cdf0e10cSrcweir FTPURL::FTPURL(const rtl::OUString& url, 136*cdf0e10cSrcweir FTPHandleProvider* pFCP) 137*cdf0e10cSrcweir throw( 138*cdf0e10cSrcweir malformed_exception 139*cdf0e10cSrcweir ) 140*cdf0e10cSrcweir : m_pFCP(pFCP), 141*cdf0e10cSrcweir m_aUsername(rtl::OUString::createFromAscii("anonymous")), 142*cdf0e10cSrcweir m_bShowPassword(false), 143*cdf0e10cSrcweir m_aPort(rtl::OUString::createFromAscii("21")) 144*cdf0e10cSrcweir { 145*cdf0e10cSrcweir parse(url); // can reset m_bShowPassword 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir 148*cdf0e10cSrcweir 149*cdf0e10cSrcweir FTPURL::~FTPURL() 150*cdf0e10cSrcweir { 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir 153*cdf0e10cSrcweir 154*cdf0e10cSrcweir void FTPURL::parse(const rtl::OUString& url) 155*cdf0e10cSrcweir throw( 156*cdf0e10cSrcweir malformed_exception 157*cdf0e10cSrcweir ) 158*cdf0e10cSrcweir { 159*cdf0e10cSrcweir rtl::OUString aPassword,aAccount; 160*cdf0e10cSrcweir rtl::OString aIdent(url.getStr(), 161*cdf0e10cSrcweir url.getLength(), 162*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 163*cdf0e10cSrcweir 164*cdf0e10cSrcweir rtl::OString lower = aIdent.toAsciiLowerCase(); 165*cdf0e10cSrcweir if(lower.getLength() < 6 || 166*cdf0e10cSrcweir strncmp("ftp://",lower.getStr(),6)) 167*cdf0e10cSrcweir throw malformed_exception(); 168*cdf0e10cSrcweir 169*cdf0e10cSrcweir char *buffer = new char[1+aIdent.getLength()]; 170*cdf0e10cSrcweir const char* p2 = aIdent.getStr(); 171*cdf0e10cSrcweir p2 += 6; 172*cdf0e10cSrcweir 173*cdf0e10cSrcweir char ch; 174*cdf0e10cSrcweir char *p1 = buffer; // determine "username:password@host:port" 175*cdf0e10cSrcweir while((ch = *p2++) != '/' && ch) 176*cdf0e10cSrcweir *p1++ = ch; 177*cdf0e10cSrcweir *p1 = 0; 178*cdf0e10cSrcweir 179*cdf0e10cSrcweir rtl::OUString aExpr(rtl::OUString(buffer,strlen(buffer), 180*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8)); 181*cdf0e10cSrcweir 182*cdf0e10cSrcweir sal_Int32 l = aExpr.indexOf(sal_Unicode('@')); 183*cdf0e10cSrcweir m_aHost = aExpr.copy(1+l); 184*cdf0e10cSrcweir 185*cdf0e10cSrcweir if(l != -1) { 186*cdf0e10cSrcweir // Now username and password. 187*cdf0e10cSrcweir aExpr = aExpr.copy(0,l); 188*cdf0e10cSrcweir l = aExpr.indexOf(sal_Unicode(':')); 189*cdf0e10cSrcweir if(l != -1) { 190*cdf0e10cSrcweir aPassword = aExpr.copy(1+l); 191*cdf0e10cSrcweir if(aPassword.getLength()) 192*cdf0e10cSrcweir m_bShowPassword = true; 193*cdf0e10cSrcweir } 194*cdf0e10cSrcweir if(l > 0) 195*cdf0e10cSrcweir // Overwritte only if the username is not empty. 196*cdf0e10cSrcweir m_aUsername = aExpr.copy(0,l); 197*cdf0e10cSrcweir else if(aExpr.getLength()) 198*cdf0e10cSrcweir m_aUsername = aExpr; 199*cdf0e10cSrcweir } 200*cdf0e10cSrcweir 201*cdf0e10cSrcweir l = m_aHost.lastIndexOf(sal_Unicode(':')); 202*cdf0e10cSrcweir sal_Int32 ipv6Back = m_aHost.lastIndexOf(sal_Unicode(']')); 203*cdf0e10cSrcweir if((ipv6Back == -1 && l != -1) // not ipv6, but a port 204*cdf0e10cSrcweir || 205*cdf0e10cSrcweir (ipv6Back != -1 && 1+ipv6Back == l) // ipv6, and a port 206*cdf0e10cSrcweir ) 207*cdf0e10cSrcweir { 208*cdf0e10cSrcweir if(1+l<m_aHost.getLength()) 209*cdf0e10cSrcweir m_aPort = m_aHost.copy(1+l); 210*cdf0e10cSrcweir m_aHost = m_aHost.copy(0,l); 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir 213*cdf0e10cSrcweir while(ch) { // now determine the pathsegments ... 214*cdf0e10cSrcweir p1 = buffer; 215*cdf0e10cSrcweir while((ch = *p2++) != '/' && ch) 216*cdf0e10cSrcweir *p1++ = ch; 217*cdf0e10cSrcweir *p1 = 0; 218*cdf0e10cSrcweir 219*cdf0e10cSrcweir if(buffer[0]) { 220*cdf0e10cSrcweir if(strcmp(buffer,"..") == 0 && 221*cdf0e10cSrcweir m_aPathSegmentVec.size() && 222*cdf0e10cSrcweir ! m_aPathSegmentVec.back().equalsAscii("..")) 223*cdf0e10cSrcweir m_aPathSegmentVec.pop_back(); 224*cdf0e10cSrcweir else if(strcmp(buffer,".") == 0) 225*cdf0e10cSrcweir ; // Ignore 226*cdf0e10cSrcweir else 227*cdf0e10cSrcweir // This is a legal name. 228*cdf0e10cSrcweir m_aPathSegmentVec.push_back( 229*cdf0e10cSrcweir rtl::OUString(buffer, 230*cdf0e10cSrcweir strlen(buffer), 231*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8)); 232*cdf0e10cSrcweir } 233*cdf0e10cSrcweir } 234*cdf0e10cSrcweir 235*cdf0e10cSrcweir delete[] buffer; 236*cdf0e10cSrcweir 237*cdf0e10cSrcweir if(m_bShowPassword) 238*cdf0e10cSrcweir m_pFCP->setHost(m_aHost, 239*cdf0e10cSrcweir m_aPort, 240*cdf0e10cSrcweir m_aUsername, 241*cdf0e10cSrcweir aPassword, 242*cdf0e10cSrcweir aAccount); 243*cdf0e10cSrcweir 244*cdf0e10cSrcweir // now check for something like ";type=i" at end of url 245*cdf0e10cSrcweir if(m_aPathSegmentVec.size() && 246*cdf0e10cSrcweir (l = m_aPathSegmentVec.back().indexOf(sal_Unicode(';'))) != -1) { 247*cdf0e10cSrcweir m_aType = m_aPathSegmentVec.back().copy(l); 248*cdf0e10cSrcweir m_aPathSegmentVec.back() = m_aPathSegmentVec.back().copy(0,l); 249*cdf0e10cSrcweir } 250*cdf0e10cSrcweir } 251*cdf0e10cSrcweir 252*cdf0e10cSrcweir 253*cdf0e10cSrcweir rtl::OUString FTPURL::ident(bool withslash,bool internal) const 254*cdf0e10cSrcweir { 255*cdf0e10cSrcweir // rebuild the url as one without ellipses, 256*cdf0e10cSrcweir // and more important, as one without username and 257*cdf0e10cSrcweir // password. ( These are set together with the command. ) 258*cdf0e10cSrcweir 259*cdf0e10cSrcweir rtl::OUStringBuffer bff; 260*cdf0e10cSrcweir bff.appendAscii("ftp://"); 261*cdf0e10cSrcweir 262*cdf0e10cSrcweir if(!m_aUsername.equalsAscii("anonymous")) { 263*cdf0e10cSrcweir bff.append(m_aUsername); 264*cdf0e10cSrcweir 265*cdf0e10cSrcweir rtl::OUString aPassword,aAccount; 266*cdf0e10cSrcweir m_pFCP->forHost(m_aHost, 267*cdf0e10cSrcweir m_aPort, 268*cdf0e10cSrcweir m_aUsername, 269*cdf0e10cSrcweir aPassword, 270*cdf0e10cSrcweir aAccount); 271*cdf0e10cSrcweir 272*cdf0e10cSrcweir if((m_bShowPassword || internal) && 273*cdf0e10cSrcweir aPassword.getLength() ) 274*cdf0e10cSrcweir bff.append(sal_Unicode(':')) 275*cdf0e10cSrcweir .append(aPassword); 276*cdf0e10cSrcweir 277*cdf0e10cSrcweir bff.append(sal_Unicode('@')); 278*cdf0e10cSrcweir } 279*cdf0e10cSrcweir bff.append(m_aHost); 280*cdf0e10cSrcweir 281*cdf0e10cSrcweir if(!m_aPort.equalsAscii("21")) 282*cdf0e10cSrcweir bff.append(sal_Unicode(':')) 283*cdf0e10cSrcweir .append(m_aPort) 284*cdf0e10cSrcweir .append(sal_Unicode('/')); 285*cdf0e10cSrcweir else 286*cdf0e10cSrcweir bff.append(sal_Unicode('/')); 287*cdf0e10cSrcweir 288*cdf0e10cSrcweir for(unsigned i = 0; i < m_aPathSegmentVec.size(); ++i) 289*cdf0e10cSrcweir if(i == 0) 290*cdf0e10cSrcweir bff.append(m_aPathSegmentVec[i]); 291*cdf0e10cSrcweir else 292*cdf0e10cSrcweir bff.append(sal_Unicode('/')).append(m_aPathSegmentVec[i]); 293*cdf0e10cSrcweir if(withslash) 294*cdf0e10cSrcweir if(bff.getLength() && bff[bff.getLength()-1] != sal_Unicode('/')) 295*cdf0e10cSrcweir bff.append(sal_Unicode('/')); 296*cdf0e10cSrcweir 297*cdf0e10cSrcweir bff.append(m_aType); 298*cdf0e10cSrcweir return bff.makeStringAndClear(); 299*cdf0e10cSrcweir } 300*cdf0e10cSrcweir 301*cdf0e10cSrcweir 302*cdf0e10cSrcweir rtl::OUString FTPURL::parent(bool internal) const 303*cdf0e10cSrcweir { 304*cdf0e10cSrcweir rtl::OUStringBuffer bff; 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir bff.appendAscii("ftp://"); 307*cdf0e10cSrcweir 308*cdf0e10cSrcweir if(!m_aUsername.equalsAscii("anonymous")) { 309*cdf0e10cSrcweir bff.append(m_aUsername); 310*cdf0e10cSrcweir 311*cdf0e10cSrcweir rtl::OUString aPassword,aAccount; 312*cdf0e10cSrcweir m_pFCP->forHost(m_aHost, 313*cdf0e10cSrcweir m_aPort, 314*cdf0e10cSrcweir m_aUsername, 315*cdf0e10cSrcweir aPassword, 316*cdf0e10cSrcweir aAccount); 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir if((internal || m_bShowPassword) && aPassword.getLength()) 319*cdf0e10cSrcweir bff.append(sal_Unicode(':')) 320*cdf0e10cSrcweir .append(aPassword); 321*cdf0e10cSrcweir 322*cdf0e10cSrcweir bff.append(sal_Unicode('@')); 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir 325*cdf0e10cSrcweir bff.append(m_aHost); 326*cdf0e10cSrcweir 327*cdf0e10cSrcweir if(!m_aPort.equalsAscii("21")) 328*cdf0e10cSrcweir bff.append(sal_Unicode(':')) 329*cdf0e10cSrcweir .append(m_aPort) 330*cdf0e10cSrcweir .append(sal_Unicode('/')); 331*cdf0e10cSrcweir else 332*cdf0e10cSrcweir bff.append(sal_Unicode('/')); 333*cdf0e10cSrcweir 334*cdf0e10cSrcweir rtl::OUString last; 335*cdf0e10cSrcweir 336*cdf0e10cSrcweir for(unsigned int i = 0; i < m_aPathSegmentVec.size(); ++i) 337*cdf0e10cSrcweir if(1+i == m_aPathSegmentVec.size()) 338*cdf0e10cSrcweir last = m_aPathSegmentVec[i]; 339*cdf0e10cSrcweir else if(i == 0) 340*cdf0e10cSrcweir bff.append(m_aPathSegmentVec[i]); 341*cdf0e10cSrcweir else 342*cdf0e10cSrcweir bff.append(sal_Unicode('/')).append(m_aPathSegmentVec[i]); 343*cdf0e10cSrcweir 344*cdf0e10cSrcweir if(!last.getLength()) 345*cdf0e10cSrcweir bff.appendAscii(".."); 346*cdf0e10cSrcweir else if(last.equalsAscii("..")) 347*cdf0e10cSrcweir bff.append(last).appendAscii("/.."); 348*cdf0e10cSrcweir 349*cdf0e10cSrcweir bff.append(m_aType); 350*cdf0e10cSrcweir return bff.makeStringAndClear(); 351*cdf0e10cSrcweir } 352*cdf0e10cSrcweir 353*cdf0e10cSrcweir 354*cdf0e10cSrcweir void FTPURL::child(const rtl::OUString& title) 355*cdf0e10cSrcweir { 356*cdf0e10cSrcweir m_aPathSegmentVec.push_back(encodePathSegment(title)); 357*cdf0e10cSrcweir } 358*cdf0e10cSrcweir 359*cdf0e10cSrcweir 360*cdf0e10cSrcweir rtl::OUString FTPURL::child() const 361*cdf0e10cSrcweir { 362*cdf0e10cSrcweir return 363*cdf0e10cSrcweir m_aPathSegmentVec.size() ? 364*cdf0e10cSrcweir decodePathSegment(m_aPathSegmentVec.back()) : rtl::OUString(); 365*cdf0e10cSrcweir } 366*cdf0e10cSrcweir 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir 369*cdf0e10cSrcweir /** Listing of a directory. 370*cdf0e10cSrcweir */ 371*cdf0e10cSrcweir 372*cdf0e10cSrcweir namespace ftp { 373*cdf0e10cSrcweir 374*cdf0e10cSrcweir enum OS { 375*cdf0e10cSrcweir FTP_DOS,FTP_UNIX,FTP_VMS,FTP_UNKNOWN 376*cdf0e10cSrcweir }; 377*cdf0e10cSrcweir 378*cdf0e10cSrcweir } 379*cdf0e10cSrcweir 380*cdf0e10cSrcweir 381*cdf0e10cSrcweir #define SET_CONTROL_CONTAINER \ 382*cdf0e10cSrcweir MemoryContainer control; \ 383*cdf0e10cSrcweir curl_easy_setopt(curl, \ 384*cdf0e10cSrcweir CURLOPT_HEADERFUNCTION, \ 385*cdf0e10cSrcweir memory_write); \ 386*cdf0e10cSrcweir curl_easy_setopt(curl, \ 387*cdf0e10cSrcweir CURLOPT_WRITEHEADER, \ 388*cdf0e10cSrcweir &control) 389*cdf0e10cSrcweir 390*cdf0e10cSrcweir 391*cdf0e10cSrcweir #define SET_DATA_CONTAINER \ 392*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,false); \ 393*cdf0e10cSrcweir MemoryContainer data; \ 394*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,memory_write); \ 395*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_WRITEDATA,&data) 396*cdf0e10cSrcweir 397*cdf0e10cSrcweir #define SET_URL(url) \ 398*cdf0e10cSrcweir rtl::OString urlParAscii(url.getStr(), \ 399*cdf0e10cSrcweir url.getLength(), \ 400*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); \ 401*cdf0e10cSrcweir curl_easy_setopt(curl, \ 402*cdf0e10cSrcweir CURLOPT_URL, \ 403*cdf0e10cSrcweir urlParAscii.getStr()); 404*cdf0e10cSrcweir 405*cdf0e10cSrcweir // Setting username:password 406*cdf0e10cSrcweir #define SET_USER_PASSWORD(username,password) \ 407*cdf0e10cSrcweir rtl::OUString combi(username + \ 408*cdf0e10cSrcweir rtl::OUString::createFromAscii(":") + \ 409*cdf0e10cSrcweir password); \ 410*cdf0e10cSrcweir rtl::OString aUserPsswd(combi.getStr(), \ 411*cdf0e10cSrcweir combi.getLength(), \ 412*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); \ 413*cdf0e10cSrcweir curl_easy_setopt(curl, \ 414*cdf0e10cSrcweir CURLOPT_USERPWD, \ 415*cdf0e10cSrcweir aUserPsswd.getStr()) 416*cdf0e10cSrcweir 417*cdf0e10cSrcweir 418*cdf0e10cSrcweir 419*cdf0e10cSrcweir FILE* FTPURL::open() 420*cdf0e10cSrcweir throw(curl_exception) 421*cdf0e10cSrcweir { 422*cdf0e10cSrcweir if(!m_aPathSegmentVec.size()) 423*cdf0e10cSrcweir throw curl_exception(CURLE_FTP_COULDNT_RETR_FILE); 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 426*cdf0e10cSrcweir 427*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 428*cdf0e10cSrcweir rtl::OUString url(ident(false,true)); 429*cdf0e10cSrcweir SET_URL(url); 430*cdf0e10cSrcweir FILE *res = tmpfile(); 431*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,file_write); 432*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_WRITEDATA,res); 433*cdf0e10cSrcweir 434*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,0); 435*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 436*cdf0e10cSrcweir 437*cdf0e10cSrcweir if(err == CURLE_OK) 438*cdf0e10cSrcweir rewind(res); 439*cdf0e10cSrcweir else { 440*cdf0e10cSrcweir fclose(res),res = 0; 441*cdf0e10cSrcweir throw curl_exception(err); 442*cdf0e10cSrcweir } 443*cdf0e10cSrcweir 444*cdf0e10cSrcweir return res; 445*cdf0e10cSrcweir } 446*cdf0e10cSrcweir 447*cdf0e10cSrcweir 448*cdf0e10cSrcweir std::vector<FTPDirentry> FTPURL::list( 449*cdf0e10cSrcweir sal_Int16 nMode 450*cdf0e10cSrcweir ) const 451*cdf0e10cSrcweir throw( 452*cdf0e10cSrcweir curl_exception 453*cdf0e10cSrcweir ) 454*cdf0e10cSrcweir { 455*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 456*cdf0e10cSrcweir 457*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 458*cdf0e10cSrcweir SET_DATA_CONTAINER; 459*cdf0e10cSrcweir rtl::OUString url(ident(true,true)); 460*cdf0e10cSrcweir SET_URL(url); 461*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,0); 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 464*cdf0e10cSrcweir if(err != CURLE_OK) 465*cdf0e10cSrcweir throw curl_exception(err); 466*cdf0e10cSrcweir 467*cdf0e10cSrcweir // now evaluate the error messages 468*cdf0e10cSrcweir 469*cdf0e10cSrcweir sal_uInt32 len = data.m_nWritePos; 470*cdf0e10cSrcweir char* fwd = (char*) data.m_pBuffer; 471*cdf0e10cSrcweir rtl::OString str(fwd,len); 472*cdf0e10cSrcweir char *p1, *p2; 473*cdf0e10cSrcweir p1 = p2 = fwd; 474*cdf0e10cSrcweir 475*cdf0e10cSrcweir OS osKind(FTP_UNKNOWN); 476*cdf0e10cSrcweir std::vector<FTPDirentry> resvec; 477*cdf0e10cSrcweir FTPDirentry aDirEntry; 478*cdf0e10cSrcweir // ensure slash at the end 479*cdf0e10cSrcweir rtl::OUString viewurl(ident(true,false)); 480*cdf0e10cSrcweir 481*cdf0e10cSrcweir while(true) { 482*cdf0e10cSrcweir while(p2-fwd < int(len) && *p2 != '\n') ++p2; 483*cdf0e10cSrcweir if(p2-fwd == int(len)) break; 484*cdf0e10cSrcweir 485*cdf0e10cSrcweir *p2 = 0; 486*cdf0e10cSrcweir switch(osKind) { 487*cdf0e10cSrcweir // While FTP knows the 'system'-command, 488*cdf0e10cSrcweir // which returns the operating system type, 489*cdf0e10cSrcweir // this is not usable here: There are Windows-server 490*cdf0e10cSrcweir // formatting the output like UNIX-ls command. 491*cdf0e10cSrcweir case FTP_DOS: 492*cdf0e10cSrcweir FTPDirectoryParser::parseDOS(aDirEntry,p1); 493*cdf0e10cSrcweir break; 494*cdf0e10cSrcweir case FTP_UNIX: 495*cdf0e10cSrcweir FTPDirectoryParser::parseUNIX(aDirEntry,p1); 496*cdf0e10cSrcweir break; 497*cdf0e10cSrcweir case FTP_VMS: 498*cdf0e10cSrcweir FTPDirectoryParser::parseVMS(aDirEntry,p1); 499*cdf0e10cSrcweir break; 500*cdf0e10cSrcweir default: 501*cdf0e10cSrcweir if(FTPDirectoryParser::parseUNIX(aDirEntry,p1)) 502*cdf0e10cSrcweir osKind = FTP_UNIX; 503*cdf0e10cSrcweir else if(FTPDirectoryParser::parseDOS(aDirEntry,p1)) 504*cdf0e10cSrcweir osKind = FTP_DOS; 505*cdf0e10cSrcweir else if(FTPDirectoryParser::parseVMS(aDirEntry,p1)) 506*cdf0e10cSrcweir osKind = FTP_VMS; 507*cdf0e10cSrcweir } 508*cdf0e10cSrcweir aDirEntry.m_aName = aDirEntry.m_aName.trim(); 509*cdf0e10cSrcweir if(osKind != int(FTP_UNKNOWN) && 510*cdf0e10cSrcweir !aDirEntry.m_aName.equalsAscii("..") && 511*cdf0e10cSrcweir !aDirEntry.m_aName.equalsAscii(".")) { 512*cdf0e10cSrcweir aDirEntry.m_aURL = viewurl + encodePathSegment(aDirEntry.m_aName); 513*cdf0e10cSrcweir 514*cdf0e10cSrcweir sal_Bool isDir = 515*cdf0e10cSrcweir sal_Bool(aDirEntry.m_nMode&INETCOREFTP_FILEMODE_ISDIR); 516*cdf0e10cSrcweir switch(nMode) { 517*cdf0e10cSrcweir case OpenMode::DOCUMENTS: 518*cdf0e10cSrcweir if(!isDir) 519*cdf0e10cSrcweir resvec.push_back(aDirEntry); 520*cdf0e10cSrcweir break; 521*cdf0e10cSrcweir case OpenMode::FOLDERS: 522*cdf0e10cSrcweir if(isDir) 523*cdf0e10cSrcweir resvec.push_back(aDirEntry); 524*cdf0e10cSrcweir break; 525*cdf0e10cSrcweir default: 526*cdf0e10cSrcweir resvec.push_back(aDirEntry); 527*cdf0e10cSrcweir }; 528*cdf0e10cSrcweir } 529*cdf0e10cSrcweir aDirEntry.clear(); 530*cdf0e10cSrcweir p1 = p2 + 1; 531*cdf0e10cSrcweir } 532*cdf0e10cSrcweir 533*cdf0e10cSrcweir return resvec; 534*cdf0e10cSrcweir } 535*cdf0e10cSrcweir 536*cdf0e10cSrcweir 537*cdf0e10cSrcweir rtl::OUString FTPURL::net_title() const 538*cdf0e10cSrcweir throw(curl_exception) 539*cdf0e10cSrcweir { 540*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 541*cdf0e10cSrcweir 542*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 543*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,true); // no data => no transfer 544*cdf0e10cSrcweir struct curl_slist *slist = 0; 545*cdf0e10cSrcweir // post request 546*cdf0e10cSrcweir slist = curl_slist_append(slist,"PWD"); 547*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,slist); 548*cdf0e10cSrcweir 549*cdf0e10cSrcweir bool try_more(true); 550*cdf0e10cSrcweir CURLcode err; 551*cdf0e10cSrcweir rtl::OUString aNetTitle; 552*cdf0e10cSrcweir 553*cdf0e10cSrcweir while(true) { 554*cdf0e10cSrcweir rtl::OUString url(ident(false,true)); 555*cdf0e10cSrcweir 556*cdf0e10cSrcweir if(try_more && 557*cdf0e10cSrcweir 1+url.lastIndexOf(sal_Unicode('/')) != url.getLength()) 558*cdf0e10cSrcweir url += rtl::OUString::createFromAscii("/"); // add end-slash 559*cdf0e10cSrcweir else if(!try_more && 560*cdf0e10cSrcweir 1+url.lastIndexOf(sal_Unicode('/')) == url.getLength()) 561*cdf0e10cSrcweir url = url.copy(0,url.getLength()-1); // remove end-slash 562*cdf0e10cSrcweir 563*cdf0e10cSrcweir SET_URL(url); 564*cdf0e10cSrcweir err = curl_easy_perform(curl); 565*cdf0e10cSrcweir 566*cdf0e10cSrcweir if(err == CURLE_OK) { // get the title from the server 567*cdf0e10cSrcweir char* fwd = (char*) control.m_pBuffer; 568*cdf0e10cSrcweir sal_uInt32 len = (sal_uInt32) control.m_nWritePos; 569*cdf0e10cSrcweir 570*cdf0e10cSrcweir aNetTitle = rtl::OUString(fwd,len,RTL_TEXTENCODING_UTF8); 571*cdf0e10cSrcweir // the buffer now contains the name of the file; 572*cdf0e10cSrcweir // analyze the output: 573*cdf0e10cSrcweir // Format of current working directory: 574*cdf0e10cSrcweir // 257 "/bla/bla" is current directory 575*cdf0e10cSrcweir sal_Int32 index1 = aNetTitle.lastIndexOf( 576*cdf0e10cSrcweir rtl::OUString::createFromAscii("257")); 577*cdf0e10cSrcweir index1 = 1+aNetTitle.indexOf(sal_Unicode('"'),index1); 578*cdf0e10cSrcweir sal_Int32 index2 = aNetTitle.indexOf(sal_Unicode('"'),index1); 579*cdf0e10cSrcweir aNetTitle = aNetTitle.copy(index1,index2-index1); 580*cdf0e10cSrcweir if(!aNetTitle.equalsAscii("/")) { 581*cdf0e10cSrcweir index1 = aNetTitle.lastIndexOf(sal_Unicode('/')); 582*cdf0e10cSrcweir aNetTitle = aNetTitle.copy(1+index1); 583*cdf0e10cSrcweir } 584*cdf0e10cSrcweir try_more = false; 585*cdf0e10cSrcweir } else if(err == CURLE_BAD_PASSWORD_ENTERED) 586*cdf0e10cSrcweir // the client should retry after getting the correct 587*cdf0e10cSrcweir // username + password 588*cdf0e10cSrcweir throw curl_exception(err); 589*cdf0e10cSrcweir #if LIBCURL_VERSION_NUM>=0x070d01 /* 7.13.1 */ 590*cdf0e10cSrcweir else if(err == CURLE_LOGIN_DENIED) 591*cdf0e10cSrcweir // the client should retry after getting the correct 592*cdf0e10cSrcweir // username + password 593*cdf0e10cSrcweir throw curl_exception(err); 594*cdf0e10cSrcweir #endif 595*cdf0e10cSrcweir else if(try_more && err == CURLE_FTP_ACCESS_DENIED) { 596*cdf0e10cSrcweir // We were either denied access when trying to login to 597*cdf0e10cSrcweir // an FTP server or when trying to change working directory 598*cdf0e10cSrcweir // to the one given in the URL. 599*cdf0e10cSrcweir if(m_aPathSegmentVec.size()) 600*cdf0e10cSrcweir // determine title form url 601*cdf0e10cSrcweir aNetTitle = decodePathSegment(m_aPathSegmentVec.back()); 602*cdf0e10cSrcweir else 603*cdf0e10cSrcweir // must be root 604*cdf0e10cSrcweir aNetTitle = rtl::OUString::createFromAscii("/"); 605*cdf0e10cSrcweir try_more = false; 606*cdf0e10cSrcweir } 607*cdf0e10cSrcweir 608*cdf0e10cSrcweir if(try_more) 609*cdf0e10cSrcweir try_more = false; 610*cdf0e10cSrcweir else 611*cdf0e10cSrcweir break; 612*cdf0e10cSrcweir } 613*cdf0e10cSrcweir 614*cdf0e10cSrcweir curl_slist_free_all(slist); 615*cdf0e10cSrcweir return aNetTitle; 616*cdf0e10cSrcweir } 617*cdf0e10cSrcweir 618*cdf0e10cSrcweir 619*cdf0e10cSrcweir FTPDirentry FTPURL::direntry() const 620*cdf0e10cSrcweir throw(curl_exception) 621*cdf0e10cSrcweir { 622*cdf0e10cSrcweir rtl::OUString nettitle = net_title(); 623*cdf0e10cSrcweir FTPDirentry aDirentry; 624*cdf0e10cSrcweir 625*cdf0e10cSrcweir aDirentry.m_aName = nettitle; // init aDirentry 626*cdf0e10cSrcweir if(nettitle.equalsAscii("/") || 627*cdf0e10cSrcweir nettitle.equalsAscii("..")) 628*cdf0e10cSrcweir aDirentry.m_nMode = INETCOREFTP_FILEMODE_ISDIR; 629*cdf0e10cSrcweir else 630*cdf0e10cSrcweir aDirentry.m_nMode = INETCOREFTP_FILEMODE_UNKNOWN; 631*cdf0e10cSrcweir 632*cdf0e10cSrcweir aDirentry.m_nSize = 0; 633*cdf0e10cSrcweir 634*cdf0e10cSrcweir if(!nettitle.equalsAscii("/")) { 635*cdf0e10cSrcweir // try to open the parent directory 636*cdf0e10cSrcweir FTPURL aURL(parent(),m_pFCP); 637*cdf0e10cSrcweir 638*cdf0e10cSrcweir std::vector<FTPDirentry> aList = aURL.list(OpenMode::ALL); 639*cdf0e10cSrcweir 640*cdf0e10cSrcweir for(unsigned i = 0; i < aList.size(); ++i) { 641*cdf0e10cSrcweir if(aList[i].m_aName == nettitle) { // the relevant file is found 642*cdf0e10cSrcweir aDirentry = aList[i]; 643*cdf0e10cSrcweir break; 644*cdf0e10cSrcweir } 645*cdf0e10cSrcweir } 646*cdf0e10cSrcweir } 647*cdf0e10cSrcweir return aDirentry; 648*cdf0e10cSrcweir } 649*cdf0e10cSrcweir 650*cdf0e10cSrcweir 651*cdf0e10cSrcweir extern "C" { 652*cdf0e10cSrcweir 653*cdf0e10cSrcweir size_t memory_read(void *ptr,size_t size,size_t nmemb,void *stream) 654*cdf0e10cSrcweir { 655*cdf0e10cSrcweir sal_Int32 nRequested = sal_Int32(size*nmemb); 656*cdf0e10cSrcweir CurlInput *curlInput = static_cast<CurlInput*>(stream); 657*cdf0e10cSrcweir if(curlInput) 658*cdf0e10cSrcweir return size_t(curlInput->read(((sal_Int8*)ptr),nRequested)); 659*cdf0e10cSrcweir else 660*cdf0e10cSrcweir return 0; 661*cdf0e10cSrcweir } 662*cdf0e10cSrcweir 663*cdf0e10cSrcweir } 664*cdf0e10cSrcweir 665*cdf0e10cSrcweir 666*cdf0e10cSrcweir void FTPURL::insert(bool replaceExisting,void* stream) const 667*cdf0e10cSrcweir throw(curl_exception) 668*cdf0e10cSrcweir { 669*cdf0e10cSrcweir if(!replaceExisting) { 670*cdf0e10cSrcweir // FTPDirentry aDirentry(direntry()); 671*cdf0e10cSrcweir // if(aDirentry.m_nMode == INETCOREFTP_FILEMODE_UNKNOWN) 672*cdf0e10cSrcweir // throw curl_exception(FILE_EXIST_DURING_INSERT); 673*cdf0e10cSrcweir throw curl_exception(FILE_MIGHT_EXIST_DURING_INSERT); 674*cdf0e10cSrcweir } // else 675*cdf0e10cSrcweir // overwrite is default in libcurl 676*cdf0e10cSrcweir 677*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 678*cdf0e10cSrcweir 679*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 680*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,false); // no data => no transfer 681*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,0); 682*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_QUOTE,0); 683*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_READFUNCTION,memory_read); 684*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_READDATA,stream); 685*cdf0e10cSrcweir curl_easy_setopt(curl, CURLOPT_UPLOAD,1); 686*cdf0e10cSrcweir 687*cdf0e10cSrcweir rtl::OUString url(ident(false,true)); 688*cdf0e10cSrcweir SET_URL(url); 689*cdf0e10cSrcweir 690*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 691*cdf0e10cSrcweir curl_easy_setopt(curl, CURLOPT_UPLOAD,false); 692*cdf0e10cSrcweir 693*cdf0e10cSrcweir if(err != CURLE_OK) 694*cdf0e10cSrcweir throw curl_exception(err); 695*cdf0e10cSrcweir } 696*cdf0e10cSrcweir 697*cdf0e10cSrcweir 698*cdf0e10cSrcweir 699*cdf0e10cSrcweir void FTPURL::mkdir(bool ReplaceExisting) const 700*cdf0e10cSrcweir throw(curl_exception) 701*cdf0e10cSrcweir { 702*cdf0e10cSrcweir rtl::OString title; 703*cdf0e10cSrcweir if(m_aPathSegmentVec.size()) { 704*cdf0e10cSrcweir rtl::OUString titleOU = m_aPathSegmentVec.back(); 705*cdf0e10cSrcweir titleOU = decodePathSegment(titleOU); 706*cdf0e10cSrcweir title = rtl::OString(titleOU.getStr(), 707*cdf0e10cSrcweir titleOU.getLength(), 708*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 709*cdf0e10cSrcweir } 710*cdf0e10cSrcweir else 711*cdf0e10cSrcweir // will give an error 712*cdf0e10cSrcweir title = rtl::OString("/"); 713*cdf0e10cSrcweir 714*cdf0e10cSrcweir rtl::OString aDel("del "); aDel += title; 715*cdf0e10cSrcweir rtl::OString mkd("mkd "); mkd += title; 716*cdf0e10cSrcweir 717*cdf0e10cSrcweir struct curl_slist *slist = 0; 718*cdf0e10cSrcweir 719*cdf0e10cSrcweir FTPDirentry aDirentry(direntry()); 720*cdf0e10cSrcweir if(!ReplaceExisting) { 721*cdf0e10cSrcweir // if(aDirentry.m_nMode != INETCOREFTP_FILEMODE_UNKNOWN) 722*cdf0e10cSrcweir // throw curl_exception(FOLDER_EXIST_DURING_INSERT); 723*cdf0e10cSrcweir throw curl_exception(FOLDER_MIGHT_EXIST_DURING_INSERT); 724*cdf0e10cSrcweir } else if(aDirentry.m_nMode != INETCOREFTP_FILEMODE_UNKNOWN) 725*cdf0e10cSrcweir slist = curl_slist_append(slist,aDel.getStr()); 726*cdf0e10cSrcweir 727*cdf0e10cSrcweir slist = curl_slist_append(slist,mkd.getStr()); 728*cdf0e10cSrcweir 729*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 730*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 731*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,true); // no data => no transfer 732*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_QUOTE,0); 733*cdf0e10cSrcweir 734*cdf0e10cSrcweir // post request 735*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,slist); 736*cdf0e10cSrcweir 737*cdf0e10cSrcweir rtl::OUString url(parent(true)); 738*cdf0e10cSrcweir if(1+url.lastIndexOf(sal_Unicode('/')) != url.getLength()) 739*cdf0e10cSrcweir url += rtl::OUString::createFromAscii("/"); 740*cdf0e10cSrcweir SET_URL(url); 741*cdf0e10cSrcweir 742*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 743*cdf0e10cSrcweir curl_slist_free_all(slist); 744*cdf0e10cSrcweir if(err != CURLE_OK) 745*cdf0e10cSrcweir throw curl_exception(err); 746*cdf0e10cSrcweir } 747*cdf0e10cSrcweir 748*cdf0e10cSrcweir 749*cdf0e10cSrcweir rtl::OUString FTPURL::ren(const rtl::OUString& NewTitle) 750*cdf0e10cSrcweir throw(curl_exception) 751*cdf0e10cSrcweir { 752*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 753*cdf0e10cSrcweir 754*cdf0e10cSrcweir // post request 755*cdf0e10cSrcweir rtl::OString renamefrom("RNFR "); 756*cdf0e10cSrcweir rtl::OUString OldTitle = net_title(); 757*cdf0e10cSrcweir renamefrom += 758*cdf0e10cSrcweir rtl::OString(OldTitle.getStr(), 759*cdf0e10cSrcweir OldTitle.getLength(), 760*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 761*cdf0e10cSrcweir 762*cdf0e10cSrcweir rtl::OString renameto("RNTO "); 763*cdf0e10cSrcweir renameto += 764*cdf0e10cSrcweir rtl::OString(NewTitle.getStr(), 765*cdf0e10cSrcweir NewTitle.getLength(), 766*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 767*cdf0e10cSrcweir 768*cdf0e10cSrcweir struct curl_slist *slist = 0; 769*cdf0e10cSrcweir slist = curl_slist_append(slist,renamefrom.getStr()); 770*cdf0e10cSrcweir slist = curl_slist_append(slist,renameto.getStr()); 771*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,slist); 772*cdf0e10cSrcweir 773*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 774*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,true); // no data => no transfer 775*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_QUOTE,0); 776*cdf0e10cSrcweir 777*cdf0e10cSrcweir rtl::OUString url(parent(true)); 778*cdf0e10cSrcweir if(1+url.lastIndexOf(sal_Unicode('/')) != url.getLength()) 779*cdf0e10cSrcweir url += rtl::OUString::createFromAscii("/"); 780*cdf0e10cSrcweir SET_URL(url); 781*cdf0e10cSrcweir 782*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 783*cdf0e10cSrcweir curl_slist_free_all(slist); 784*cdf0e10cSrcweir if(err != CURLE_OK) 785*cdf0e10cSrcweir throw curl_exception(err); 786*cdf0e10cSrcweir else if(m_aPathSegmentVec.size() && 787*cdf0e10cSrcweir !m_aPathSegmentVec.back().equalsAscii("..")) 788*cdf0e10cSrcweir m_aPathSegmentVec.back() = encodePathSegment(NewTitle); 789*cdf0e10cSrcweir return OldTitle; 790*cdf0e10cSrcweir } 791*cdf0e10cSrcweir 792*cdf0e10cSrcweir 793*cdf0e10cSrcweir 794*cdf0e10cSrcweir void FTPURL::del() const 795*cdf0e10cSrcweir throw(curl_exception) 796*cdf0e10cSrcweir { 797*cdf0e10cSrcweir FTPDirentry aDirentry(direntry()); 798*cdf0e10cSrcweir 799*cdf0e10cSrcweir rtl::OString dele(aDirentry.m_aName.getStr(), 800*cdf0e10cSrcweir aDirentry.m_aName.getLength(), 801*cdf0e10cSrcweir RTL_TEXTENCODING_UTF8); 802*cdf0e10cSrcweir 803*cdf0e10cSrcweir if(aDirentry.m_nMode & INETCOREFTP_FILEMODE_ISDIR) { 804*cdf0e10cSrcweir std::vector<FTPDirentry> vec = list(sal_Int16(OpenMode::ALL)); 805*cdf0e10cSrcweir for( unsigned int i = 0; i < vec.size(); ++i ) 806*cdf0e10cSrcweir try { 807*cdf0e10cSrcweir FTPURL url(vec[i].m_aURL,m_pFCP); 808*cdf0e10cSrcweir url.del(); 809*cdf0e10cSrcweir } catch(const curl_exception&) { 810*cdf0e10cSrcweir } 811*cdf0e10cSrcweir dele = rtl::OString("RMD ") + dele; 812*cdf0e10cSrcweir } 813*cdf0e10cSrcweir else if(aDirentry.m_nMode != INETCOREFTP_FILEMODE_UNKNOWN) 814*cdf0e10cSrcweir dele = rtl::OString("DELE ") + dele; 815*cdf0e10cSrcweir else 816*cdf0e10cSrcweir return; 817*cdf0e10cSrcweir 818*cdf0e10cSrcweir // post request 819*cdf0e10cSrcweir CURL *curl = m_pFCP->handle(); 820*cdf0e10cSrcweir struct curl_slist *slist = 0; 821*cdf0e10cSrcweir slist = curl_slist_append(slist,dele.getStr()); 822*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_POSTQUOTE,slist); 823*cdf0e10cSrcweir 824*cdf0e10cSrcweir SET_CONTROL_CONTAINER; 825*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_NOBODY,true); // no data => no transfer 826*cdf0e10cSrcweir curl_easy_setopt(curl,CURLOPT_QUOTE,0); 827*cdf0e10cSrcweir 828*cdf0e10cSrcweir rtl::OUString url(parent(true)); 829*cdf0e10cSrcweir if(1+url.lastIndexOf(sal_Unicode('/')) != url.getLength()) 830*cdf0e10cSrcweir url += rtl::OUString::createFromAscii("/"); 831*cdf0e10cSrcweir SET_URL(url); 832*cdf0e10cSrcweir 833*cdf0e10cSrcweir CURLcode err = curl_easy_perform(curl); 834*cdf0e10cSrcweir curl_slist_free_all(slist); 835*cdf0e10cSrcweir if(err != CURLE_OK) 836*cdf0e10cSrcweir throw curl_exception(err); 837*cdf0e10cSrcweir } 838*cdf0e10cSrcweir 839