--- /dev/null
+/**
+ * Contact.js
+ *
+ * Nokia Web Runtime Service API emulation
+ * WRT v1.1
+ *
+ * Copyright 2009 Nokia Corporation. All rights reserved.
+*/
+
+
+(function(){
+
+ var provider = 'Service.Contact' ,
+ Interface = 'IDataSource';
+
+ /**
+ * Contact service
+ */
+ var ContactService = function(){
+ this.GetList = __GetList;
+ this.Add = __Add;
+ this.Delete = __Delete;
+ this.Import = __Import;
+ this.Export = __Export;
+ this.Organise = __Organise;
+ this.Cancel = __Cancel;
+ }
+
+ device.implementation.extend(provider, Interface, new ContactService() );
+
+
+ /******************************************************/
+ /******************************************************/
+ /******************************************************/
+
+ var context = device.implementation.context,
+ _t = context._t,
+ method = '',
+ result = false,
+ DBase = null;
+
+ /**
+ * Contact: GetList
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __GetList(criteria, callback){
+
+ if ((result = validator.apply('GetList', arguments)) !== false)
+ return result;
+
+ if (!/^(Contact|Group|Database)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType);
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ var returnValue = [],
+ match = null,
+ filter = criteria.Filter || null;
+
+ DBase = context.getData(provider);
+
+ // Type = Database
+ if (/Database/i.test(criteria.Type)){
+ returnValue = DBase.Database;
+ }
+ // Type = Group
+ else if (/Group/i.test(criteria.Type)){
+ // filter by id
+ if (filter && filter.id) {
+ returnValue = findById(DBase.Group, filter.id);
+ if (returnValue.length == 0)
+ return error(device.implementation.ERR_NOT_FOUND);
+ }
+ // return all groups
+ else {
+ returnValue = DBase.Group;
+ }
+ }
+ // Type = Contact
+ else if (/Contact/i.test(criteria.Type)){
+
+ // filter by id
+ if (filter && filter.id) {
+ returnValue = findById(DBase.Contact, filter.id);
+ if (returnValue.length == 0)
+ return error(device.implementation.ERR_NOT_FOUND);
+ }
+ // return all contacts
+ else {
+ returnValue = DBase.Contact;
+ }
+
+ // unsupported filters
+ if (filter
+ && (match = context.keys(filter).join().match(/SearchVal|DBUri/ig)) ) {
+ context.notify(_t('%s:: GetList : filter %s not implemented in preview').arg(provider, match.join()));
+ }
+ // unsupported sort
+ if (criteria.Sort) {
+ context.notify(_t('%s:: GetList : sort not implemented in preview').arg(provider));
+ }
+ }
+ return context.Result(context.Iterator(returnValue));
+ }
+
+ /**
+ * Contact: Add
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __Add(criteria, callback){
+
+ if ((result = validator.apply('Add', arguments)) !== false)
+ return result;
+
+ if (!/^(Contact|Group)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ DBase = context.getData(provider);
+ var Data = criteria.Data,
+ item;
+
+ // unsupported!
+ if (Data.DBUri) {
+ context.notify(_t('%s:: Add : Data.DBUri not implemented in preview').arg(provider));
+ }
+
+ // Type = Group
+ if (/Group/i.test(criteria.Type)){
+
+ if (!Data.GroupLabel)
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.missingGroupLabel);
+
+ // update
+ if (Data.id) {
+ returnValue = findById(DBase.Group, Data.id);
+ if (returnValue.length == 0)
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+
+ returnValue[0].GroupLabel = Data.GroupLabel;
+ //@todo: group contents!?
+ }
+ // new
+ else {
+ item = context.extend({}, Data);
+ item.id = String(context.getUniqueID());
+ DBase.Group.push(item);
+ }
+ }
+ // Type = Contact
+ else {
+ // update
+ if (Data.id) {
+ returnValue = findById(DBase.Contact, Data.id);
+ if (returnValue.length == 0)
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE);
+
+ context.extend(returnValue[0], Data);
+ }
+ // new
+ else {
+ item = context.extend({}, Data);
+ item.id = String(context.getUniqueID());
+ DBase.Contact.push(item);
+ }
+ }
+ // return success
+ return error(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /**
+ * Contact: Delete
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __Delete(criteria, callback){
+
+ if ((result = validator.apply('Delete', arguments)) !== false)
+ return result;
+
+ if (!/^(Contact|Group)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType2);
+
+ var Data = criteria.Data;
+ if (!Data.IdList)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+ if (typeof Data.IdList != 'object')
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+
+ DBase = context.getData(provider);
+ var type = criteria.Type;
+
+ // unsupported!
+ if (Data.DBUri) {
+ context.notify(_t('%s:: Delete : Data.DBUri not implemented in preview').arg(provider));
+ }
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ // for both Group & Contact:
+ var i,j,id,item;
+ for (j in Data.IdList) {
+ id = Data.IdList[j];
+ for (i in DBase[type]) {
+ item = DBase[type][i];
+ if (id == item.id) {
+ DBase[type].splice(i, 1);
+ }
+ }
+ }
+ // return success
+ return error(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /**
+ * Contact: Import
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __Import(criteria, callback){
+
+ if ((result = validator.apply('Import', arguments)) !== false)
+ return result;
+
+ if (!/^(Contact)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType3);
+
+ var Data = criteria.Data;
+ if (!Data.SourceFile)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingSourceFile);
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ context.notify(_t('%s:: Import : not implemented in preview.').arg(provider));
+ return error(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /**
+ * Contact: Export
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __Export(criteria, callback){
+
+ if ((result = validator.apply('Export', arguments)) !== false)
+ return result;
+
+ if (!/^(Contact)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badType4);
+
+ var Data = criteria.Data;
+ if (!Data.DestinationFile)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingDestinationFile);
+
+ if (!Data.id)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId);
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ context.notify(_t('%s:: Export : not implemented in preview.').arg(provider));
+ return error(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /**
+ * Contact: Organise
+ * @param {Object} criteria
+ * @param {Function} [callback] function for async call (optional)
+ */
+ function __Organise(criteria, callback){
+
+ if ((result = validator.apply('Organise', arguments)) !== false)
+ return result;
+
+ if (!/^(Group)$/i.test(criteria.Type))
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badType5);
+
+ var Data = criteria.Data;
+ if (!Data.id)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingId2);
+
+ if (!Data.IdList)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingIdList);
+
+ if (typeof Data.IdList != 'object')
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badIdList);
+
+ if (!/^(Associate|Disassociate)$/i.test(criteria.OperationType))
+ return error(device.implementation.ERR_BAD_ARGUMENT_TYPE, msg.badOperationType);
+
+ if (typeof callback == 'function') {
+ return context.callAsync(this, arguments.callee, criteria, callback);
+ }
+
+ context.notify(_t('%s:: Organise : not implemented in preview.').arg(provider));
+ return error(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /**
+ * Contact: Cancel
+ * @param {Object} criteria
+ */
+ function __Cancel(criteria){
+ method = 'Cancel';
+ if (!criteria || !criteria.TransactionID)
+ return error(device.implementation.ERR_INVALID_SERVICE_ARGUMENT, msg.missingTID);
+
+ clearTimeout(criteria.TransactionID);
+ return context.ErrorResult(device.implementation.ERR_SUCCESS);
+ }
+
+
+ /*******************************
+ * helper functions
+ *******************************/
+
+ function error(code, msg /*, args...*/){
+
+ var args = ['Contacts',method].concat([].slice.call(arguments,2));
+ msg = msg ? _t().arg.apply(msg,args) : undefined;
+ return context.ErrorResult(code, msg);
+ }
+
+ /**
+ * validate common input arguments
+ * 'this' is string (object) name of calling function
+ *
+ * @param {arguments} arguments of calling function
+ * @return {Result} Result object if error, false if no error.
+ */
+ function validator() {
+ method = ''+this;
+ var failed = false,
+ criteria = arguments[0] || false;
+
+ if (!criteria || typeof criteria != 'object' || typeof criteria.Type == 'undefined')
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingType, method);
+
+ if (method == 'GetList') return failed;
+
+ var Data = criteria.Data || false;
+ if (!Data)
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.missingData, method);
+ if (typeof Data != 'object')
+ return error(device.implementation.ERR_MISSING_ARGUMENT, msg.badData);
+
+ return failed;
+ }
+
+
+ function findById(dbase, id){
+ var result = [];
+ for (var i in dbase) {
+ if (id == dbase[i]['id']) {
+ result.push(dbase[i]);
+ }
+ }
+ return result;
+ }
+
+ /**
+ * error messages
+ * order of %s args: Service name, method name, parameter name
+ */
+ var msg = {
+ missingType : '%s : %s : Type is Missing',
+ badType : '%s: %s : Invalid value for Type, Must be Contact/Group/Database',
+ badType2 : '%s : %s : Invalid Type, must be Contact/Group',
+ badType3 : '%s : %s : Invalid Type,it must be Contact',
+ badType4 : '%s : %s : Invalid Type, it must be Contact',
+ badType5 : '%s : %s : Invalid Content Type, It must be Group',
+ badOperationType: '%s : %s : Invalid Operation Type',
+ missingGroupLabel: '%s : %s : Group Label is Missing',
+ missingTID : 'Contact : Cancel : TransactionID is missing', // not 'Contacts'!!
+ badAsync : '%s : %s : Invalid async parameters',
+ missingData : '%s : %s : %s data Missing',
+ badData : '%s : %s : Invalid Type of Data , Map is required',
+ missingIdList : '%s : %s : List of Ids is missing',
+ badIdList : '%s : %s : Type of IdList is wrong, List is required',
+ missingSourceFile: '%s : %s : Import Source Filename is Missing',
+ missingDestinationFile: '%s : %s : Export Destination Filename is Missing',
+ missingId : '%s : %s : Contact Id to be exported is missing',
+ missingId2 : '%s : %s : GroupId is missing',
+ is_missing : '%s : %s : %s is missing',
+ is_invalid : '%s : %s : %s is invalid'
+ };
+
+
+}) ()
+