This section presents the full source code of a working sample widget
for the SystemInfo
Service. You can download the wgz
package for
this widget from section Example widgets.
For general information about creating widgets, see section Widget component files.
For widget development and debugging purposes, this example writes its
output to c:\data\jslog_widget.log
using console.info
.
For instructions on how to enable logging in the Web browser for S60, see
section JavaScript console.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Nokia//DTD PLIST 1.0//EN" "http://www.nokia.com/NOKIA_COM_1/DTDs/plist-1.0.dtd"> <plist version="1.0"> <dict> <key>DisplayName</key> <string>SysInfoSample</string> <key>Identifier</key> <string>com.nokia.widget.sapi.sysinfo.sample</string> <key>Version</key> <string>1.0</string> <key>MainHTML</key> <string>sysinfo-sample.html</string> </dict> </plist>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <script type="text/javascript" src="js/common.js"></script> <script type="text/javascript" src="js/sysinfo-sample.js"></script> </head> <body id='docBody' bgcolor="#ddeeff" onload="setup()" style=width:100%;height:100%;> <form name="frm"> <h3>Sysinfo API Sample Widget</h3> <input type="button" onclick="getSysInfo('img1')" value="GetSysInfo"><img id="img1" src="pic/blank.png" width="25" height="25" align="center"><br> <input type="button" onclick="setSysInfo('img2')" value="SetSysInfo"><img id="img2" src="pic/blank.png" width="25" height="25" align="center"><br> <input type="button" onclick="getSysInfoAsync('img3')" value="GetSysInfoAsync"><img id="img3" src="pic/blank.png" width="25" height="25" align="center"><br> <input type="button" onclick="getNotification('img4')" value="GetNotification"><img id="img4" src="pic/blank.png" width="25" height="25" align="center"><br> <input type="button" onclick="cancelGetSysInfoAsync('img5')" value="CancelGetSysInfoAsync"><img id="img5" src="pic/blank.png" width="25" height="25" align="center"><hr> <div class='sysinfo' id='sysinfo' bgcolor="#ddeeff" style=width:100%;height:100%;overflow:auto></div> </form> </body> </html>
// common.js // // This file contains some utility functions // Check the error code and show the information to users function checkError(message, resultList, divId, imgId) { var errCode = resultList.ErrorCode; var msg = ""; if (errCode) { msg = message + "<BR>" + "Failed Error: " + errCode + "<BR>"; if(resultList.ErrorMessage != undefined) msg += "Error Message: " + resultList.ErrorMessage; showIMG(imgId,"no"); } else { showIMG(imgId,"yes"); } //print error message if(divId != null && divId != undefined) document.getElementById(divId).innerHTML = msg; console.info(msg); return errCode; } // Build the message by reading a iteratorable list in a recursive manner function showIterableList(iterator) { var msg = ""; try { iterator.reset(); var item; while (( item = iterator.getNext()) != undefined ){ msg += showObject( item ); } } catch(e) { alert('<showIterableList> ' + e); } return msg; } // Build the message by reading a JS object in a recursive manner function showObject( obj ) { var txt = ""; try { if ( typeof obj != 'object' ) return "" + obj + '<BR/>'; else { for(var key in obj) { txt += key + ":"; txt += showObject( obj[key] ); txt += '<BR/>'; } txt += '<BR/>'; } } catch (e) { alert("showObject: " + e); } return txt; } // Show the image to indicate the test result function showIMG(imgId, isOK) { if(imgId == null || imgId == undefined) return; if(isOK == "yes") document.getElementById(imgId).src = "pic/yes.png"; else if(isOK == "no") document.getElementById(imgId).src = "pic/no.png"; else document.getElementById(imgId).src = "pic/blank.png"; } // Show elements in object by using 'alert' function testObject(obj) { var msg = ""; for(var key in obj) { msg = msg + ":" + key + "=" + obj[key]; } alert(msg); } // Test whether the input is numeric function IsNumeric(sText) { var ValidChars = "0123456789."; var IsNumber=true; var Char; for (i = 0; i < sText.length && IsNumber == true; i++) { Char = sText.charAt(i); if (ValidChars.indexOf(Char) == -1) { IsNumber = false; } } return IsNumber; }
// sysinfo-sample.js // // In this sample system information will be listed and changed; The // notification will be send when the system info changes; Also, // async operation will be canceled. // //SAPI Error Codes // 0 - Success // 1000 - InvalidServiceArgument // 1001 - UnknownArgumentName // 1002 - BadArgumentType // 1003 - MissingArgument // 1004 - ServiceNotSupported // 1005 - ServiceInUse // 1006 - ServiceNotReady // 1007 - NoMemory // 1008 - HardwareNotAvailable // 1009 - ServerBusy // 1010 - EntryExists // 1011 - AccessDenied // 1012 - NotFound // 1013 - UnknownFormat // 1014 - GeneralError // 1015 - CancelSuccess // 1016 - ServiceTimedOut // 1017 - PathNotFound // Declare the service object var so; // imgid for callback1 function var imgid_callback1; // imgid for callback2 function var imgid_callback2; // imgid for callback3 function var imgid_callback3; // id of the div used to display information const DIV_ID = 'sysinfo'; // Called from onload() function setup() { try { so = device.getServiceObject("Service.SysInfo", "ISysInfo"); console.info("setup: so: %s", so); } catch (e) { alert('<setup> ' +e); } } //Get SysInfo function getSysInfo(imgId) { // get the entity var entity = prompt("Please enter the Entry", "General"); var key = prompt("Please enter the Key", "VibraActive"); var criteria = new Object(); criteria.Entity = entity; criteria.Key = key; try { var result = so.ISysInfo.GetInfo(criteria); if(!checkError("ISysInfo::getSysInfo",result,DIV_ID,imgId)) { document.getElementById(DIV_ID).innerHTML = showObject(result.ReturnValue); } } catch (e) { showIMG(imgId,"no"); alert ("getSysInfo: " + e); } } //Set SysInfo function setSysInfo(imgId) { // get the entity var entity = prompt("Please enter the Entry", "General"); var key = prompt("Please enter the Key", "VibraActive"); var vals = prompt("Please enter the new Value", 0); var systemData = new Object(); if(IsNumeric(vals)) { systemData.Status = parseInt(vals); } else { systemData.StringData = vals; } var criteria = new Object(); criteria.Entity = entity; criteria.Key = key; criteria.SystemData = systemData; try { var result = so.ISysInfo.SetInfo(criteria); checkError("ISysInfo::setSysInfo",result,DIV_ID,imgId); } catch (e) { showIMG(imgId,"no"); alert ("setSysInfo: " + e); } } //Get SysInfo function getSysInfoAsync(imgId) { // get the entity var entity = prompt("Please enter the Entry", "Network"); var key = prompt("Please enter the Key", "HomeNetwork"); var criteria = new Object(); criteria.Entity = entity; criteria.Key = key; try { imgid_callback1 = imgId; var result = so.ISysInfo.GetInfo(criteria, callback1); if(!checkError("ISysInfo::getSysInfoAsync",result,DIV_ID,imgId)) showIMG(imgId, ""); } catch (e) { showIMG(imgId,"no"); alert ("getSysInfoAsync: " + e); } } // set callback function for notification function getNotification(imgId) { // get the entity var entity = prompt("Please enter the Entry", "General"); var key = prompt("Please enter the Key", "VibraActive"); var criteria = new Object(); criteria.Entity = entity; criteria.Key = key; try { imgid_callback2 = imgId; var result = so.ISysInfo.GetNotification(criteria,callback2); if(!checkError("ISysInfo::getNotification",result,DIV_ID,imgId)) showIMG(imgId, ""); } catch (e) { showIMG(imgId,"no"); alert ("setSysInfo: " + e); } } //Ccancel SysInfo function cancelGetSysInfoAsync(imgId) { // get the entity var entity = prompt("Please enter the Entry", "Network"); var key = prompt("Please enter the Key", "HomeNetwork"); var criteria = new Object(); criteria.Entity = entity; criteria.Key = key; try { imgid_callback3 = imgId; var result = so.ISysInfo.GetInfo(criteria, callback3); if(!checkError("ISysInfo::cancelGetSysInfoAsync",result,DIV_ID,imgId)){ var criteria2 = new Object(); criteria2.TransactionID = result.TransactionID; var cresult = so.ISysInfo.Cancel(criteria2); checkError("ISysInfo::cancelGetSysInfoAsync",cresult,DIV_ID,imgId); } } catch (e) { showIMG(imgId,"no"); alert ("cancelGetSysInfoAsync: " + e); } } // This is the asynchronous callback handler function callback1(transId, eventCode, result) { console.info("callback1: transId: %d eventCode: %d result.ErrorCode: %d", transId, eventCode, result.ErrorCode); if(!checkError("callback1::getSysInfoAsync",result,DIV_ID,imgid_callback1)) { document.getElementById(DIV_ID).innerHTML = showObject(result.ReturnValue); } } // This is the asynchronous callback handler function callback2(transId, eventCode, result) { console.info("callback2: transId: %d eventCode: %d result.ErrorCode: %d", transId, eventCode, result.ErrorCode); if(!checkError("callback2::getNotification",result,DIV_ID,imgid_callback2)) { document.getElementById(DIV_ID).innerHTML = "Got Notification!Following settings changed!\n" + showObject(result.ReturnValue); } } // This is the asynchronous callback handler function callback3(transId, eventCode, result) { console.info("callback3: transId: %d eventCode: %d result.ErrorCode: %d", transId, eventCode, result.ErrorCode); if(!checkError("callback3::getNotification",result,DIV_ID,imgid_callback3)) { document.getElementById(DIV_ID).innerHTML = showObject(result.ReturnValue); } }