December 31, 2005

Web Services in Objective C Part 3

This is my caller file. It is a .mm file not a .m file so I can micx C++ and Objective C. Sorry for my newbieness.

This is SakaiServer.mm - look in the doLogin method.

Again, Creative Commons Public Domain blah blah.

//
// SakaiServer.m
// SakaiDesktop
//
// Created by Charles Severance on 12/29/05.
// Copyright 2005 __MyCompanyName__. All rights reserved.
//

// Needed for SoapUtils
#include

#import "SakaiServer.h"

#import "SoapUtils.h";

#define checkErr(err) \
while (err != noErr) { fprintf(stderr, "Failed at line %d, error %d\n", __LINE__, err); exit(-1); }

@implementation SakaiServer

- (void) init
{
host = nil;
title = nil;
xmlDoc = nil;
account = nil;
password = nil;
session = nil;

// Initially we allow logins, and have neither tried, nor failed logging in
suppressLogin = NO;
goodLogin = NO;
triedLogin = NO;
}

- (IBAction) setHost:(NSString *) theHost
{
host = [theHost retain];
}

- (IBAction) setTitle:(NSString *) theTitle
{
title = [theTitle retain];
}

- (IBAction) setAccount:(NSString *) theAccount
{
account = theAccount;
}

- (IBAction) setPassword:(NSString *) thePassword
{
password = thePassword;
}

- (IBAction) setSuppressLogin:(BOOL) theValue
{
suppressLogin = theValue;
}

- (NSString *)title
{
return title;
}

- (NSString *)host
{
return host;
}

- (NSString *)account
{
return account;
}

// Instead of handing back the password, we simply allow our caller
// to know if it is nil
- (BOOL) passwordIsNil
{
if ( password == nil ) return YES;
return NO;
}

- (BOOL) suppressLogin
{
return suppressLogin;
}

- (BOOL) goodLogin
{
return goodLogin;
}


- (BOOL) triedLogin
{
return triedLogin;
}

// Log in to a Sakai Server
- (BOOL) doLogin :(NSTextField *) statusField
{

if ( triedLogin == YES ) {
[statusField setStringValue:@"Prior login failed..."];
return goodLogin;
}

triedLogin = YES;
goodLogin = NO;

OSErr err;
AEDesc soapParms;
err = createSoapParameters(&soapParms);
checkErr(err);

// Build up Soap Parameters - Ignore Errors while building up parameters
err = addSoapParameter(&soapParms, "id", typeChar, [account cString]);
err = addSoapParameter(&soapParms, "pw", typeChar, [password cString]);

char newSession[1024];
char errorMessage[1024];
[statusField setStringValue:@"Making web service call for login..."];
err = makeSoapCall([[host stringByAppendingString:@"/sakai-axis/SakaiLogin.jws"] cString],
"login", &soapParms, newSession, sizeof(newSession), errorMessage, sizeof(errorMessage), false, true);
AEDisposeDesc(&soapParms);

if ( err == noErr ) {
fprintf(stderr,"Success String = %s!\n\n", newSession);
} else {
fprintf(stderr,"Error String = %s!\n\n", errorMessage);
[statusField setStringValue:[NSString stringWithUTF8String:errorMessage]];
return NO;
}

// Retrieve the sites
err = createSoapParameters(&soapParms);
checkErr(err);
err = addSoapParameter(&soapParms, "session", typeChar, newSession);
err = addSoapParameter(&soapParms, "search", typeChar, "");
int i = 1;
err = addSoapParameter(&soapParms, "first", typeSInt32, &i);
i = 999;
err = addSoapParameter(&soapParms, "last", typeSInt32, &i);

// fullString = [string stringByAppendingString:@"Extra Text"];
char sitesDom[100000];
[statusField setStringValue:@"Making web service call retrieving sites..."];
err = makeSoapCall([[host stringByAppendingString:@"/sakai-axis/SakaiSite.jws"] cString],
"getToolsDom", &soapParms, sitesDom, sizeof(sitesDom), errorMessage, sizeof(errorMessage), false, true);
AEDisposeDesc(&soapParms);

if ( err == noErr ) {
fprintf(stderr,"Success String = %s!\n\n", sitesDom);
} else {
fprintf(stderr,"Error String = %s!\n\n", errorMessage);
[statusField setStringValue:[NSString stringWithUTF8String:errorMessage]];
return NO;
}

// Parse it all
// Release if this has been done before
if ( xmlDoc != nil ) {
[xmlDoc release];
xmlDoc = nil;
}

// NSXMLDocument *xmlDoc;
NSString *bar;
NSError *nsErr = nil;
bar = [NSString stringWithUTF8String:sitesDom];
NSLog(bar);
xmlDoc = [ [ [ NSXMLDocument alloc] initWithXMLString:bar options:0 error:&nsErr ] retain ] ;
if ( xmlDoc == nil ) {
[statusField setStringValue:@"Unable to parse returned XML from web Service"];
return NO;
}

[statusField setStringValue:@"Web Service Login Successful"];
goodLogin = YES;
return goodLogin;
}

@end

Posted by csev at December 31, 2005 09:56 AM