Home | History | Annotate | Download | only in platform
      1 /*
      2  * Copyright (C) 2007, 2011 Apple Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  *
      8  * 1.  Redistributions of source code must retain the above copyright
      9  *     notice, this list of conditions and the following disclaimer.
     10  * 2.  Redistributions in binary form must reproduce the above copyright
     11  *     notice, this list of conditions and the following disclaimer in the
     12  *     documentation and/or other materials provided with the distribution.
     13  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     16  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     17  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     18  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     19  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     20  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     21  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #include "config.h"
     27 #include "FileSystem.h"
     28 
     29 #include <wtf/HexNumber.h>
     30 
     31 namespace WebCore {
     32 
     33 // The following lower-ASCII characters need escaping to be used in a filename
     34 // across all systems, including Windows:
     35 //     - Unprintable ASCII (00-1F)
     36 //     - Space             (20)
     37 //     - Double quote      (22)
     38 //     - Percent           (25) (escaped because it is our escape character)
     39 //     - Asterisk          (2A)
     40 //     - Slash             (2F)
     41 //     - Colon             (3A)
     42 //     - Less-than         (3C)
     43 //     - Greater-than      (3E)
     44 //     - Question Mark     (3F)
     45 //     - Backslash         (5C)
     46 //     - Pipe              (7C)
     47 //     - Delete            (7F)
     48 
     49 static const bool needsEscaping[128] = {
     50     /* 00-07 */ true,  true,  true,  true,  true,  true,  true,  true,
     51     /* 08-0F */ true,  true,  true,  true,  true,  true,  true,  true,
     52 
     53     /* 10-17 */ true,  true,  true,  true,  true,  true,  true,  true,
     54     /* 18-1F */ true,  true,  true,  true,  true,  true,  true,  true,
     55 
     56     /* 20-27 */ true,  false, true,  false, false, true,  false, false,
     57     /* 28-2F */ false, false, true,  false, false, false, false, true,
     58 
     59     /* 30-37 */ false, false, false, false, false, false, false, false,
     60     /* 38-3F */ false, false, true,  false, true,  false, true,  true,
     61 
     62     /* 40-47 */ false, false, false, false, false, false, false, false,
     63     /* 48-4F */ false, false, false, false, false, false, false, false,
     64 
     65     /* 50-57 */ false, false, false, false, false, false, false, false,
     66     /* 58-5F */ false, false, false, false, true,  false, false, false,
     67 
     68     /* 60-67 */ false, false, false, false, false, false, false, false,
     69     /* 68-6F */ false, false, false, false, false, false, false, false,
     70 
     71     /* 70-77 */ false, false, false, false, false, false, false, false,
     72     /* 78-7F */ false, false, false, false, true,  false, false, true,
     73 };
     74 
     75 static inline bool shouldEscapeUChar(UChar c)
     76 {
     77     return c > 127 ? false : needsEscaping[c];
     78 }
     79 
     80 String encodeForFileName(const String& inputStr)
     81 {
     82     unsigned length = inputStr.length();
     83     Vector<UChar, 512> buffer(length * 3 + 1);
     84     UChar* p = buffer.data();
     85 
     86     const UChar* str = inputStr.characters();
     87     const UChar* strEnd = str + length;
     88 
     89     while (str < strEnd) {
     90         UChar c = *str++;
     91         if (shouldEscapeUChar(c)) {
     92             *p++ = '%';
     93             placeByteAsHex(c, p);
     94         } else
     95             *p++ = c;
     96     }
     97 
     98     ASSERT(p - buffer.data() <= static_cast<int>(buffer.size()));
     99 
    100     return String(buffer.data(), p - buffer.data());
    101 }
    102 
    103 #if !PLATFORM(MAC)
    104 
    105 bool canExcludeFromBackup()
    106 {
    107     return false;
    108 }
    109 
    110 bool excludeFromBackup(const String&)
    111 {
    112     return false;
    113 }
    114 
    115 #endif
    116 
    117 } // namespace WebCore
    118