diff --git a/src/classlib/remote.cc b/src/classlib/remote.cc index fd3e555..0e0c391 100644 --- a/src/classlib/remote.cc +++ b/src/classlib/remote.cc @@ -417,6 +417,8 @@ HKEY hKey = 0; unsigned long datalen = sizeof(buffer); + debug("%s(%s)",__FUNCTION__,name); + *buffer = 0; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\pw3270",0,KEY_QUERY_VALUE,&hKey) != ERROR_SUCCESS) { @@ -448,6 +450,8 @@ hPipe = INVALID_HANDLE_VALUE; + trace("%s(%s)",__FUNCTION__,session); + if(strcasecmp(session,"start") == 0 || strcasecmp(session,"new") == 0) { // Start a new session @@ -509,7 +513,16 @@ } // Wait? - int delay = atoi(getRegistryKey("hllapiWait").c_str()); + int delay; + + try + { + delay = atoi(getRegistryKey("hllapiWait").c_str()); + } + catch(std::exception &e) + { + delay = 0; + } if(delay) { timer = time(0) + delay; diff --git a/src/classlib/session.cc b/src/classlib/session.cc index a12d9ee..6b1ef6d 100644 --- a/src/classlib/session.cc +++ b/src/classlib/session.cc @@ -38,20 +38,25 @@ #include #endif // !WIN32 - #ifdef HAVE_SYSLOG +#ifdef HAVE_SYSLOG #include - #endif // HAVE_SYSLOG +#endif // HAVE_SYSLOG + +#if __cplusplus < 201103L + #define nullptr NULL +#endif // !c11 /*--[ Implement ]--------------------------------------------------------------------------------------------------*/ namespace PW3270_NAMESPACE { - session * session::first = 0; - session * session::last = 0; - session * (*session::factory)(const char *name) = 0; + session * session::first = nullptr; + session * session::last = nullptr; + session * (*session::factory)(const char *name) = nullptr; session::session() { + #ifdef HAVE_ICONV this->conv2Local = (iconv_t) (-1); this->conv2Host = (iconv_t) (-1); @@ -98,6 +103,8 @@ // Factory methods and settings session * session::create(const char *name) throw (std::exception) { + trace("%s(%s)",__FUNCTION__,name); + if(factory) return factory(name); @@ -112,6 +119,11 @@ return create(name); } + bool session::has_default(void) + { + return first != nullptr; + } + session * session::get_default(void) { if(first) diff --git a/src/include/pw3270/class.h b/src/include/pw3270/class.h index 07c95b3..56f0ce3 100644 --- a/src/include/pw3270/class.h +++ b/src/include/pw3270/class.h @@ -132,6 +132,7 @@ static session * start(const char *name = 0); static session * create(const char *name = 0) throw (std::exception); static session * get_default(void); + static bool has_default(void); static void set_plugin(session * (*factory)(const char *name)); // Log management diff --git a/src/plugins/hllapi/Makefile.in b/src/plugins/hllapi/Makefile.in index 70a327d..4a3a2a6 100644 --- a/src/plugins/hllapi/Makefile.in +++ b/src/plugins/hllapi/Makefile.in @@ -44,11 +44,12 @@ include $(CLASSLIBDIR)/class.mak #---[ Release Targets ]-------------------------------------------------------- $(BINRLS)/$(PLUGIN_NAME): \ - $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) $(BINRLS)$(DLL_NAME) + $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/$(SRC).o) \ + $(BINRLS)$(DLL_NAME) @echo " CCLD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @RLS_LDFLAGS@ -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(CLASS_LIBS) + @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ $(LDFLAGS) @RLS_LDFLAGS@ -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GTK_LIBS) $(GLIB_LIBS) $(PW3270_LIBS) $(BINRLS)$(DLL_NAME).$(VERSION): \ $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJRLS)/$(SRC).o) $(CLASS_RELEASE_OBJECTS) @@ -62,11 +63,12 @@ install: #---[ Debug Targets ]---------------------------------------------------------- $(BINDBG)/$(PLUGIN_NAME): \ - $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) $(BINDBG)$(DLL_NAME) + $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJDBG)/$(SRC).o) \ + $(BINDBG)$(DLL_NAME) @echo " CCLD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(CLASS_LIBS) + @$(CXX) $(DLL_FLAGS) @LDSOFLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(LIBS) $(LIB3270_LIBS) $(GTK_LIBS) $(GLIB_LIBS) $(PW3270_LIBS) $(BINDBG)$(DLL_NAME).$(VERSION): \ $(foreach SRC, $(basename $(EXTAPI_SRC)), $(OBJDBG)/$(SRC)@OBJEXT@) $(CLASS_DEBUG_OBJECTS) diff --git a/src/plugins/hllapi/calls.cc b/src/plugins/hllapi/calls.cc index fc1a7cc..2a4bfd4 100644 --- a/src/plugins/hllapi/calls.cc +++ b/src/plugins/hllapi/calls.cc @@ -114,6 +114,11 @@ HLLAPI_API_CALL hllapi_is_connected(void) { + if(!session::has_default()) + { + return 0; + } + return session::get_default()->is_connected(); } @@ -255,7 +260,13 @@ HLLAPI_API_CALL hllapi_setcursor(WORD pos) { - return session::get_default()->set_cursor_addr(pos-1); + if(!hllapi_is_connected()) + return HLLAPI_STATUS_DISCONNECTED; + + session::get_default()->set_cursor_addr(pos-1); + + return HLLAPI_STATUS_SUCCESS; + } HLLAPI_API_CALL hllapi_getcursor() @@ -267,15 +278,28 @@ { int rc = HLLAPI_STATUS_SYSTEM_ERROR; + if(!session::has_default()) + { + return HLLAPI_STATUS_DISCONNECTED; + } + if(!(buffer && *buffer)) return rc; try { - size_t szBuffer = strlen(buffer); + size_t szBuffer; + + if(len > 0) + { + szBuffer = (size_t) len; + } + else + { + return HLLAPI_STATUS_BAD_PARAMETER; + } - if(len < szBuffer && len > 0) - szBuffer = len; + memset(buffer,' ',szBuffer); string str = session::get_default()->get_string(offset,szBuffer); strncpy(buffer,str.c_str(),szBuffer); diff --git a/src/plugins/hllapi/hllapi.c b/src/plugins/hllapi/hllapi.c index 10e8576..47f1ef0 100644 --- a/src/plugins/hllapi/hllapi.c +++ b/src/plugins/hllapi/hllapi.c @@ -37,10 +37,7 @@ #include #include "client.h" - #undef trace - #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } - -/*--[ Prototipes ]-----------------------------------------------------------------------------------*/ + /*--[ Prototipes ]-----------------------------------------------------------------------------------*/ static int connect_ps(char *buffer, unsigned short *length, unsigned short *rc); static int disconnect_ps(char *buffer, unsigned short *length, unsigned short *rc); @@ -177,9 +174,12 @@ static int set_cursor_position(char *buffer, unsigned short *length, unsigned sh static int copy_ps_to_str(char *buffer, unsigned short *length, unsigned short *rc) { + // Length Length of the target data string. // PS Position Position within the host presentation space of the first byte in your target data string. - return hllapi_get_screen(*rc,buffer,*length); + *rc = hllapi_get_screen(*rc,buffer,*length); + + return 0; } static int input_string(char *input, unsigned short *length, unsigned short *rc) @@ -187,6 +187,11 @@ static int input_string(char *input, unsigned short *length, unsigned short *rc) size_t szText; char * text; + if(!hllapi_is_connected()) { + *rc = HLLAPI_STATUS_DISCONNECTED; + return HLLAPI_STATUS_DISCONNECTED; + } + if(!input) { *rc = HLLAPI_STATUS_BAD_PARAMETER; diff --git a/src/plugins/hllapi/hllapi.cbp b/src/plugins/hllapi/hllapi.cbp index 1849055..c09ca53 100644 --- a/src/plugins/hllapi/hllapi.cbp +++ b/src/plugins/hllapi/hllapi.cbp @@ -68,6 +68,7 @@ + diff --git a/src/plugins/hllapi/testprogram.c b/src/plugins/hllapi/testprogram.c index d21de4c..16cc6a9 100644 --- a/src/plugins/hllapi/testprogram.c +++ b/src/plugins/hllapi/testprogram.c @@ -32,13 +32,18 @@ #include #include + #if defined(DEBUG) && defined(_WIN32) + #undef trace + #define trace( fmt, ... ) { FILE *out = fopen("c:\\Users\\Perry\\hllapi.log","a"); if(out) { fprintf(out, "%s(%d) " fmt "\n", __FILE__, __LINE__, __VA_ARGS__ ); fclose(out); } } + #endif // DEBUG + #define MAX_DATA_SIZE 8000 //< Maximum data size for this application. static CHAR hllapi_data[MAX_DATA_SIZE]; /*---[ Implement ]--------------------------------------------------------------------------------*/ - static void connect(const char *session) + static void connect_ps(const char *session) { WORD len; WORD fn = HLLAPI_CMD_CONNECTPS; @@ -51,16 +56,16 @@ if(rc) { - fprintf(stderr,"HLLAPI_CMD_CONNECTPS exits with rc=%d",(int) rc); + trace("HLLAPI_CMD_CONNECTPS(%s) exits with rc=%d", session, (int) rc); } } int main(int numpar, char *param[]) { - const char *session = "pw3270:a"; + const char *session = "pw3270:A"; - connect(session); + connect_ps(session); /* -- libgit2 0.21.2