FS/FS_HomeHelper.C

/*
 * Copyright (c) 2012
 *      Side Effects Software Inc.  All rights reserved.
 *
 * Redistribution and use of Houdini Development Kit samples 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. The name of Side Effects Software may not be used to endorse or
 *    promote products derived from this software without specific prior
 *    written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY SIDE EFFECTS SOFTWARE `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 SIDE EFFECTS SOFTWARE 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 <fstream.h>
#include <UT/UT_DSOVersion.h>
#include <UT/UT_EnvControl.h>
#include <UT/UT_NTStreamUtil.h>
#include <UT/UT_DirUtil.h>
#include <UT/UT_SysClone.h>
#include "FS_HomeHelper.h"

#define HOME_SIGNATURE          "home:"
#define HOME_SIGNATURE_LEN      5

void
installFSHelpers()
{
    new HDK_Sample::FS_HomeReadHelper();
    new HDK_Sample::FS_HomeWriteHelper();
    new HDK_Sample::FS_HomeInfoHelper();
}

using namespace HDK_Sample;

static bool
prefixPathWithHome(UT_String &destpath, const char *srcpath)
{
    if( strncmp(srcpath, HOME_SIGNATURE, HOME_SIGNATURE_LEN) == 0 )
    {
        destpath = UT_EnvControl::getString(ENV_HOME);

        if( srcpath[HOME_SIGNATURE_LEN] != '/' )
            destpath += "/";
        destpath += &srcpath[HOME_SIGNATURE_LEN];

        return true;
    }

    return false;
}

FS_HomeReadHelper::FS_HomeReadHelper()
{
    UTaddAbsolutePathPrefix(HOME_SIGNATURE);
}

FS_HomeReadHelper::~FS_HomeReadHelper()
{
}

FS_ReaderStream *
FS_HomeReadHelper::createStream(const char *source)
{
    FS_ReaderStream             *is = 0;
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
        is = new FS_ReaderStream(homepath);

    return is;
}

FS_HomeWriteHelper::FS_HomeWriteHelper()
{
    UTaddAbsolutePathPrefix(HOME_SIGNATURE);
}

FS_HomeWriteHelper::~FS_HomeWriteHelper()
{
}

FS_WriterStream *
FS_HomeWriteHelper::createStream(const char *source)
{
    FS_WriterStream             *os = 0;
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
        os = new FS_WriterStream(homepath);

    return os;
}

FS_HomeInfoHelper::FS_HomeInfoHelper()
{
    UTaddAbsolutePathPrefix(HOME_SIGNATURE);
}

FS_HomeInfoHelper::~FS_HomeInfoHelper()
{
}

bool
FS_HomeInfoHelper::canHandle(const char *source)
{
    return (strncmp(source, HOME_SIGNATURE, HOME_SIGNATURE_LEN) == 0);
}

bool
FS_HomeInfoHelper::hasAccess(const char *source, int mode)
{
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
    {
        FS_Info                  info(homepath);

        return info.hasAccess(mode);
    }

    return false;
}

bool
FS_HomeInfoHelper::getIsDirectory(const char *source)
{
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
    {
        FS_Info                  info(homepath);

        return info.getIsDirectory();
    }

    return false;
}

int
FS_HomeInfoHelper::getModTime(const char *source)
{
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
    {
        FS_Info                  info(homepath);

        return info.getModTime();
    }

    return 0;
}

int64
FS_HomeInfoHelper::getSize(const char *source)
{
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
    {
        FS_Info                  info(homepath);

        return info.getFileDataSize();
    }

    return 0;
}

bool
FS_HomeInfoHelper::getContents(const char *source,
                               UT_StringArray &contents,
                               UT_StringArray *dirs)
{
    UT_String                    homepath;

    if( prefixPathWithHome(homepath, source) )
    {
        FS_Info                  info(homepath);

        return info.getContents(contents, dirs);
    }

    return false;
}


Generated on Mon May 21 00:08:39 2012 for HDK by  doxygen 1.5.9