/* * "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 ipc-client-internals.h * * @brief Private definitions for lib3270/pw3270 ipc client library. * * @author perry.werneck@gmail.com * */ #ifndef IPC_CLIENT_INTERNALS_INCLUDED #define IPC_CLIENT_INTERNALS_INCLUDED #include #ifdef _WIN32 #include #include #include #else #include #endif // WIN32 #include #include #include #include #include #include #include #ifdef HAVE_LIBINTL #include #define _( x ) gettext(x) #define N_( x ) x #else #define _( x ) x #define N_( x ) x #endif // HAVE_LIBINTL #ifdef HAVE_ICONV #include #endif // HAVE_ICONV #ifdef DEBUG inline void console(std::ostream &out) { out << std::endl; } template void console(std::ostream &out, T value, Targs... Fargs) { out << value; console(out, Fargs...); } template void log(T value, Targs... Fargs) { console(std::clog,value,Fargs...); } #define debug(...) log(__FILE__, "(", __LINE__, ") ", __VA_ARGS__); #else #define debug(...) /* __VA_ARGS__ */ #endif namespace TN3270 { /// @brief Check lib3270 return codes, launch exception when failed. TN3270_PRIVATE void chkResponse(int rc); namespace Abstract { class TN3270_PRIVATE Session : public TN3270::Session { private: #ifdef HAVE_ICONV struct { /// @brief Convert strings from host codepage to local codepage. iconv_t local; /// @brief Convert string from local codepage to host codepage. iconv_t host; } converter; #endif /// @brief Converte charset. static std::string convertCharset(iconv_t &converter, const char *str, int length); protected: Session(); virtual ~Session(); /// @brief Setup charsets void setCharSet(const char *remote, const char *local); /// @brief Converte string recebida do host para o charset atual. std::string convertFromHost(const std::string &str) const; /// @brief Converte string do charset atual para o charset do host. std::string convertToHost(const std::string &str) const; std::string convertToHost(const char *text, int length) const; // Get strings from lib3270 without charset conversion. virtual std::string get() const = 0; virtual std::string get(int baddr, int len, char lf) const = 0; virtual std::string get(unsigned int row, unsigned int col, int sz, char lf) const = 0; // Set strings to lib3270 without charset conversion. virtual void set(const std::string &str) = 0; virtual void set(int baddr, const std::string &str) = 0; virtual void set(int row, int col, const std::string &str) = 0; public: // Contents std::string toString(int baddr, int len, char lf) const override; std::string toString(unsigned int row, unsigned int col, int len, char lf) const override; void push(const char *text, size_t length) override; void push(int baddr, const char *text, int length) override; void push(int row, int col, const char *text, int length) override; void pop(int baddr, std::string &text) override; void pop(int row, int col, std::string &text) override; void pop(std::string &text) override; }; } /// @brief lib3270 direct access objects (no IPC); namespace Local { TN3270_PRIVATE Session * getSessionInstance(); } /// @brief IPC Based acess (Access an active instance of pw3270 or pw3270d) namespace IPC { TN3270_PRIVATE TN3270::Session * getSessionInstance(const char *id); class Session; } } #endif // IPC_CLIENT_INTERNALS_INCLUDED