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 /************************************************************************** 32*cdf0e10cSrcweir TODO 33*cdf0e10cSrcweir ************************************************************************** 34*cdf0e10cSrcweir 35*cdf0e10cSrcweir *************************************************************************/ 36*cdf0e10cSrcweir #include "ftpdirp.hxx" 37*cdf0e10cSrcweir #include <osl/time.h> 38*cdf0e10cSrcweir 39*cdf0e10cSrcweir 40*cdf0e10cSrcweir using namespace rtl; 41*cdf0e10cSrcweir using namespace ftp; 42*cdf0e10cSrcweir 43*cdf0e10cSrcweir 44*cdf0e10cSrcweir typedef sal_uInt32 ULONG; 45*cdf0e10cSrcweir 46*cdf0e10cSrcweir 47*cdf0e10cSrcweir inline sal_Bool ascii_isLetter( sal_Unicode ch ) 48*cdf0e10cSrcweir { 49*cdf0e10cSrcweir return (( (ch >= 0x0041) && (ch <= 0x005A)) || 50*cdf0e10cSrcweir (( ch >= 0x0061) && (ch <= 0x007A))); 51*cdf0e10cSrcweir } 52*cdf0e10cSrcweir 53*cdf0e10cSrcweir inline sal_Bool ascii_isWhitespace( sal_Unicode ch ) 54*cdf0e10cSrcweir { 55*cdf0e10cSrcweir return ((ch <= 0x20) && ch); 56*cdf0e10cSrcweir } 57*cdf0e10cSrcweir 58*cdf0e10cSrcweir 59*cdf0e10cSrcweir 60*cdf0e10cSrcweir /*======================================================================== 61*cdf0e10cSrcweir * 62*cdf0e10cSrcweir * FTPDirectoryParser implementation. 63*cdf0e10cSrcweir * 64*cdf0e10cSrcweir *======================================================================*/ 65*cdf0e10cSrcweir /* 66*cdf0e10cSrcweir * parseDOS. 67*cdf0e10cSrcweir * Accepts one of two styles: 68*cdf0e10cSrcweir * 69*cdf0e10cSrcweir * 1 *WSP 1*2DIGIT ("." / "-") 1*2DIGIT ("." / "-") 1*4DIGIT 1*WSP 70*cdf0e10cSrcweir * 1*2DIGIT ":" 1*2DIGIT [*WSP ("A" / "P") "M"] 1*WSP 71*cdf0e10cSrcweir * ((DIGIT *(DIGIT / "." / ",")) / "<DIR>") 1*WSP 1*OCTET 72*cdf0e10cSrcweir * 73*cdf0e10cSrcweir * interpreted as: mm.dd.yy hh:mm (size / <DIR>) name 74*cdf0e10cSrcweir * 75*cdf0e10cSrcweir * 2 *WSP 1*DIGIT 1*WSP *(1*CHAR *WSP) *1("DIR" 1*WSP) 1*2DIGIT "-" 1*2DIGIT 76*cdf0e10cSrcweir * "-" 1*4DIGIT 1*WSP 1*2DIGIT ":" 1*2DIGIT 1*WSP 1*OCTET 77*cdf0e10cSrcweir * 78*cdf0e10cSrcweir * interpreted as: size attribs DIR mm-dd-yy hh:mm name 79*cdf0e10cSrcweir */ 80*cdf0e10cSrcweir 81*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseDOS ( 82*cdf0e10cSrcweir FTPDirentry &rEntry, 83*cdf0e10cSrcweir const sal_Char *pBuffer) 84*cdf0e10cSrcweir { 85*cdf0e10cSrcweir sal_Bool bDirectory = false; 86*cdf0e10cSrcweir sal_uInt32 nSize = 0; 87*cdf0e10cSrcweir sal_uInt16 nYear = 0; 88*cdf0e10cSrcweir sal_uInt16 nMonth = 0; 89*cdf0e10cSrcweir sal_uInt16 nDay = 0; 90*cdf0e10cSrcweir sal_uInt16 nHour = 0; 91*cdf0e10cSrcweir sal_uInt16 nMinute = 0; 92*cdf0e10cSrcweir 93*cdf0e10cSrcweir enum StateType 94*cdf0e10cSrcweir { 95*cdf0e10cSrcweir STATE_INIT_LWS, 96*cdf0e10cSrcweir STATE_MONTH_OR_SIZE, 97*cdf0e10cSrcweir STATE_1_DAY, STATE_1_YEAR, STATE_1_YEAR_LWS, STATE_1_HOUR, 98*cdf0e10cSrcweir STATE_1_MINUTE, STATE_1_MINUTE_LWS, STATE_1_AP, 99*cdf0e10cSrcweir STATE_1_APM, STATE_1_LESS, STATE_1_D, STATE_1_DI, 100*cdf0e10cSrcweir STATE_1_DIR, STATE_1_SIZE, 101*cdf0e10cSrcweir STATE_2_SIZE, STATE_2_SIZE_LWS, STATE_2_ATTRIB, 102*cdf0e10cSrcweir STATE_2_D, STATE_2_DI, STATE_2_DIR_LWS, 103*cdf0e10cSrcweir STATE_2_MONTH, STATE_2_DAY, STATE_2_YEAR, STATE_2_YEAR_LWS, 104*cdf0e10cSrcweir STATE_2_HOUR, STATE_2_MINUTE, 105*cdf0e10cSrcweir STATE_LWS_NAME, 106*cdf0e10cSrcweir STATE_ERROR 107*cdf0e10cSrcweir }; 108*cdf0e10cSrcweir 109*cdf0e10cSrcweir int nDigits = 0; 110*cdf0e10cSrcweir enum StateType eState = STATE_INIT_LWS; 111*cdf0e10cSrcweir for (const sal_Char *p = pBuffer; 112*cdf0e10cSrcweir eState != STATE_ERROR && *p; 113*cdf0e10cSrcweir ++p) 114*cdf0e10cSrcweir { 115*cdf0e10cSrcweir switch (eState) 116*cdf0e10cSrcweir { 117*cdf0e10cSrcweir case STATE_INIT_LWS: 118*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 119*cdf0e10cSrcweir { 120*cdf0e10cSrcweir nMonth = *p - '0'; 121*cdf0e10cSrcweir nDigits = 1; 122*cdf0e10cSrcweir eState = STATE_MONTH_OR_SIZE; 123*cdf0e10cSrcweir } 124*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 125*cdf0e10cSrcweir eState = STATE_ERROR; 126*cdf0e10cSrcweir break; 127*cdf0e10cSrcweir 128*cdf0e10cSrcweir case STATE_MONTH_OR_SIZE: 129*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 130*cdf0e10cSrcweir { 131*cdf0e10cSrcweir nMonth = 10 * nMonth + (*p - '0'); 132*cdf0e10cSrcweir if (nDigits < 2) 133*cdf0e10cSrcweir ++nDigits; 134*cdf0e10cSrcweir else 135*cdf0e10cSrcweir { 136*cdf0e10cSrcweir nSize = nMonth; 137*cdf0e10cSrcweir nMonth = 0; 138*cdf0e10cSrcweir eState = STATE_2_SIZE; 139*cdf0e10cSrcweir } 140*cdf0e10cSrcweir } 141*cdf0e10cSrcweir else if (ascii_isWhitespace(*p)) 142*cdf0e10cSrcweir { 143*cdf0e10cSrcweir nSize = nMonth; 144*cdf0e10cSrcweir nMonth = 0; 145*cdf0e10cSrcweir eState = STATE_2_SIZE_LWS; 146*cdf0e10cSrcweir } 147*cdf0e10cSrcweir else if ((*p == '.' || *p == '-') && nMonth && nMonth <= 12) 148*cdf0e10cSrcweir { 149*cdf0e10cSrcweir nDigits = 0; 150*cdf0e10cSrcweir eState = STATE_1_DAY; 151*cdf0e10cSrcweir } 152*cdf0e10cSrcweir else 153*cdf0e10cSrcweir eState = STATE_ERROR; 154*cdf0e10cSrcweir break; 155*cdf0e10cSrcweir 156*cdf0e10cSrcweir case STATE_1_DAY: 157*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 158*cdf0e10cSrcweir if (nDigits < 2) 159*cdf0e10cSrcweir { 160*cdf0e10cSrcweir nDay = 10 * nDay + (*p - '0'); 161*cdf0e10cSrcweir ++nDigits; 162*cdf0e10cSrcweir } 163*cdf0e10cSrcweir else 164*cdf0e10cSrcweir eState = STATE_ERROR; 165*cdf0e10cSrcweir else if ((*p == '.' || *p == '-') && nDay && nDay <= 31) 166*cdf0e10cSrcweir { 167*cdf0e10cSrcweir nDigits = 0; 168*cdf0e10cSrcweir eState = STATE_1_YEAR; 169*cdf0e10cSrcweir } 170*cdf0e10cSrcweir else 171*cdf0e10cSrcweir eState = STATE_ERROR; 172*cdf0e10cSrcweir break; 173*cdf0e10cSrcweir 174*cdf0e10cSrcweir case STATE_1_YEAR: 175*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 176*cdf0e10cSrcweir { 177*cdf0e10cSrcweir if (nDigits < 4) 178*cdf0e10cSrcweir { 179*cdf0e10cSrcweir nYear = 10 * nYear + (*p - '0'); 180*cdf0e10cSrcweir ++nDigits; 181*cdf0e10cSrcweir } 182*cdf0e10cSrcweir else 183*cdf0e10cSrcweir eState = STATE_ERROR; 184*cdf0e10cSrcweir } 185*cdf0e10cSrcweir else 186*cdf0e10cSrcweir { 187*cdf0e10cSrcweir if (ascii_isWhitespace(*p)) 188*cdf0e10cSrcweir eState = STATE_1_YEAR_LWS; 189*cdf0e10cSrcweir else 190*cdf0e10cSrcweir eState = STATE_ERROR; 191*cdf0e10cSrcweir } 192*cdf0e10cSrcweir break; 193*cdf0e10cSrcweir 194*cdf0e10cSrcweir case STATE_1_YEAR_LWS: 195*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 196*cdf0e10cSrcweir { 197*cdf0e10cSrcweir nHour = *p - '0'; 198*cdf0e10cSrcweir nDigits = 1; 199*cdf0e10cSrcweir eState = STATE_1_HOUR; 200*cdf0e10cSrcweir } 201*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 202*cdf0e10cSrcweir eState = STATE_ERROR; 203*cdf0e10cSrcweir break; 204*cdf0e10cSrcweir 205*cdf0e10cSrcweir case STATE_1_HOUR: 206*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 207*cdf0e10cSrcweir if (nDigits < 2) 208*cdf0e10cSrcweir { 209*cdf0e10cSrcweir nHour = 10 * nHour + (*p - '0'); 210*cdf0e10cSrcweir ++nDigits; 211*cdf0e10cSrcweir } 212*cdf0e10cSrcweir else 213*cdf0e10cSrcweir eState = STATE_ERROR; 214*cdf0e10cSrcweir else if (*p == ':' && nHour < 24) 215*cdf0e10cSrcweir { 216*cdf0e10cSrcweir nDigits = 0; 217*cdf0e10cSrcweir eState = STATE_1_MINUTE; 218*cdf0e10cSrcweir } 219*cdf0e10cSrcweir else 220*cdf0e10cSrcweir eState = STATE_ERROR; 221*cdf0e10cSrcweir break; 222*cdf0e10cSrcweir 223*cdf0e10cSrcweir case STATE_1_MINUTE: 224*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 225*cdf0e10cSrcweir if (nDigits < 2) 226*cdf0e10cSrcweir { 227*cdf0e10cSrcweir nMinute = 10 * nMinute + (*p - '0'); 228*cdf0e10cSrcweir ++nDigits; 229*cdf0e10cSrcweir } 230*cdf0e10cSrcweir else 231*cdf0e10cSrcweir eState = STATE_ERROR; 232*cdf0e10cSrcweir else if ((*p == 'a' || *p == 'A') && nMinute < 60) 233*cdf0e10cSrcweir if (nHour >= 1 && nHour <= 11) 234*cdf0e10cSrcweir eState = STATE_1_AP; 235*cdf0e10cSrcweir else if (nHour == 12) 236*cdf0e10cSrcweir { 237*cdf0e10cSrcweir nHour = 0; 238*cdf0e10cSrcweir eState = STATE_1_AP; 239*cdf0e10cSrcweir } 240*cdf0e10cSrcweir else 241*cdf0e10cSrcweir eState = STATE_ERROR; 242*cdf0e10cSrcweir else if ((*p == 'p' || *p == 'P') && nMinute < 60) 243*cdf0e10cSrcweir if (nHour >= 1 && nHour <= 11) 244*cdf0e10cSrcweir { 245*cdf0e10cSrcweir nHour += 12; 246*cdf0e10cSrcweir eState = STATE_1_AP; 247*cdf0e10cSrcweir } 248*cdf0e10cSrcweir else if (nHour == 12) 249*cdf0e10cSrcweir eState = STATE_1_AP; 250*cdf0e10cSrcweir else 251*cdf0e10cSrcweir eState = STATE_ERROR; 252*cdf0e10cSrcweir else if (ascii_isWhitespace(*p) && (nMinute < 60)) 253*cdf0e10cSrcweir eState = STATE_1_MINUTE_LWS; 254*cdf0e10cSrcweir else 255*cdf0e10cSrcweir eState = STATE_ERROR; 256*cdf0e10cSrcweir break; 257*cdf0e10cSrcweir 258*cdf0e10cSrcweir case STATE_1_MINUTE_LWS: 259*cdf0e10cSrcweir if (*p == 'a' || *p == 'A') 260*cdf0e10cSrcweir if (nHour >= 1 && nHour <= 11) 261*cdf0e10cSrcweir eState = STATE_1_AP; 262*cdf0e10cSrcweir else if (nHour == 12) 263*cdf0e10cSrcweir { 264*cdf0e10cSrcweir nHour = 0; 265*cdf0e10cSrcweir eState = STATE_1_AP; 266*cdf0e10cSrcweir } 267*cdf0e10cSrcweir else 268*cdf0e10cSrcweir eState = STATE_ERROR; 269*cdf0e10cSrcweir else if (*p == 'p' || *p == 'P') 270*cdf0e10cSrcweir if (nHour >= 1 && nHour <= 11) 271*cdf0e10cSrcweir { 272*cdf0e10cSrcweir nHour += 12; 273*cdf0e10cSrcweir eState = STATE_1_AP; 274*cdf0e10cSrcweir } 275*cdf0e10cSrcweir else if (nHour == 12) 276*cdf0e10cSrcweir eState = STATE_1_AP; 277*cdf0e10cSrcweir else 278*cdf0e10cSrcweir eState = STATE_ERROR; 279*cdf0e10cSrcweir else if (*p == '<') 280*cdf0e10cSrcweir eState = STATE_1_LESS; 281*cdf0e10cSrcweir else if (*p >= '0' && *p <= '9') 282*cdf0e10cSrcweir { 283*cdf0e10cSrcweir nSize = *p - '0'; 284*cdf0e10cSrcweir eState = STATE_1_SIZE; 285*cdf0e10cSrcweir } 286*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 287*cdf0e10cSrcweir eState = STATE_ERROR; 288*cdf0e10cSrcweir break; 289*cdf0e10cSrcweir 290*cdf0e10cSrcweir case STATE_1_AP: 291*cdf0e10cSrcweir eState = *p == 'm' || *p == 'M' ? STATE_1_APM : STATE_ERROR; 292*cdf0e10cSrcweir break; 293*cdf0e10cSrcweir 294*cdf0e10cSrcweir case STATE_1_APM: 295*cdf0e10cSrcweir if (*p == '<') 296*cdf0e10cSrcweir eState = STATE_1_LESS; 297*cdf0e10cSrcweir else if (*p >= '0' && *p <= '9') 298*cdf0e10cSrcweir { 299*cdf0e10cSrcweir nSize = *p - '0'; 300*cdf0e10cSrcweir eState = STATE_1_SIZE; 301*cdf0e10cSrcweir } 302*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 303*cdf0e10cSrcweir eState = STATE_ERROR; 304*cdf0e10cSrcweir break; 305*cdf0e10cSrcweir 306*cdf0e10cSrcweir case STATE_1_LESS: 307*cdf0e10cSrcweir eState = *p == 'd' || *p == 'D' ? STATE_1_D : STATE_ERROR; 308*cdf0e10cSrcweir break; 309*cdf0e10cSrcweir 310*cdf0e10cSrcweir case STATE_1_D: 311*cdf0e10cSrcweir eState = *p == 'i' || *p == 'I' ? STATE_1_DI : STATE_ERROR; 312*cdf0e10cSrcweir break; 313*cdf0e10cSrcweir 314*cdf0e10cSrcweir case STATE_1_DI: 315*cdf0e10cSrcweir eState = *p == 'r' || *p == 'R' ? STATE_1_DIR : STATE_ERROR; 316*cdf0e10cSrcweir break; 317*cdf0e10cSrcweir 318*cdf0e10cSrcweir case STATE_1_DIR: 319*cdf0e10cSrcweir if (*p == '>') 320*cdf0e10cSrcweir { 321*cdf0e10cSrcweir bDirectory = true; 322*cdf0e10cSrcweir eState = STATE_LWS_NAME; 323*cdf0e10cSrcweir } 324*cdf0e10cSrcweir else 325*cdf0e10cSrcweir eState = STATE_ERROR; 326*cdf0e10cSrcweir break; 327*cdf0e10cSrcweir 328*cdf0e10cSrcweir case STATE_1_SIZE: 329*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 330*cdf0e10cSrcweir nSize = 10 * nSize + (*p - '0'); 331*cdf0e10cSrcweir else if (ascii_isWhitespace(*p)) 332*cdf0e10cSrcweir eState = STATE_LWS_NAME; 333*cdf0e10cSrcweir else 334*cdf0e10cSrcweir eState = STATE_ERROR; 335*cdf0e10cSrcweir break; 336*cdf0e10cSrcweir 337*cdf0e10cSrcweir case STATE_2_SIZE: 338*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 339*cdf0e10cSrcweir nSize = 10 * nSize + (*p - '0'); 340*cdf0e10cSrcweir else if (ascii_isWhitespace(*p)) 341*cdf0e10cSrcweir eState = STATE_2_SIZE_LWS; 342*cdf0e10cSrcweir else 343*cdf0e10cSrcweir eState = STATE_ERROR; 344*cdf0e10cSrcweir break; 345*cdf0e10cSrcweir 346*cdf0e10cSrcweir case STATE_2_SIZE_LWS: 347*cdf0e10cSrcweir if (*p == 'd' || *p == 'D') 348*cdf0e10cSrcweir eState = STATE_2_D; 349*cdf0e10cSrcweir else if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) 350*cdf0e10cSrcweir eState = STATE_2_ATTRIB; 351*cdf0e10cSrcweir else if (*p >= '0' && *p <= '9') 352*cdf0e10cSrcweir { 353*cdf0e10cSrcweir nMonth = *p - '0'; 354*cdf0e10cSrcweir nDigits = 1; 355*cdf0e10cSrcweir eState = STATE_2_MONTH; 356*cdf0e10cSrcweir } 357*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 358*cdf0e10cSrcweir eState = STATE_ERROR; 359*cdf0e10cSrcweir break; 360*cdf0e10cSrcweir 361*cdf0e10cSrcweir case STATE_2_ATTRIB: 362*cdf0e10cSrcweir if (ascii_isWhitespace(*p)) 363*cdf0e10cSrcweir eState = STATE_2_SIZE_LWS; 364*cdf0e10cSrcweir else if ((*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z')) 365*cdf0e10cSrcweir eState = STATE_ERROR; 366*cdf0e10cSrcweir break; 367*cdf0e10cSrcweir 368*cdf0e10cSrcweir case STATE_2_D: 369*cdf0e10cSrcweir if (*p == 'i' || *p == 'I') 370*cdf0e10cSrcweir eState = STATE_2_DI; 371*cdf0e10cSrcweir else if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) 372*cdf0e10cSrcweir eState = STATE_2_ATTRIB; 373*cdf0e10cSrcweir else if (ascii_isWhitespace(*p)) 374*cdf0e10cSrcweir eState = STATE_2_SIZE_LWS; 375*cdf0e10cSrcweir else 376*cdf0e10cSrcweir eState = STATE_ERROR; 377*cdf0e10cSrcweir break; 378*cdf0e10cSrcweir 379*cdf0e10cSrcweir case STATE_2_DI: 380*cdf0e10cSrcweir if (*p == 'r' || *p == 'R') 381*cdf0e10cSrcweir { 382*cdf0e10cSrcweir bDirectory = true; 383*cdf0e10cSrcweir eState = STATE_2_DIR_LWS; 384*cdf0e10cSrcweir } 385*cdf0e10cSrcweir else 386*cdf0e10cSrcweir { 387*cdf0e10cSrcweir if ((*p >= 'a' && *p <= 'z') || (*p >= 'A' && *p <= 'Z')) 388*cdf0e10cSrcweir eState = STATE_2_ATTRIB; 389*cdf0e10cSrcweir else if (ascii_isWhitespace(*p)) 390*cdf0e10cSrcweir eState = STATE_2_SIZE_LWS; 391*cdf0e10cSrcweir else 392*cdf0e10cSrcweir eState = STATE_ERROR; 393*cdf0e10cSrcweir } 394*cdf0e10cSrcweir break; 395*cdf0e10cSrcweir 396*cdf0e10cSrcweir case STATE_2_DIR_LWS: 397*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 398*cdf0e10cSrcweir { 399*cdf0e10cSrcweir nMonth = *p - '0'; 400*cdf0e10cSrcweir nDigits = 1; 401*cdf0e10cSrcweir eState = STATE_2_MONTH; 402*cdf0e10cSrcweir } 403*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 404*cdf0e10cSrcweir eState = STATE_ERROR; 405*cdf0e10cSrcweir break; 406*cdf0e10cSrcweir 407*cdf0e10cSrcweir case STATE_2_MONTH: 408*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 409*cdf0e10cSrcweir if (nDigits < 2) 410*cdf0e10cSrcweir { 411*cdf0e10cSrcweir nMonth = 10 * nMonth + (*p - '0'); 412*cdf0e10cSrcweir ++nDigits; 413*cdf0e10cSrcweir } 414*cdf0e10cSrcweir else 415*cdf0e10cSrcweir eState = STATE_ERROR; 416*cdf0e10cSrcweir else if (*p == '-' && nMonth && nMonth <= 12) 417*cdf0e10cSrcweir { 418*cdf0e10cSrcweir nDigits = 0; 419*cdf0e10cSrcweir eState = STATE_2_DAY; 420*cdf0e10cSrcweir } 421*cdf0e10cSrcweir else 422*cdf0e10cSrcweir eState = STATE_ERROR; 423*cdf0e10cSrcweir break; 424*cdf0e10cSrcweir 425*cdf0e10cSrcweir case STATE_2_DAY: 426*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 427*cdf0e10cSrcweir if (nDigits < 2) 428*cdf0e10cSrcweir { 429*cdf0e10cSrcweir nDay = 10 * nDay + (*p - '0'); 430*cdf0e10cSrcweir ++nDigits; 431*cdf0e10cSrcweir } 432*cdf0e10cSrcweir else 433*cdf0e10cSrcweir eState = STATE_ERROR; 434*cdf0e10cSrcweir else if (*p == '-' && nDay && nDay <= 31) 435*cdf0e10cSrcweir { 436*cdf0e10cSrcweir nDigits = 0; 437*cdf0e10cSrcweir eState = STATE_2_YEAR; 438*cdf0e10cSrcweir } 439*cdf0e10cSrcweir else 440*cdf0e10cSrcweir eState = STATE_ERROR; 441*cdf0e10cSrcweir break; 442*cdf0e10cSrcweir 443*cdf0e10cSrcweir case STATE_2_YEAR: 444*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 445*cdf0e10cSrcweir { 446*cdf0e10cSrcweir if (nDigits < 4) 447*cdf0e10cSrcweir { 448*cdf0e10cSrcweir nYear = 10 * nYear + (*p - '0'); 449*cdf0e10cSrcweir ++nDigits; 450*cdf0e10cSrcweir } 451*cdf0e10cSrcweir else 452*cdf0e10cSrcweir eState = STATE_ERROR; 453*cdf0e10cSrcweir } 454*cdf0e10cSrcweir else 455*cdf0e10cSrcweir { 456*cdf0e10cSrcweir if (ascii_isWhitespace(*p)) 457*cdf0e10cSrcweir eState = STATE_2_YEAR_LWS; 458*cdf0e10cSrcweir else 459*cdf0e10cSrcweir eState = STATE_ERROR; 460*cdf0e10cSrcweir } 461*cdf0e10cSrcweir break; 462*cdf0e10cSrcweir 463*cdf0e10cSrcweir case STATE_2_YEAR_LWS: 464*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 465*cdf0e10cSrcweir { 466*cdf0e10cSrcweir nHour = *p - '0'; 467*cdf0e10cSrcweir nDigits = 1; 468*cdf0e10cSrcweir eState = STATE_2_HOUR; 469*cdf0e10cSrcweir } 470*cdf0e10cSrcweir else if (!ascii_isWhitespace(*p)) 471*cdf0e10cSrcweir eState = STATE_ERROR; 472*cdf0e10cSrcweir break; 473*cdf0e10cSrcweir 474*cdf0e10cSrcweir case STATE_2_HOUR: 475*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 476*cdf0e10cSrcweir if (nDigits < 2) 477*cdf0e10cSrcweir { 478*cdf0e10cSrcweir nHour = 10 * nHour + (*p - '0'); 479*cdf0e10cSrcweir ++nDigits; 480*cdf0e10cSrcweir } 481*cdf0e10cSrcweir else 482*cdf0e10cSrcweir eState = STATE_ERROR; 483*cdf0e10cSrcweir else if (*p == ':' && nHour < 24) 484*cdf0e10cSrcweir { 485*cdf0e10cSrcweir nDigits = 0; 486*cdf0e10cSrcweir eState = STATE_2_MINUTE; 487*cdf0e10cSrcweir } 488*cdf0e10cSrcweir else 489*cdf0e10cSrcweir eState = STATE_ERROR; 490*cdf0e10cSrcweir break; 491*cdf0e10cSrcweir 492*cdf0e10cSrcweir case STATE_2_MINUTE: 493*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 494*cdf0e10cSrcweir { 495*cdf0e10cSrcweir if (nDigits < 2) 496*cdf0e10cSrcweir { 497*cdf0e10cSrcweir nMinute = 10 * nMinute + (*p - '0'); 498*cdf0e10cSrcweir ++nDigits; 499*cdf0e10cSrcweir } 500*cdf0e10cSrcweir else 501*cdf0e10cSrcweir eState = STATE_ERROR; 502*cdf0e10cSrcweir } 503*cdf0e10cSrcweir else 504*cdf0e10cSrcweir { 505*cdf0e10cSrcweir if (ascii_isWhitespace(*p) && (nMinute < 60)) 506*cdf0e10cSrcweir eState = STATE_LWS_NAME; 507*cdf0e10cSrcweir else 508*cdf0e10cSrcweir eState = STATE_ERROR; 509*cdf0e10cSrcweir } 510*cdf0e10cSrcweir break; 511*cdf0e10cSrcweir 512*cdf0e10cSrcweir case STATE_LWS_NAME: 513*cdf0e10cSrcweir if (!ascii_isWhitespace(*p)) 514*cdf0e10cSrcweir { 515*cdf0e10cSrcweir setPath (rEntry.m_aName, p); 516*cdf0e10cSrcweir if (bDirectory) 517*cdf0e10cSrcweir rEntry.m_nMode |= INETCOREFTP_FILEMODE_ISDIR; 518*cdf0e10cSrcweir rEntry.m_nSize = nSize; 519*cdf0e10cSrcweir 520*cdf0e10cSrcweir setYear (rEntry.m_aDate, nYear); 521*cdf0e10cSrcweir 522*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(nMonth); 523*cdf0e10cSrcweir rEntry.m_aDate.SetDay(nDay); 524*cdf0e10cSrcweir rEntry.m_aDate.SetHour(nHour); 525*cdf0e10cSrcweir rEntry.m_aDate.SetMin(nMinute); 526*cdf0e10cSrcweir 527*cdf0e10cSrcweir return sal_True; 528*cdf0e10cSrcweir } 529*cdf0e10cSrcweir break; 530*cdf0e10cSrcweir case STATE_ERROR: 531*cdf0e10cSrcweir break; 532*cdf0e10cSrcweir } 533*cdf0e10cSrcweir } 534*cdf0e10cSrcweir 535*cdf0e10cSrcweir return sal_False; 536*cdf0e10cSrcweir } 537*cdf0e10cSrcweir 538*cdf0e10cSrcweir /* 539*cdf0e10cSrcweir * parseVMS. 540*cdf0e10cSrcweir * Directory entries may span one or two lines: 541*cdf0e10cSrcweir * 542*cdf0e10cSrcweir * entry: *lws name *1(*lws <NEWLINE>) 1*lws size 1*lws datetime rest 543*cdf0e10cSrcweir * 544*cdf0e10cSrcweir * name: filename "." filetype ";" version 545*cdf0e10cSrcweir * filename: 1*39fchar 546*cdf0e10cSrcweir * filetype: 1*39fchar 547*cdf0e10cSrcweir * version: non0digit *digit 548*cdf0e10cSrcweir * 549*cdf0e10cSrcweir * size: "0" / non0digit *digit 550*cdf0e10cSrcweir * 551*cdf0e10cSrcweir * datetime: date 1*lwsp time 552*cdf0e10cSrcweir * date: day "-" month "-" year 553*cdf0e10cSrcweir * day: (*1"0" non0digit) / ("1"-"2" digit) / ("3" "0"-"1") 554*cdf0e10cSrcweir * month: "JAN" / "FEB" / "MAR" / "APR" / "MAY" / "JUN" / "JUL" / "AUG" 555*cdf0e10cSrcweir * / "SEP" / "OCT" / "NOV" / "DEC" ; all case insensitive 556*cdf0e10cSrcweir * year: 2digit / 4digit 557*cdf0e10cSrcweir * time: hour ":" minute 558*cdf0e10cSrcweir * hour: ((*1"0" / "1") digit) / ("2" "0"-"3") 559*cdf0e10cSrcweir * minute: "0"-"5" digit 560*cdf0e10cSrcweir * 561*cdf0e10cSrcweir * rest: *1(lws *<ANY>) 562*cdf0e10cSrcweir * 563*cdf0e10cSrcweir * lws: <TAB> / <SPACE> 564*cdf0e10cSrcweir * non0digit: "1"-"9" 565*cdf0e10cSrcweir * digit: "0" / non0digit 566*cdf0e10cSrcweir * fchar: "A"-"Z" / "a"-"z" / digit / "-" / "_" / "$" 567*cdf0e10cSrcweir * 568*cdf0e10cSrcweir * For directories, the returned name is the <filename> part; for non- 569*cdf0e10cSrcweir * directory files, the returned name is the <filename "." filetype> part. 570*cdf0e10cSrcweir * An entry is a directory iff its filetype is "DIR" (ignoring case). 571*cdf0e10cSrcweir * 572*cdf0e10cSrcweir * The READ, WRITE, and ISLINK mode bits are not supported. 573*cdf0e10cSrcweir * 574*cdf0e10cSrcweir * The returned size is the <size> part, multiplied by 512, and with the high 575*cdf0e10cSrcweir * order bits truncated to fit into a ULONG. 576*cdf0e10cSrcweir * 577*cdf0e10cSrcweir */ 578*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseVMS ( 579*cdf0e10cSrcweir FTPDirentry &rEntry, 580*cdf0e10cSrcweir const sal_Char *pBuffer) 581*cdf0e10cSrcweir { 582*cdf0e10cSrcweir static OUString aFirstLineName; 583*cdf0e10cSrcweir static sal_Bool bFirstLineDir = sal_False; 584*cdf0e10cSrcweir 585*cdf0e10cSrcweir for (sal_Bool bFirstLine = sal_True;; bFirstLine = sal_False) 586*cdf0e10cSrcweir { 587*cdf0e10cSrcweir const sal_Char *p = pBuffer; 588*cdf0e10cSrcweir if (bFirstLine) 589*cdf0e10cSrcweir { 590*cdf0e10cSrcweir // Skip <*lws> part: 591*cdf0e10cSrcweir while (*p == '\t' || *p == ' ') 592*cdf0e10cSrcweir ++p; 593*cdf0e10cSrcweir 594*cdf0e10cSrcweir // Parse <filename "."> part: 595*cdf0e10cSrcweir const sal_Char *pFileName = p; 596*cdf0e10cSrcweir while ((*p >= 'A' && *p <= 'Z') || 597*cdf0e10cSrcweir (*p >= 'a' && *p <= 'z') || 598*cdf0e10cSrcweir (*p >= '0' && *p <= '9') || 599*cdf0e10cSrcweir *p == '-' || *p == '_' || *p == '$') 600*cdf0e10cSrcweir ++p; 601*cdf0e10cSrcweir 602*cdf0e10cSrcweir if (*p != '.' || p == pFileName || p - pFileName > 39) 603*cdf0e10cSrcweir { 604*cdf0e10cSrcweir if (aFirstLineName.getLength()) 605*cdf0e10cSrcweir continue; 606*cdf0e10cSrcweir else 607*cdf0e10cSrcweir return sal_False; 608*cdf0e10cSrcweir } 609*cdf0e10cSrcweir 610*cdf0e10cSrcweir // Parse <filetype ";"> part: 611*cdf0e10cSrcweir const sal_Char *pFileType = ++p; 612*cdf0e10cSrcweir while ((*p >= 'A' && *p <= 'Z') || 613*cdf0e10cSrcweir (*p >= 'a' && *p <= 'z') || 614*cdf0e10cSrcweir (*p >= '0' && *p <= '9') || 615*cdf0e10cSrcweir *p == '-' || *p == '_' || *p == '$') 616*cdf0e10cSrcweir ++p; 617*cdf0e10cSrcweir 618*cdf0e10cSrcweir if (*p != ';' || p == pFileName || p - pFileName > 39) 619*cdf0e10cSrcweir { 620*cdf0e10cSrcweir if (aFirstLineName.getLength()) 621*cdf0e10cSrcweir continue; 622*cdf0e10cSrcweir else 623*cdf0e10cSrcweir return sal_False; 624*cdf0e10cSrcweir } 625*cdf0e10cSrcweir ++p; 626*cdf0e10cSrcweir 627*cdf0e10cSrcweir // Set entry's name and mode (ISDIR flag): 628*cdf0e10cSrcweir if ((p - pFileType == 4) && 629*cdf0e10cSrcweir (pFileType[0] == 'D' || pFileType[0] == 'd') && 630*cdf0e10cSrcweir (pFileType[1] == 'I' || pFileType[1] == 'i') && 631*cdf0e10cSrcweir (pFileType[2] == 'R' || pFileType[2] == 'r') ) 632*cdf0e10cSrcweir { 633*cdf0e10cSrcweir setPath (rEntry.m_aName, pFileName, (pFileType - pFileName)); 634*cdf0e10cSrcweir rEntry.m_nMode = INETCOREFTP_FILEMODE_ISDIR; 635*cdf0e10cSrcweir } 636*cdf0e10cSrcweir else 637*cdf0e10cSrcweir { 638*cdf0e10cSrcweir setPath (rEntry.m_aName, pFileName, (p - pFileName)); 639*cdf0e10cSrcweir rEntry.m_nMode = 0; 640*cdf0e10cSrcweir } 641*cdf0e10cSrcweir 642*cdf0e10cSrcweir // Skip <version> part: 643*cdf0e10cSrcweir if (*p < '1' || *p > '9') 644*cdf0e10cSrcweir { 645*cdf0e10cSrcweir if (aFirstLineName.getLength()) 646*cdf0e10cSrcweir continue; 647*cdf0e10cSrcweir else 648*cdf0e10cSrcweir return sal_False; 649*cdf0e10cSrcweir } 650*cdf0e10cSrcweir ++p; 651*cdf0e10cSrcweir while (*p >= '0' && *p <= '9') 652*cdf0e10cSrcweir ++p; 653*cdf0e10cSrcweir 654*cdf0e10cSrcweir // Parse <1*lws> or <*lws <NEWLINE>> part: 655*cdf0e10cSrcweir sal_Bool bLWS = false; 656*cdf0e10cSrcweir while (*p == '\t' || *p == ' ') 657*cdf0e10cSrcweir { 658*cdf0e10cSrcweir bLWS = true; 659*cdf0e10cSrcweir ++p; 660*cdf0e10cSrcweir } 661*cdf0e10cSrcweir if (*p) 662*cdf0e10cSrcweir { 663*cdf0e10cSrcweir if (!bLWS) 664*cdf0e10cSrcweir { 665*cdf0e10cSrcweir if (aFirstLineName.getLength()) 666*cdf0e10cSrcweir continue; 667*cdf0e10cSrcweir else 668*cdf0e10cSrcweir return sal_False; 669*cdf0e10cSrcweir } 670*cdf0e10cSrcweir } 671*cdf0e10cSrcweir else 672*cdf0e10cSrcweir { 673*cdf0e10cSrcweir /* 674*cdf0e10cSrcweir * First line of entry spanning two lines, 675*cdf0e10cSrcweir * wait for second line. 676*cdf0e10cSrcweir */ 677*cdf0e10cSrcweir aFirstLineName = rEntry.m_aName; 678*cdf0e10cSrcweir bFirstLineDir = 679*cdf0e10cSrcweir ((rEntry.m_nMode & INETCOREFTP_FILEMODE_ISDIR) != 0); 680*cdf0e10cSrcweir return sal_False; 681*cdf0e10cSrcweir } 682*cdf0e10cSrcweir } 683*cdf0e10cSrcweir else 684*cdf0e10cSrcweir { 685*cdf0e10cSrcweir /* 686*cdf0e10cSrcweir * Second line of entry spanning two lines, 687*cdf0e10cSrcweir * restore entry's name and mode (ISDIR flag). 688*cdf0e10cSrcweir */ 689*cdf0e10cSrcweir rEntry.m_aName = aFirstLineName; 690*cdf0e10cSrcweir rEntry.m_nMode = (bFirstLineDir ? INETCOREFTP_FILEMODE_ISDIR : 0); 691*cdf0e10cSrcweir 692*cdf0e10cSrcweir // Skip <1*lws> part: 693*cdf0e10cSrcweir if (*p != '\t' && *p != ' ') 694*cdf0e10cSrcweir return sal_False; 695*cdf0e10cSrcweir ++p; 696*cdf0e10cSrcweir while (*p == '\t' || *p == ' ') 697*cdf0e10cSrcweir ++p; 698*cdf0e10cSrcweir } 699*cdf0e10cSrcweir 700*cdf0e10cSrcweir // Parse <size> part and set entry's size: 701*cdf0e10cSrcweir if (*p < '0' || *p > '9') 702*cdf0e10cSrcweir return sal_False; 703*cdf0e10cSrcweir ULONG nSize = *p - '0'; 704*cdf0e10cSrcweir if (*p++ != '0') 705*cdf0e10cSrcweir while (*p >= '0' && *p <= '9') 706*cdf0e10cSrcweir nSize = 10 * rEntry.m_nSize + (*p++ - '0'); 707*cdf0e10cSrcweir rEntry.m_nSize = 512 * nSize; 708*cdf0e10cSrcweir 709*cdf0e10cSrcweir // Skip <1*lws> part: 710*cdf0e10cSrcweir if (*p != '\t' && *p != ' ') 711*cdf0e10cSrcweir return sal_False; 712*cdf0e10cSrcweir ++p; 713*cdf0e10cSrcweir while (*p == '\t' || *p == ' ') 714*cdf0e10cSrcweir ++p; 715*cdf0e10cSrcweir 716*cdf0e10cSrcweir // Parse <day "-"> part and set entry date's day: 717*cdf0e10cSrcweir sal_uInt16 nDay; 718*cdf0e10cSrcweir if (*p == '0') 719*cdf0e10cSrcweir { 720*cdf0e10cSrcweir ++p; 721*cdf0e10cSrcweir if (*p < '1' || *p > '9') 722*cdf0e10cSrcweir return sal_False; 723*cdf0e10cSrcweir nDay = *p++ - '0'; 724*cdf0e10cSrcweir } 725*cdf0e10cSrcweir else if (*p == '1' || *p == '2') 726*cdf0e10cSrcweir { 727*cdf0e10cSrcweir nDay = *p++ - '0'; 728*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 729*cdf0e10cSrcweir nDay = 10 * nDay + (*p++ - '0'); 730*cdf0e10cSrcweir } 731*cdf0e10cSrcweir else if (*p == '3') 732*cdf0e10cSrcweir { 733*cdf0e10cSrcweir ++p; 734*cdf0e10cSrcweir nDay = (*p == '0' || *p == '1') ? 30 + (*p++ - '0') : 3; 735*cdf0e10cSrcweir } 736*cdf0e10cSrcweir else if (*p >= '4' && *p <= '9') 737*cdf0e10cSrcweir nDay = *p++ - '0'; 738*cdf0e10cSrcweir else 739*cdf0e10cSrcweir return sal_False; 740*cdf0e10cSrcweir 741*cdf0e10cSrcweir rEntry.m_aDate.SetDay(nDay); 742*cdf0e10cSrcweir if (*p++ != '-') 743*cdf0e10cSrcweir return sal_False; 744*cdf0e10cSrcweir 745*cdf0e10cSrcweir // Parse <month "-"> part and set entry date's month: 746*cdf0e10cSrcweir sal_Char const * pMonth = p; 747*cdf0e10cSrcweir sal_Int32 const monthLen = 3; 748*cdf0e10cSrcweir for (int i = 0; i < monthLen; ++i) 749*cdf0e10cSrcweir { 750*cdf0e10cSrcweir if (!((*p >= 'A' && *p <= 'Z') || (*p >= 'a' && *p <= 'z'))) 751*cdf0e10cSrcweir return sal_False; 752*cdf0e10cSrcweir ++p; 753*cdf0e10cSrcweir } 754*cdf0e10cSrcweir if (rtl_str_compareIgnoreAsciiCase_WithLength( 755*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("JAN")) == 0) 756*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(1); 757*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 758*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("FEB")) == 0) 759*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(2); 760*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 761*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("MAR")) == 0) 762*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(3); 763*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 764*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("APR")) == 0) 765*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(4); 766*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 767*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("MAY")) == 0) 768*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(5); 769*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 770*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("JUN")) == 0) 771*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(6); 772*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 773*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("JUL")) == 0) 774*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(7); 775*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 776*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("AUG")) == 0) 777*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(8); 778*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 779*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("SEP")) == 0) 780*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(9); 781*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 782*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("OCT")) == 0) 783*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(10); 784*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 785*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("NOV")) == 0) 786*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(11); 787*cdf0e10cSrcweir else if (rtl_str_compareIgnoreAsciiCase_WithLength( 788*cdf0e10cSrcweir pMonth, monthLen, RTL_CONSTASCII_STRINGPARAM("DEC")) == 0) 789*cdf0e10cSrcweir rEntry.m_aDate.SetMonth(12); 790*cdf0e10cSrcweir else 791*cdf0e10cSrcweir return sal_False; 792*cdf0e10cSrcweir if (*p++ != '-') 793*cdf0e10cSrcweir return sal_False; 794*cdf0e10cSrcweir 795*cdf0e10cSrcweir // Parse <year> part and set entry date's year: 796*cdf0e10cSrcweir sal_uInt16 nYear = 0; 797*cdf0e10cSrcweir {for (int i = 0; i < 2; ++i) 798*cdf0e10cSrcweir { 799*cdf0e10cSrcweir if (*p < '0' || *p > '9') 800*cdf0e10cSrcweir return sal_False; 801*cdf0e10cSrcweir nYear = 10 * nYear + (*p++ - '0'); 802*cdf0e10cSrcweir }} 803*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 804*cdf0e10cSrcweir { 805*cdf0e10cSrcweir nYear = 10 * nYear + (*p++ - '0'); 806*cdf0e10cSrcweir if (*p < '0' || *p > '9') 807*cdf0e10cSrcweir return sal_False; 808*cdf0e10cSrcweir nYear = 10 * nYear + (*p++ - '0'); 809*cdf0e10cSrcweir } 810*cdf0e10cSrcweir setYear (rEntry.m_aDate, nYear); 811*cdf0e10cSrcweir 812*cdf0e10cSrcweir // Skip <1*lws> part: 813*cdf0e10cSrcweir if (*p != '\t' && *p != ' ') 814*cdf0e10cSrcweir return sal_False; 815*cdf0e10cSrcweir ++p; 816*cdf0e10cSrcweir while (*p == '\t' || *p == ' ') 817*cdf0e10cSrcweir ++p; 818*cdf0e10cSrcweir 819*cdf0e10cSrcweir // Parse <hour ":"> part and set entry time's hour: 820*cdf0e10cSrcweir sal_uInt16 nHour; 821*cdf0e10cSrcweir if (*p == '0' || *p == '1') 822*cdf0e10cSrcweir { 823*cdf0e10cSrcweir nHour = *p++ - '0'; 824*cdf0e10cSrcweir if (*p >= '0' && *p <= '9') 825*cdf0e10cSrcweir nHour = 10 * nHour + (*p++ - '0'); 826*cdf0e10cSrcweir } 827*cdf0e10cSrcweir else if (*p == '2') 828*cdf0e10cSrcweir { 829*cdf0e10cSrcweir ++p; 830*cdf0e10cSrcweir nHour = (*p >= '0' && *p <= '3') ? 20 + (*p++ - '0') : 2; 831*cdf0e10cSrcweir } 832*cdf0e10cSrcweir else if (*p >= '3' && *p <= '9') 833*cdf0e10cSrcweir nHour = *p++ - '0'; 834*cdf0e10cSrcweir else 835*cdf0e10cSrcweir return sal_False; 836*cdf0e10cSrcweir 837*cdf0e10cSrcweir rEntry.m_aDate.SetHour(nHour); 838*cdf0e10cSrcweir if (*p++ != ':') 839*cdf0e10cSrcweir return sal_False; 840*cdf0e10cSrcweir 841*cdf0e10cSrcweir /* 842*cdf0e10cSrcweir * Parse <minute> part and set entry time's minutes, 843*cdf0e10cSrcweir * seconds (0), and 1/100 seconds (0). 844*cdf0e10cSrcweir */ 845*cdf0e10cSrcweir if (*p < '0' || *p > '5') 846*cdf0e10cSrcweir return sal_False; 847*cdf0e10cSrcweir 848*cdf0e10cSrcweir sal_uInt16 nMinute = *p++ - '0'; 849*cdf0e10cSrcweir if (*p < '0' || *p > '9') 850*cdf0e10cSrcweir return sal_False; 851*cdf0e10cSrcweir 852*cdf0e10cSrcweir nMinute = 10 * nMinute + (*p++ - '0'); 853*cdf0e10cSrcweir rEntry.m_aDate.SetMin(nMinute); 854*cdf0e10cSrcweir rEntry.m_aDate.SetSec(0); 855*cdf0e10cSrcweir rEntry.m_aDate.Set100Sec(0); 856*cdf0e10cSrcweir 857*cdf0e10cSrcweir // Skip <rest> part: 858*cdf0e10cSrcweir if (*p && (*p != '\t' && *p != ' ')) 859*cdf0e10cSrcweir return sal_False; 860*cdf0e10cSrcweir 861*cdf0e10cSrcweir return sal_True; 862*cdf0e10cSrcweir } 863*cdf0e10cSrcweir } 864*cdf0e10cSrcweir 865*cdf0e10cSrcweir /* 866*cdf0e10cSrcweir * parseUNIX 867*cdf0e10cSrcweir */ 868*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX ( 869*cdf0e10cSrcweir FTPDirentry &rEntry, 870*cdf0e10cSrcweir const sal_Char *pBuffer) 871*cdf0e10cSrcweir { 872*cdf0e10cSrcweir const sal_Char *p1, *p2; 873*cdf0e10cSrcweir p1 = p2 = pBuffer; 874*cdf0e10cSrcweir 875*cdf0e10cSrcweir if (!((*p1 == '-') || (*p1 == 'd') || (*p1 == 'l'))) 876*cdf0e10cSrcweir return sal_False; 877*cdf0e10cSrcweir 878*cdf0e10cSrcweir // 1st column: FileMode. 879*cdf0e10cSrcweir if (*p1 == 'd') 880*cdf0e10cSrcweir rEntry.m_nMode |= INETCOREFTP_FILEMODE_ISDIR; 881*cdf0e10cSrcweir 882*cdf0e10cSrcweir if (*p1 == 'l') 883*cdf0e10cSrcweir rEntry.m_nMode |= INETCOREFTP_FILEMODE_ISLINK; 884*cdf0e10cSrcweir 885*cdf0e10cSrcweir // Skip to end of column and set rights by the way 886*cdf0e10cSrcweir while (*p1 && !ascii_isWhitespace(*p1)) { 887*cdf0e10cSrcweir if(*p1 == 'r') 888*cdf0e10cSrcweir rEntry.m_nMode |= INETCOREFTP_FILEMODE_READ; 889*cdf0e10cSrcweir else if(*p1 == 'w') 890*cdf0e10cSrcweir rEntry.m_nMode |= INETCOREFTP_FILEMODE_WRITE; 891*cdf0e10cSrcweir p1++; 892*cdf0e10cSrcweir } 893*cdf0e10cSrcweir 894*cdf0e10cSrcweir /* 895*cdf0e10cSrcweir * Scan for the sequence of size and date fields: 896*cdf0e10cSrcweir * *LWS 1*DIGIT 1*LWS 3CHAR 1*LWS 1*2DIGIT 1*LWS 897*cdf0e10cSrcweir * (4DIGIT / (1*2DIGIT ":" 2DIGIT)) 1*LWS 898*cdf0e10cSrcweir */ 899*cdf0e10cSrcweir enum Mode 900*cdf0e10cSrcweir { 901*cdf0e10cSrcweir FOUND_NONE, FOUND_SIZE, FOUND_MONTH, FOUND_DAY, FOUND_YEAR_TIME 902*cdf0e10cSrcweir }; 903*cdf0e10cSrcweir 904*cdf0e10cSrcweir const sal_Char *pDayStart = 0; 905*cdf0e10cSrcweir const sal_Char *pDayEnd = 0; 906*cdf0e10cSrcweir Mode eMode; 907*cdf0e10cSrcweir for (eMode = FOUND_NONE; *p1 && eMode != FOUND_YEAR_TIME; p1 = p2 + 1) 908*cdf0e10cSrcweir { 909*cdf0e10cSrcweir while (*p1 && ascii_isWhitespace(*p1)) 910*cdf0e10cSrcweir ++p1; 911*cdf0e10cSrcweir p2 = p1; 912*cdf0e10cSrcweir while (*p2 && !ascii_isWhitespace(*p2)) 913*cdf0e10cSrcweir ++p2; 914*cdf0e10cSrcweir 915*cdf0e10cSrcweir switch (eMode) 916*cdf0e10cSrcweir { 917*cdf0e10cSrcweir case FOUND_NONE: 918*cdf0e10cSrcweir if (parseUNIX_isSizeField (p1, p2, rEntry.m_nSize)) 919*cdf0e10cSrcweir eMode = FOUND_SIZE; 920*cdf0e10cSrcweir break; 921*cdf0e10cSrcweir 922*cdf0e10cSrcweir case FOUND_SIZE: 923*cdf0e10cSrcweir if (parseUNIX_isMonthField (p1, p2, rEntry.m_aDate)) 924*cdf0e10cSrcweir eMode = FOUND_MONTH; 925*cdf0e10cSrcweir else if (!parseUNIX_isSizeField (p1, p2, rEntry.m_nSize)) 926*cdf0e10cSrcweir eMode = FOUND_NONE; 927*cdf0e10cSrcweir break; 928*cdf0e10cSrcweir 929*cdf0e10cSrcweir case FOUND_MONTH: 930*cdf0e10cSrcweir if (parseUNIX_isDayField (p1, p2, rEntry.m_aDate)) 931*cdf0e10cSrcweir { 932*cdf0e10cSrcweir pDayStart = p1; 933*cdf0e10cSrcweir pDayEnd = p2; 934*cdf0e10cSrcweir eMode = FOUND_DAY; 935*cdf0e10cSrcweir } 936*cdf0e10cSrcweir else if (parseUNIX_isSizeField (p1, p2, rEntry.m_nSize)) 937*cdf0e10cSrcweir eMode = FOUND_SIZE; 938*cdf0e10cSrcweir else 939*cdf0e10cSrcweir eMode = FOUND_NONE; 940*cdf0e10cSrcweir break; 941*cdf0e10cSrcweir 942*cdf0e10cSrcweir case FOUND_DAY: 943*cdf0e10cSrcweir if (parseUNIX_isYearTimeField (p1, p2, rEntry.m_aDate)) 944*cdf0e10cSrcweir eMode = FOUND_YEAR_TIME; 945*cdf0e10cSrcweir else if ( 946*cdf0e10cSrcweir parseUNIX_isSizeField ( 947*cdf0e10cSrcweir pDayStart, pDayEnd, rEntry.m_nSize) && 948*cdf0e10cSrcweir parseUNIX_isMonthField ( 949*cdf0e10cSrcweir p1, p2, rEntry.m_aDate)) 950*cdf0e10cSrcweir eMode = FOUND_MONTH; 951*cdf0e10cSrcweir else if (parseUNIX_isSizeField (p1, p2, rEntry.m_nSize)) 952*cdf0e10cSrcweir eMode = FOUND_SIZE; 953*cdf0e10cSrcweir else 954*cdf0e10cSrcweir eMode = FOUND_NONE; 955*cdf0e10cSrcweir break; 956*cdf0e10cSrcweir case FOUND_YEAR_TIME: 957*cdf0e10cSrcweir break; 958*cdf0e10cSrcweir } 959*cdf0e10cSrcweir } 960*cdf0e10cSrcweir 961*cdf0e10cSrcweir if (eMode == FOUND_YEAR_TIME) 962*cdf0e10cSrcweir { 963*cdf0e10cSrcweir // 9th column: FileName (rest of line). 964*cdf0e10cSrcweir while (*p1 && ascii_isWhitespace(*p1)) p1++; 965*cdf0e10cSrcweir setPath (rEntry.m_aName, p1); 966*cdf0e10cSrcweir 967*cdf0e10cSrcweir // Done. 968*cdf0e10cSrcweir return sal_True; 969*cdf0e10cSrcweir } 970*cdf0e10cSrcweir return sal_False; 971*cdf0e10cSrcweir } 972*cdf0e10cSrcweir 973*cdf0e10cSrcweir /* 974*cdf0e10cSrcweir * parseUNIX_isSizeField. 975*cdf0e10cSrcweir */ 976*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX_isSizeField ( 977*cdf0e10cSrcweir const sal_Char *pStart, 978*cdf0e10cSrcweir const sal_Char *pEnd, 979*cdf0e10cSrcweir sal_uInt32 &rSize) 980*cdf0e10cSrcweir { 981*cdf0e10cSrcweir if (!*pStart || !*pEnd || pStart == pEnd) 982*cdf0e10cSrcweir return sal_False; 983*cdf0e10cSrcweir 984*cdf0e10cSrcweir rSize = 0; 985*cdf0e10cSrcweir if (*pStart >= '0' && *pStart <= '9') 986*cdf0e10cSrcweir { 987*cdf0e10cSrcweir for (; pStart < pEnd; ++pStart) 988*cdf0e10cSrcweir if ((*pStart >= '0') && (*pStart <= '9')) 989*cdf0e10cSrcweir rSize = 10 * rSize + (*pStart - '0'); 990*cdf0e10cSrcweir else 991*cdf0e10cSrcweir return sal_False; 992*cdf0e10cSrcweir return sal_True; 993*cdf0e10cSrcweir } 994*cdf0e10cSrcweir else 995*cdf0e10cSrcweir { 996*cdf0e10cSrcweir /* 997*cdf0e10cSrcweir * For a combination of long group name and large file size, 998*cdf0e10cSrcweir * some FTPDs omit LWS between those two columns. 999*cdf0e10cSrcweir */ 1000*cdf0e10cSrcweir int nNonDigits = 0; 1001*cdf0e10cSrcweir int nDigits = 0; 1002*cdf0e10cSrcweir 1003*cdf0e10cSrcweir for (; pStart < pEnd; ++pStart) 1004*cdf0e10cSrcweir if ((*pStart >= '1') && (*pStart <= '9')) 1005*cdf0e10cSrcweir { 1006*cdf0e10cSrcweir ++nDigits; 1007*cdf0e10cSrcweir rSize = 10 * rSize + (*pStart - '0'); 1008*cdf0e10cSrcweir } 1009*cdf0e10cSrcweir else if ((*pStart == '0') && nDigits) 1010*cdf0e10cSrcweir { 1011*cdf0e10cSrcweir ++nDigits; 1012*cdf0e10cSrcweir rSize *= 10; 1013*cdf0e10cSrcweir } 1014*cdf0e10cSrcweir else if ((*pStart > ' ') && (sal::static_int_cast<sal_uInt8>(*pStart) <= '\x7F')) 1015*cdf0e10cSrcweir { 1016*cdf0e10cSrcweir nNonDigits += nDigits + 1; 1017*cdf0e10cSrcweir nDigits = 0; 1018*cdf0e10cSrcweir rSize = 0; 1019*cdf0e10cSrcweir } 1020*cdf0e10cSrcweir else 1021*cdf0e10cSrcweir return sal_False; 1022*cdf0e10cSrcweir return ((nNonDigits >= 9) && (nDigits >= 7)); 1023*cdf0e10cSrcweir } 1024*cdf0e10cSrcweir } 1025*cdf0e10cSrcweir 1026*cdf0e10cSrcweir /* 1027*cdf0e10cSrcweir * parseUNIX_isMonthField. 1028*cdf0e10cSrcweir */ 1029*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX_isMonthField ( 1030*cdf0e10cSrcweir const sal_Char *pStart, 1031*cdf0e10cSrcweir const sal_Char *pEnd, 1032*cdf0e10cSrcweir DateTime &rDateTime) 1033*cdf0e10cSrcweir { 1034*cdf0e10cSrcweir if (!*pStart || !*pEnd || pStart + 3 != pEnd) 1035*cdf0e10cSrcweir return sal_False; 1036*cdf0e10cSrcweir 1037*cdf0e10cSrcweir if ((pStart[0] == 'j' || pStart[0] == 'J') && 1038*cdf0e10cSrcweir (pStart[1] == 'a' || pStart[1] == 'A') && 1039*cdf0e10cSrcweir (pStart[2] == 'n' || pStart[2] == 'N') ) 1040*cdf0e10cSrcweir { 1041*cdf0e10cSrcweir rDateTime.SetMonth(1); 1042*cdf0e10cSrcweir return sal_True; 1043*cdf0e10cSrcweir } 1044*cdf0e10cSrcweir if ((pStart[0] == 'f' || pStart[0] == 'F') && 1045*cdf0e10cSrcweir (pStart[1] == 'e' || pStart[1] == 'E') && 1046*cdf0e10cSrcweir (pStart[2] == 'b' || pStart[2] == 'B') ) 1047*cdf0e10cSrcweir { 1048*cdf0e10cSrcweir rDateTime.SetMonth(2); 1049*cdf0e10cSrcweir return sal_True; 1050*cdf0e10cSrcweir } 1051*cdf0e10cSrcweir if ((pStart[0] == 'm' || pStart[0] == 'M') && 1052*cdf0e10cSrcweir (pStart[1] == 'a' || pStart[1] == 'A') && 1053*cdf0e10cSrcweir (pStart[2] == 'r' || pStart[2] == 'R') ) 1054*cdf0e10cSrcweir { 1055*cdf0e10cSrcweir rDateTime.SetMonth(3); 1056*cdf0e10cSrcweir return sal_True; 1057*cdf0e10cSrcweir } 1058*cdf0e10cSrcweir if ((pStart[0] == 'a' || pStart[0] == 'A') && 1059*cdf0e10cSrcweir (pStart[1] == 'p' || pStart[1] == 'P') && 1060*cdf0e10cSrcweir (pStart[2] == 'r' || pStart[2] == 'R') ) 1061*cdf0e10cSrcweir { 1062*cdf0e10cSrcweir rDateTime.SetMonth(4); 1063*cdf0e10cSrcweir return sal_True; 1064*cdf0e10cSrcweir } 1065*cdf0e10cSrcweir if ((pStart[0] == 'm' || pStart[0] == 'M') && 1066*cdf0e10cSrcweir (pStart[1] == 'a' || pStart[1] == 'A') && 1067*cdf0e10cSrcweir (pStart[2] == 'y' || pStart[2] == 'Y') ) 1068*cdf0e10cSrcweir { 1069*cdf0e10cSrcweir rDateTime.SetMonth(5); 1070*cdf0e10cSrcweir return sal_True; 1071*cdf0e10cSrcweir } 1072*cdf0e10cSrcweir if ((pStart[0] == 'j' || pStart[0] == 'J') && 1073*cdf0e10cSrcweir (pStart[1] == 'u' || pStart[1] == 'U') && 1074*cdf0e10cSrcweir (pStart[2] == 'n' || pStart[2] == 'N') ) 1075*cdf0e10cSrcweir { 1076*cdf0e10cSrcweir rDateTime.SetMonth(6); 1077*cdf0e10cSrcweir return sal_True; 1078*cdf0e10cSrcweir } 1079*cdf0e10cSrcweir if ((pStart[0] == 'j' || pStart[0] == 'J') && 1080*cdf0e10cSrcweir (pStart[1] == 'u' || pStart[1] == 'U') && 1081*cdf0e10cSrcweir (pStart[2] == 'l' || pStart[2] == 'L') ) 1082*cdf0e10cSrcweir { 1083*cdf0e10cSrcweir rDateTime.SetMonth(7); 1084*cdf0e10cSrcweir return sal_True; 1085*cdf0e10cSrcweir } 1086*cdf0e10cSrcweir if ((pStart[0] == 'a' || pStart[0] == 'A') && 1087*cdf0e10cSrcweir (pStart[1] == 'u' || pStart[1] == 'U') && 1088*cdf0e10cSrcweir (pStart[2] == 'g' || pStart[2] == 'G') ) 1089*cdf0e10cSrcweir { 1090*cdf0e10cSrcweir rDateTime.SetMonth(8); 1091*cdf0e10cSrcweir return sal_True; 1092*cdf0e10cSrcweir } 1093*cdf0e10cSrcweir if ((pStart[0] == 's' || pStart[0] == 'S') && 1094*cdf0e10cSrcweir (pStart[1] == 'e' || pStart[1] == 'E') && 1095*cdf0e10cSrcweir (pStart[2] == 'p' || pStart[2] == 'P') ) 1096*cdf0e10cSrcweir { 1097*cdf0e10cSrcweir rDateTime.SetMonth(9); 1098*cdf0e10cSrcweir return sal_True; 1099*cdf0e10cSrcweir } 1100*cdf0e10cSrcweir if ((pStart[0] == 'o' || pStart[0] == 'O') && 1101*cdf0e10cSrcweir (pStart[1] == 'c' || pStart[1] == 'C') && 1102*cdf0e10cSrcweir (pStart[2] == 't' || pStart[2] == 'T') ) 1103*cdf0e10cSrcweir { 1104*cdf0e10cSrcweir rDateTime.SetMonth(10); 1105*cdf0e10cSrcweir return sal_True; 1106*cdf0e10cSrcweir } 1107*cdf0e10cSrcweir if ((pStart[0] == 'n' || pStart[0] == 'N') && 1108*cdf0e10cSrcweir (pStart[1] == 'o' || pStart[1] == 'O') && 1109*cdf0e10cSrcweir (pStart[2] == 'v' || pStart[2] == 'V') ) 1110*cdf0e10cSrcweir { 1111*cdf0e10cSrcweir rDateTime.SetMonth(11); 1112*cdf0e10cSrcweir return sal_True; 1113*cdf0e10cSrcweir } 1114*cdf0e10cSrcweir if ((pStart[0] == 'd' || pStart[0] == 'D') && 1115*cdf0e10cSrcweir (pStart[1] == 'e' || pStart[1] == 'E') && 1116*cdf0e10cSrcweir (pStart[2] == 'c' || pStart[2] == 'C') ) 1117*cdf0e10cSrcweir { 1118*cdf0e10cSrcweir rDateTime.SetMonth(12); 1119*cdf0e10cSrcweir return sal_True; 1120*cdf0e10cSrcweir } 1121*cdf0e10cSrcweir return sal_False; 1122*cdf0e10cSrcweir } 1123*cdf0e10cSrcweir 1124*cdf0e10cSrcweir /* 1125*cdf0e10cSrcweir * parseUNIX_isDayField. 1126*cdf0e10cSrcweir */ 1127*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX_isDayField ( 1128*cdf0e10cSrcweir const sal_Char *pStart, 1129*cdf0e10cSrcweir const sal_Char *pEnd, 1130*cdf0e10cSrcweir DateTime &rDateTime) 1131*cdf0e10cSrcweir { 1132*cdf0e10cSrcweir if (!*pStart || !*pEnd || pStart == pEnd) 1133*cdf0e10cSrcweir return sal_False; 1134*cdf0e10cSrcweir if (*pStart < '0' || *pStart > '9') 1135*cdf0e10cSrcweir return sal_False; 1136*cdf0e10cSrcweir 1137*cdf0e10cSrcweir sal_uInt16 nDay = *pStart - '0'; 1138*cdf0e10cSrcweir if (pStart + 1 < pEnd) 1139*cdf0e10cSrcweir { 1140*cdf0e10cSrcweir if (pStart + 2 != pEnd || pStart[1] < '0' || pStart[1] > '9') 1141*cdf0e10cSrcweir return sal_False; 1142*cdf0e10cSrcweir nDay = 10 * nDay + (pStart[1] - '0'); 1143*cdf0e10cSrcweir } 1144*cdf0e10cSrcweir if (!nDay || nDay > 31) 1145*cdf0e10cSrcweir return sal_False; 1146*cdf0e10cSrcweir 1147*cdf0e10cSrcweir rDateTime.SetDay(nDay); 1148*cdf0e10cSrcweir return sal_True; 1149*cdf0e10cSrcweir } 1150*cdf0e10cSrcweir 1151*cdf0e10cSrcweir /* 1152*cdf0e10cSrcweir * parseUNIX_isYearTimeField. 1153*cdf0e10cSrcweir */ 1154*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX_isYearTimeField ( 1155*cdf0e10cSrcweir const sal_Char *pStart, 1156*cdf0e10cSrcweir const sal_Char *pEnd, 1157*cdf0e10cSrcweir DateTime &rDateTime) 1158*cdf0e10cSrcweir { 1159*cdf0e10cSrcweir if (!*pStart || !*pEnd || pStart == pEnd || 1160*cdf0e10cSrcweir *pStart < '0' || *pStart > '9') 1161*cdf0e10cSrcweir return sal_False; 1162*cdf0e10cSrcweir 1163*cdf0e10cSrcweir sal_uInt16 nNumber = *pStart - '0'; 1164*cdf0e10cSrcweir ++pStart; 1165*cdf0e10cSrcweir 1166*cdf0e10cSrcweir if (pStart == pEnd) 1167*cdf0e10cSrcweir return sal_False; 1168*cdf0e10cSrcweir if (*pStart == ':') 1169*cdf0e10cSrcweir return parseUNIX_isTime (pStart, pEnd, nNumber, rDateTime); 1170*cdf0e10cSrcweir if (*pStart < '0' || *pStart > '9') 1171*cdf0e10cSrcweir return sal_False; 1172*cdf0e10cSrcweir 1173*cdf0e10cSrcweir nNumber = 10 * nNumber + (*pStart - '0'); 1174*cdf0e10cSrcweir ++pStart; 1175*cdf0e10cSrcweir 1176*cdf0e10cSrcweir if (pStart == pEnd) 1177*cdf0e10cSrcweir return sal_False; 1178*cdf0e10cSrcweir if (*pStart == ':') 1179*cdf0e10cSrcweir return parseUNIX_isTime (pStart, pEnd, nNumber, rDateTime); 1180*cdf0e10cSrcweir if (*pStart < '0' || *pStart > '9') 1181*cdf0e10cSrcweir return sal_False; 1182*cdf0e10cSrcweir 1183*cdf0e10cSrcweir nNumber = 10 * nNumber + (*pStart - '0'); 1184*cdf0e10cSrcweir ++pStart; 1185*cdf0e10cSrcweir 1186*cdf0e10cSrcweir if (pStart == pEnd || *pStart < '0' || *pStart > '9') 1187*cdf0e10cSrcweir return sal_False; 1188*cdf0e10cSrcweir 1189*cdf0e10cSrcweir nNumber = 10 * nNumber + (*pStart - '0'); 1190*cdf0e10cSrcweir if (pStart + 1 != pEnd || nNumber < 1970) 1191*cdf0e10cSrcweir return sal_False; 1192*cdf0e10cSrcweir 1193*cdf0e10cSrcweir rDateTime.SetYear(nNumber); 1194*cdf0e10cSrcweir rDateTime.SetTime(0); 1195*cdf0e10cSrcweir return sal_True; 1196*cdf0e10cSrcweir } 1197*cdf0e10cSrcweir 1198*cdf0e10cSrcweir /* 1199*cdf0e10cSrcweir * parseUNIX_isTime. 1200*cdf0e10cSrcweir */ 1201*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::parseUNIX_isTime ( 1202*cdf0e10cSrcweir const sal_Char *pStart, 1203*cdf0e10cSrcweir const sal_Char *pEnd, 1204*cdf0e10cSrcweir sal_uInt16 nHour, 1205*cdf0e10cSrcweir DateTime &rDateTime) 1206*cdf0e10cSrcweir { 1207*cdf0e10cSrcweir if ((nHour > 23 ) || (pStart + 3 != pEnd) || 1208*cdf0e10cSrcweir (pStart[1] < '0') || (pStart[1] > '5') || 1209*cdf0e10cSrcweir (pStart[2] < '0') || (pStart[2] > '9') ) 1210*cdf0e10cSrcweir return sal_False; 1211*cdf0e10cSrcweir 1212*cdf0e10cSrcweir sal_uInt16 nMin = 10 * (pStart[1] - '0') + (pStart[2] - '0'); 1213*cdf0e10cSrcweir 1214*cdf0e10cSrcweir rDateTime.SetHour (nHour); 1215*cdf0e10cSrcweir rDateTime.SetMin (nMin); 1216*cdf0e10cSrcweir rDateTime.SetSec (0); 1217*cdf0e10cSrcweir rDateTime.Set100Sec (0); 1218*cdf0e10cSrcweir 1219*cdf0e10cSrcweir // Date aCurDate; 1220*cdf0e10cSrcweir // if (rDateTime.GetMonth() > aCurDate.GetMonth()) 1221*cdf0e10cSrcweir // rDateTime.SetYear(aCurDate.GetYear() - 1); 1222*cdf0e10cSrcweir // else 1223*cdf0e10cSrcweir // rDateTime.SetYear(aCurDate.GetYear()); 1224*cdf0e10cSrcweir // return sal_True; 1225*cdf0e10cSrcweir 1226*cdf0e10cSrcweir TimeValue aTimeVal; 1227*cdf0e10cSrcweir osl_getSystemTime(&aTimeVal); 1228*cdf0e10cSrcweir oslDateTime aCurrDateTime; 1229*cdf0e10cSrcweir osl_getDateTimeFromTimeValue(&aTimeVal,&aCurrDateTime); 1230*cdf0e10cSrcweir 1231*cdf0e10cSrcweir if (rDateTime.GetMonth() > aCurrDateTime.Month) 1232*cdf0e10cSrcweir rDateTime.SetYear(aCurrDateTime.Year - 1); 1233*cdf0e10cSrcweir else 1234*cdf0e10cSrcweir rDateTime.SetYear(aCurrDateTime.Year); 1235*cdf0e10cSrcweir return sal_True; 1236*cdf0e10cSrcweir } 1237*cdf0e10cSrcweir 1238*cdf0e10cSrcweir /* 1239*cdf0e10cSrcweir * setYear. 1240*cdf0e10cSrcweir * 1241*cdf0e10cSrcweir * Two-digit years are taken as within 50 years back and 49 years forward 1242*cdf0e10cSrcweir * (both ends inclusive) from the current year. The returned date is not 1243*cdf0e10cSrcweir * checked for validity of the given day in the given month and year. 1244*cdf0e10cSrcweir * 1245*cdf0e10cSrcweir */ 1246*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::setYear ( 1247*cdf0e10cSrcweir DateTime &rDateTime, sal_uInt16 nYear) 1248*cdf0e10cSrcweir { 1249*cdf0e10cSrcweir if (nYear < 100) 1250*cdf0e10cSrcweir { 1251*cdf0e10cSrcweir TimeValue aTimeVal; 1252*cdf0e10cSrcweir osl_getSystemTime(&aTimeVal); 1253*cdf0e10cSrcweir oslDateTime aCurrDateTime; 1254*cdf0e10cSrcweir osl_getDateTimeFromTimeValue(&aTimeVal,&aCurrDateTime); 1255*cdf0e10cSrcweir sal_uInt16 nCurrentYear = aCurrDateTime.Year; 1256*cdf0e10cSrcweir // sal_uInt16 nCurrentYear = Date().GetYear(); 1257*cdf0e10cSrcweir sal_uInt16 nCurrentCentury = nCurrentYear / 100; 1258*cdf0e10cSrcweir nCurrentYear %= 100; 1259*cdf0e10cSrcweir if (nCurrentYear < 50) 1260*cdf0e10cSrcweir if (nYear <= nCurrentYear) 1261*cdf0e10cSrcweir nYear += nCurrentCentury * 100; 1262*cdf0e10cSrcweir else if (nYear < nCurrentYear + 50) 1263*cdf0e10cSrcweir nYear += nCurrentCentury * 100; 1264*cdf0e10cSrcweir else 1265*cdf0e10cSrcweir nYear += (nCurrentCentury - 1) * 100; 1266*cdf0e10cSrcweir else 1267*cdf0e10cSrcweir if (nYear >= nCurrentYear) 1268*cdf0e10cSrcweir nYear += nCurrentCentury * 100; 1269*cdf0e10cSrcweir else if (nYear >= nCurrentYear - 50) 1270*cdf0e10cSrcweir nYear += nCurrentCentury * 100; 1271*cdf0e10cSrcweir else 1272*cdf0e10cSrcweir nYear += (nCurrentCentury + 1) * 100; 1273*cdf0e10cSrcweir } 1274*cdf0e10cSrcweir 1275*cdf0e10cSrcweir rDateTime.SetYear(nYear); 1276*cdf0e10cSrcweir return sal_True; 1277*cdf0e10cSrcweir } 1278*cdf0e10cSrcweir 1279*cdf0e10cSrcweir /* 1280*cdf0e10cSrcweir * setPath. 1281*cdf0e10cSrcweir */ 1282*cdf0e10cSrcweir sal_Bool FTPDirectoryParser::setPath ( 1283*cdf0e10cSrcweir OUString &rPath, const sal_Char *value, sal_Int32 length) 1284*cdf0e10cSrcweir { 1285*cdf0e10cSrcweir if (value) 1286*cdf0e10cSrcweir { 1287*cdf0e10cSrcweir if (length < 0) 1288*cdf0e10cSrcweir length = rtl_str_getLength (value); 1289*cdf0e10cSrcweir rPath = OUString (value, length, RTL_TEXTENCODING_UTF8); 1290*cdf0e10cSrcweir } 1291*cdf0e10cSrcweir return (!!value); 1292*cdf0e10cSrcweir } 1293