ds/impl/IPPAdaptor.js

/**
 * @fileoverview This file contains the IPad Protocol Adaptor and its related
 *               utility function. There is quite a lot of code dedicated to
 *               data structure conversion, this is intentional and provides a
 *               layer of abstraction between the exported web service code and
 *               GUI code. It is unclear at the time of writing if the VIViD 
 *               protocol will be implemented in this client or if the ipad 
 *               protocol will be implemented in the stand alone server. This
 *               abstraction of the protocol implementation will allow for both 
 *               options.
 * 
 * TODO: add more assertions of protocol data conversions later.
 *
 * @author anders.rejdebrant@spark-vision.com (Anders Rejdebrant)
 */

goog.provide('spv.ds.impl.IPPAdaptor');

goog.require('spv.ds.UserConfigInfo');
goog.require('spv.ds.ConfigLoadResult');
goog.require('spv.ds.DisplayPrice');
goog.require('spv.ds.FacebookShareData');
goog.require('spv.ds.FreshConfig');
goog.require('spv.ds.GuiPath');
goog.require('spv.ds.GuiPathItem');
goog.require('spv.ds.Loan');
goog.require('spv.ds.ImageParams');
goog.require('spv.ds.ImageResult');
goog.require('spv.ds.IntroPage');
goog.require('spv.ds.IntroPageConfig');
goog.require('spv.ds.IntroPageGroup');
goog.require('spv.ds.ItemResources');
goog.require('spv.ds.ItemSummary');
goog.require('spv.ds.MenuItem');
goog.require('spv.ds.MenuNode');
goog.require('spv.ds.SessionStateUpdate');
goog.require('spv.ds.Summary');
goog.require('spv.ds.impl.AuxData');
goog.require('spv.ds.impl.Bump');
goog.require('spv.ds.impl.BumpItem');
goog.require('spv.ds.impl.BumpSerie');
goog.require('spv.ds.impl.IDsProtocol');
goog.require('spv.ds.impl.IPPCommon');
goog.require('spv.ds.impl.SessionInitData');

goog.require('spv.ds.ipprot.IpadClient');
goog.require('spv.ds.ipprot.boosterconfig.FreshConfig');
goog.require('spv.ds.ipprot.boosterconfig.Result');
goog.require('spv.ds.ipprot.boostercshw.AuxiliaryCarrier');
goog.require('spv.ds.ipprot.boostercshw.AuxiliaryCarrier_v2');
goog.require('spv.ds.ipprot.boostercshw.Bump');
goog.require('spv.ds.ipprot.boostercshw.BumpItem');
goog.require('spv.ds.ipprot.boostercshw.BumpMenu');
goog.require('spv.ds.ipprot.boostercshw.BumpSerie');
goog.require('spv.ds.ipprot.boostercshw.ConfigBop');
goog.require('spv.ds.ipprot.boostercshw.GuiItem');
goog.require('spv.ds.ipprot.boostercshw.GuiPath');
goog.require('spv.ds.ipprot.boostercshw.MenuNode');
goog.require('spv.ds.ipprot.boostercshw.OutBop');
goog.require('spv.ds.ipprot.boostercshw.OutBopSummary');
goog.require('spv.ds.ipprot.boostercshw.OutBopUpdate');
goog.require('spv.ds.ipprot.boostercshw.PdfGenerationResult');
goog.require('spv.ds.ipprot.boostermiddle.Category');
goog.require('spv.ds.ipprot.boostermiddle.FacebookShareData');
goog.require('spv.ds.ipprot.intropage.Configuration');
goog.require('spv.ds.ipprot.intropage.Groups');
goog.require('spv.ds.ipprot.intropage.Root');
goog.require('spv.ds.ipprot.dsproto.SessionInitData');




/**
 * Protocol adaptor for spv.ds.ipprot.IpadClient
 *
 * Resposible for hiding protocol data types and interpreting reponse data to
 * failures in cases where errors are reported inside the normal result data.
 * eg. Result codes from load config operations.
 *
 * @constructor
 * @implements {spv.ds.impl.IDsProtocol}
 * @param {string} service_url
 * @param {boolean} use_jsonp
 */
spv.ds.impl.IPPAdaptor = function(service_url, use_jsonp)
{
	/** @type {spv.ds.ipprot.IpadClient} */
	this._impl = new spv.ds.ipprot.IpadClient(service_url, use_jsonp);

	/** @type {Object.<string,boolean>} */
	this.disabled_item = {};
};




