Here’s what I got so far:
> @import Foundation;
> #include <stdbool.h>
> #include <stdlib.h>
>
> int returnCode = EXIT_SUCCESS;
> bool shouldExit = false;
>
> int main(int argc, const char * argv[]) {
> if (argc != 2) {
> fprintf(stderr, "Usage: %s URL\n", argv[0]);
> returnCode = EXIT_FAILURE;
> goto finish;
> }
>
> @autoreleasepool {
> NSRunLoop * const runLoop = [NSRunLoop currentRunLoop];
> NSURLSession * const session = [NSURLSession
> sessionWithConfiguration:[NSURLSessionConfiguration
> ephemeralSessionConfiguration] delegate:nil delegateQueue:[NSOperationQueue
> mainQueue]];
> NSURLSessionDownloadTask * const task = [session
> downloadTaskWithURL:[NSURL URLWithString:[NSString
> stringWithUTF8String:argv[1]]] completionHandler:^(NSURL *location,
> NSURLResponse *response, NSError *error) {
> if (error) {
> fprintf(stderr, "Error, downloading: %s\n",
> error.localizedFailureReason.UTF8String ?:
> error.localizedDescription.UTF8String);
> returnCode = EXIT_FAILURE;
> } else {
> NSURL * const finalLocation = [NSURL
> fileURLWithPath:response.suggestedFilename isDirectory:NO];
>
> [[NSFileManager defaultManager] moveItemAtURL:location
> toURL:finalLocation error:&error];
> if (error) {
> fprintf(stderr, "Error, copying: %s\n",
> error.localizedFailureReason.UTF8String ?:
> error.localizedDescription.UTF8String);
> returnCode = EXIT_FAILURE;
> } else {
> fprintf(stdout, "%s\n", finalLocation.path.UTF8String);
> }
> }
> shouldExit = true;
> }];
>
> if (!task) {
> returnCode = EXIT_FAILURE;
> goto finish;
> }
> [task resume];
> while (!shouldExit && [runLoop runMode:NSDefaultRunLoopMode
> beforeDate:[NSDate distantFuture]])
> ;
> }
>
> finish:
> return returnCode;
> }
1. Is this an acceptable way to use a run loop in a command-line tool?
2. Is it OK to break an @autoreleasepool with a goto?
3. Is UTF-8 the standard to convert between NSString and whatever goes to/from
the Terminal? I’ve seen it in various 3rd-party code.
4. When I run the tool with the same URL twice, the “Error, copying” line is
triggered since the file already exists. However, the file-name within the
error reason is the one in “location,” when it should be the one from
“finalLocation”. (Especially funny since the file-name in “location” changes
every run.) Has anyone else seen that before? Is this a bug?
5. Should I be using “localizedFailureReason” over “localizedDescription” when
printing errors?
6. Is an ephemeral session the best option? What if I someday add options for
proxies, cookies, etc. (like curl or wget)?
7. Is there a standard routine that moves files and renames them when
necessary? (The API would need a NSURL** parameter to give the developer the
file’s actual final location.) Moving files to the Trash is an example of
Apple’s code renaming when needed during a move.
—
Daryle Walker
Mac, Internet, and Video Game Junkie
darylew AT mac DOT com
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]