예제 #1
0
파일: Logic.cpp 프로젝트: fredcadete/cynara
int Logic::createRequest(bool simple, const std::string &client, const std::string &session,
                         const std::string &user, const std::string &privilege,
                         cynara_check_id &checkId, cynara_response_callback callback,
                         void *userResponseData) {
    if (!m_operationPermitted)
        return CYNARA_API_OPERATION_NOT_ALLOWED;

    if (!ensureConnection())
        return CYNARA_API_SERVICE_NOT_AVAILABLE;

    ProtocolFrameSequenceNumber sequenceNumber;
    if (!m_sequenceContainer.get(sequenceNumber))
        return CYNARA_API_MAX_PENDING_REQUESTS;

    PolicyKey key(client, user, privilege);
    ResponseCallback responseCallback(callback, userResponseData);
    m_checks.insert(CheckPair(sequenceNumber, CheckData(key, session, responseCallback,
                                                        simple)));
    if (simple)
        m_socketClient.appendRequest(SimpleCheckRequest(key, sequenceNumber));
    else
        m_socketClient.appendRequest(CheckRequest(key, sequenceNumber));

    onStatusChange(m_socketClient.getSockFd(), cynara_async_status::CYNARA_STATUS_FOR_RW);
    checkId = static_cast<cynara_check_id>(sequenceNumber);

    return CYNARA_API_SUCCESS;
}
예제 #2
0
//----------------------------------------
void GenericAPICore::process()
//----------------------------------------
{
	GenericRequest *req;
	GenericResponse *res;

	if (!m_suspended)
	{
		// Process timeout on pending requests
		while((m_outCount > 0) && ((req = m_outboundQueue.front().first)->getTimeout() <= time(NULL)))
		{
			--m_outCount;
			res = m_outboundQueue.front().second;
			m_outboundQueue.pop();

			responseCallback(res);
			delete res;
			delete req;
		}

		// Process timeout on pending responses
		while((m_pendingCount > 0) && ((res = (*m_pending.begin()).second)->getTimeout() <= time(NULL)))
		{
			--m_pendingCount;
			m_pending.erase(m_pending.begin());
			responseCallback(res);
			delete res;
		}

		while(m_outCount > 0)
		{
			pair<GenericRequest *, GenericResponse *> out_pair = m_outboundQueue.front();
            req = out_pair.first;
            res = out_pair.second;
			GenericConnection *con = NULL;
			if (req->getMappedServerTrack() == 0)					// request has no originating "owner" server
			{
				con = getNextActiveConnection();					// it does not matter which server we send this to
			}
			else
			{
				ServerTrackObject *stobj = findServer(req->getMappedServerTrack());
				if (stobj)
				{
					con = stobj->getConnection();						// the server connection to respond to
					req->setServerTrack(stobj->getRealServerTrack());	// map server track back to REAL server track
					//printf("\nUnmapping %d to %d", stobj->getMappedServerTrack(), req->getMappedServerTrack());	//debug
					delete stobj;
				}
			}

            if (con != NULL)
            {
				Base::ByteStream msg;
				req->pack(msg);
				con->Send(msg);
				m_pending.insert(pair<unsigned, GenericResponse *>(res->getTrack(), res));
				--m_outCount;
				++m_pendingCount;
				m_outboundQueue.pop();
				delete req;
            }
            else
            {
                //no active connections
                break; //from while loop
            }

		}
	}

   for (std::vector<GenericConnection *>::iterator conIter = m_serverConnections.begin(); conIter != m_serverConnections.end(); conIter++)
    {
		GenericConnection *con = *conIter;
	    con->process();
    }
}