/*
 * Copyright (C) 2009 Apple Inc.  All rights reserved.
 * Copyright (C) 2009 Google Inc.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#include "sky/engine/config.h"
#include "sky/engine/platform/clipboard/ClipboardUtilities.h"

#include "sky/engine/wtf/text/WTFString.h"

namespace blink {

// On POSIX systems, the typical filename length limit is 255 character units. HFS+'s limit is
// actually 255 Unicode characters using Apple's modification of Normzliation Form D, but the
// differences aren't really worth dealing with here.
static const unsigned maxFilenameLength = 255;

static bool isInvalidFileCharacter(UChar c)
{
    // HFS+ disallows '/' and Linux systems also disallow null. For sanity's sake we'll also
    // disallow control characters.
    return c < ' ' || c == 0x7F || c == '/';
}

void validateFilename(String& name, String& extension)
{
    // Remove any invalid file system characters, especially "/".
    name = name.removeCharacters(&isInvalidFileCharacter);
    extension = extension.removeCharacters(&isInvalidFileCharacter);

    // Remove a ridiculously-long extension.
    if (extension.length() >= maxFilenameLength)
        extension = String();

    // Truncate an overly-long filename, reserving one character for a dot.
    name.truncate(maxFilenameLength - extension.length() - 1);
}

} // namespace blink
