/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <GLES2/gl2.h>
#include <GLcommon/objectNameManager.h>
#include "ProgramData.h"

ProgramData::ProgramData() :  ObjectData(PROGRAM_DATA),
                              AttachedVertexShader(0),
                              AttachedFragmentShader(0),
                              LinkStatus(GL_FALSE),
                              IsInUse(false),
                              DeleteStatus(false) {}

void ProgramData::setInfoLog(const GLchar* log) {
    infoLog.reset(log);
}

const GLchar* ProgramData::getInfoLog() const {
    return infoLog.get() ? infoLog.get() : (const GLchar*)"";
}

GLuint ProgramData::getAttachedVertexShader() const {
    return AttachedVertexShader;
}

GLuint ProgramData::getAttachedFragmentShader() const {
    return AttachedFragmentShader;
}

GLuint ProgramData::getAttachedShader(GLenum type) const {
    GLuint shader = 0;
    switch (type) {
    case GL_VERTEX_SHADER:
        shader = AttachedVertexShader;
        break;
    case GL_FRAGMENT_SHADER:
        shader = AttachedFragmentShader;
        break;
    }
    return shader;
}

bool ProgramData::attachShader(GLuint shader,GLenum type) {
    if (type==GL_VERTEX_SHADER && AttachedVertexShader==0) {
        AttachedVertexShader=shader;
        return true;
    }
    else if (type==GL_FRAGMENT_SHADER && AttachedFragmentShader==0) {
        AttachedFragmentShader=shader;
        return true;
    }
    return false;
}

bool ProgramData::isAttached(GLuint shader) const {
    return (AttachedFragmentShader==shader || AttachedVertexShader==shader);
}

bool ProgramData::detachShader(GLuint shader) {
    if (AttachedVertexShader==shader) {
        AttachedVertexShader = 0;
        return true;
    }
    else if (AttachedFragmentShader==shader) {
        AttachedFragmentShader = 0;
        return true;
    }
    return false;
}

void ProgramData::setLinkStatus(GLint status) {
    LinkStatus = status;
}

GLint ProgramData::getLinkStatus() const {
    return LinkStatus;
}
