/*
 * Licensed to OMTP Ltd. (OMTP) under one or more contributor license agreements. 
 * See the NOTICE file distributed with this work for additional information regarding 
 * copyright ownership. 
 * 
 * The Reference Implementation (save for such parts of the reference implementation made 
 * available under separate terms and conditions) is made available under the terms of the 
 * Apache License, version 2.0, subject to the condition that any "Works" and "Derivative 
 * Works" used or distributed for commercial purposes must be and remain compliant with the
 * BONDI specification as promulgated by OMTP in each release. Your implementation of the 
 * Reference Implementation (whether object or source) must maintain these conditions, and 
 * you must notify any recipient of this condition in a conspicuous way.
 * 
 * You may not use this BONDI Reference Implementation except in compliance with the License. 
 * 
 * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 or at 
 * http://bondi.omtp.org/BONDI-LICENSE-2.0 
 */

/**
 * \brief Common BONDI functionality.
 *
 * These definitions can be used in all other BONDI modules as dependencies.
  * \version 1.1
 */
module bondi {

	/**
	 * \brief Array of DOMStrings.
	 */
	typedef sequence<DOMString> StringArray;

	/**
	 * \brief Array of 8-bit unsigned integer values.
	 */
	typedef sequence<octet>     ByteArray;

	/**
	 * \brief Array of 16-bit signed integer values.
	 */
	typedef sequence<short>     ShortArray;

	/**
	 * \brief Array of 32-bit signed integer values.
	 */
	typedef sequence<long>      LongArray;

	/**
	 * \brief Array of floating point values.
	 */
	typedef sequence<float>     FloatArray;

	/**
	 * \brief Generic Map object.
	 */
	typedef Object              Map;

	/**
	 * \brief Generic success callback interface.
	 */
	[Callback=FunctionOnly, NoInterfaceObject] interface SuccessCallback {
	   /**
	    * \brief Method invoked when the asynchronous call completes successfully
	    */
		void onSuccess();
	};


	/**
	 * \brief Success callback interface for requestFeature invocations
	 */
    [Callback=FunctionOnly, NoInterfaceObject] interface RequestFeatureSuccessCallback {
       /**
	    * \brief Method invoked upon a succesful requestFeature invocation
	    *
	    * \param ob Object implementing the JavaScript API associated with the requested Feature.
	    */
        void onSuccess(in Object ob);
     };


	/**
	 * \brief Generic error callback interface.
	 */
	[Callback=FunctionOnly, NoInterfaceObject] interface ErrorCallback {
	   /**
	    * \brief Method invoked when an error occurs
	    *
	    * \param error The error that is raised.
	    */
		void onError(in GenericError error);
	};

	/**
	 * \brief Generic error interface.
	 *
	 * 
	 */


	interface GenericError {

		/**
		 * \brief 16-bit error code.
		 */
		readonly attribute unsigned short code;
	};
		
	/**
	 * \brief DeviceApiError error interface.
	 *
	 * The error codes must be in the range 10000-19999.
	 */

	interface DeviceAPIError : GenericError {

		/**
		 * \brief Unknown error.
		 */
		const unsigned short UNKNOWN_ERROR           = 10000;

		/**
		 * \brief Invalid value was specified as input parameter.
		 */
		const unsigned short INVALID_ARGUMENT_ERROR  = 10001;

		/**
		 * \brief The searched value or object was not found.
		 */
		const unsigned short NOT_FOUND_ERROR         = 10002;

		/**
		 * \brief Operation is pending.
		 */
		const unsigned short PENDING_OPERATION_ERROR = 10003;

		/**
		 * \brief Input/Output error.
		 */
		const unsigned short IO_ERROR                = 10004;

		/**
		 * \brief Not supported error.
		 */
		const unsigned short NOT_SUPPORTED_ERROR     = 10005;
	};

	/**
	 * \brief Security error interface.
	 *
	 * The error codes must be in the range 20000-29999
	 */
	interface SecurityError : GenericError {
		const unsigned short PERMISSION_DENIED_ERROR = 20000;
	};

	/**
	 * \brief PendingOperation.
	 *
	 * Interface that is returned by asynchronous operations in order to
	 * provide a cancellation operation.
	 */
	interface PendingOperation {
		/**
		 * \brief Call to cancel the underlying asynchronous operation.
		 *
		 * This call is always successful, i.e. the pending operation i.e.
		 * either cancelled or one of the callback is called.
		 *
		 * \return <em>false</em> if the cancellation did not succeed
		 * either because the pending operation finished already or because
		 * the cancellation cannot succeed due to technical limitations in
		 * the underlying implementation. Consquently the pending operation 
		 * completes and depending on the success or failure the appropriate
		 * callbacks will be called.
		 * <em>true</em> if the cancellation did succeed. No callbacks will
		 * be called by the cancelled pending operation.
		 */
		boolean cancel();
	};

	/**
	 * \brief BONDI root API.
	 * bondi root property exists in the global object
	 * \def-api-feature http://bondi.omtp.org/api/bondi.requestfeature
	 */
	interface Bondi {
		/**
		 * \brief Requests a feature.
		 *
		 * This function requests a named feature
		 * asynchronously and returns a pending operation object.
		 * If it succeeds it calls the successCallback and passes in
		 * the object of the requested feature. If it fails it calls
		 * the errorCallback passing in a DeviceAPIError which provides 
		 * an error message and error code indicating the nature of the error.
		 *
		 * If the requested feature binds itself to a root namespace
		 * ( for example, "bondi.pim.contact") this will happen prior to the
		 * successCallback being invoked.
		 *
		 * \param successCallback  the success callback function
		 * \param errorCallback    the error callback function
		 * \param name             the feature name IRI
		 *
		 * \return PendingOperation enabling the requester to cancel this request.
		 *
		 * The errorCallback will receive one of the following errors:
		 * \throw DeviceAPIError INVALID_ARGUMENT_ERROR if a malformed
		 * argument has been supplied or a required argument has been omitted.
		 * \throw DeviceAPIError NOT_FOUND_ERROR if the requested feature could not be found.
		 * \throw SecurityError PERMISSION_DENIED_ERROR if the
		 * requested feature is not permitted to load/bind or that
		 * access to a required device capability has been denied.
		 * \throw DeviceAPIError UNKNOWN_ERROR if an error occurred and a pending
		 * operation object can't be returned.
		 */
		PendingOperation requestFeature(in RequestFeatureSuccessCallback successCallback,
		                                in ErrorCallback   errorCallback,
		                                in DOMString       name)
			raises(DeviceAPIError, SecurityError);
	};
	interface BondiObject {
		readonly attribute Bondi bondi; 
	};
	Window implements bondiObject;
};
