libcurl/resume

Discuss the development of new homebrew software, tools and libraries.

Moderators: cheriff, TyRaNiD

Post Reply
dbeyer3069
Posts: 81
Joined: Mon Dec 19, 2005 4:09 pm

libcurl/resume

Post by dbeyer3069 »

Has anyone figured out how to get libcurl to report back the ORIGINAL file size when doing a RESUME operation? Or a flag that indicates that curl actually is doing a resume? Curl reports the BYTES REMAINING during a resume operation.

As the library looks to me (and it works in my app), you pass the offset of the file to start at with the resume_from_large or resume_from and then it does its thing if it can. But there's no guarantee that the server on the other side supports resume so reporting the current progress is skewed. In a perfect world with a resume working 100% of the time, I'd just add the offset to the "d" field value (bytes received this session) and get the number of bytes received so far. If the resume isn't supported for that transfer though... that won't work.

I don't see a flag to indicate a resume has indeed been started/accepted... or found a field (such as in curlinfo_xxx) reporting the original size.

David Beyer
danzel
Posts: 182
Joined: Fri Nov 04, 2005 11:03 pm

Post by danzel »

I haven't done any resuming or anything with libcurl yet, so I can't help you.

You may get a better response on the libcurl mailing list, or having a look through the online docs.
http://curl.haxx.se/libcurl/

Anything there will apply to using it on psp aswell.
dbeyer3069
Posts: 81
Joined: Mon Dec 19, 2005 4:09 pm

Post by dbeyer3069 »

danzel wrote:I haven't done any resuming or anything with libcurl yet, so I can't help you.

You may get a better response on the libcurl mailing list, or having a look through the online docs.
http://curl.haxx.se/libcurl/

Anything there will apply to using it on psp aswell.
Looks pretty sparse in there for C++ :)

I am sending an email to the mailing list. Thanks.

UPDATE: it rejected my email :) do you know if I'd get lots of emails from the mailing list or just a few? I get enough junk mail as it is :)

The resume works great but I want to add the extra bells and whistles for our PSP users :)

David Beyer
danzel
Posts: 182
Joined: Fri Nov 04, 2005 11:03 pm

Post by danzel »

well there is a progress callback that gets called to tell you how much needs to be downloaded etc.

http://curl.haxx.se/libcurl/c/curl_easy ... SSFUNCTION

looks like what you want ;)

the callback prototype is:

Code: Select all

typedef int (*curl_progress_callback)(void *clientp,
                                      double dltotal,
                                      double dlnow,
                                      double ultotal,
                                      double ulnow);
hope that helps :)
dbeyer3069
Posts: 81
Joined: Mon Dec 19, 2005 4:09 pm

Post by dbeyer3069 »

danzel wrote:well there is a progress callback that gets called to tell you how much needs to be downloaded etc.

http://curl.haxx.se/libcurl/c/curl_easy ... SSFUNCTION

looks like what you want ;)

the callback prototype is:

Code: Select all

typedef int (*curl_progress_callback)(void *clientp,
                                      double dltotal,
                                      double dlnow,
                                      double ultotal,
                                      double ulnow);
hope that helps :)
Thanks for trying...

This is the function that I use already to get the info.

During downloading when NOT resuming (file offset = 0), the dltotal and dlnow report the original file size because the # of remaining bytes is the same as the original size. When it's a RESUME dltotal and dlnow reflect the bytes REMAINING (original size minus whatever offset you pass to the resume function). The problem is that a resume isn't guaranteed since not all servers support it. In that case, it looks a bit odd when you know a file is larger than what it is reporting. If there was a way to KNOW that a resume is in progress, I would just add the offset to both dltotal and dlnow when I display it.

For example:

1. ORIGINAL FILE SIZE = 5 MEGS (curl reports 5 megs to download)
2. DOWNLOAD INTERRUPTED 3 MEGS INTO IT
3. DOWNLOAD RESUMED WITH 3 MEG OFFSET (curl now reports the file size is 2 megs)
4. Once the download is complete, the final file is 5 megs and is accurate but the reporting during the download is skewed.

I checked all their curlinfo_ reporting and it returns the same values as the dltotal and dlnow.

See what I mean? The resume and download works fine but It would be nice to show logical info on the screen (what people are expecting to see).

I'll figure out a way to get the original file size on resume. If nothing else, this will save others writing future apps from having to figure out how it works.

David Beyer
danzel
Posts: 182
Joined: Fri Nov 04, 2005 11:03 pm

Post by danzel »

Well since you are passing in the offset of where to resume from, you could use that to work out the numbers you want ;)

Perhaps pass the offset into the CURLOPT_PROGRESSDATA and then use it in the callback function, adding the amount onto both dltotal and dlnow to get correct values. Pass in a value of 0 to CURLOPT_PROGRESSDATA when not resuming so you add 0 :)
dbeyer3069
Posts: 81
Joined: Mon Dec 19, 2005 4:09 pm

Post by dbeyer3069 »

danzel wrote:Well since you are passing in the offset of where to resume from, you could use that to work out the numbers you want ;)

Perhaps pass the offset into the CURLOPT_PROGRESSDATA and then use it in the callback function, adding the amount onto both dltotal and dlnow to get correct values. Pass in a value of 0 to CURLOPT_PROGRESSDATA when not resuming so you add 0 :)
As said, there's no way to know if a RESUME is in progress even if you pass in the offset. You could pass the offset and then curl determines its not possible to resume once it talks to the server. In that case, it would start from the beginning anyways....even though you gave it an offset.

David Beyer
danzel
Posts: 182
Joined: Fri Nov 04, 2005 11:03 pm

Post by danzel »

ah yeah.... hhhhmmmm.
Might be worth taking it to the mailing list, I'd assume there is a way, but I don't know how and haven't found anything with google.

One more idea you've probally already thought of:
Since you know the full size the first time you try download it, you can tell if its resumes because the size it returns will be smaller than the total size originally given, if it doesn't resume it will be the same.
Post Reply