/**
 * Fetches an image for a serialized configuration.
 * 
 * @param {spv.ds.Config} conf
 * @param {spv.ds.ImageParams} img_params
 * @param {function(spv.ds.ImageResult)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.getConfigImage = function(
		conf,
		img_params,
		on_success,
		on_failure)
{
	var proto_success = function(image_url)
	{
		var result = new spv.ds.ImageResult(image_url);
		on_success(result);
	};
	this._impl.get_config_image(
			conf.data,
			conf.encoding,
			img_params.scaled_width,
			img_params.scaled_height,
			img_params.serie_name,
			img_params.frame,
			img_params.crop_x_ratio,
			img_params.crop_y_ratio,
			img_params.cropped_width,
			img_params.cropped_height,
			img_params.skip.join(';'),
			img_params.skip_groups.join(';'),
			img_params.only_use.join(';'),
			img_params.only_use_groups.join(';'),
			img_params.file_type,
			img_params.use_hd,
			img_params.keep_aspect_ratio,
			img_params.auto_crop,
			proto_success,
			on_failure);
};




/**
 * @param {function(spv.ds.IntroPage)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.getIntroPage = function(
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.intropage.Root} proto_intro_page */
	var proto_success = function(proto_intro_page)
	{
		var intro_page = spv.ds.impl.IPPCommon.convertToIntroPage(proto_intro_page);
		on_success(intro_page);
	};
	this._impl.init_settings(proto_success, on_failure);
};




/**
 * @param {string} item_id
 * @param {string} model
 * @param {string} category
 * @param {function(Array.<spv.ds.ReadMoreResource>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.getReadMore = function(
	item_id,
	model,
	category,
	language,
	on_success,
	on_failure)
{
	throw Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {Array<string>} item_ids
 * @param {string} category
 * @param {string} model
 * @param {string} language
 * @param {function(Object<string,spv.ds.ItemResources>)} on_success
 * @param {function(Error)} on_failure
 **/
spv.ds.impl.IPPAdaptor.prototype.getItemResources = function(
	item_ids,
	category,
	model,
	language,
	on_success,
	on_failure)
{
	throw Error( "Not yet implemented for legacy booster." );
}




