static KineticStatus KineticClient_CreateOperation( KineticOperation** operation, KineticSessionHandle handle) { if (handle == KINETIC_HANDLE_INVALID) { LOG0("Specified session has invalid handle value"); return KINETIC_STATUS_SESSION_EMPTY; } KineticConnection* connection = KineticConnection_FromHandle(handle); if (connection == NULL) { LOG0("Specified session is not associated with a connection"); return KINETIC_STATUS_SESSION_INVALID; } LOGF1("\n" "--------------------------------------------------\n" "Building new operation on connection @ 0x%llX", connection); *operation = KineticAllocator_NewOperation(connection); if (*operation == NULL) { return KINETIC_STATUS_MEMORY_ERROR; } if ((*operation)->request == NULL) { return KINETIC_STATUS_NO_PDUS_AVAVILABLE; } return KINETIC_STATUS_SUCCESS; }
KineticStatus KineticClient_Connect(const KineticSession* config, KineticSessionHandle* handle) { if (handle == NULL) { LOG0("Session handle is NULL!"); return KINETIC_STATUS_SESSION_EMPTY; } *handle = KINETIC_HANDLE_INVALID; if (config == NULL) { LOG0("KineticSession is NULL!"); return KINETIC_STATUS_SESSION_EMPTY; } if (strlen(config->host) == 0) { LOG0("Host is empty!"); return KINETIC_STATUS_HOST_EMPTY; } if (config->hmacKey.len < 1 || config->hmacKey.data == NULL) { LOG0("HMAC key is NULL or empty!"); return KINETIC_STATUS_HMAC_EMPTY; } // Obtain a new connection/handle *handle = KineticConnection_NewConnection(config); if (*handle == KINETIC_HANDLE_INVALID) { LOG0("Failed connecting to device!"); return KINETIC_STATUS_SESSION_INVALID; } KineticConnection* connection = KineticConnection_FromHandle(*handle); if (connection == NULL) { LOG0("Failed getting valid connection from handle!"); return KINETIC_STATUS_CONNECTION_ERROR; } // Create the connection KineticStatus status = KineticConnection_Connect(connection); if (status != KINETIC_STATUS_SUCCESS) { LOGF0("Failed creating connection to %s:%d", config->host, config->port); KineticConnection_FreeConnection(handle); *handle = KINETIC_HANDLE_INVALID; return status; } // Wait for initial unsolicited status to be received in order to obtain connectionID while(connection->connectionID == 0) {sleep(1);} return status; }
void KineticConnection_FreeConnection(KineticSessionHandle* const handle) { assert(handle != NULL); assert(*handle != KINETIC_HANDLE_INVALID); KineticConnection* connection = KineticConnection_FromHandle(*handle); assert(connection != NULL); *connection = (KineticConnection) { .connected = false }; Connections[(int)*handle - 1] = NULL; } KineticConnection* KineticConnection_FromHandle(KineticSessionHandle handle) { assert(handle > KINETIC_HANDLE_INVALID); assert(handle <= KINETIC_SESSIONS_MAX); return Connections[(int)handle - 1]; }
KineticStatus KineticClient_Disconnect(KineticSessionHandle* const handle) { if (*handle == KINETIC_HANDLE_INVALID) { LOG0("Invalid KineticSessionHandle specified!"); return KINETIC_STATUS_SESSION_INVALID; } KineticConnection* connection = KineticConnection_FromHandle(*handle); if (connection == NULL) { LOG0("Failed getting valid connection from handle!"); return KINETIC_STATUS_CONNECTION_ERROR; } // Disconnect KineticStatus status = KineticConnection_Disconnect(connection); if (status != KINETIC_STATUS_SUCCESS) {LOG0("Disconnection failed!");} KineticConnection_FreeConnection(handle); *handle = KINETIC_HANDLE_INVALID; return status; }