/* * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a * aplicativos mainframe. Registro no INPI sob o nome G3270. * * Copyright (C) <2008> * * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela * Free Software Foundation. * * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para * obter mais detalhes. * * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin * St, Fifth Floor, Boston, MA 02110-1301 USA * * Este programa está nomeado como - e possui - linhas de código. * * Contatos: * * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) * */ /** * @file * * @brief * * @author perry.werneck@gmail.com * */ #include "private.h" #include #include #include #include /*---[ Implement ]----------------------------------------------------------------------------------*/ namespace TN3270 { // Class template template class TN3270_PRIVATE TemplateAttribute : public Attribute { protected: struct Worker { const T *methods; IPC::Session * session; }; public: TemplateAttribute(const IPC::Session *session, Attribute::Type type, const T *methods) : Attribute(type, sizeof(struct Worker)) { getWorker()->session = const_cast(session); getWorker()->methods = methods; get.name = [](const void *worker) { return ((const struct Worker *) worker)->methods->name; }; get.description = [](const void *worker) { return ((const struct Worker *) worker)->methods->description; }; } inline struct Worker * getWorker() { return (struct Worker *) this->data; } }; // Signed int attribute class TN3270_PRIVATE IntAttribute : public TemplateAttribute { public: IntAttribute(const IPC::Session *session, const LIB3270_INT_PROPERTY *worker) : TemplateAttribute(session, Attribute::Int32, worker) { get.asString = [](const Attribute GNUC_UNUSED(& attr), const void GNUC_UNUSED(*worker)) { return std::to_string(attr.getInt32()); }; get.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; int value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return (int32_t) value; }; get.asUint32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (uint32_t) attr.getInt32(); }; get.asBoolean = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (attr.getInt32() != 0); }; if(worker->set) { set.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const int32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; set.asUint32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const uint32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; } } }; // Boolean attribute class TN3270_PRIVATE BooleanAttribute : public TemplateAttribute { public: BooleanAttribute(const IPC::Session *session, const LIB3270_INT_PROPERTY *worker) : TemplateAttribute(session, Attribute::Boolean, worker) { get.asString = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return attr.getBoolean() ? "true" : "false"; }; get.asInt32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (uint32_t) attr.getBoolean(); }; get.asUint32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (uint32_t) attr.getInt32(); }; get.asBoolean = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; bool value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return value; }; if(worker->set) { set.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const int32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; set.asBoolean = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const bool value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; } } }; // Toggle attribute class TN3270_PRIVATE ToggleAttribute : public TemplateAttribute { public: ToggleAttribute(const IPC::Session *session, const LIB3270_TOGGLE *worker) : TemplateAttribute(session, Attribute::Boolean, worker) { get.asString = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return attr.getBoolean() ? "true" : "false"; }; get.asInt32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (uint32_t) attr.getBoolean(); }; get.asUint32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (uint32_t) attr.getInt32(); }; get.asBoolean = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; bool value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return value; }; set.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const int32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; set.asBoolean = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const bool value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; } }; // Unsigned int attribute class TN3270_PRIVATE UnsignedIntAttribute : public TemplateAttribute { public: UnsignedIntAttribute(const IPC::Session *session, const LIB3270_UINT_PROPERTY *worker) : TemplateAttribute(session, Attribute::Boolean, worker) { get.asString = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return std::to_string(attr.getUint32()); }; get.asInt32 = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (int32_t) attr.getUint32(); }; get.asUint32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; unsigned int value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return (uint32_t) value; }; get.asBoolean = [](const Attribute & attr, const void GNUC_UNUSED(*worker)) { return (attr.getUint32() != 0); }; if(worker->set) { set.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const int32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; set.asUint32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const uint32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; } } }; // String attribute class TN3270_PRIVATE StringAttribute : public TemplateAttribute { public: StringAttribute(const IPC::Session *session, const LIB3270_STRING_PROPERTY *worker) : TemplateAttribute(session, Attribute::String, worker) { get.asString = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; string value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return value; }; get.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker) { const struct Worker * w = (const struct Worker *) worker; string value; IPC::Request(*w->session,false,w->methods->name) .call() .pop(value); return atoi(value.c_str()); }; if(worker->set) { set.asString = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const char *value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(value) .call(); }; set.asInt32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const int32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(std::to_string(value).c_str()) .call(); }; set.asUint32 = [](const Attribute GNUC_UNUSED(& attr), const void *worker, const uint32_t value) { const struct Worker * w = (const struct Worker *) worker; IPC::Request(*w->session,true,w->methods->name) .push(std::to_string(value).c_str()) .call(); }; } } }; Attribute IPC::Session::getAttribute(const char *name) const { // Check for integer properties. { const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { if(!strcasecmp(name,intprop[ix].name)) { return IntAttribute(this,&intprop[ix]); } } } // Check for unsigned int properties { const LIB3270_UINT_PROPERTY * intprop = lib3270_get_unsigned_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { if(!strcasecmp(name,intprop[ix].name)) { return UnsignedIntAttribute(this,&intprop[ix]); } } } // Check for string properties { const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); for(size_t ix = 0; strprop[ix].name; ix++) { if(!strcasecmp(name,strprop[ix].name)) { return StringAttribute(this,&strprop[ix]); } } } // Check for boolean properties { const LIB3270_TOGGLE *toggles = lib3270_get_toggles(); for(size_t ix = 0; toggles[ix].name; ix++) { if(!strcasecmp(name,toggles[ix].name)) { return ToggleAttribute(this,&toggles[ix]); } } const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { if(!strcasecmp(name,intprop[ix].name)) { return BooleanAttribute(this,&intprop[ix]); } } } // Not found! throw std::runtime_error("Invalid attribute"); } void IPC::Session::getAttributes(std::vector & attributes) const { // Add integer properties. { const LIB3270_INT_PROPERTY * intprop = lib3270_get_int_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { attributes.push_back(IntAttribute(this,&intprop[ix])); } } // Add unsigned int properties { const LIB3270_UINT_PROPERTY * intprop = lib3270_get_unsigned_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { attributes.push_back(UnsignedIntAttribute(this,&intprop[ix])); } } // Add string properties { const LIB3270_STRING_PROPERTY * strprop = lib3270_get_string_properties_list(); for(size_t ix = 0; strprop[ix].name; ix++) { attributes.push_back(StringAttribute(this,&strprop[ix])); } } // Add boolean properties { const LIB3270_TOGGLE *toggles = lib3270_get_toggles(); for(size_t ix = 0; toggles[ix].name; ix++) { attributes.push_back(ToggleAttribute(this,&toggles[ix])); } const LIB3270_INT_PROPERTY * intprop = lib3270_get_boolean_properties_list(); for(size_t ix = 0; intprop[ix].name; ix++) { attributes.push_back(BooleanAttribute(this,&intprop[ix])); } } } }