Ejemplo n.º 1
0
STSStatus request_perform(RequestParams* params, int* httpResponseCode, char* response)
{
    Request* request = 0;
    STSStatus status;
    
    
    if (STSStatusOK != (status = request_get(params, &request))) {
        fprintf(stderr, "Request Get ERR\n");
        return status;
    }
    
    request->getResultCallback = responseCallback;
    request->callbackData = response;
    request->status = STSStatusWaiting;
    
    CURLcode code = curl_easy_perform(request->curl);
    
    if (CURLE_OK != code) {
        request->httpResponseCode = 0;
        *httpResponseCode = request->httpResponseCode;
        request->status = request_curl_code_to_status(code);
        return request->status;
    }
    else {
        *httpResponseCode = request->httpResponseCode;
        request_finish(request);
        return request->status;
    }
}
Ejemplo n.º 2
0
void Audex::start() {

  emit changedEncodeTrack(0, 0, "");
  emit info(i18n("Start ripping and encoding with profile \"%1\"...", p_profile_name));
  if (check()) start_extract(); else request_finish(FALSE);

}
Ejemplo n.º 3
0
int udp_request_process (Context *cont) {
	char *fn = "udp_request_process()";
	struct sockaddr *sa;

	syslog (LOG_DEBUG, "%s: start", fn);

	/*
	 * ev_udp_in() called us to process an incoming response
	 * to the request we sent. The response message has been
	 * put in cont->mesg.p
	 */

	/*
	 * Timeout will still go off later, so we render
	 * it harmless here by removing the handler.
	 */
	if (cont->tout)
		cont->tout->handler = NULL;

	/* remove me from I/O list */
	sa = (struct sockaddr *) cont->current_ns->list_data;
	if (ev_udp_in_remove (sa, cont->q_id) < 0)
		return (request_abort (cont, -1));
	else
		return request_finish (cont);
}
Ejemplo n.º 4
0
S3Status S3_finish_request_context(S3RequestContext *requestContext)
{
    CURLMsg *msg;
    int junk;
    while ((msg = curl_multi_info_read(requestContext->curlm, &junk))) {
        if (msg->msg != CURLMSG_DONE) {
            return S3StatusInternalError;
        }
        Request *request;
        if (curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE,
                              (char **) (char *) &request) != CURLE_OK) {
            return S3StatusInternalError;
        }
        // Remove the request from the list of requests
        if (request->prev == request->next) {
            // It was the only one on the list
            requestContext->requests = 0;
        }
        else {
            // It doesn't matter what the order of them are, so just in
            // case request was at the head of the list, put the one after
            // request to the head of the list
            requestContext->requests = request->next;
            request->prev->next = request->next;
            request->next->prev = request->prev;
        }
        if ((msg->data.result != CURLE_OK) &&
            (request->status == S3StatusOK)) {
            request->status = request_curl_code_to_status
                (msg->data.result);
            if (! request->errorParser.s3ErrorDetails.message) {
                request->errorParser.s3ErrorDetails.message =
                    curl_easy_strerror(msg->data.result);
            }
        }
        if (curl_multi_remove_handle(requestContext->curlm,
                                     msg->easy_handle) != CURLM_OK) {
            return S3StatusInternalError;
        }
        // Finish the request, ensuring that all callbacks have been made,
        // and also releases the request
        request_finish(request);
        // Now, since a callback was made, there may be new requests
        // queued up to be performed immediately, so do so
    }

    return S3StatusOK;
}
Ejemplo n.º 5
0
void S3_destroy_request_context(S3RequestContext *requestContext)
{
    curl_multi_cleanup(requestContext->curlm);

    // For each request in the context, call back its done method with
    // 'interrupted' status
    Request *r = requestContext->requests, *rFirst = r;
    
    if (r) do {
        r->status = S3StatusInterrupted;
        Request *rNext = r->next;
        request_finish(r);
        r = rNext;
    } while (r != rFirst);

    free(requestContext);
}
Ejemplo n.º 6
0
void request_perform(const RequestParams *params, S3RequestContext *context)
{
    Request *request;
    S3Status status;

#define return_status(status)                                           \
    (*(params->completeCallback))(status, 0, params->callbackData);     \
    return

    // These will hold the computed values
    RequestComputedValues computed;

    // Validate the bucket name
    if (params->bucketContext.bucketName && 
        ((status = S3_validate_bucket_name
          (params->bucketContext.bucketName, 
           params->bucketContext.uriStyle)) != S3StatusOK)) {
        return_status(status);
    }

    // Compose the amz headers
    if ((status = compose_amz_headers(params, &computed)) != S3StatusOK) {
        return_status(status);
    }

    // Compose standard headers
    if ((status = compose_standard_headers
         (params, &computed)) != S3StatusOK) {
        return_status(status);
    }

    // URL encode the key
    if ((status = encode_key(params, &computed)) != S3StatusOK) {
        return_status(status);
    }

    // Compute the canonicalized amz headers
    canonicalize_amz_headers(&computed);

    // Compute the canonicalized resource
    canonicalize_resource(params->bucketContext.bucketName,
                          params->subResource, computed.urlEncodedKey,
                          computed.canonicalizedResource);

    // Compose Authorization header
    if ((status = compose_auth_header(params, &computed)) != S3StatusOK) {
        return_status(status);
    }
    
    // Get an initialized Request structure now
    if ((status = request_get(params, &computed, &request)) != S3StatusOK) {
        return_status(status);
    }

    // If a RequestContext was provided, add the request to the curl multi
    if (context) {
        CURLMcode code = curl_multi_add_handle(context->curlm, request->curl);
        if (code == CURLM_OK) {
            if (context->requests) {
                request->prev = context->requests->prev;
                request->next = context->requests;
                context->requests->prev->next = request;
                context->requests->prev = request;
            }
            else {
                context->requests = request->next = request->prev = request;
            }
        }
        else {
            if (request->status == S3StatusOK) {
                request->status = (code == CURLM_OUT_OF_MEMORY) ?
                    S3StatusOutOfMemory : S3StatusInternalError;
            }
            request_finish(request);
        }
    }
    // Else, perform the request immediately
    else {
        CURLcode code = curl_easy_perform(request->curl);
        if ((code != CURLE_OK) && (request->status == S3StatusOK)) {
            request->status = request_curl_code_to_status(code);
        }
        // Finish the request, ensuring that all callbacks have been made, and
        // also releases the request
        request_finish(request);
    }
}
Ejemplo n.º 7
0
void Audex::slot_error(const QString& description, const QString& solution) {
  emit error(description, solution);
  request_finish(FALSE);
}
Ejemplo n.º 8
0
void Audex::start_encode() {

  if (_finished) return;

  if (p_single_file) {

    if (en_track_count >= 1) {
      request_finish(TRUE);
      return;
    }

    if (encoder_wrapper->isProcessing()) return;

    AudexJob* job = jobs->orderJob();
    if (!job) return;

    int cdnum = cdda_model->cdNum();
    int nooftracks = cdda_model->numOfAudioTracks();
    QString artist = cdda_model->artist();
    QString title = cdda_model->title();
    QString year = cdda_model->year();
    QString genre = cdda_model->genre();
    QString suffix = p_suffix;
    CachedImage *cover = cdda_model->cover();

    QString targetFilename = job->targetFilename();
    en_track_target_filename = targetFilename;

    emit changedEncodeTrack(job->trackNo(), 1, targetFilename);
    en_track_count++;

    en_track_filename = job->sourceFilename();
    en_track_index = job->trackNo();
    if (!encoder_wrapper->encode(job->trackNo(), cdnum, 0, nooftracks,
          artist, title, artist, title, genre, year, suffix, cover, FALSE, tmp_path,
          job->sourceFilename(), targetFilename)) {
      request_finish(FALSE);
    }
    process_counter++;

  } else {

    if (en_track_count >= cdda_model->numOfAudioTracksInSelection()) {
      request_finish(TRUE);
      return;
    }

    if (encoder_wrapper->isProcessing()) return;

    AudexJob* job = jobs->orderJob();
    if (!job) return;

    int cdnum = cdda_model->cdNum();
    int trackoffset = cdda_model->trackOffset();
    int nooftracks = cdda_model->numOfAudioTracks();
    QString artist = cdda_model->artist();
    QString title = cdda_model->title();
    QString tartist = cdda_model->data(cdda_model->index(job->trackNo()-1, CDDA_MODEL_COLUMN_ARTIST_INDEX)).toString();
    QString ttitle = cdda_model->data(cdda_model->index(job->trackNo()-1, CDDA_MODEL_COLUMN_TITLE_INDEX)).toString();
    QString year = cdda_model->year();
    QString genre = cdda_model->genre();
    QString suffix = p_suffix;
    CachedImage *cover = cdda_model->cover();
    bool fat32_compatible = profile_model->data(profile_model->index(profile_model->currentProfileRow(), PROFILE_MODEL_COLUMN_FAT32COMPATIBLE_INDEX)).toBool();

    QString targetFilename = job->targetFilename();
    en_track_target_filename = targetFilename;

    emit changedEncodeTrack(job->trackNo(), cdda_model->numOfAudioTracks(), targetFilename);
    en_track_count++;

    en_track_filename = job->sourceFilename();
    en_track_index = job->trackNo();
    if (cdda_model->isVarious()) {
      if (!encoder_wrapper->encode(job->trackNo(), cdnum, trackoffset, nooftracks,
            artist, title, tartist, ttitle, genre, year, suffix, cover, fat32_compatible, tmp_path,
            job->sourceFilename(), targetFilename)) {
        request_finish(FALSE);
      }
    } else {
      if (!encoder_wrapper->encode(job->trackNo(), cdnum, trackoffset, nooftracks,
            artist, title, artist, ttitle, genre, year, suffix, cover, fat32_compatible, tmp_path,
            job->sourceFilename(), targetFilename)) {
        request_finish(FALSE);
      }
    }
    process_counter++;

  }

}
Ejemplo n.º 9
0
void Audex::start_extract() {

  if (_finished) return;

  if (p_single_file) {

    if (ex_track_count >= 1) {
      if (!jobs->jobInProgress() && !jobs->pendingJobs()) request_finish(TRUE);
      return;
    }

    ex_track_index++;

    QString artist = cdda_model->artist();
    QString title = cdda_model->title();
    QString year = cdda_model->year();
    QString genre = cdda_model->genre();
    QString suffix = p_suffix;
    QString basepath = Preferences::basePath();
    int cdnum;
    if (!cdda_model->isMultiCD()) cdnum = 0; else cdnum = cdda_model->cdNum();
    int nooftracks = cdda_model->numOfAudioTracks();
    bool overwrite = Preferences::overwriteExistingFiles();

    QString targetFilename;
    if (!construct_target_filename_for_singlefile(targetFilename, cdnum, nooftracks, artist, title, year, genre, suffix, basepath, overwrite)) {
      request_finish(FALSE);
      return;
    }
    ex_track_target_filename = targetFilename;

    cdda_model->setCustomData("filename", targetFilename);

    //if empty (maybe because it already exists) skip
    if (!targetFilename.isEmpty()) {

      emit changedExtractTrack(ex_track_index,
        1,
        artist,
        title);

      QString sourceFilename = tmp_path+QString("%1").arg(DiscIDCalculator::FreeDBId(cdda_model->discSignature()))+".wav";
      ex_track_source_filename = sourceFilename;
      wave_file_writer->open(sourceFilename);

      if (Preferences::paranoiaMode()) {
        cdda_extract_thread->setParanoiaMode(3);
      } else {
        cdda_extract_thread->setParanoiaMode(0);
      }
      cdda_extract_thread->setNeverSkip(Preferences::neverSkip());
      cdda_extract_thread->setTrackToRip(0);
      cdda_extract_thread->start(); process_counter++;

      ex_track_count++;

    } else {

      if (!jobs->jobInProgress() && !jobs->pendingJobs()) request_finish(TRUE);

    }

  } else {

    if (ex_track_count >= cdda_model->numOfAudioTracksInSelection()) {
      if (!jobs->jobInProgress() && !jobs->pendingJobs()) request_finish(TRUE);
      return;
    }

    ex_track_index++;

    bool skip = !cdda_model->isTrackInSelection(ex_track_index);

    if (!cdda_model->isAudioTrack(ex_track_index)) skip = TRUE;

    if (!skip) {

      QString artist = cdda_model->artist();
      QString title = cdda_model->title();
      QString tartist = cdda_model->data(cdda_model->index(ex_track_index-1, CDDA_MODEL_COLUMN_ARTIST_INDEX)).toString();
      QString ttitle = cdda_model->data(cdda_model->index(ex_track_index-1, CDDA_MODEL_COLUMN_TITLE_INDEX)).toString();
      QString year = cdda_model->year();
      QString genre = cdda_model->genre();
      QString suffix = p_suffix;
      QString basepath = Preferences::basePath();
      bool fat32_compatible = profile_model->data(profile_model->index(profile_model->currentProfileRow(), PROFILE_MODEL_COLUMN_FAT32COMPATIBLE_INDEX)).toBool();
      bool replacespaceswithunderscores = profile_model->data(profile_model->index(profile_model->currentProfileRow(), PROFILE_MODEL_COLUMN_UNDERSCORE_INDEX)).toBool();
      bool _2digitstracknum = profile_model->data(profile_model->index(profile_model->currentProfileRow(), PROFILE_MODEL_COLUMN_2DIGITSTRACKNUM_INDEX)).toBool();
      int cdnum;
      if (!cdda_model->isMultiCD()) cdnum = 0; else cdnum = cdda_model->cdNum();
      int trackoffset = cdda_model->trackOffset();
      int nooftracks = cdda_model->numOfAudioTracks();
      bool overwrite = Preferences::overwriteExistingFiles();

      QString targetFilename;
      if (cdda_model->isVarious()) {
        if (!construct_target_filename(targetFilename, ex_track_index, cdnum, nooftracks, trackoffset,
            artist, title, tartist, ttitle, year, genre, suffix, basepath, fat32_compatible, replacespaceswithunderscores, _2digitstracknum, overwrite, (ex_track_index==1))) {
          request_finish(FALSE);
          return;
        }
      } else {
        if (!construct_target_filename(targetFilename, ex_track_index, cdnum, nooftracks, trackoffset,
            artist, title, artist, ttitle, year, genre, suffix, basepath, fat32_compatible, replacespaceswithunderscores, _2digitstracknum, overwrite, (ex_track_index==1))) {
          request_finish(FALSE);
          return;
        }
      }
      ex_track_target_filename = targetFilename;

      //if empty (maybe because it already exists) skip
      if (!targetFilename.isEmpty()) {

        emit changedExtractTrack(ex_track_index,
          cdda_model->numOfAudioTracks(),
          tartist,
          ttitle);

        QString sourceFilename = tmp_path+QString("%1").arg(DiscIDCalculator::FreeDBId(cdda_model->discSignature()))+"."+QString("%1").arg(ex_track_index)+".wav";
        ex_track_source_filename = sourceFilename;
        wave_file_writer->open(sourceFilename);

        if (Preferences::paranoiaMode()) {
          cdda_extract_thread->setParanoiaMode(3);
        } else {
          cdda_extract_thread->setParanoiaMode(0);
        }
        cdda_extract_thread->setNeverSkip(Preferences::neverSkip());
        cdda_extract_thread->setTrackToRip(ex_track_index);
        cdda_extract_thread->start(); process_counter++;

        ex_track_count++;

      } else {

        en_track_count++;
        ex_track_count++; //important to check for finish
        cdda_extract_thread->skipTrack(ex_track_index);
        start_extract();

      }

    } else {

      start_extract();

    }

  }

}
Ejemplo n.º 10
0
void Audex::cancel() {

  request_finish(FALSE);

}
Ejemplo n.º 11
0
S3Status S3_runonce_request_context(S3RequestContext *requestContext, 
                                    int *requestsRemainingReturn)
{
    CURLMcode status;

    do {
        status = curl_multi_perform(requestContext->curlm,
                                    requestsRemainingReturn);

        switch (status) {
        case CURLM_OK:
        case CURLM_CALL_MULTI_PERFORM:
            break;
        case CURLM_OUT_OF_MEMORY:
            return S3StatusOutOfMemory;
        default:
            return S3StatusInternalError;
        }

        CURLMsg *msg;
        int junk;
        while ((msg = curl_multi_info_read(requestContext->curlm, &junk))) {
            if (msg->msg != CURLMSG_DONE) {
                return S3StatusInternalError;
            }
            Request *request;
            if (curl_easy_getinfo(msg->easy_handle, CURLINFO_PRIVATE, 
                                  (char **) (char *) &request) != CURLE_OK) {
                return S3StatusInternalError;
            }
            // Remove the request from the list of requests
            if (request->prev == request->next) {
                // It was the only one on the list
                requestContext->requests = 0;
            }
            else {
                // It doesn't matter what the order of them are, so just in
                // case request was at the head of the list, put the one after
                // request to the head of the list
                requestContext->requests = request->next;
                request->prev->next = request->next;
                request->next->prev = request->prev;
            }
            if ((msg->data.result != CURLE_OK) &&
                (request->status == S3StatusOK)) {
                request->status = request_curl_code_to_status
                    (msg->data.result);
            }
            if (curl_multi_remove_handle(requestContext->curlm, 
                                         msg->easy_handle) != CURLM_OK) {
                return S3StatusInternalError;
            }
            // Finish the request, ensuring that all callbacks have been made,
            // and also releases the request
            request_finish(request);
            // Now, since a callback was made, there may be new requests 
            // queued up to be performed immediately, so do so
            status = CURLM_CALL_MULTI_PERFORM;
        }
    } while (status == CURLM_CALL_MULTI_PERFORM);

    return S3StatusOK;
}