char supla_client_iterate(void *_suplaclient, int wait_usec) { TSuplaClientData *suplaclient = (TSuplaClientData *)_suplaclient; if ( supla_client_connected(_suplaclient) == 0 ) return 0; if ( supla_client_registered(_suplaclient) == 0 ) { supla_client_set_registered(_suplaclient, -1); supla_client_register(suplaclient); } else if ( supla_client_registered(_suplaclient) == 1 ) { supla_client_ping(suplaclient); } if ( suplaclient->srpc != NULL && srpc_iterate(suplaclient->srpc) == SUPLA_RESULT_FALSE ) { supla_client_disconnect(_suplaclient); return 0; } if ( supla_client_connected(_suplaclient) == 1 && suplaclient->eh != NULL ) { eh_wait(suplaclient->eh, wait_usec); } return 1; }
char supla_client_connect(void *_suplaclient) { TSuplaClientData *suplaclient = (TSuplaClientData *)_suplaclient; supla_client_disconnect(_suplaclient); supla_client_clean(_suplaclient); if ( ssocket_client_connect(suplaclient->ssd, NULL) == 1 ) { suplaclient->eh = eh_init(); TsrpcParams srpc_params; srpc_params_init(&srpc_params); srpc_params.user_params = _suplaclient; srpc_params.data_read = &supla_client_socket_read; srpc_params.data_write = &supla_client_socket_write; srpc_params.on_remote_call_received = &supla_client_on_remote_call_received; srpc_params.before_async_call = &supla_client_before_async_call; srpc_params.eh = suplaclient->eh; suplaclient->srpc = srpc_init(&srpc_params); eh_add_fd(suplaclient->eh, ssocket_get_fd(suplaclient->ssd)); suplaclient->connected = 1; supla_client_set_registered(_suplaclient, 0); if ( suplaclient->cfg.cb_on_connected ) suplaclient->cfg.cb_on_connected(_suplaclient, suplaclient->cfg.user_data); return 1; } return 0; }
JNIEXPORT void JNICALL Java_org_supla_android_lib_SuplaClient_scDisconnect(JNIEnv* env, jobject thiz, jlong _asc) { void *supla_client = supla_client_ptr(_asc); if ( supla_client ) supla_client_disconnect(supla_client); };
void supla_client_on_version_error(TSuplaClientData *scd, TSDC_SuplaVersionError *version_error) { supla_log(LOG_ERR, "Protocol version error. Server doesn't support this client. S:%d-%d/C:%d", version_error->server_version_min, version_error->server_version, SUPLA_PROTO_VERSION); if ( scd->cfg.cb_on_versionerror ) scd->cfg.cb_on_versionerror(scd, scd->cfg.user_data, SUPLA_PROTO_VERSION, version_error->server_version_min, version_error->server_version); supla_client_disconnect(scd); }
void supla_client_on_register_result(TSuplaClientData *scd, TSC_SuplaRegisterClientResult *register_client_result) { if ( register_client_result->result_code == SUPLA_RESULTCODE_TRUE ) { supla_client_set_registered(scd, 1); scd->server_activity_timeout = register_client_result->activity_timeout; scd->client_id = register_client_result->ClientID; supla_log(LOG_DEBUG, "Registered."); if ( scd->cfg.cb_on_registered ) scd->cfg.cb_on_registered(scd, scd->cfg.user_data, register_client_result); } else { switch(register_client_result->result_code) { case SUPLA_RESULTCODE_BAD_CREDENTIALS: supla_log(LOG_ERR, "Bad credentials!"); break; case SUPLA_RESULTCODE_TEMPORARILY_UNAVAILABLE: supla_log(LOG_NOTICE, "Temporarily unavailable!"); break; case SUPLA_RESULTCODE_ACCESSID_DISABLED: supla_log(LOG_NOTICE, "Access Identifier is disabled!"); break; case SUPLA_RESULTCODE_CLIENT_DISABLED: supla_log(LOG_NOTICE, "Client is disabled!"); break; case SUPLA_RESULTCODE_CLIENT_LIMITEXCEEDED: supla_log(LOG_NOTICE, "Client limit exceeded!"); break; case SUPLA_RESULTCODE_GUID_ERROR: supla_log(LOG_NOTICE, "Incorrect client GUID!"); break; } if ( scd->cfg.cb_on_registererror ) scd->cfg.cb_on_registererror(scd, scd->cfg.user_data, register_client_result->result_code); supla_client_disconnect(scd); } }
void supla_client_free(void *_suplaclient) { if ( _suplaclient != NULL ) { supla_client_disconnect(_suplaclient); supla_client_clean(_suplaclient); TSuplaClientData *scd = (TSuplaClientData*)_suplaclient; if ( scd->cfg.host ) free(scd->cfg.host); ssocket_free(scd->ssd); lck_free(scd->lck); free(_suplaclient); } }