SOL9 2.0 Class: Pipe

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * Pipe.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL++2000
#pragma once

#include <sol\Object.h>

namespace SOL {

class Pipe :public Object {
private:
    HANDLE    hReader;
    HANDLE    hWriter;
    SECURITY_ATTRIBUTES sa;

public:
    Pipe(int buffsize =1024) 
    :hReader(INVALID_HANDLE_VALUE),
    hWriter(INVALID_HANDLE_VALUE)
    {
        memset(&sa, 0, sizeof(sa));
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);
        sa.bInheritHandle = TRUE;
        if (CreatePipe(&hReader, &hWriter, &sa, buffsize) == False) {
            hReader = INVALID_HANDLE_VALUE;
            hWriter = INVALID_HANDLE_VALUE;
        }
    }

public:
// Create duplicated pipe.
    Pipe(Pipe& origPipe)
    :hReader(INVALID_HANDLE_VALUE),
    hWriter(INVALID_HANDLE_VALUE)
    {
        memset(&sa, 0, sizeof(sa));
        hReader = origPipe.duplicateReaderHandle();
        hWriter = origPipe.duplicateWriterHandle();
    }


public:
// Create duplicated pipe.
    Pipe(Pipe* origPipe)
    :hReader(INVALID_HANDLE_VALUE),
    hWriter(INVALID_HANDLE_VALUE)
    {
        memset(&sa, 0, sizeof(sa));
        if (origPipe) {
            hReader = origPipe -> duplicateReaderHandle();
            hWriter = origPipe -> duplicateWriterHandle();
        }
    }

public:
    ~Pipe() 
    {
        close();
    }

public:
    void close()
    {
        closeReaderHandle();
        closeWriterHandle();
    }

public:
    void closeReaderHandle() 
    {
        if (hReader != INVALID_HANDLE_VALUE) {
            ::CloseHandle(hReader);
        }
        hReader = NULL;
    }

public:
    void closeWriterHandle() 
    {
        if (hWriter != INVALID_HANDLE_VALUE) {
            ::CloseHandle(hWriter);
        }
        hWriter = NULL;
    }


public:
    HANDLE duplicateReaderHandle()
    {
        HANDLE hReaderDup = INVALID_HANDLE_VALUE;
        if (hReader != INVALID_HANDLE_VALUE &&
            !::DuplicateHandle(GetCurrentProcess(), hReader,
                GetCurrentProcess(), &hReaderDup , 0,
                FALSE,  DUPLICATE_SAME_ACCESS)) {
            hReaderDup = INVALID_HANDLE_VALUE;
        }
        return hReaderDup;
    }

public:
    HANDLE duplicateWriterHandle()
    {
        HANDLE hWriterDup = INVALID_HANDLE_VALUE;
        if (hWriter != INVALID_HANDLE_VALUE &&
            !::DuplicateHandle(GetCurrentProcess(), hWriter,
                GetCurrentProcess(), &hWriterDup , 0,
                FALSE,  DUPLICATE_SAME_ACCESS)) {
            hWriterDup = INVALID_HANDLE_VALUE;
        }
        return hWriterDup;
    }

public:
    int read(char* buffer, int len) 
    {
        unsigned long result = 0;
        if (hReader != INVALID_HANDLE_VALUE) {
            ::ReadFile(hReader, buffer, len, &result, 0);
        }
        return (int)result;
    }

public:
    int    write(const char* buffer, int len) 
    {
        unsigned long result = 0;
        if (hWriter !=INVALID_HANDLE_VALUE) {
            ::WriteFile(hWriter, buffer, len, &result, 0);
        }
        return (int)result;
    }


    HANDLE getReaderHandle() {
        return hReader;
    }

    HANDLE getWriterHandle() {
        return hWriter;

    }
/*
    void    close();

    void    closeReaderHandle();
    void    closeWriterHandle();

    HANDLE    duplicateReaderHandle();
    HANDLE    duplicateWriterHandle();


    int        read(char* buffer, int len);
    int        write(const char* buffer, int len);
*/
};

}

Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.