/**
 * @param {string} username
 * @param {function(Array.<spv.ds.SavedConfig>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.getUserConfigList = function(
	username,
	on_success,
	on_failure)
{
	throw Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {Array.<string>} group_ids
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionAddGuiGroupSubscriptions = function(
	session_id,
	group_ids,
	on_success,
	on_failure )
{
	throw Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionClearGuiGroupSubscriptions = function(
	session_id,
	on_success,
	on_failure )
{
	throw Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {function(string)} on_success    Callback taking the generated pdf url
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGeneratePdf = function(
		session_id,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boostercshw.PdfGenerationResult} pdf_result */
	var handle_protocol = function(pdf_result)
	{
		var pdf_code = pdf_result.result_code;
		if ('SUCCESS' != pdf_code)
		{
			throw new Error('Pdf generator failed with code: ' + pdf_code);
		}
		var pdf_url = pdf_result.url;
		if (!pdf_url || '' == pdf_url)
		{
			throw new Error('Pdf generator returned empty url');
		}
		on_success(pdf_url);
	};
	this._impl.generate_pdf(
			session_id,
			'',
			false,
			false,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} encoding
 * @param {function(spv.ds.Config)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetConfig = function(
		session_id,
		encoding,
		on_success,
		on_failure)
{
	/** @param {string} conf_data */
	var on_protocol_success = function(conf_data)
	{
		var conf = new spv.ds.Config(encoding, conf_data);
		on_success(conf);
	};
	this._impl.get_config_as_string(
			session_id,
			encoding,
			on_protocol_success,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {function(Array.<string>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetConfigNames = function(
		session_id,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boosterconfig.Result} result */
	var handle_protocol = function(result)
	{
		on_success(result.Output);
	};
	this._impl.get_configs(session_id, handle_protocol, on_failure);
};




/**
 * @param {string} session_id
 * @param {function(spv.ds.FacebookShareData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetFacebookShareData = function(
		session_id,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boostermiddle.FacebookShareData} proto_data */
	var handle_protocol = function(proto_data)
	{
		var share_data = spv.ds.impl.IPPCommon.convertToFacebookShareData(proto_data);
		on_success(share_data);
	};
	this._impl.get_facebook_share_data(
			session_id,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {number} limit
 * @param {number} scale_width
 * @param {number} scale_height
 * @param {function(Array.<spv.ds.FreshConfig>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetFreshConfigs = function(
		session_id,
		limit,
		scale_width,
		scale_height,
		on_success,
		on_failure)
{
	/** @param {Array.<spv.ds.ipprot.boosterconfig.FreshConfig>} proto_data */
	var handle_protocol = function(proto_data)
	{
		var fresh_configs = spv.ds.impl.IPPCommon.convertToFreshConfigs(proto_data);
		on_success(fresh_configs);
	};
	var ctime = 0;
	var meta_filter = 'MODEL;ENGINE;GEAR';
	this._impl.get_fresh_configs(
			session_id,
			ctime,
			limit,
			meta_filter,
			scale_width,
			scale_height,
			handle_protocol,
			on_failure);
};




/**
 * @param {number} limit
 * @param {number} scale_width
 * @param {number} scale_height
 * @param {function(Array.<spv.ds.FreshConfig>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.getFreshConfigs = function(
		limit,
		scale_width,
		scale_height,
		on_success,
		on_failure)
{
	throw new Error( "Not supported in legacy backend." );
};




/**
 * @param {string} session_id
 * @param {spv.ds.ImageParams} img_params
 * @param {function(spv.ds.ImageResult)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetImage = function(
		session_id,
		img_params,
		on_success,
		on_failure)
{
	/** @param {string} image_url */
	var handle_image_success = function(image_url)
	{
		var result = new spv.ds.ImageResult(image_url); 
		on_success(result);
	};
	this._impl.get_current_config_image(
			session_id,
			img_params.scaled_width,
			img_params.scaled_height,
			img_params.serie_name,
			img_params.frame,
			img_params.crop_x_ratio,
			img_params.crop_y_ratio,
			img_params.cropped_width,
			img_params.cropped_height,
			img_params.skip.join(';'),
			img_params.skip_groups.join(';'),
			img_params.only_use.join(';'),
			img_params.only_use_groups.join(';'),
			img_params.file_type,
			img_params.use_hd,
			img_params.keep_aspect_ratio,
			img_params.auto_crop,
			handle_image_success,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {Array.<string>} item_ids
 * @param {string} language
 * @param {function(Array.<spv.ds.MenuItem>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetItemInfo = function(
		session_id,
		item_ids,
		language,
		on_success,
		on_failure)
{
	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}
	var that = this;
	/** @param {Array.<spv.ds.ipprot.boostercshw.OutBopUpdate>} obus */
	var on_proto_success = function(obus)
	{
		that.storeItemDisabledFlags( [obus] );
		var result = spv.ds.impl.IPPCommon.convertToMenuItems(obus);
		on_success(result);
	};
	this._impl.get_item_info(
			session_id,
			item_ids.join(';'),
			on_proto_success,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {number} serie_index
 * @param {number} frame_index
 * @param {string} file_type
 * @param {boolean} separate_background
 * @param {boolean} separate_shadow
 * @param {boolean} all_frames
 * @param {boolean} use_hd
 * @param {number} image_width
 * @param {number} image_height
 * @param {function(string)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetMediaKit = function(
	session_id,
	serie_index,
	frame_index,
	file_type,
	separate_background,
	separate_shadow,
	all_frames,
	use_hd,
	image_width,
	image_height,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented in IPPAdaptor." );
};




/**
 * @param {string} session_id
 * @param {string} item_id
 * @param {function(Array.<spv.ds.impl.GoalStateResolver>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetStateResolvers = function(
		session_id,
		item_id,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boostercshw.OutResolvers} out_resolver */
	var on_protocol_success = function(out_resolver)
	{
		var goal_resolver = spv.ds.impl.IPPCommon.convertToGoalStateResolver(out_resolver);
		var result = [goal_resolver];
		on_success(result);
	};
	this._impl.get_state_resolvers(
			session_id,
			item_id,
			on_protocol_success,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {function(spv.ds.Summary)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetSummary = function(
		session_id,
		on_success,
		on_failure)
{
	var that = this;
	/** @param {spv.ds.ipprot.boostercshw.OutBop} out_bop */
	var handle_protocol = function(out_bop)
	{
		that.storeItemDisabledFlags( out_bop.updates );
		var s = spv.ds.impl.IPPCommon.extractSummary(out_bop);
		on_success(s);
	};
	this._impl.bip(
			session_id,
			'',
			'BTN_SUMMARY',
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {spv.ds.ImageParams} img_params
 * @param {function(spv.ds.ImageResult)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetUserConfigImage = function(
		session_id,
		config_name,
		img_params,
		on_success,
		on_failure)
{
	var proto_success = function(image_url)
	{
		var result = new spv.ds.ImageResult(image_url);
		on_success(result);
	};
	this._impl.get_user_config_image(
			session_id,
			config_name,
			img_params.scaled_width,
			img_params.scaled_height,
			img_params.serie_name,
			img_params.frame,
			img_params.crop_x_ratio,
			img_params.crop_y_ratio,
			img_params.cropped_width,
			img_params.cropped_height,
			img_params.skip.join(';'),
			img_params.skip_groups.join(';'),
			img_params.only_use.join(';'),
			img_params.only_use_groups.join(';'),
			img_params.file_type,
			img_params.use_hd,
			img_params.keep_aspect_ratio,
			img_params.auto_crop,
			proto_success,
			on_failure);
};



/**
 * @param {string} session_id
 * @param {string} filter_name
 * @param {spv.ds.PresentationStructureQuery} query
 * @param {function(spv.ds.PresentationStructure)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGetPresentationStructure = function(
		session_id,
		filter_name,
		query,
		on_success,
		on_failure )
{
	throw Error( "Not yet implemented for legacy booster." );
};




/**
 * Hides multiple server calls required to initialize
 *
 * @param {string} menu_query
 * @param {string} readmore_mode
 * @param {string} language
 * @param {number} ttl    NOT IMPLEMENTED IN PRE-NOVA BOOSTER
 * @param {string} origin NOT IMPLEMENTED IN PRE-NOVA BOOSTER
 * @param {string} category NOT IMPLEMENTED IN PRE-NOVA BOOSTER
 * @param {function(spv.ds.impl.SessionInitData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionCreate = function(
		menu_query,
		readmore_mode,
		language,
		ttl,
		origin,
		category,
		on_success,
		on_failure)
{
	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}

	/** @type {spv.ds.impl.SessionInitData} */
	var sid;

	/** @param {spv.ds.ipprot.dsproto.SessionInitData} proto_sid */
	var on_session_success = function(proto_sid)
	{
		sid = spv.ds.impl.IPPCommon.convertToSessionInitData(proto_sid);
		on_success(sid);
	};
	this._impl.create_session(
			menu_query,
			readmore_mode,
			on_session_success,
			on_failure);
};


/**
 * @param {string} session_id
 * @param {string} language
 * @param {function(spv.ds.impl.SessionInitData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionResume = function(
		session_id,
		language,
		on_success,
		on_failure)
{
	throw Error( "Not yet implemented for legacy booster." );
}


/**
 * @param {string} session_id
 * @param {spv.ds.Config} config
 * @param {string} language
 * @param {function(spv.ds.ConfigLoadResult, spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionLoadConfig = function(
		session_id,
		config,
		language,
		on_success,
		on_failure)
{
	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}

	/** @param {spv.ds.ipprot.boostercshw.ConfigBop} config_bop */
	var handle_protocol = function(config_bop)
	{
		var config_load_result = spv.ds.impl.IPPCommon.convertToConfigLoadResult(config_bop);
		var out_bop = config_bop.bops[0];
		var state_update = spv.ds.impl.IPPCommon.convertToSessionStateUpdate(out_bop);
		var aux_data = spv.ds.impl.IPPCommon.extractAuxiliaryData(out_bop);
		on_success(
			config_load_result,
			state_update,
			aux_data );
	};
	this._impl.load_config_from_string(
			session_id,
			config.data,
			config.encoding,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {function(spv.ds.ConfigLoadResult, spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionLoadConfigByName = function(
		session_id,
		config_name,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boostercshw.ConfigBop} config_bop */
	var handle_protocol = function(config_bop)
	{
		var config_load_result = spv.ds.impl.IPPCommon.convertToConfigLoadResult(config_bop);
		var out_bop = config_bop.bops[0];
		var state_update = spv.ds.impl.IPPCommon.convertToSessionStateUpdate(out_bop);
		var aux_data = spv.ds.impl.IPPCommon.extractAuxiliaryData(out_bop);
		on_success(config_load_result, state_update, aux_data);
	};
	this._impl.load_config(
			session_id,
			config_name,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {function(spv.ds.ConfigLoadResult, spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionLoadPublicConfig = function(
		session_id,
		config_name,
		on_success,
		on_failure)
{
	/** @param {spv.ds.ipprot.boostercshw.ConfigBop} config_bop */
	var handle_protocol = function(config_bop)
	{
		var config_load_result = spv.ds.impl.IPPCommon.convertToConfigLoadResult(config_bop);
		var out_bop = config_bop.bops[0];
		var state_update = spv.ds.impl.IPPCommon.convertToSessionStateUpdate(out_bop);
		var aux_data = spv.ds.impl.IPPCommon.extractAuxiliaryData(out_bop);
		on_success(config_load_result, state_update, aux_data);
	};
	this._impl.load_public_config(
			session_id,
			config_name,
			handle_protocol,
			on_failure);
};



/**
 * @param {string} session_id
 * @param {function(string)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionGeneratePublicConfig = function(
	session_id,
	on_success,
	on_failure )
{
	var handle_protocol = function(result)
	{
		if(result == 'SERVICE_FAILURE')
			throw new Error(result);
		else
			on_success(result);
	};
	this._impl.generate_public_config(
		session_id,
		"", // Sending an empty string makes booster generate a unique name.
		handle_protocol,
		on_failure );
}



/**
 * @param {string} session_id
 * @param {string} user_name
 * @param {string} password
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionLogin = function(
		session_id,
		user_name,
		password,
		on_success,
		on_failure)
{
	if( password !== "" )
		throw new Error("Legacy booster doesn't support login with password.");

	/** @param {string} result_code */
	var handle_protocol = function(result_code)
	{
		if ('SUCCESS' == result_code)
		{
			on_success();
			return;
		}
		throw new Error('sessionLogin failed with code: ' + result_code);
	};
	this._impl.login(
			session_id,
			user_name,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {function(boolean)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionLogout = function(
		session_id,
		on_success,
		on_failure)
{
	throw new Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {string} user_name
 * @param {string} password
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionCreateUser = function(
		session_id,
		user_name,
		password,
		on_success,
		on_failure)
{
	throw new Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {function(boolean)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionHasLoggedInUser = function(
		session_id,
		on_success,
		on_failure)
{
	throw new Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {string} main_url
 * @param {string} user_name
 * @param {string} language
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionSendResetPasswordMail = function(
		session_id,
		main_url,
		user_name,
		language,
		on_success,
		on_failure)
{
	throw new Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} token
 * @param {string} new_password
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.resetPassword = function(
		token,
		new_password,
		on_success,
		on_failure)
{
	throw new Error( "Not yet implemented for legacy booster." );
};




/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionRemoveConfigByName = function(
		session_id,
		config_name,
		on_success,
		on_failure)
{
	/** @param {string} result_code */
	var handle_protocol = function(result_code)
	{
		if ('SUCCESS' == result_code)
		{
			on_success();
			return;
		}
		throw new Error('Remove config failed with code: ' + result_code);
	};
	this._impl.remove_config(
			session_id,
			config_name,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {boolean} allow_overwrite
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionSaveConfigByName = function(
		session_id,
		config_name,
		allow_overwrite,
		on_success,
		on_failure)
{
	var handle_protocol = function(result_code)
	{
		if ('SUCCESS' == result_code)
		{
			on_success();
			return;
		}
		throw new Error(result_code);
	};
	this._impl.save_config(
			session_id,
			config_name,
			allow_overwrite,
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} price_localization_id
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionSetPriceLocalization = function(
		session_id,
		price_localization_id,
		on_success,
		on_failure)
{
	/** @param {boolean} result_flag */
	var handle_protocol = function(result_flag)
	{
		if (true == result_flag)
		{
			on_success();
		}
		else
		{
			throw new Error('sessionSetPriceLocalization failed for id: ' +
							price_localization_id);
		}
	};
	this._impl.set_price_localization(
			session_id,
			price_localization_id,
			handle_protocol,
			on_failure);
};





/**
 * @param {string} session_id
 * @param {string} item_id
 * @param {string} category
 * @param {string} language
 * @param {function(spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_bop
 * @param {function(Array.<spv.ds.impl.GoalStateResolver>)} on_resolvers
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionToggleItem = function(
	session_id,
	item_id,
	category,
	language,
	on_bop,
	on_resolvers,
	on_failure )
{
	spv.assert.isFunction(on_bop, 'on_bop');
	spv.assert.isFunction(on_resolvers, 'on_resolvers');
	spv.assert.isFunction(on_failure, 'on_failure');

	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}

	if( this.disabled_item[item_id] )
	{
		this.sessionGetStateResolvers(
				session_id,
				item_id,
				on_resolvers,
				on_failure);
	}
	else
	{
		this.sessionBip(
				session_id,
				category,
				[item_id],
				'',
				on_bop,
				on_failure);
	}
};




/**
 * @param {string} session_id
 * @param {string} category
 * @param {Array.<string>} item_ids
 * @param {string} language
 * @param {function(spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionBip = function(
		session_id,
		category,
		item_ids,
		language,
		on_success,
		on_failure)
{
	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}
	var that = this;
	/** @param {spv.ds.ipprot.boostercshw.OutBop} out_bop */
	var handle_protocol = function(out_bop)
	{
		that.storeItemDisabledFlags( out_bop.updates );
		var state_update = spv.ds.impl.IPPCommon.convertToSessionStateUpdate(out_bop);
		var aux_data = spv.ds.impl.IPPCommon.extractAuxiliaryData(out_bop);
		on_success(state_update, aux_data);
	};
	this._impl.bip(
			session_id,
			category,
			item_ids.join(';'),
			handle_protocol,
			on_failure);
};




/**
 * @param {string} session_id
 * @param {string} language
 * @param {function(spv.ds.SessionStateUpdate, spv.ds.impl.AuxData)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionUpdateBop = function(
	session_id,
	language,
	on_success,
	on_failure )
{
	var that = this;
	if( language )
	{
		throw new Error( "The use of the language argument is not supported in legacy booster." );
	}
	/** @param {spv.ds.ipprot.boostercshw.OutBop} out_bop */
	var handle_protocol = function( out_bop )
	{
		that.storeItemDisabledFlags( out_bop.updates );
		var state_update = spv.ds.impl.IPPCommon.convertToSessionStateUpdate(out_bop);
		var aux_data = spv.ds.impl.IPPCommon.extractAuxiliaryData(out_bop);
		on_success(state_update, aux_data);
	};
	this._impl.rebop( session_id, handle_protocol, on_failure );
}


/**
 * @param {string} session_id
 * @param {function(string)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.sessionSendHeartBeat = function(
	session_id,
	on_success,
	on_failure)
{
	this._impl.heartbeat(session_id, on_success, on_failure);
}






/**
 * @private
 * @param {Array.<spv.ds.ipprot.boostercshw.OutBopUpdate>} bop_updates
 */
spv.ds.impl.IPPAdaptor.prototype.storeItemDisabledFlags = function( bop_updates )
{
	for (var i = 0; i < bop_updates.length; i++)
	{
		var bop_update = bop_updates[i];
		this.disabled_item[ bop_update.id ] = bop_update.disabled;
	}
};



/**
 * @param {string} session_id
 * @param {number} config_id
 * @param {string} description
 * @param {Object.<string,string>} user_config_aux
 * @param {Object.<string,string>} config_storage_aux
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.userConfigV2Save = function(
	session_id,
	config_id,
	description,
	user_config_aux,
	config_storage_aux,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {string} config_name
 * @param {string} config_description
 * @param {Object.<string,string>} user_config_aux
 * @param {Object.<string,string>} config_storage_aux
 * @param {function(number)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.userConfigV2SaveAs = function(
	session_id,
	config_name,
	config_description,
	user_config_aux,
	config_storage_aux,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {number} config_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.userConfigV2Delete = function(
	session_id,
	config_id,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {function(Array<spv.ds.UserConfigInfo>)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.userConfigV2List = function(
	session_id,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {number} config_id
 * @param {function()} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.userConfigV2Load = function(
	session_id,
	config_id,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {string} public_config_id
 * @param {Function} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.publicConfigV2Load = function(
	session_id,
	public_config_id,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
};


/**
 * @param {string} session_id
 * @param {string} description
 * @param {Object.<string, string>} config_storage_aux
 * @param {function(spv.ds.PublicConfigInfo)} on_success
 * @param {function(Error)} on_failure
 */
spv.ds.impl.IPPAdaptor.prototype.publicConfigV2Save = function(
	session_id,
	description,
	config_storage_aux,
	on_success,
	on_failure)
{
	throw new Error( "Not implemented." );
}