{"id":113,"date":"2005-12-31T09:56:48","date_gmt":"2005-12-31T13:56:48","guid":{"rendered":"http:\/\/www.dr-chuck.com\/wordpress\/?p=113"},"modified":"2011-12-17T12:18:51","modified_gmt":"2011-12-17T16:18:51","slug":"web-services-in-objective-c-part-3","status":"publish","type":"post","link":"https:\/\/www.dr-chuck.com\/csev-blog\/2005\/12\/web-services-in-objective-c-part-3\/","title":{"rendered":"Web Services in Objective C Part 3"},"content":{"rendered":"<p>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.<br \/>\nThis is SakaiServer.mm &#8211; look in the doLogin method.<br \/>\nAgain, Creative Commons Public Domain blah blah.<\/p>\n<p><!--more--><br \/>\n\/\/<br \/>\n\/\/  SakaiServer.m<br \/>\n\/\/  SakaiDesktop<br \/>\n\/\/<br \/>\n\/\/  Created by Charles Severance on 12\/29\/05.<br \/>\n\/\/  Copyright 2005 __MyCompanyName__. All rights reserved.<br \/>\n\/\/<br \/>\n\/\/ Needed for SoapUtils<br \/>\n#include <Carbon\/Carbon.h><br \/>\n#import &#8220;SakaiServer.h&#8221;<br \/>\n#import &#8220;SoapUtils.h&#8221;;<br \/>\n#define checkErr(err) \\<br \/>\nwhile (err != noErr) { fprintf(stderr, &#8220;Failed at line %d, error %d\\n&#8221;, __LINE__, err); exit(-1); }<br \/>\n@implementation SakaiServer<br \/>\n&#8211; (void) init<br \/>\n{<br \/>\nhost = nil;<br \/>\ntitle = nil;<br \/>\nxmlDoc = nil;<br \/>\naccount = nil;<br \/>\npassword = nil;<br \/>\nsession = nil;<br \/>\n\/\/ Initially we allow logins, and have neither tried, nor failed logging in<br \/>\nsuppressLogin = NO;<br \/>\ngoodLogin = NO;<br \/>\ntriedLogin = NO;<br \/>\n}<br \/>\n&#8211; (IBAction) setHost:(NSString *) theHost<br \/>\n{<br \/>\nhost = [theHost retain];<br \/>\n}<br \/>\n&#8211; (IBAction) setTitle:(NSString *) theTitle<br \/>\n{<br \/>\ntitle = [theTitle retain];<br \/>\n}<br \/>\n&#8211; (IBAction) setAccount:(NSString *) theAccount<br \/>\n{<br \/>\naccount = theAccount;<br \/>\n}<br \/>\n&#8211; (IBAction) setPassword:(NSString *) thePassword<br \/>\n{<br \/>\npassword = thePassword;<br \/>\n}<br \/>\n&#8211; (IBAction) setSuppressLogin:(BOOL) theValue<br \/>\n{<br \/>\nsuppressLogin = theValue;<br \/>\n}<br \/>\n&#8211; (NSString *)title<br \/>\n{<br \/>\nreturn title;<br \/>\n}<br \/>\n&#8211; (NSString *)host<br \/>\n{<br \/>\nreturn host;<br \/>\n}<br \/>\n&#8211; (NSString *)account<br \/>\n{<br \/>\nreturn account;<br \/>\n}<br \/>\n\/\/ Instead of handing back the password, we simply allow our caller<br \/>\n\/\/ to know if it is nil<br \/>\n&#8211; (BOOL) passwordIsNil<br \/>\n{<br \/>\nif ( password == nil ) return YES;<br \/>\nreturn NO;<br \/>\n}<br \/>\n&#8211; (BOOL) suppressLogin<br \/>\n{<br \/>\nreturn suppressLogin;<br \/>\n}<br \/>\n&#8211; (BOOL) goodLogin<br \/>\n{<br \/>\nreturn goodLogin;<br \/>\n}<br \/>\n&#8211; (BOOL) triedLogin<br \/>\n{<br \/>\nreturn triedLogin;<br \/>\n}<br \/>\n\/\/ Log in to a Sakai Server<br \/>\n&#8211; (BOOL) doLogin :(NSTextField *) statusField<br \/>\n{<br \/>\nif ( triedLogin == YES ) {<br \/>\n[statusField setStringValue:@&#8221;Prior login failed&#8230;&#8221;];<br \/>\nreturn goodLogin;<br \/>\n}<br \/>\ntriedLogin = YES;<br \/>\ngoodLogin = NO;<br \/>\nOSErr err;<br \/>\nAEDesc soapParms;<br \/>\nerr = createSoapParameters(&#038;soapParms);<br \/>\ncheckErr(err);<br \/>\n\/\/ Build up Soap Parameters &#8211; Ignore Errors while building up parameters<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;id&#8221;, typeChar, [account cString]);<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;pw&#8221;, typeChar, [password cString]);<br \/>\nchar newSession[1024];<br \/>\nchar errorMessage[1024];<br \/>\n[statusField setStringValue:@&#8221;Making web service call for login&#8230;&#8221;];<br \/>\nerr = makeSoapCall([[host stringByAppendingString:@&#8221;\/sakai-axis\/SakaiLogin.jws&#8221;] cString],<br \/>\n&#8220;login&#8221;, &#038;soapParms, newSession, sizeof(newSession), errorMessage, sizeof(errorMessage), false, true);<br \/>\nAEDisposeDesc(&#038;soapParms);<br \/>\nif ( err == noErr ) {<br \/>\nfprintf(stderr,&#8221;Success String = %s!\\n\\n&#8221;, newSession);<br \/>\n} else {<br \/>\nfprintf(stderr,&#8221;Error String = %s!\\n\\n&#8221;, errorMessage);<br \/>\n[statusField setStringValue:[NSString stringWithUTF8String:errorMessage]];<br \/>\nreturn NO;<br \/>\n}<br \/>\n\/\/ Retrieve the sites<br \/>\nerr = createSoapParameters(&#038;soapParms);<br \/>\ncheckErr(err);<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;session&#8221;, typeChar, newSession);<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;search&#8221;, typeChar, &#8220;&#8221;);<br \/>\nint i = 1;<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;first&#8221;, typeSInt32, &#038;i);<br \/>\ni = 999;<br \/>\nerr = addSoapParameter(&#038;soapParms, &#8220;last&#8221;, typeSInt32, &#038;i);<br \/>\n\/\/ fullString  = [string   stringByAppendingString:@&#8221;Extra Text&#8221;];<br \/>\nchar sitesDom[100000];<br \/>\n[statusField setStringValue:@&#8221;Making web service call retrieving sites&#8230;&#8221;];<br \/>\nerr = makeSoapCall([[host stringByAppendingString:@&#8221;\/sakai-axis\/SakaiSite.jws&#8221;] cString],<br \/>\n&#8220;getToolsDom&#8221;, &#038;soapParms, sitesDom, sizeof(sitesDom), errorMessage, sizeof(errorMessage), false, true);<br \/>\nAEDisposeDesc(&#038;soapParms);<br \/>\nif ( err == noErr ) {<br \/>\nfprintf(stderr,&#8221;Success String = %s!\\n\\n&#8221;, sitesDom);<br \/>\n} else {<br \/>\nfprintf(stderr,&#8221;Error String = %s!\\n\\n&#8221;, errorMessage);<br \/>\n[statusField setStringValue:[NSString stringWithUTF8String:errorMessage]];<br \/>\nreturn NO;<br \/>\n}<br \/>\n\/\/ Parse it all<br \/>\n\/\/ Release if this has been done before<br \/>\nif ( xmlDoc != nil ) {<br \/>\n[xmlDoc release];<br \/>\nxmlDoc = nil;<br \/>\n}<br \/>\n\/\/ NSXMLDocument *xmlDoc;<br \/>\nNSString *bar;<br \/>\nNSError *nsErr = nil;<br \/>\nbar = [NSString stringWithUTF8String:sitesDom];<br \/>\nNSLog(bar);<br \/>\nxmlDoc = [ [ [ NSXMLDocument alloc] initWithXMLString:bar options:0 error:&#038;nsErr ] retain ] ;<br \/>\nif ( xmlDoc == nil ) {<br \/>\n[statusField setStringValue:@&#8221;Unable to parse returned XML from web Service&#8221;];<br \/>\nreturn NO;<br \/>\n}<br \/>\n[statusField setStringValue:@&#8221;Web Service Login Successful&#8221;];<br \/>\ngoodLogin = YES;<br \/>\nreturn goodLogin;<br \/>\n}<br \/>\n@end<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 &#8211; look in the doLogin method. Again, Creative Commons Public Domain blah blah.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-113","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/posts\/113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/comments?post=113"}],"version-history":[{"count":1,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":2205,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/posts\/113\/revisions\/2205"}],"wp:attachment":[{"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/media?parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/categories?post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dr-chuck.com\/csev-blog\/wp-json\/wp\/v2\/tags?post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}