<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8949719</id><updated>2012-02-12T23:36:01.945+01:00</updated><category term='general'/><category term='Programming'/><title type='text'>Slow crawl on the B31</title><subtitle type='html'>Fremder in einem fremdem Land</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>24</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8949719.post-522274745238983955</id><published>2011-10-11T10:35:00.002+02:00</published><updated>2011-10-11T10:37:29.399+02:00</updated><title type='text'>Ubuntu 11.04 - Network Manager not Active</title><content type='html'>If you make changes via Network Manager that are not doing anything, try the following:&lt;br /&gt;&lt;br /&gt;sudo vi /etc/NetworkManager/NetworkManager.conf&lt;br /&gt;&lt;br /&gt;Change &lt;br /&gt;managed=false&lt;br /&gt;&lt;br /&gt;to&lt;br /&gt;managed=true&lt;br /&gt;&lt;br /&gt;Then&lt;br /&gt;sudo /etc/init.d/network-manager  restart&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-522274745238983955?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/522274745238983955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=522274745238983955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/522274745238983955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/522274745238983955'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2011/10/ubuntu-1104-network-manager-not-active.html' title='Ubuntu 11.04 - Network Manager not Active'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-304986428036173348</id><published>2011-07-11T14:50:00.003+02:00</published><updated>2011-07-11T16:20:49.236+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Pinata does not break...</title><content type='html'>Two years in a row, we have had the brilliant idea of having a pinata at our daughter's birthday party. Living in Germany, we thought it would be a treat for the kids to have such an experience (though neither I nor my wife is Mexican or Latin American or likes Tequila)&lt;br /&gt;&lt;br /&gt;Last year, for our daughter's fifth birthday, my wife schlepped a pinata across the Atlantic from Texas. Needless to say, it did not break.&lt;br /&gt;&lt;br /&gt;This year, we ordered one online (who knew one could order a pinata online in Germany) and again, the kids whacked at it for a good 30 minutes without it even showing a hit of a crack.. &lt;br /&gt;&lt;br /&gt;&lt;iframe width="560" height="349" src="http://www.youtube.com/embed/Kxh74-TQ40g" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;I hope the german kids aren't getting the wrong idea about a pinata, that it is something to hit and hit till nothing happens and an adult hs to pry it open to let the candy out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-304986428036173348?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/304986428036173348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=304986428036173348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/304986428036173348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/304986428036173348'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2011/07/pinata-does-not-break_11.html' title='Pinata does not break...'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://img.youtube.com/vi/Kxh74-TQ40g/default.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-1401758026599248645</id><published>2011-07-06T16:53:00.003+02:00</published><updated>2011-07-11T15:38:58.357+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Selenium clicking links from Safari/Opera not working</title><content type='html'>There have been lots and lots of solutions proposed for this problem. Let me add mine to the list.&lt;br /&gt;&lt;br /&gt;Here is what I was facing: the following (very simple) link click&lt;br /&gt;$link-&amp;gt;selenium-&amp;gt;click("//td[5]/a/img");&lt;br /&gt;&lt;br /&gt;works perfectly in Firefox, IE and Google Chrome but results in no action in Safari or Opera. No error is generated but no change to the website occurs.&lt;br /&gt;&lt;br /&gt;After pulling my hair out for two days, I noticed that at the bottom of the  Firefox window, the link that results was displayed.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/-h5uriV-p7GY/ThR8IY-CLaI/AAAAAAAAAII/lsvMyVtBPpc/s1600/url.jpg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 22px;" src="http://2.bp.blogspot.com/-h5uriV-p7GY/ThR8IY-CLaI/AAAAAAAAAII/lsvMyVtBPpc/s320/url.jpg" alt="" id="BLOGGER_PHOTO_ID_5626258318076030370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So I changed the command to&lt;br /&gt;$link-&amp;gt;selenium-&amp;gt;open("main.php?action=adm_overview&amp;amp;lang=de");&lt;br /&gt;&lt;br /&gt;And voila!...it was exactly the same as clicking on the link.&lt;br /&gt;&lt;br /&gt;If Firefox dos not display the link (for instance, if it displays the Javascript that will be called), then try to use a tool like Webscarb to intercept the outgoing message.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-1401758026599248645?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/1401758026599248645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=1401758026599248645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1401758026599248645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1401758026599248645'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2011/07/selenium-clicking-links-from.html' title='Selenium clicking links from Safari/Opera not working'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-h5uriV-p7GY/ThR8IY-CLaI/AAAAAAAAAII/lsvMyVtBPpc/s72-c/url.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-994094961990620354</id><published>2011-03-22T09:54:00.005+01:00</published><updated>2011-07-11T15:38:58.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Bromine error - Could not get handle to remote scheduler: Connection refused to host: 127.0.0.1</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-eGFY4kcBXEg/TYhltaRzZiI/AAAAAAAAAH8/gftpkC3oIE0/s1600/bromine-scheduler_not_starting.jpeg"&gt;&lt;img style="display: block; margin: 0px auto 10px; text-align: center; cursor: pointer; width: 320px; height: 256px;" src="http://3.bp.blogspot.com/-eGFY4kcBXEg/TYhltaRzZiI/AAAAAAAAAH8/gftpkC3oIE0/s320/bromine-scheduler_not_starting.jpeg" alt="" id="BLOGGER_PHOTO_ID_5586827168575612450" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I pulled my hair out for a day trying to get this solved.&lt;div&gt;But first, a bit of zen: When I am stuck on a problem that seems intractable, I find it good to walk away from it, sleep on it, and then the next day, debug it some more and read the solutions I've already gone through but did not get me to the solution previously.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The error I kept getting was the following: Scheduler would not start with the error in the title of this blog. I tried running start.sh to check what the error was and that worked fine. WTF!!&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The solution was something stupid that I had done.&lt;/div&gt;&lt;div&gt;I needed to enter a static IP address and first used network manager to try to do it which did not work. I ended up just editing the interfaces file to get the static IP address configured.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, during the time I was messing around with network manager, my /etc/hosts file was written to with an IP address&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The following line was added to the /etc/hosts file:&lt;/div&gt;&lt;div&gt;10.41.16.38&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;test-P5Q-VM&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;#Added by NetworkManager&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I just had to delete the line from /etc/hosts and then the scheduler started working.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Zen works. I say this not as a devotee as I am not one. I would like to be but I am not even close. My mind wanders so easily. It takes all my willpower just to get this post finished without moving to something else in between.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-994094961990620354?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/994094961990620354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=994094961990620354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/994094961990620354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/994094961990620354'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2011/03/bromine-error-could-not-get-handle-to.html' title='Bromine error - Could not get handle to remote scheduler: Connection refused to host: 127.0.0.1'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-eGFY4kcBXEg/TYhltaRzZiI/AAAAAAAAAH8/gftpkC3oIE0/s72-c/bromine-scheduler_not_starting.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-5725414010643912279</id><published>2011-02-22T13:19:00.002+01:00</published><updated>2011-07-11T15:38:58.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Solving SSL error Unable to load config info from /usr/local/ssl/openssl.cnf on Windows</title><content type='html'>Try the following:&lt;div&gt;&lt;div&gt;set OPENSSL_CONF=C:/Program Files (x86)/Apache Software Foundation/Apache2.2/conf/openssl.cnf&lt;/div&gt;&lt;/div&gt;&lt;div&gt;(or more generally, set it to where openssl.cnf is located)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;and now the command which generated the error above should be solved&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-5725414010643912279?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/5725414010643912279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=5725414010643912279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/5725414010643912279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/5725414010643912279'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2011/02/solving-ssl-error-unable-to-load-config.html' title='Solving SSL error Unable to load config info from /usr/local/ssl/openssl.cnf on Windows'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-1245264360909297564</id><published>2008-03-31T09:52:00.008+02:00</published><updated>2011-07-11T15:38:58.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>XPCOM Proxy and getting access to the GUI from non-GUI thread</title><content type='html'>It was a frustrating week of pulling out hair trying to get this to work.&lt;br /&gt;&lt;br /&gt;First, you'll need to get nsIProxyObjectManager which is not part of the Gecko-sdk but the idl file is part of the Firefox source code. So download the Firefox source code for the Firefox version that you're using. If you are using Firefox 2.0, downloading Firefox 3.0 source code and using the idl included there will not suffice. The UID of the IDL in Firefox 3.0 is different from that of Firefox 2.0. It would've saved me half a week of frsutration had I realized this sooner.&lt;br /&gt;&lt;br /&gt;I'm sure there are several ways to proceed from here. I found the IDL in the Firefox source, generated a header file out of it using the xpidl command from Gecko-sdk and included that in my project. You'll find that when you try to compile your project with the nsIProxyObejctManager.h inculded, it'll require other header files as well and so you'll have to find and generate header files from a few other IDLs as well. I think in total it comes out to about 10. Not too frustrating a process, but frustrating enough.&lt;br /&gt;&lt;br /&gt;Finally, you'll need to access the method you want via the proxy&lt;br /&gt;Declare the proxy object&lt;br /&gt;      nsCOMPtr&lt;nsiproxyobjectmanager&gt; pmgr;&lt;br /&gt;      pmgr=do_GetService("@&lt;a href="http://mozilla.org/xpcomproxy;1" target="_blank"&gt;mozilla.org/xpcomproxy;1&lt;/a&gt;",&amp;amp;rv);&lt;br /&gt;&lt;br /&gt;Now, i'm trying to write to an RDF file via the proxy. So I'll declare an  RDF datasource to access via the proxy&lt;br /&gt;      nsCOMPtr &lt;nsirdfdatasource&gt; proxyObject;&lt;br /&gt;&lt;br /&gt;And then try to get proxy access to the nsIRDFDataSource&lt;br /&gt;      if (pmgr){&lt;br /&gt;          rv = pmgr-&gt;GetProxyForObject(NS_UI&lt;wbr&gt;_THREAD_EVENTQ, NS_GET_IID(nsIRDFDataSource), dsource, 1|4, getter_AddRefs(proxyObject));&lt;br /&gt;&lt;br /&gt;Now we have a proxy object for calling all functions declared in nsIRDFDataSource. For instance, to call the assert, we would do&lt;br /&gt;  proxyObject-&gt;Assert(ns_subject, ns_predicate, ns_literal, PR_TRUE);&lt;br /&gt;&lt;br /&gt;Its the same for any other XPCOM Interface. You'll need to get access to it via GetProxyForObject and then you can access all functions to it via the proxy as above. Hope this helped.&lt;/nsirdfdatasource&gt;&lt;/nsiproxyobjectmanager&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-1245264360909297564?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/1245264360909297564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=1245264360909297564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1245264360909297564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1245264360909297564'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2008/03/xpcom-proxy-and-getting-access-to-gui.html' title='XPCOM Proxy and getting access to the GUI from non-GUI thread'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-1613364337797866764</id><published>2008-03-16T16:42:00.003+01:00</published><updated>2011-07-11T15:38:58.358+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>XPCOM and OS X</title><content type='html'>&lt;div&gt;What I had to do to get an XPCOM component written in C++ compiled and linked on OS X&lt;/div&gt;&lt;div&gt; &lt;/div&gt;1. Install Xcode&lt;div&gt;2. Install Fink&lt;/div&gt;&lt;div&gt;3. At command prompt&lt;br /&gt;cd /sw/bin;&lt;br /&gt;sudo ./apt-get install glib&lt;br /&gt;sudo ./apt-get install  libIDL2&lt;br /&gt;sudo cp libIDL-config-2 libIDL-config&lt;br /&gt;&lt;br /&gt;4. Download the source of the Firefox version you'll be developing for. The only steps I had to perform that weren't mentioned on&lt;br /&gt;http://developer.mozilla.org/en/docs/Mac_OS_X_Build_Prerequisites&lt;br /&gt;was to add the following directory to my path&lt;br /&gt;/sw/bin&lt;br /&gt;&lt;br /&gt;5. change to directory to which Firefox source was downloaded and run the following commands&lt;br /&gt;cp ./obj-ff/dist/bin/libxpcom_core.dylib ./obj-ff/dist/sdk/bin&lt;br /&gt;cp ./obj-ff/dist/bin/libplds4.dylib ./obj-ff/dist/sdk/bin&lt;br /&gt;cp ./obj-ff/dist/bin/libplc4.dylib ./obj-ff/dist/sdk/bin&lt;br /&gt;&lt;br /&gt;6. Follow the steps give in&lt;br /&gt;http://rcrowley.org/2007/07/17/cross-platform-xpcom-a-howto/&lt;br /&gt;with Makefile looking like this:&lt;br /&gt;&lt;br /&gt;GECKO_SDK := &lt;directory&gt;/obj-ff/dist/sdk&lt;br /&gt;&lt;br /&gt;DEFINE := -DXP_UNIX -DXP_MACOSX&lt;br /&gt;all: xpt dylib&lt;br /&gt;xpt:&lt;br /&gt;   $(GECKO_SDK)/bin/xpidl -m header -I$(GECKO_SDK)/idl foo.idl&lt;br /&gt;   $(GECKO_SDK)/bin/xpidl -m typelib -I$(GECKO_SDK)/idl foo.idl&lt;br /&gt;impl:&lt;br /&gt;   g++ -w -c -o foo_impl.o -I $(GECKO_SDK)/include $(DEFINE) foo_impl.cpp&lt;br /&gt;module:&lt;br /&gt;   g++ -w -c -o foo_module.o -I $(GECKO_SDK)/include $(DEFINE) foo_module.cpp&lt;br /&gt;dylib: impl module&lt;br /&gt;   g++ -dynamiclib -o foo.dylib foo_impl.o foo_module.o -L$(GECKO_SDK)/lib \&lt;br /&gt;   -L$(GECKO_SDK)/bin -Wl,-executable_path,$(GECKO_SDK)/bin \&lt;br /&gt;   -lxpcomglue_s -lxpcom -lnspr4&lt;br /&gt;clean:&lt;br /&gt;   rm *.o&lt;br /&gt;   rm foo.h&lt;br /&gt;   rm foo.xpt&lt;br /&gt;   rm foo.dylib&lt;br /&gt;&lt;br /&gt;7. Run make. Hopefully, it should work.&lt;br /&gt;&lt;/directory&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-1613364337797866764?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/1613364337797866764/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=1613364337797866764' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1613364337797866764'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1613364337797866764'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2008/03/xpcom-and-os-x.html' title='XPCOM and OS X'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-679685866353779124</id><published>2008-01-09T21:44:00.001+01:00</published><updated>2011-07-11T15:39:08.188+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Hyperconnected GSM-r solutions for the developing world.</title><content type='html'>GSM-r seeks to reinvent communications on board trains, between trains, and between trains and the sorrounding world.  A hyperconnected solution transforming the current wired/wireless network of people communicating with one another to a network where devices are involved as well will change it from a network of people tracking the rail network to a network which that tracks the rail network. It does not remove the human element from the equation but rather changes the human from being the singular interface to one in which the human is one of many. Information gathering and sending can be done without human intervention and it will allow the network to initiate actions rather than the current situation where the human always intiates the action.&lt;br /&gt;While hyperconnectivity is seen as the next step in the evolution of networks, it will allow developing countries who have not yet evolved beyond GSM and traditional wired networks to provide viable solutions to long running rail problems that have so far proved intractable due to cultural and economic issues&lt;br /&gt;Countries like China and India have huge and heavily used rail networks but the additional infrastructure taken for granted in first world countries is sorely lacking, for example displays on platforms, displays in the stations to announce arrivals and departures, information gathering and dissemination on passengers, reservations, etc. Culturally and economically, it may make sense for these countries to invest in hyperconnected solutions to solve some of these issues rather than the traditional solutions deployed in first world countries. The penetration of mobile devices in these countries is large and they are among the fastest growing wireless markets in the world making hyperconnected solutions a viable solution at present and more so in the future.&lt;br /&gt;Creative solutions based around trains and hyperconnectivity can be numerous taking based on cultural aind environmental factors not seen in the first world. The problems that users of trains face in developing countries are far different to those faced in the first world and the solutions offered by a hyperconnectivity can lead to a greater quality of life. For instance, on time train service is not quite the norm in the developing world. A lot of time can be spent to platforms that could be better used. A hyperconnected world would allow a train user to circumvent this by geting updates and allow the train operators to lessen rider discontemt where there currently isn't an immediately viable solution. Hyperconnected solutions will be most useful in mega-cities, think Bombay and Shanghai, where trains are a common form of transportation, commuting times are long and  professions are more and more digital in nature. Any advantages that being always connected will be embraced.&lt;br /&gt;In the event of an accident, a hyperconnected GSM-r solution will allow a quick response from emergency personnal who could be provided far more information than would have been previously available. A coordinated rescue and response with data that is automatically gathered would be possible and may significantly improve rescue effectiveness.&lt;br /&gt;A hyperconnected world would make driverless trains safer to operate in countries where the use of a single networks are not robust enough. Use of traditional wireless networks, Wi-Fi and Wimax networks when wireless networks are out of commision and ad hoc networks would significantly increase the robustness of the network coverage available to driverless trains.&lt;br /&gt;While hyperconnectivity is another evolution for the first world, it can be a fundamental rethink for the developing world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-679685866353779124?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/679685866353779124/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=679685866353779124' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/679685866353779124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/679685866353779124'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2008/01/hyperconnected-gsm-r-solutions-for.html' title='Hyperconnected GSM-r solutions for the developing world.'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-7543371283755430026</id><published>2008-01-09T21:39:00.000+01:00</published><updated>2011-07-11T15:39:08.193+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Hyperconnected GSM-r solutions for the developing world</title><content type='html'>&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-7543371283755430026?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/7543371283755430026/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=7543371283755430026' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/7543371283755430026'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/7543371283755430026'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2008/01/hyperconnected-gsm-r-solutions-for_09.html' title='Hyperconnected GSM-r solutions for the developing world'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-2033718752630778324</id><published>2007-12-30T13:46:00.000+01:00</published><updated>2011-07-11T15:39:40.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Innovative Minds Don’t Think Alike</title><content type='html'>http://www.nytimes.com/2007/12/30/business/30know.html?_r=1&amp;amp;oref=slogin&lt;br /&gt;I found this article especially profound, having been away from my engineering job for a few weeks and working on things that have very little to do with engineering. The time away has given me a new perspective on some of the things that have perplexed me over the past year.&lt;br /&gt;I'm surrounded by engineers by education, brilliant ones at that, but conversations are about more or less the same thing and they tend to flow in one direction. Fresh perspectives are tough to come by and even tougher to gain a foot hold if someone has one.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-2033718752630778324?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/2033718752630778324/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=2033718752630778324' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/2033718752630778324'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/2033718752630778324'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/12/innovative-minds-dont-think-alike.html' title='Innovative Minds Don’t Think Alike'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-6930865497538426769</id><published>2007-11-16T09:00:00.000+01:00</published><updated>2011-07-11T15:38:58.359+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>undefined reference to `QApplication::QApplication</title><content type='html'>&lt;span style="font-family:Arial;font-size:85%;"&gt;Add the following Linker flags: -lQtGui -lQtCore&lt;br /&gt;&lt;br /&gt;In Eclipse, it would be under&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Under Project -&gt; Properties -&gt; GCC C++ Linker -&gt; Miscellaneous&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__jBuP2Z7o7E/Rz1O0NJzxDI/AAAAAAAAABs/U2CT_xK9x0g/s1600-h/eclipse-problem.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/__jBuP2Z7o7E/Rz1O0NJzxDI/AAAAAAAAABs/U2CT_xK9x0g/s320/eclipse-problem.JPG" alt="" id="BLOGGER_PHOTO_ID_5133345809063199794" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-6930865497538426769?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/6930865497538426769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=6930865497538426769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/6930865497538426769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/6930865497538426769'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/11/undefined-reference-to.html' title='undefined reference to `QApplication::QApplication'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__jBuP2Z7o7E/Rz1O0NJzxDI/AAAAAAAAABs/U2CT_xK9x0g/s72-c/eclipse-problem.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-1493952699008453505</id><published>2007-11-14T09:49:00.000+01:00</published><updated>2011-07-11T15:38:58.359+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Linker error and sipXtapi</title><content type='html'>If you get the following error:&lt;br /&gt;&lt;p&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Invoking: GCC C++ Linker&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;g++ -L../../src/.libs/  -L../../src/libs/ -lQtGui -lQtCore -o"my_sipXezPhone"  ./fred.o ./main.o  ./moc_myqtapp.o ./myqtapp.o   &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;./myqtapp.o: In function  `myQtApp::show()':&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;/root/sipXtapi/sipXcallLib/workspace/my_sipXezPhone/Debug/../myqtapp.cpp:115:  undefined reference to `sipxInitialize'&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;collect2: ld returned 1 exit status&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;It because the linker cannot find the object file. Do the following&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Add the following path to the linker library search path: directory where sipxtapi is installed/sipXcallib/src/.libs/&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span lang="de"&gt;&lt;span style="font-family:Arial;font-size:85%;"&gt;Add the following entry to the linker libraries: sipXcall&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;In Eclipse, it would look like this:&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__jBuP2Z7o7E/Rzq4flYBSZI/AAAAAAAAABk/BbWdOvqmpUc/s1600-h/linker_problem.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://4.bp.blogspot.com/__jBuP2Z7o7E/Rzq4flYBSZI/AAAAAAAAABk/BbWdOvqmpUc/s320/linker_problem.JPG" alt="" id="BLOGGER_PHOTO_ID_5132617578090416530" border="0" /&gt;&lt;/a&gt;A couple of webpages that helped me get to the solution:&lt;/p&gt;&lt;p&gt;http://developer.apple.com/documentation/DeveloperTools/gcc-3.3/gcc/Link-Options.html&lt;/p&gt;&lt;p&gt;Relevant text:&lt;br /&gt;&lt;/p&gt;&lt;dl&gt;&lt;dt&gt;&lt;code&gt;-l &lt;/code&gt;&lt;var&gt;library&lt;/var&gt;&lt;/dt&gt;&lt;dd&gt;&lt;a name="index-l-528"&gt;&lt;/a&gt;Search the library named &lt;var&gt;library&lt;/var&gt; when linking.  (The second alternative with the library as a separate argument is only for POSIX compliance and is not recommended.)       &lt;p&gt;It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified.  Thus, &lt;span class="samp"&gt;foo.o -lz bar.o&lt;/span&gt; searches library &lt;span class="samp"&gt;z&lt;/span&gt; after file &lt;span class="file"&gt;foo.o&lt;/span&gt; but before &lt;span class="file"&gt;bar.o&lt;/span&gt;.  If &lt;span class="file"&gt;bar.o&lt;/span&gt; refers to functions in &lt;span class="samp"&gt;z&lt;/span&gt;, those functions may not be loaded.       &lt;/p&gt;&lt;p&gt;The linker searches a standard list of directories for the library, which is actually a file named &lt;span class="file"&gt;lib&lt;/span&gt;&lt;var&gt;library&lt;/var&gt;&lt;span class="file"&gt;.a&lt;/span&gt;.  The linker then uses this file as if it had been specified precisely by name.       &lt;/p&gt;&lt;p&gt;The directories searched include several standard system directories plus any that you specify with &lt;span class="option"&gt;-L&lt;/span&gt;.       &lt;/p&gt;&lt;p&gt;Normally the files found this way are library files—archive files whose members are object files.  The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined.  But if the file that is found is an ordinary object file, it is linked in the usual fashion.  The only difference between using an &lt;span class="option"&gt;-l&lt;/span&gt; option and specifying a file name is that &lt;span class="option"&gt;-l&lt;/span&gt; surrounds &lt;var&gt;library&lt;/var&gt; with &lt;span class="samp"&gt;lib&lt;/span&gt; and &lt;span class="samp"&gt;.a&lt;/span&gt; and searches several directories.       &lt;/p&gt;&lt;/dd&gt;&lt;/dl&gt;http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-1493952699008453505?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/1493952699008453505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=1493952699008453505' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1493952699008453505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/1493952699008453505'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/11/linker-error-and-sipxtapi.html' title='Linker error and sipXtapi'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__jBuP2Z7o7E/Rzq4flYBSZI/AAAAAAAAABk/BbWdOvqmpUc/s72-c/linker_problem.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-8366924691183055972</id><published>2007-10-09T07:43:00.001+02:00</published><updated>2011-07-11T15:39:08.198+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>O-2875 requirements</title><content type='html'>I'm a bit obsessed on Edward Tufte at the moment, specially the following quote:&lt;br /&gt;"Clutter and confusion are failures of design, not attributes of information"&lt;br /&gt;&lt;br /&gt;One prime example: GSM specifications. Essentially, the documents are verbal representations of information that would far better be expressed in a visual form.&lt;br /&gt;I shall use the latest O-2875 spec which defines&lt;br /&gt;&lt;br /&gt;Essentially, the whole convoluted document can be expressed in a couple of diagrams, diagrams which are essentially not too complicated.&lt;br /&gt;&lt;br /&gt;I was suprised how little information is actually contained in the document when I finished with the first diagram. The whole document defines four measurements under different configurations, REC call, VGCS/VBS call origianted by Mobile, fixed line dispatcher and terminated to the same.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-8366924691183055972?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/8366924691183055972/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=8366924691183055972' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/8366924691183055972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/8366924691183055972'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/10/o-2875-requirements.html' title='O-2875 requirements'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-5309558419018011295</id><published>2007-09-19T09:36:00.000+02:00</published><updated>2011-07-11T15:38:58.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Accessing User to User Info in a SIP invite message via sipXtapi</title><content type='html'>My task: to allow a SIP GUI to access UUI (User to User Information) sent in a SIP invite message&lt;br /&gt;&lt;br /&gt;In the GSM-r environment, it is used for sending functional numbers between subscribers and any SIP application in the GSM-r world must support this.&lt;br /&gt;&lt;br /&gt;Let's start at the end and end at the beginning...with some forays to the beginning in between&lt;br /&gt;&lt;br /&gt;SIP applications built on top of sipXtapi are provided access to the data received via the SIPXTAPI_API. So any data that needs to be accessed by the SIP application will need an API defined here. For the UUI, I defined the following:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;SIPXTAPI_API SIPX_RESULT sipxCallGetUsertoUserInfo(const SIPX_CALL hCall, &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;                                             char* szId, &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;                                             const size_t iMaxLength) ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;SIPXTAPI_API SIPX_RESULT sipxCallGetUsertoUserInfo(const SIPX_CALL hCall,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;                                             char* szId,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;                                             const size_t iMaxLength)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    OsStackTraceLogger stackLogger(FAC_SIPXTAPI, PRI_DEBUG, "sipxCallGetUsertoUserInfo");&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        "sipxCallGetUsertoUserInfo hCall=%d",&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        hCall);&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    SIPX_RESULT sr = SIPX_RESULT_FAILURE ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    UtlString callId ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    UtlString UUSInfo ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    if (sipxCallGetCommonData(hCall, NULL, &amp;amp;callId, NULL, NULL, NULL, NULL, &amp;amp;UUSInfo))&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        if (iMaxLength)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;            strncpy(szId, UUSInfo.data(), iMaxLength) ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;            szId[iMaxLength-1] = 0 ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;        sr = SIPX_RESULT_SUCCESS ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;    return sr ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This is an exact copy of another sipxCallGet routine and I did so to&lt;br /&gt;1. Keep a consistant format to the calls&lt;br /&gt;2. To minimize the amount of work I had to do&lt;br /&gt;&lt;br /&gt;The API makes a call to sipxCallGetCommonData and so that procedure had to be changed to accomodate this new call. The changes are shown in bold italic (as opposed to non-bold italic for old code)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;UtlBoolean sipxCallGetCommonData(SIPX_CALL hCall,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 SIPX_INSTANCE_DATA** pInst,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pStrCallId,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pStrRemoteAddress,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pLineId,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pGhostCallId,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pContactAddress,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pUsertoUserInfo,&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                                 UtlString* pPriority)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    OsStackTraceLogger logItem(FAC_SIPXTAPI, PRI_DEBUG, "sipxCallGetCommonData");&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;   &lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    UtlBoolean bSuccess = FALSE ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    SIPX_CALL_DATA* pData = sipxCallLookup(hCall, SIPX_LOCK_READ, logItem);&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    if (pData)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pInst)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            *pInst = pData-&gt;pInst ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pStrCallId)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            if (pData-&gt;sessionCallId)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                *pStrCallId = *pData-&gt;sessionCallId ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            else&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                *pStrCallId = *pData-&gt;callId ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pStrRemoteAddress)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            if (pData-&gt;remoteAddress)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                *pStrRemoteAddress = *pData-&gt;remoteAddress;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            else&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                pStrRemoteAddress-&gt;remove(0) ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pLineId)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            *pLineId = *pData-&gt;lineURI ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pGhostCallId)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            if (pData-&gt;ghostCallId)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                *pGhostCallId = *pData-&gt;ghostCallId;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pContactAddress)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            if (pData-&gt;contactAddress)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;                *pContactAddress = *pData-&gt;contactAddress;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;        if (pUsertoUserInfo)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;            if (pData-&gt;UsertoUserInfo)&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;                *pUsertoUserInfo = *pData-&gt;UsertoUserInfo;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        bSuccess = TRUE ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;        sipxCallReleaseLock(pData, SIPX_LOCK_READ, logItem) ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    }&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;    return bSuccess ;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sipXCallGetCommonData basically looks up the call data which is stored in SIPX_CALL_DATA. So if there's info that a SIP application needs to access, it needs to be declared there and then stored there so that sipXCallGetCommonData can access it.&lt;br /&gt;&lt;br /&gt;Here's the declaration of the new field in SIPX_CALL_DATA&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;font-size:78%;" &gt;&lt;span style="color: rgb(51, 102, 255);"&gt;typedef struct SIPX_CALL_DATA&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* callId;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* sessionCallId;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* ghostCallId;    &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* remoteAddress ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* lineURI ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlString* contactAddress ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_LINE  hLine ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_INSTANCE_DATA* pInst ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    OsRWMutex* pMutex ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_CONF hConf ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_SECURITY_ATTRIBUTES security;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_VIDEO_DISPLAY display;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlBoolean bRemoveInsteadOfDrop ;   /** Remove the call instead of dropping it &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                            -- this is used as part of consultative &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                            transfer when we are the transfer target &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                            and need to replace a call leg within &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                            the same CpPeerCall. */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_CALLSTATE_EVENT lastCallstateEvent ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_CALLSTATE_CAUSE lastCallstateCause ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_MEDIA_EVENT lastLocalMediaAudioEvent ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_MEDIA_EVENT lastLocalMediaVideoEvent ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_MEDIA_EVENT lastRemoteMediaAudioEvent ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_MEDIA_EVENT lastRemoteMediaVideoEvent ;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_INTERNAL_CALLSTATE state ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    UtlBoolean bInFocus ;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    int connectionId;                  /** Cache the connection id */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    SIPX_TRANSPORT hTransport;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    bool bHoldAfterConnect;            /** Used if we are the transfer target, and the&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                           replaced call is HELD or REMOTE_HELD, then&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                           this flag is set, and indicates that the call&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                           should be placed on hold after the connection&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                           is established. */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    bool bCallHoldInvoked;             /** Set to true if sipxCallHold has been invoked.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                                           Set to fales if sipxCallUnhold has been invoked. */                                          &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    bool bTonePlaying;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;    int nFilesPlaying;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;    UtlString* UsertoUserInfo;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;} SIPX_CALL_DATA ;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Looking up all the uses of SIPX_CALL_DATA forincoming calls, almost all of them are looks ups using sipx_call_lookup. Thankfully (i assume due to good coding practices), there is only one place where SIPX_CALL_DATA is initialized with data for an incoming call, which is in sipxFireCallEvent and so I added some calls there to save the data to SIPX_CALL_DATA .&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:78%;"&gt;v&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;oid sipxFireCallEvent(const void* pSrc,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       const char* szCallId,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       SipSession* pSession,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       const char* szRemoteAddress,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       SIPX_CALLSTATE_EVENT event,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       SIPX_CALLSTATE_CAUSE cause,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       void* pEventData,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                       const char* szRemoteAssertedIdentity)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    OsStackTraceLogger stackLogger(FAC_SIPXTAPI, PRI_DEBUG, "sipxFireCallEvent");&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    OsSysLog::add(FAC_SIPXTAPI, PRI_INFO,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            "sipxFireCallEvent Src=%p CallId=%s RemoteAddress=%s Event=%s:%s",&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            pSrc, szCallId, szRemoteAddress, convertCallstateEventToString(event), convertCallstateCauseToString(cause)) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;     &lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    SIPX_CALL hCall = SIPX_CALL_NULL;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    SIPX_CALL_DATA* pCallData = NULL;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    SIPX_LINE hLine = SIPX_LINE_NULL ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlVoidPtr* ptr = NULL;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    SIPX_INSTANCE_DATA* pInst ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString callId ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString remoteAddress ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString lineId ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString contactAddress ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    SIPX_CALL hAssociatedCall = SIPX_CALL_NULL ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    // Prashant&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString UUS;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString Priority;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    // If this is an NEW inbound call (first we are hearing of it), then create&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    // a call handle/data structure for it.&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    if (event == CALLSTATE_NEWCALL)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;    {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData = new SIPX_CALL_DATA;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        memset((void*) pCallData, 0, sizeof(SIPX_CALL_DATA));&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;state = SIPX_INTERNAL_CALLSTATE_UNKNOWN;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;callId = new UtlString(szCallId) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;remoteAddress = new UtlString(szRemoteAddress) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;pMutex = new OsRWMutex(OsRWMutex::Q_FIFO) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-size:78%;" &gt;        pSession-&gt;getUsertoUserInfo(UUS);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        Url urlFrom;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;lineURI = new UtlString(urlFrom.toString()) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pCallData-&gt;pInst = findSessionByCallManager(pSrc) ;                    &lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        hCall = gpCallHandleMap-&gt;allocHandle(pCallData) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pInst = pCallData-&gt;pInst ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        if (pEventData)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            char* szOriginalCallId = (char*) pEventData ;                &lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            hAssociatedCall = sipxCallLookupHandle(UtlString(szOriginalCallId), pSrc) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            // Make sure we remove the call instead of allowing a drop.  When acting&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            // as a transfer target, we are performing surgery on a CpPeerCall.  We&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            // want to remove the call leg -- not drop the entire call.&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            if ((hAssociatedCall) &amp;amp;&amp;amp; (cause == CALLSTATE_CAUSE_TRANSFERRED))&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                // get the callstate of the replaced leg&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                SIPX_CALL_DATA* pOldCallData = sipxCallLookup(hAssociatedCall, SIPX_LOCK_READ, stackLogger);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                bool bCallHoldInvoked = false;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                if (pOldCallData)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    bCallHoldInvoked = pOldCallData-&gt;bCallHoldInvoked;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    sipxCallReleaseLock(pOldCallData, SIPX_LOCK_READ, stackLogger);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                &lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                if (bCallHoldInvoked)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    SIPX_CALL_DATA* pData = sipxCallLookup(hCall, SIPX_LOCK_WRITE, stackLogger);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    if (pData)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                        pData-&gt;bHoldAfterConnect = true;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                        sipxCallReleaseLock(pData, SIPX_LOCK_WRITE, stackLogger);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                sipxCallSetRemoveInsteadofDrop(hAssociatedCall) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                SIPX_CONF hConf = sipxCallGetConf(hAssociatedCall) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                if (hConf)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    sipxAddCallHandleToConf(hCall, hConf) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            else if ((hAssociatedCall) &amp;amp;&amp;amp; (cause == CALLSTATE_CAUSE_TRANSFER))&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                // This is the case where we are the transferee -- we want to&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                // make sure that the new call is part of the conference&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                SIPX_CONF hConf = sipxCallGetConf(hAssociatedCall) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                if (hConf)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    // The original call was part of a transfer -- make sure the&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    // replacement leg is also part of the conference.&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                    sipxAddCallHandleToConf(hCall, hConf) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;                }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        // Increment call count&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pInst-&gt;pLock-&gt;acquire() ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pInst-&gt;nCalls++ ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        pInst-&gt;pLock-&gt;release() ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        callId = szCallId ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        remoteAddress = szRemoteAddress ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;        lineId = urlFrom.toString() ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 255);font-size:78%;" &gt;        pCallData-&gt;UsertoUserInfo= new UtlString(UUS) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;Now to the very beginning for the rest of the explanation. UUI info in an invite message is received as: User-To-User: 0506102011223320;pd=1&lt;br /&gt;&lt;br /&gt;First off we'll need to extract the info from the invite message and sipXtapi makes this pretty simple.&lt;br /&gt;&lt;br /&gt;We'll need to define the UUI field in SipMessage.h&lt;br /&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;i style="font-weight: bold;"&gt;&lt;span style=""&gt;#define&lt;/span&gt;&lt;/i&gt;&lt;/span&gt;&lt;i style=""&gt;&lt;span style=""&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-size:78%;" &gt; SIP_USER_TO_USER_INFO_FIELD &lt;/span&gt;&lt;span style="color: rgb(163, 21, 21);"&gt;&lt;span style="color: rgb(51, 51, 255); font-weight: bold;font-size:78%;" &gt;"User-To-User"&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  and then define a method to extract the UUI in the SIPMessage class.&lt;br /&gt;&lt;br /&gt;&lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;UtlBoolean SipMessage::getUsertoUserInfo(UtlString&amp;amp; eventField) const&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span style="font-size:78%;"&gt;const char* value = getHeaderValue(0, SIP_USER_TO_USER_INFO_FIELD);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;    &lt;/span&gt;&lt;span style="font-size:78%;"&gt;eventField.remove(0);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span style="font-size:78%;"&gt;if(value)&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span style="font-size:78%;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;      &lt;/span&gt;&lt;span style="font-size:78%;"&gt;eventField.append(value);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span style="font-size:78%;"&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;   &lt;/span&gt;&lt;span style="font-size:78%;"&gt;return(value != NULL);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-weight: bold; font-style: italic;font-size:78%;" &gt;}&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;i style=""&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;    &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;UtlBoolean SipMessage::getUsertoUserInfo(UtlString&amp;amp; eventField) const&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;   const char* value = getHeaderValue(0, SIP_USER_TO_USER_INFO_FIELD);&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;    eventField.remove(0);&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;u1:p&gt;&lt;b&gt; &lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;   if(value)&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;   {&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;      eventField.append(value);&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="font-style: italic; color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;   }&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;u1:p&gt;&lt;b&gt;&lt;span style="font-style: italic;"&gt; &lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="color: rgb(51, 51, 255);"&gt;&lt;span style="font-size:78%;"&gt;&lt;b&gt;   return(value != NULL);&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;u1:p&gt;&lt;/u1:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;o:p&gt;This is where I got stuck for a while. I know how to extract the data and I know where to store the data for SIP appliation but how do I get the extracted data to the variable where it needs to be stored.&lt;/o:p&gt;&lt;/p&gt;sipXFireCallEvent has access to class SIPSession, but not class SIPmessage. SIPSession in turn is used in methods which have access varaibles from SIpConnection which in turn has access to SIPmessage. So the data would have to be copied from SIPmessage to SIPConnection , then to SIPsession and then frinally copied from SIPsession into SIPX_CALL_DATA. I think at the very least, I should've been able to avoid SIPConnection but that proved impossible. The methods that had access to SIPmessage and SIPsession were not being hit when the data was available yet in SIPMessage. So, no other way that to go via SIPSession&lt;br /&gt;&lt;br /&gt;First up, copying the data from SIPMessage to SIPConnection&lt;br /&gt;A new variable in SIPConnection to hold the UUI&lt;br /&gt;&lt;p class="MsoNormal" style=""&gt;&lt;span style="font-style: italic; font-weight: bold; color: rgb(51, 51, 255);font-family:Arial;font-size:10;"  &gt;&lt;span style="color: rgb(51, 102, 255);font-size:78%;" &gt;            UtlString mUsertoUserInfo;&lt;/span&gt;&lt;/span&gt;&lt;i style=""&gt;&lt;span style=";font-family:Arial;font-size:10;"  &gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;  The variable is populated in method processInviteRequestOffering&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;void SipConnection::processInviteRequestOffering(const SipMessage* request,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 int               tag,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 UtlBoolean        doesReplaceCallLegExist,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 int               replaceCallLegState,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 UtlString&amp;amp;        replaceCallId,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 UtlString&amp;amp;        replaceToTag,&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;                                                 UtlString&amp;amp;        replaceFromTag)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString callId ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    getCallId(&amp;amp;callId) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    request-&gt;getCSeqField(&amp;amp;lastRemoteSequenceNumber, NULL) ;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Save a copy of the INVITE&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    inviteMsg = new SipMessage(*request);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    inviteFromThisSide = FALSE;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    setCallerId();&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Set the to tag if it is not set in the Invite&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    if(tag &gt;= 0)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    {&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;        inviteMsg-&gt;setToFieldTag(tag);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;        // Update the cached from field after saving the tag&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;        inviteMsg-&gt;getToUrl(mFromUrl);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    }&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Save line Id&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString uri;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    request-&gt;getRequestUri(&amp;amp;uri);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Convert the URI to name-addr format.&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    Url parsedUri(uri, TRUE);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Store into mLocalContact, which is in name-addr format.&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    parsedUri.toString(mLocalContact);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;     request-&gt;getUsertoUserInfo(mUsertoUserInfo);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Then we need to copy the data from SIPConnection to SIPSession. Again create the variable to hold the data&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;            UtlString mUUSInfo;&lt;/span&gt;    &lt;p style="color: rgb(0, 0, 0);" class="MsoNormal"&gt;&lt;o:p&gt;And additionally, a new method to populate the new variable&lt;/o:p&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 102, 255);" class="MsoNormal"&gt;&lt;span style=""&gt;   &lt;/span&gt;&lt;span style=""&gt;         &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:78%;" &gt;UtlBoolean getUsertoUserInfo(UtlString&amp;amp; UUSinfo);&lt;/span&gt;&lt;/p&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;The methods itself is quite simple:&lt;/span&gt;&lt;br /&gt;&lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;UtlBoolean SipSession::setUsertoUserInfo(UtlString&amp;amp; UUSinfo)&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span lang="FI"  style="font-size:78%;"&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span lang="FI"  style="font-size:78%;"&gt;&lt;span style=""&gt;    &lt;/span&gt;mUUSinfo = UUSInfo;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span lang="FI"  style="font-size:78%;"&gt;&lt;span style=""&gt;    &lt;/span&gt;return(UUSinfo != NULL);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);" class="MsoNormal"&gt;&lt;span style="font-size:78%;"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;The last question is where do you call this methods to populate the info correctly. After much searching, the only place that made sense was in a method called getSession (which seems wierd to me as it seems to be a method that gets data rather than writes data.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;UtlBoolean SipConnection::getSession(SipSession&amp;amp; session)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString callId;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    getCallId(&amp;amp;callId);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    SipSession ssn;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    UtlString temp;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    ssn.setCallId(callId.data());&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    ssn.setLastFromCseq(mCSeqMgr.getCSeqNumber(CSEQ_ID_INVITE));&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    ssn.setLastToCseq(lastRemoteSequenceNumber);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    ssn.setFromUrl(mFromUrl);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    ssn.setToUrl(mToUrl);&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;    // Prashant&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    ssn.setUsertoUserInfo(mUsertoUserInfo);&lt;/span&gt;&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;And finally, we have to assign the variable to the current instance of the SIPSession&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;SipSession::operator=(const SipSession&amp;amp; rhs)&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;{&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   if (this == &amp;amp;rhs)            // handle the assignment to self case&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;      return *this;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   UtlString::operator=(rhs);  // assign fields for parent class&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mLocalUrl = rhs.mLocalUrl;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mRemoteUrl = rhs.mRemoteUrl;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mLocalContact = rhs.mLocalContact;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mRemoteContact = rhs.mRemoteContact;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mInitialMethod = rhs.mInitialMethod;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mInitialLocalCseq = rhs.mInitialLocalCseq;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mInitialRemoteCseq = rhs.mInitialRemoteCseq;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mLastFromCseq = rhs.mLastFromCseq;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mLastToCseq = rhs.mLastToCseq;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   mSessionState = rhs.mSessionState;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   msLocalRequestUri = rhs.msLocalRequestUri;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   msRemoteRequestUri = rhs.msRemoteRequestUri;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic; color: rgb(51, 102, 255);font-size:78%;" &gt;   msContactUriStr = rhs.msContactUriStr;&lt;/span&gt;&lt;span style="font-size:78%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; font-style: italic; color: rgb(51, 51, 255);font-size:78%;" &gt;   mUUSInfo=rhs.mUUSInfo;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;At this point, when sipXFireCallEvent is called, mUUSInfo contains the correct inforamtion to be written into SIPX_CALL_DATA and to be used by the SIP_API&lt;span style="font-weight: bold; font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-5309558419018011295?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/5309558419018011295/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=5309558419018011295' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/5309558419018011295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/5309558419018011295'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/09/accessing-user-to-user-info-in-sip.html' title='Accessing User to User Info in a SIP invite message via sipXtapi'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-8508642634850882528</id><published>2007-06-21T10:51:00.001+02:00</published><updated>2011-07-11T15:38:58.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Using Wikis to decentrailze management of a lab</title><content type='html'>Problem: A large lab enviroment. Several MSCs, with different software loads. Several BSSs, again running different software loads all of which can be connected at different times to different MSCs. All these BSSs have multiple cells, whose coverage can be connected to different offices. (There is more equipment on top of this that needs to be tracked but I'll use this basic setup to show how wikis can be used to decentralize the management of this lab environment)&lt;br /&gt;In the past, there was a single person who was in charge of this. Any changes to the configuration went through him/her. He tracked the configuration, triggered and tracked the changes, and if there were any problems, was the point of contact for that as well. He updated the config books, kept track of data changes to all the nodes (which with a large environment used by numerous projects was a big task), did the short term booking for the nodes and the long term planning for the lab, and was in charge of making sure the lab was correctly configured for each project using each node, i.e. patches were up to date, config that was requested was correct, and the lab was working when it was needed.&lt;br /&gt;Then came the budget cuts. The position wasn't eliminated as such but the funding for a dedicated person disappeared. So we were left with a task that remained unchanged but no actual budget to address that task.&lt;br /&gt;The first attempt to remedy the situation was to split the role between many individuals: One person for each MSC, one person for the BSSs, and one person in charge overall. They took over the tasks in addition to their usual tasks. As things got hectic however, this was the task was the first to be ignored.&lt;br /&gt;On the one hand, this kind of bookkeeping task is abhorred by engineers. It is also the most thankless. No one notices when things are going well. That's what's expected but when things aren't going well, the amount of complaining is frustrating. Its a very obvious failure and people really like to stick it to you that you're not doing your job. It seems like whatever frustrations are being felt are taken out on the lab managers when things go wrong.&lt;br /&gt;It was a bit of a Catch-22. On the one hand, you cannot pass this task on to someone without the requisite experience. That's an immediate recipe for disaster. On the other hand, experience and knowledge is required for other  projects as well and allocating that for lab upkeep seems a bit of a waste.&lt;br /&gt;It was quickly realized that centralizing the task even further as not option given the manpower available and the whole team needed to step up and address this from a decentralized point. The wiki turned out be a good solution to the problems we faced though it in itself is not a full solution.&lt;br /&gt;&lt;br /&gt;Short term Booking&lt;br /&gt;Booking is done via the wiki on a first come/first serve basis. It is done on an MSC basis and on a cell basis. Any conflicts are ironed out between the people first and then via the project managers. The complaints are that a previous booking can be overwritten without the previous person's knowledge. That's true but the wiki does keep track of who's making the changes and you can get emails when pages are changed. So there are ways to track this. In the end though, if there's an a-hole in your department, a wiki gives that person more ways of being an a-hole.&lt;br /&gt;&lt;br /&gt;Long Term planning&lt;br /&gt;This has been taken over by a manager. It cannot be taken over via a wiki. It really requires one person looking at the inputs and deceiding what's required in the future.&lt;br /&gt;&lt;br /&gt;Updating the config books&lt;br /&gt;Config books are updated per person based on the changes made. If you make a change and it is not reflected in the config book, then a change to he configuration noted in the config book can be made at any time. This gives people an impetus to update the config book when a change is made. This method functions most fruitfully when the configurations are checked to make sure they match the config book. A person to check that the config books are up to data is required (pehaps a manager) but they avoid being the target of any bitching. Everyone knows the policy and if it is not followed, well then...tough.&lt;br /&gt;&lt;br /&gt;Hardware changes&lt;br /&gt;This can be decentralized based on experience. Caveat: A change that is not done correctly can hose the system and finding out what that change is can be time consuming. We went through stages where all changes were  decentralized and based on our experiences, have centralized some tasks and left others to the herd. The problem with centralizing the task is that the people whose responsibility it is need to have time to do the task requested. In our lab, based on the number of projects running concurrently and the changes required, it may be beyond the capacity of the person put in charge. It really should be decentralized completely but compaints have been too numerous.&lt;br /&gt;Once a hardware change is made, the wiki is updated with the change. Thus everyone can check what the current configuration is and what needs to be requested or done.&lt;br /&gt;&lt;br /&gt;Making sure a lab is correctly configured&lt;br /&gt;This again is decentralized to a degree. There are designated people to take care of the activities that should happen at regualr intervals. For anything that is specific to a project, the person running the project is responsible. Any changes that causes a system wide change are noted on specific wiki pages. So if another project is seeing some wierd issues, then there are specific wiki pages to check. Again, there are complaints but no one has been able to come up with a better system and the system currently works pretty well, akin to PGP.&lt;br /&gt;&lt;br /&gt;The main problem with the current system is people not updating the wiki. The whole system depends on that happening but especially when things are extra busy, updating the wiki is not upmost in people's minds. We have threatened punitive measures to keep transgressors in line but none have been actually imposed. It just seems like it would cause more pissed off people than anything else. Less adherence rahter than more.&lt;br /&gt;&lt;br /&gt;At the moment, the benefits of using the wiki outweight the costs. It frees us, in a large part, from a single point of contact for much of lab mangement and it frees a single person from mind numbing work. However, the amount of work that goes into lab management has decreased significantly and in general, the lab isn't in as good a shape as before. However, the risks added to specific projects due to this change have been minimal, and the quality of our products have not suffered due to this change.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-8508642634850882528?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/8508642634850882528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=8508642634850882528' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/8508642634850882528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/8508642634850882528'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/06/using-wikis-to-decentrailze-management.html' title='Using Wikis to decentrailze management of a lab'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-6039836528348092479</id><published>2007-04-03T09:33:00.001+02:00</published><updated>2011-07-11T15:38:58.360+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>How not to implement an automation platform</title><content type='html'>The task that my team works on is the end to end test and integration of a communications network. Struggling though a period of mass layoffs where there weren't enough minds and bodies available to perform the minimum tasks required to get a robust product out to our customers, we took the forward looking approach and dedicated some mind/timeshare into implementing an automation platform. The idea was that it would allow us to increase our work load by shifting repetitive tasks to automation while allowing us greater test coverage plus it would allow us to focus our energies on the interesting work, the non-repetitive stuff.&lt;br /&gt;&lt;br /&gt;One thing I immediately learned is that engineers like to implement automation platforms. I liked it. Its fun. Challenging. The meetings were full of energy and ideas. I also learned that engineers do not like debugging automation platforms. Once the software and hardware was up and running and the platform was proven functional, working on stability issues was the last thing anyone wants to do. The answer from everyone always was "Well, it worked for me. Must be your setup/testcase/server/coverage." It was never the automation platform that was the problem.&lt;br /&gt;&lt;br /&gt;Work on the platform started in 2004 and this week, the whole project was finally put to rest. What follows is the post-mortem, i.e. what not and what to do when implementing an automation platform&lt;br /&gt;1. There were some repetitive tasks being done at the time we undertook the automation platform but they were not large. It was maybe a day's worth of work every month. The thought when this started was that those repetitive tasks would get larger or that we would run automated tests more often if an automation platform was available. There were a range of tests that we could cover with the platform that were not being done today.&lt;br /&gt;It turned out that the tests that were being run repeatedly were not unmasking bugs. We were running the tests which were always passing. A warm fuzzy feeling followed but nothing else. After a while, it became apparent that the tests were a waste of time and they were stopped. However, the link to the work on automation platform was not apparent. We continued working on the automation platform even though the initial requirement was no longer valid. The thought was to keep looking forward without really looking forward.&lt;br /&gt;It also turned out that the problems that were being reported by customers were not those that could be uncovered by automation. So the range of tests that was not being done and potentially could be covered by automation was not at all essential to the stability or robustness of the product. Yet again, the link to the work on the automation platform was not made. It seemed like the work on automation already in progress could not be stopped. Time and effort already spent required more time and effort. Though apparent now, it wasn't really apparent at the time.&lt;br /&gt;Finally, no one like doing repetitive tasks, even if they're simple to do. That was the reason to undertake the automation platform. On the same hand, no one takes on more repetitive tasks just because they're made easier. They're still repetitive. Its still doing the same thing again and the overhead of testing is still there. I've never heard an engineer say " I've got some time. Let me run some automated testcases" I've often heard an engineer say "F****** automated testcases again. F***"&lt;br /&gt;&lt;br /&gt;2. Testing an end to end network where software on multiple nodes is updated frequently in probably not the ideal environment for an automation platform. But that one of the key drivers to begin with. We have so many changes to the network that we need an low labor intensive method to see if basic functionalities were still functioning. However, the testing required to cover the software changes were always so specific that the effort to automate those tests never made sense. It seemed that there were a lot of tests in a lot of different testplans that were alike (probably because basic tests were always included and testplans were copied from one another) but the bulk of the work were tests that were unique and time consuming. Tests that could not be automated. So the automation platform wasn't really making a dent in our workload.&lt;br /&gt;&lt;br /&gt;Configuring an automation system where so many changes were happening also required quite a bit of work. Automation does not respond well to large scale changes and the work required for upkeep of the system was large. In the end, the total effort saved was nil or maybe even in the negative. Lack of minds/bodies was exacerbated by the need for reconfiguring. Automation was not really saving us time. People were giving up on using the automation platform cause so much reconfiguring and tweaking was needed before their automation runs. Since there was no central person responsible for the platform, the person who required the automation run was basically also responsible to make sure it was in working order before they began. That resulted in a lot of frustration and people began giving up on the platform before they even really used it.&lt;br /&gt;&lt;br /&gt;3. We did not have the budget for a dedicated system for the automation platform. We basically had to run our tests on a system that was under test at the same time by a lot of other users. A system with multiple nodes, each of which was simultaneously being tested by multiple people. Initially, the thought was that we would either be able to run automation when the system was not being used by other people,overnight for instance, or we would be able to create our own system within the system that could be shielded from other users. Both never fully worked.&lt;br /&gt;&lt;br /&gt;Resetting the system to a known initial starting point after use by many users was a nightmare. Things were changing that should not have been. I think we could've made this work, if there were people managing the changes. Lack of minds and bodies precluded us from setting that up. In our environment, managing changes meant an email saying something was going to be changed unless they heard otherwise was sent around. Rarely did they hear otherwise.&lt;br /&gt;&lt;br /&gt;Automation does not deal well to non-standard starting points. Changes to system under test can and do have severe effects on test results and when running suites of testcases, they produce totally incoherent results.&lt;br /&gt;&lt;br /&gt;I have read several documents that say a dedicated system is needed for automation. I do not think this is absolutely necessary. This can be gotten around by having a set of people managing the changes to the system. However, non dedicated system and all testers managing their own changes is a recipe for disaster.&lt;br /&gt;&lt;br /&gt;4. Writing testcases for automation was deemed to be one of the easier activities. We handed off the activity to a couple of contractors who ,with a few inputs from us, basically came up with the framework, wrote the testcases, verified them and passed them to us for a second round of verification. Based on the fact that they were getting paid per testcase, problems they were facing with robustness really didn't cause them any bother. To them, it wasn't the testcase that was the problem. It was the SUT or the automation platform. Of course, some of their failures had to do with both those things but the design of their testcases only exacerbated those issues. We also only saw a list of testcases that were being automated. No further info. In the end, we got a set of testcases that ran and passed sometimes and failed other times , even when there were no changes to the SUT. They were useless. We did get a framework for writing testcases but that may have been a curse in disguise as we never got around to totally rewriting the testcases from the ground up as we felt we had some work already done.&lt;br /&gt;The testcases have been through a few revisions. now looking nothing like the testcases originally writing and one can get consistent results from them. But not with all the other problems.&lt;br /&gt;&lt;br /&gt;Moral of the story: Automation is not a substitute for minds and bodies. It only shifts the work and it is continual if the SUT is continuously changing&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-6039836528348092479?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/6039836528348092479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=6039836528348092479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/6039836528348092479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/6039836528348092479'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/04/how-not-to-implement-automation.html' title='How not to implement an automation platform'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-4109006776906870782</id><published>2007-02-19T15:38:00.001+01:00</published><updated>2011-07-11T15:38:58.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>aTCA and the Telecom Service Provider</title><content type='html'>&lt;p class="MsoNormal"&gt;The promise of aTCA for telecom service providers is that it will unshackle then from their current relationship with their core network vendors. Currently, the core network vendors provide multiple proprietary large boxes plus huge amounts of proprietary software which cost millions of dollars. Switching vendors involves again the expenditure of millions of dollars, which the vendor knows cannot and will not be done lightly. Once a vendor has a foot in the door of the provider’s CO, the vendor kind of has the provider by the balls. &lt;/p&gt;    &lt;p class="MsoNormal"&gt;aTCA promises to reduce the huge capitol expenditures associated with changing vendors. The process could be as simple as switching out one module for another, in which case the capitol expenditure is the cost of the module, in the ten of thousands of dollars, plus the cost of software. The process could even be simplified to loading software from a different vendor onto an already installed blade. aTCA threatens to upend the current relationship between service providers and equipment vendors and could allow new vendors onto a marketplace that was closed to so many due immense capital expenses required.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;    &lt;p class="MsoNormal"&gt;In order to maximize the promise of aTCA, the telecom providers should insist on a chassis/backplane that meets the aTCA standard. It would be even better if they bought the chassis/backplane separately and then asked vendors to supply modules for the chassis that meet the various functions needed for their network. In this way, the provider forces vendors to meet the aTCA requirements and allows them the ability to mix and match modules from different vendors. Given the opportunity, a telecom provider will sell a chassis that is only compliant to their modules, thereby locking in the provider to their products. This approach prevents that. In addition, it increases the number of vendors that the provider has to choose from.&lt;o:p&gt;&lt;br /&gt;&lt;/o:p&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;Another step would be for the provider is to specify the hardware modules that fit into those shelves as well. They then by the modules on their own, and then ask their traditional telecom vendors to only supply the software required for those modules. This gets to the heart of what telecom vendors do best; providing robust software for off the shelf parts. This approach also allows for the new vendors on the telecom marketplace, companies that did not have the capitol to enter a hardware-software business but have the wherewithal to enter a purely software space. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-4109006776906870782?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/4109006776906870782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=4109006776906870782' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/4109006776906870782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/4109006776906870782'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2007/02/atca-and-telecom-service-provider.html' title='aTCA and the Telecom Service Provider'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-116516678821620222</id><published>2006-12-03T18:26:00.001+01:00</published><updated>2011-07-11T15:39:40.988+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>The joys of the German workplace</title><content type='html'>My experience of working in Germany is limited to one company and its not even a German company. From what I have heard from friends and acqaintances, my experience may not even be representative of the typical German workplace. But it is not atypical and goes a long way to show why I love working and living in Deutschland.&lt;br /&gt;If you open the door to the cupboard in my office, here's what you'll find inside:&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6000/631/1600/Beer%20-%20Cupboard.1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/200/Beer%20-%20Cupboard.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;And here's what the bottom drawer of my desk looks like&lt;br /&gt;Here are two pictures of my office, one of my closet with a case of beer in it and the next of my bottom drawer stuffed with empty bottles of beer.&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6000/631/1600/Beer%20-%20Drawer.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/200/Beer%20-%20Drawer.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Not that this is the norm within the company. Except for one other collegue (who also happens to be American), no one else has beer in their office. But the fact that I have beer bottles in my office is not something that I have to hide. Its completely allowed and accepted.&lt;br /&gt;Its so allowed that the Coke machine in the basement of our office building&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6000/631/1600/Coke%20Machine.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/200/Coke%20Machine.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;actually dispenses beer (Meckatzer is a beer from a brewery in Mekatz, a town nearby)&lt;br /&gt;&lt;a href="http://photos1.blogger.com/blogger/6000/631/1600/Beer%20-%20choices.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/200/Beer%20-%20choices.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The tradition at our company at least is that every employee that joins or leaves the company must throw an Einstand (for joining) or Austand (when leaving) Austands generally involve a lot of drinking on company premises, which generally start during work hours. So in effect, the company pays us to drink on the job.&lt;br /&gt;&lt;br /&gt;There's plenty of other things as well about the German workplace: Six weeks of holidays per year (but that's not so much if you count the vacation we're forced to take), we're only allowed to work ten hours a day (anything more is not counted towards overtime which I'll get to and if you get in an accident on your way home after working more than ten hours, the company is liable), and the best part: The company keeps track of the hours over eight that are worked. It can be taken as vacation or be paid out. As vacation, this can accrue quite quickly and lead to a lot of extra time off.&lt;br /&gt;&lt;br /&gt;The other pluses of living here: One of the German responses to the oil crisis in the 70s was to build a lot of bike paths to make it easier for people to use bicycles to get around. For about seven months out of the year, I'm able to ride my bike in to work. Its a bit more than 10 km each way and that saves me a whole lot of car usage, not to mention getting a good bit of exercise every day. The weather is often bad though and it can get cold. So biking regularly does require some perseverence but its fun.&lt;br /&gt;&lt;br /&gt;Are there only pluses? No there are minuses as well but for me, the pluses outweigh the minuses. The minuses: Tax rate is a bit high, especially if you have no kids. I'm paying a lot of money in social security and health insurance whose benefits I'm nost sure I'll ever get to enjoy. The country is aging and it can be seen in its acceptance and use of technology (a field in which I work)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-116516678821620222?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/116516678821620222/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=116516678821620222' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/116516678821620222'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/116516678821620222'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/12/joys-of-german-workplace.html' title='The joys of the German workplace'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-116516660515122288</id><published>2006-12-03T18:13:00.000+01:00</published><updated>2011-07-11T15:38:58.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Using javax.comm from your jar file</title><content type='html'>I tried all the suggestions for including javax.comm to my jar file but none of them worked. &lt;br /&gt;The problem I kept having was that the jar file I generated would never run for someone who did not have javax.comm installed. The only solution that worked for me was the following:&lt;br /&gt;Maifest file contained the following line:&lt;br /&gt;Class-Path: .\comm.jar&lt;br /&gt;&lt;br /&gt;And comm.jar must be present in the same directory as your jar file, i.e. I sent comm.jar along with my jar file and asked users to put both in the same directory.&lt;br /&gt;&lt;br /&gt;This worked for java version 1.5.0_09 but did not work for 1.4.x&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-116516660515122288?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/116516660515122288/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=116516660515122288' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/116516660515122288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/116516660515122288'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/12/using-javaxcomm-from-your-jar-file.html' title='Using javax.comm from your jar file'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-115677103792493175</id><published>2006-08-28T15:16:00.000+02:00</published><updated>2011-07-11T15:38:58.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Measuring Transfer Delay of Circuit Switched Data calls in Cellular Networks</title><content type='html'>Here is the requirement from Document No. O-2475, ERTMS/GSM-R Quality of Service Test Specification&lt;br /&gt;3.4 Transfer delay of user data frame&lt;br /&gt;3.4.1 Definition:&lt;br /&gt;This is the value of the elapsed time between the request for transfer of a data frame and the indication of successfully transferred end-to-end data frame.&lt;br /&gt;3.4.2 Pre-conditions for measurement:&lt;br /&gt;Measurement interfaces are IGSM(T) and IFIX(T), measurement point is IGSM(T)&lt;br /&gt;Only successfully received user data frames (ie data frames received with a correct CRC check sum) are evaluated.&lt;br /&gt;The length of data frame shall be 30 bytes.&lt;br /&gt;The fixed side responding application is a test application responsible for echoing all incoming data frames back to the sender.&lt;br /&gt;The response time of the test application shall be very small and negligible.&lt;br /&gt;3.4.3 For measurement:&lt;br /&gt;Round trip delay is an allowed measurement procedure.&lt;br /&gt;The test is performed by sending and receiving bytes and in the test application represented by ASCII characters.&lt;br /&gt;At IGSM(T), value of the half of elapsed time between start of transmission of a user data frame and end of reception of the same frame echoed back from B-subscriber terminal application is evaluated as transfer delay. The term 'user' refers to the user of the GSM-R bearer service.&lt;br /&gt;3.4.4 Recommended tools:&lt;br /&gt;Test application for control of terminal and automation (scripting).&lt;br /&gt;Test terminal for tracking possible failure in automated test, and/or&lt;br /&gt;Abis protocol analyser for tracking possible failure.&lt;br /&gt;GPS for position information.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This was accomplished using Rexx scripts on two PCs connected to mobiles via the serial port. The Rexx script set up the connection between the two mobiles. On the initiator side, the script prints out a time stamp before it started transmitting data. On the receiving side, once the expected data has been received, a time stamp is again printed. According to the definition in the test defined above, the tranmission delay time is half the elapsed time between the two printed times. &lt;br /&gt;&lt;br /&gt;Rexx Script for Originator:&lt;br /&gt;/* INITIALIZATION + GET NUMBER */&lt;br /&gt;OK=0&lt;br /&gt;BUSY=0&lt;br /&gt;FAIL=0&lt;br /&gt;TOUT=0&lt;br /&gt;ERROR=0&lt;br /&gt;TIMEOUT=0&lt;br /&gt;Speed="9600" /* Data Speed */&lt;br /&gt;CALL ZocCls  /* Clear Screen */&lt;br /&gt;SAY "Initialization starts, please wait..."&lt;br /&gt;CALL ZocSend "at+cr=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "at+crc=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "at+cmee=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "atx1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "ats0=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "ats2=67^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;SAY "Initialization done..."&lt;br /&gt;&lt;br /&gt;/* Loop of data calls */&lt;br /&gt; ZocSend "AT+CBST=71,0,0^M"&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 1     /* WAIT 1 SECOND */&lt;br /&gt; CALL ZocTimeout 45&lt;br /&gt; /* Dial the NUMBER */&lt;br /&gt; /* CALL ZocSend "ATD"NUMBER"^M" */&lt;br /&gt; CALL ZocSend "ATD8188074^M"&lt;br /&gt;&lt;br /&gt; /* Check for the result */&lt;br /&gt; &lt;br /&gt; DO LINE=1 TO 3&lt;br /&gt;  timeout=ZocGetLine()&lt;br /&gt;  IF timeout=640 THEN DO&lt;br /&gt;   TOUT=TOUT+1&lt;br /&gt;   SAY&lt;br /&gt;   SAY "XXXXX Timeout during Try " TRY "."&lt;br /&gt;   LEAVE LINE&lt;br /&gt;  END&lt;br /&gt;  IF LEFT(ZOCLASTLINE(),7)="CONNECT" THEN DO&lt;br /&gt;   OK=OK+1&lt;br /&gt;   CALL ZOCDELAY 4&lt;br /&gt;timenow=time('L')&lt;br /&gt;say 'Time' timenow&lt;br /&gt;   CALL ZocSend "00000000000000000000000000000" TRY&lt;br /&gt;   SAY "&gt;&gt;&gt;&gt;&gt; Testtransfer " TRY " is sent."&lt;br /&gt;   CALL ZOCDELAY 1&lt;br /&gt;   ZocWait "&lt;&lt;&lt;&lt;&lt; Testtransfer"   /* to wait for answer from datacall_receive Script */&lt;br /&gt;   CALL ZOCDELAY 2&lt;br /&gt;   LEAVE LINE&lt;br /&gt;  END /* IF */&lt;br /&gt;  IF LEFT(ZOCLASTLINE(),4)="BUSY" THEN DO&lt;br /&gt;   CALL ZocBeep 1&lt;br /&gt;   BUSY=BUSY+1&lt;br /&gt;   LEAVE LINE&lt;br /&gt;  END /* IF */&lt;br /&gt;  IF LEFT(ZOCLASTLINE(),10)="NO CARRIER" THEN DO&lt;br /&gt;   CALL ZocBeep 1&lt;br /&gt;   FAIL=FAIL+1&lt;br /&gt;   LEAVE LINE&lt;br /&gt;  END /* IF */&lt;br /&gt;  IF LEFT(ZOCLASTLINE(),5)="ERROR" THEN DO&lt;br /&gt;   CALL ZocBeep 1&lt;br /&gt;   ERROR=ERROR+1&lt;br /&gt;   LEAVE LINE&lt;br /&gt;  END /* IF */&lt;br /&gt; END LINE&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 5     /* WAIT 5 SECONDS */&lt;br /&gt; CALL ZocSend "+++"&lt;br /&gt; SAY&lt;br /&gt; SAY "+++ IS SENT"&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 5     /* WAIT 5 SECONDS */&lt;br /&gt; CALL ZocSend "ATH^M"&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 10     /* WAIT 10 SECONDS */&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rexx script for Terminator&lt;br /&gt;/* REXX test script for receive of data calls */&lt;br /&gt;&lt;br /&gt;/* INITIALIZATION + GET NUMBER */&lt;br /&gt;OK=0    /* counter */&lt;br /&gt;BUSY=0   /* counter */&lt;br /&gt;FAIL=0   /* counter */&lt;br /&gt;TIMEOUT=0   /* counter */&lt;br /&gt;CALL ZocTimeout 60 /* timeout value for ZocWait */&lt;br /&gt;Speed="9600"  /* Data Speed */&lt;br /&gt;CALL ZocCls   /* Clear Screen */&lt;br /&gt;SAY "Initialization starts, please wait..."&lt;br /&gt;CALL ZocSend "at+cr=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "at+crc=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "at+cmee=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "atx1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "ats0=1^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;CALL ZocSend "ats2=67^M"&lt;br /&gt;CALL ZOCDELAY 1&lt;br /&gt;SAY "Initialization done..."&lt;br /&gt;&lt;br /&gt;/* Loop of 100 data calls */&lt;br /&gt;DO TRY=1 TO 10&lt;br /&gt;&lt;br /&gt; CALL ZocSend "AT+CBST=71,0,0^M"&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 1     /* WAIT 1 SECOND */&lt;br /&gt; SAY "---&gt; Waiting for RING"&lt;br /&gt;&lt;br /&gt; ZocWait "+CRING" &lt;br /&gt; SAY "---&gt; Waiting for CR"&lt;br /&gt;&lt;br /&gt; ZocWait "+CR:" &lt;br /&gt; SAY "---&gt; Waiting for CONNECT"&lt;br /&gt;&lt;br /&gt; ZocWait "CONNECT" &lt;br /&gt; SAY "---&gt; Waiting for DATA"&lt;br /&gt;&lt;br /&gt; ZocWait "00000000000000000000000000000"&lt;br /&gt;timenow=time('L')&lt;br /&gt;say 'Time' timenow&lt;br /&gt;&lt;br /&gt; CALL ZOCDELAY 1     /* WAIT 1 SECOND */&lt;br /&gt; SAY&lt;br /&gt; CALL ZocSend "&lt;&lt;&lt;&lt;&lt; Testtransfer back: " TRY&lt;br /&gt; SAY "&lt;&lt;&lt;&lt;&lt; Testtransfer number " TRY " is sent back."&lt;br /&gt; CALL ZOCDELAY 1     /* WAIT 1 SECOND */&lt;br /&gt; SAY "---&gt; Waiting for NO CARRIER"&lt;br /&gt;&lt;br /&gt; ZocWait "NO CARRIER^M" &lt;br /&gt; CALL ZOCDELAY 1     /* WAIT 1 SECOND */&lt;br /&gt; SAY "##################################################################"&lt;br /&gt;&lt;br /&gt;END TRY&lt;br /&gt;CALL ZocBeep 2&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-115677103792493175?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/115677103792493175/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=115677103792493175' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/115677103792493175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/115677103792493175'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/08/measuring-transfer-delay-of-circuit.html' title='Measuring Transfer Delay of Circuit Switched Data calls in Cellular Networks'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-114392136080307021</id><published>2006-04-01T21:28:00.000+02:00</published><updated>2011-07-11T15:39:07.656+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>Carnival of the Mobilists #21</title><content type='html'>You can find the latest edition @&lt;br /&gt;http://www.mopocket.com/2006/03/the_21st_carnival_of_the_mobil.php&lt;br /&gt;&lt;br /&gt;Some interesting thoughts on cellphone culture from Howard Rheingold and Mimi Ito.&lt;br /&gt;I completely agree that the most important applications of the next generation of mobile culture will be those that are adopted or appropriated by kids on the streets of Shanghai or Rio or Bombay (probably not Milan), places where competing technologies, landlines, broadband, etc,  are less reliable or widely available and mobiles are the main form of voice/data access. &lt;br /&gt;&lt;br /&gt;A few articles applauding the EU's decision to abolish roaming charges within Europe&lt;br /&gt;I think this is the wrong way to go about this (maybe its an American view) as a market as competitive as wireless should be able to set competitive rates without interference. If all carriers are setting the same price, then its either that they need the revenue or they're in collusion with one another. If it made no economic sense, then at least one of the carriers would be advertising no roaming charges to grab more customers. If they're in collusion, then the anti-trust laws should be invoked against them. Setting prices seems a bit arcane.&lt;br /&gt;It appears to me like this is a decision to prove that the EU commision is doing something rather than a decision that will actually produce tangible results to users at large. &lt;br /&gt;&lt;br /&gt;Some interesting questions about skyping.&lt;br /&gt;What don't Iike about Skype? The free version that is. It adds to the unmanageable interruptions in my lie. Landlines or mobiles come with voice mail. Messaging enables me to send back a response when I have the time. But Skype. If I don't answer the call, then that conversation is lost. Either I or the perosn that called have to remember to retry.  And if you do answer, then whatever you were doing is interrupted. Its a 21st century technology wrapped in an early 20th century mentality. I need a service that lets me manage my interruptions better. Cause there are so many of them. Skype's not it.&lt;br /&gt;&lt;br /&gt;And much more....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-114392136080307021?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/114392136080307021/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=114392136080307021' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114392136080307021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114392136080307021'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/04/carnival-of-mobilists-21.html' title='Carnival of the Mobilists #21'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-114297132174163616</id><published>2006-03-21T21:01:00.000+01:00</published><updated>2011-07-11T15:38:58.361+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>A google-like location based service</title><content type='html'>A google-like location based service&lt;br /&gt;&lt;br /&gt;In a new city/neighborhood and trying to find a good place to eat which is nearby? Or a decent place to grab a drink? Or a club? And you've got your mobile. What if you were able to get a listing of places where people tend to congregate, the theory being that if a lot of people frequent a place, then chances are that's its a decent spot.&lt;br /&gt;&lt;br /&gt;How would you implement this? Use the functionality already used to provide location based mobile services. At a very high level, here's the idea.&lt;br /&gt;&lt;br /&gt; First, getting recommendations for places. For this, the service would send an SMS (or any service that gets you back a response with location info) to your group of mobilists, at certain times of the day: lunchtime (for good lunchspots), dinnertime (popular restaurants), maybe later in the evening (someplace to grab a drink) and perhaps at midnight on Fridays and Saturdays, for clubs. If they wish, they simply reply with an empty message, which is basically a vote for a place. Using the location info in the reply, you can map where they are. If you get a lot of responses around lunchtime from the same location and a bit of post processing determines the location is a restaurant, then you would rank it as a good spot to eat lunch. &lt;br /&gt;&lt;br /&gt;The thing that strikes me as powerful about this idea for getting recommendations is that a recommendation is only valid if it is sent from the place that is recommended. So you're getting recommendations from people who are at the place right then and there. Its also a very simple response, i.e. no filling out forms on a website, which may prod users to make more recommendations.&lt;br /&gt;&lt;br /&gt;Second, giving out recommendations to people, or how would someone use this service. Its lunch time. A hungry mobilist is looking for a place to eat. They send an SMS to the service which contains the word restaurant. The service responds with a map based on their location, which was contained in the SMS, and restaurants nearby that have received votes, including the number of votes received. They can then base their decision on where to eat lunch based on other people's recommendations.&lt;br /&gt;&lt;br /&gt;Someone at google is already working on this, I know. Or maybe it already exists. Stuck in my little corner of Germany, the modern world really doesn't get here too quickly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-114297132174163616?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/114297132174163616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=114297132174163616' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114297132174163616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114297132174163616'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/03/google-like-location-based-service.html' title='A google-like location based service'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-114217172996899012</id><published>2006-03-12T14:54:00.000+01:00</published><updated>2011-07-11T15:39:40.989+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='general'/><title type='text'>Wireless market in Iraq</title><content type='html'>An article in this month's Spectrum magazine about the wireless market in Baghdad (http://www.spectrum.ieee.org/mar06/3071/1) states that "many middle class Iraqis are paying an astounding 25% - 50% of their income for cell phones." And this for a phone with which you can't roam into or call anyone in a competing wireless network.&lt;br /&gt;&lt;br /&gt;Putting that into perspective, that would mean in Germany (where I currently live), a person would be willing to pay between $335 and $770 per month for a mobile. That's on par with what someone would pay for rent. In Iraq, for some people, having a mobile is as important as having a roof over your head. &lt;br /&gt;&lt;br /&gt;Anybody still questioning the transformative power of wireless telephony need only look at that statistic. I think its difficult to judge the effect of mobile telephony in first world societies as other competing technologies are just as easily (and perhaps more cheaply) available but its in the midst of chaos that mobile telephony  really shines. The (relatively) minimal infrastructure required, the ubiquitous availability of the service. Its easy to see how its transforms the functioning of societies&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-114217172996899012?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/114217172996899012/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=114217172996899012' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114217172996899012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/114217172996899012'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/03/wireless-market-in-iraq.html' title='Wireless market in Iraq'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8949719.post-113941342963577587</id><published>2006-02-08T16:35:00.000+01:00</published><updated>2011-07-11T15:38:58.362+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><title type='text'>GSM Milenage – Implementing it at the network level</title><content type='html'>Of the descriptions I have read explaining GSM Milenage, none clearly explain what is involved in implementing it at a network level. The info that is required to accomplish this is not the nuts and bolts of how the authentication or key generation work (which is more of a software design interest when implementing Milenage) but rather which nodes in the network are affected and what is additionally required at these node.&lt;br /&gt;&lt;br /&gt;Generally speaking, GSM Milenage is implemented in networks where A3/A8 authentication and key generation algorithms, which preceded Milenage, are already implemented. So this discussion will start with the requirements of the A3/A8 algorithms on a network level and then show what the additional overhead is for Milenage.&lt;br /&gt;When A3/A8 algorithms are implemented, here’s how authentication and key generation work&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6000/631/1600/GSM%20current.0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6000/631/320/GSM%20current.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The inputs are the Ki and the RAND. The outputs are the SRES (which is derived by applying an algorithm known as A3 to the Ki and RAND) and Kc (which is derived by applying an algorithm known as A8 to the Ki and RAND)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6000/631/1600/Network%20-%20GSM%20Current.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/320/Network%20-%20GSM%20Current.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;Pic&gt;&lt;br /&gt;&lt;br /&gt;To implement it at a network level, the Ki must be stored on the HLR and the SIM and must be identical to each other. On the HLR and the SIM, the A3/A8 algorithms must be implemented, again identically. Only when these two conditions are met can the SIM and the HLR compute SRES values and Ki values that match one another. The matching of these vlaues computed on two different nodes is the success criteria for authentication and key generation.&lt;br /&gt;&lt;br /&gt;Switching to GSM Milenage adds an extra input and replaces the A3/A8 algorithms with Milenage algorithms, which are adapted for a GSM network&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6000/631/1600/GSM%20Milenage%20pics%20for%20blog2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/320/GSM%20Milenage%20pics%20for%20blog2.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;The extra input required is the OPc (which, like the Ki, is stored on the SIM card and on the HLR and have to be identical) So SIM cards which support Milenage must contain this extra value known as OPC. Like the Ki, it must be synced between the SIM card and HLR.&lt;br /&gt;&lt;br /&gt;It may be that SIM cards already in use in the network may not be upgradeable to support GSM Milenage algorithms. In that instance, both A3/A8 algorithms as well as GSM Milenage algorithms will need to be supported in the network. Either that or all SIM cards must be exchanged for new ones. &lt;br /&gt;&lt;br /&gt;To explain how to implement the chage from the A3/A8 algorithm to the Milenage algorithm, we need to look at bit more deeply at the nuts and bolts of the GSM Milenage Algorithm. The A3/A8 algorithm used previously is replaced by five different functions in Milenage: f2, f3 and f4, and two others, which use the outputs of f2, f3 and f4 to compute the Kc and the SRES.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6000/631/1600/GSM%20Milenage%20pics%20for%20blog3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://photos1.blogger.com/blogger/6000/631/320/GSM%20Milenage%20pics%20for%20blog3.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The three functions, f2, f3 and f4, come directly from the Milenage standard. The two functions used to compute the Kc and SRES are the adaptations to Milenage that allow it to be used in the GSM network.&lt;br /&gt;&lt;br /&gt;The three functions known as f2, f3 and f4 are defined in the standard for Milenage, 3GPP TS 35.205. Any explanation of those three functions will make this discussion far too complicated. Suffice to say that the definition of these three functions are customer controlled and require that values for six variables, c2, c3, c4, r2, r3,  and r4, be chosen and stored identically on the HLR and on the SIM.&lt;br /&gt;&lt;br /&gt;The last additional overhead is choosing the SRES derivation function. There are two defined and the one chosen must be the same on both the HLR and the SIM. A Kc derivation function must also be implemeted on the SIM and the HLR but that is a internal requirement for the SIM and the HLR and does not add any further actions when implementing Milenage at a network level.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/6000/631/1600/Network%20-%20Milenage.0.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6000/631/320/Network%20-%20Milenage.0.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;So implementing Milenage at a network level requires,&lt;br /&gt;1. Ki, and OPc must be stored on the HLR as well as the SIM with identical values. &lt;br /&gt;2. Three functions, f2, f3 and f4 much be implemented on both the HLR and the SIM and six values associated with those functions, c2, c3, c4, r2, r3, and r4, must also be stored identically on the SIM and the HLR.&lt;br /&gt;3. The SRES function chosen must be identically implemented on both the HLR and SIM and the function to compute must also be implemented.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8949719-113941342963577587?l=discobabu.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://discobabu.blogspot.com/feeds/113941342963577587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8949719&amp;postID=113941342963577587' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/113941342963577587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8949719/posts/default/113941342963577587'/><link rel='alternate' type='text/html' href='http://discobabu.blogspot.com/2006/02/gsm-milenage-implementing-it-at.html' title='GSM Milenage – Implementing it at the network level'/><author><name>Disco Babu</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://photobucket.com/albums/v355/keenajohn/th_prt.jpg'/></author><thr:total>24</thr:total></entry></feed>
