import NetConnection from "./NetConnection";
import ObjectEncoding from "./ObjectEncoding";
import SharedObjectFlushStatus from "./SharedObjectFlushStatus";
import EventDispatcher from "./../events/EventDispatcher";


declare namespace openfl.net {
	
	
	/**
	 * The SharedObject class is used to read and store limited amounts of data on
	 * a user's computer or on a server. Shared objects offer real-time data
	 * sharing between multiple client SWF files and objects that are persistent
	 * on the local computer or remote server. Local shared objects are similar to
	 * browser cookies and remote shared objects are similar to real-time data
	 * transfer devices. To use remote shared objects, you need Adobe Flash Media
	 * Server.
	 *
	 * Use shared objects to do the following:
	 *
	 * 
	 *  * **Maintain local persistence**. This is the simplest way to use a
	 * shared object, and does not require Flash Media Server. For example, you
	 * can call `SharedObject.getLocal()` to create a shared object in
	 * an application, such as a calculator with memory. When the user closes the
	 * calculator, Flash Player saves the last value in a shared object on the
	 * user's computer. The next time the calculator is run, it contains the
	 * values it had previously. Alternatively, if you set the shared object's
	 * properties to `null` before the calculator application is
	 * closed, the next time the application runs, it opens without any values.
	 * Another example of maintaining local persistence is tracking user
	 * preferences or other data for a complex website, such as a record of which
	 * articles a user read on a news site. Tracking this information allows you
	 * to display articles that have already been read differently from new,
	 * unread articles. Storing this information on the user's computer reduces
	 * server load.
	 *  * **Store and share data on Flash Media Server**. A shared object
	 * can store data on the server for other clients to retrieve. For example,
	 * call `SharedObject.getRemote()` to create a remote shared
	 * object, such as a phone list, that is persistent on the server. Whenever a
	 * client makes changes to the shared object, the revised data is available to
	 * all clients currently connected to the object or who later connect to it.
	 * If the object is also persistent locally, and a client changes data while
	 * not connected to the server, the data is copied to the remote shared object
	 * the next time the client connects to the object.
	 *  * **Share data in real time**. A shared object can share data among
	 * multiple clients in real time. For example, you can open a remote shared
	 * object that stores a list of users connected to a chat room that is visible
	 * to all clients connected to the object. When a user enters or leaves the
	 * chat room, the object is updated and all clients that are connected to the
	 * object see the revised list of chat room users.
	 * 
	 *
	 *  To create a local shared object, call
	 * `SharedObject.getLocal()`. To create a remote shared object,
	 * call `SharedObject.getRemote()`.
	 *
	 *  When an application closes, shared objects are _flushed_, or
	 * written to a disk. You can also call the `flush()` method to
	 * explicitly write data to a disk.
	 *
	 * **Local disk space considerations.** Local shared objects have some
	 * limitations that are important to consider as you design your application.
	 * Sometimes SWF files may not be allowed to write local shared objects, and
	 * sometimes the data stored in local shared objects can be deleted without
	 * your knowledge. Flash Player users can manage the disk space that is
	 * available to individual domains or to all domains. When users decrease the
	 * amount of disk space available, some local shared objects may be deleted.
	 * Flash Player users also have privacy controls that can prevent third-party
	 * domains(domains other than the domain in the current browser address bar)
	 * from reading or writing local shared objects.
	 *
	 * **Note**: SWF files that are stored and run on a local computer, not
	 * from a remote server, can always write third-party shared objects to disk.
	 * For more information about third-party shared objects, see the 
	 * [Global Storage Settings panel](http://www.macromedia.com/support/documentation/en/flashplayer/help/settings_manager03.html)
	 * in Flash Player Help.
	 *
	 * It's a good idea to check for failures related to the amount of disk
	 * space and to user privacy controls. Perform these checks when you call
	 * `getLocal()` and `flush()`:
	 * 
	 *  * `SharedObject.getLocal()`  -  Flash Player throws an
	 * exception when a call to this method fails, such as when the user has
	 * disabled third-party shared objects and the domain of your SWF file does
	 * not match the domain in the browser address bar.
	 *  * `SharedObject.flush()`  -  Flash Player throws an
	 * exception when a call to this method fails. It returns
	 * `SharedObjectFlushStatus.FLUSHED` when it succeeds. It returns
	 * `SharedObjectFlushStatus.PENDING` when additional storage space
	 * is needed. Flash Player prompts the user to allow an increase in storage
	 * space for locally saved information. Thereafter, the `netStatus`
	 * event is dispatched with an information object indicating whether the flush
	 * failed or succeeded.
	 * 
	 * 
	 *
	 * If your SWF file attempts to create or modify local shared objects, make
	 * sure that your SWF file is at least 215 pixels wide and at least 138 pixels
	 * high(the minimum dimensions for displaying the dialog box that prompts
	 * users to increase their local shared object storage limit). If your SWF
	 * file is smaller than these dimensions and an increase in the storage limit
	 * is required, `SharedObject.flush()` fails, returning
	 * `SharedObjectFlushedStatus.PENDING` and dispatching the
	 * `netStatus` event.
	 *
	 *  **Remote shared objects.** With Flash Media Server, you can create
	 * and use remote shared objects, that are shared in real-time by all clients
	 * connected to your application. When one client changes a property of a
	 * remote shared object, the property is changed for all connected clients.
	 * You can use remote shared objects to synchronize clients, for example,
	 * users in a multi-player game. 
	 *
	 *  Each remote shared object has a `data` property which is an
	 * Object with properties that store data. Call `setProperty()` to
	 * change an property of the data object. The server updates the properties,
	 * dispatches a `sync` event, and sends the properties back to the
	 * connected clients. 
	 *
	 *  You can choose to make remote shared objects persistent on the client,
	 * the server, or both. By default, Flash Player saves locally persistent
	 * remote shared objects up to 100K in size. When you try to save a larger
	 * object, Flash Player displays the Local Storage dialog box, which lets the
	 * user allow or deny local storage for the shared object. Make sure your
	 * Stage size is at least 215 by 138 pixels; this is the minimum size Flash
	 * requires to display the dialog box. 
	 *
	 *  If the user selects Allow, the server saves the shared object and
	 * dispatches a `netStatus` event with a `code` property
	 * of `SharedObject.Flush.Success`. If the user select Deny, the
	 * server does not save the shared object and dispatches a
	 * `netStatus` event with a `code` property of
	 * `SharedObject.Flush.Failed`. 
	 * 
	 * @:event asyncError Dispatched when an exception is thrown asynchronously  - 
	 *                   that is, from native asynchronous code.
	 * @:event netStatus  Dispatched when a SharedObject instance is reporting its
	 *                   status or error condition. The `netStatus`
	 *                   event contains an `info` property, which is an
	 *                   information object that contains specific information
	 *                   about the event, such as whether a connection attempt
	 *                   succeeded or whether the shared object was successfully
	 *                   written to the local disk.
	 * @:event sync       Dispatched when a remote shared object has been updated
	 *                   by the server.
	 */
	export class SharedObject extends EventDispatcher {
		
		
		public static defaultObjectEncoding:ObjectEncoding;
		
		// #if flash
		// @:noCompletion @:dox(hide) @:require(flash11_7) public static preventBackup:boolean;
		// #end
		
		public client:any;
		
		/**
		 * The collection of attributes assigned to the `data` property of
		 * the object; these attributes can be shared and stored. Each attribute can
		 * be an object of any ActionScript or JavaScript type  -  Array, Number,
		 * Boolean, ByteArray, XML, and so on. For example, the following lines
		 * assign values to various aspects of a shared object:
		 *
		 *  For remote shared objects used with a server, all attributes of the
		 * `data` property are available to all clients connected to the
		 * shared object, and all attributes are saved if the object is persistent.
		 * If one client changes the value of an attribute, all clients now see the
		 * new value. 
		 */
		public readonly data:any;
		
		public fps:number;
		public objectEncoding:ObjectEncoding;
		
		/**
		 * The current size of the shared object, in bytes.
		 *
		 * Flash calculates the size of a shared object by stepping through all of
		 * its data properties; the more data properties the object has, the longer
		 * it takes to estimate its size. Estimating object size can take significant
		 * processing time, so you may want to avoid using this method unless you
		 * have a specific need for it.
		 */
		public readonly size:number;
		
		protected get_size ():number;
		
		
		// protected constructor ();
		
		
		/**
		 * For local shared objects, purges all of the data and deletes the shared
		 * object from the disk. The reference to the shared object is still active,
		 * but its data properties are deleted.
		 *
		 *  For remote shared objects used with Flash Media Server,
		 * `clear()` disconnects the object and purges all of the data. If
		 * the shared object is locally persistent, this method also deletes the
		 * shared object from the disk. The reference to the shared object is still
		 * active, but its data properties are deleted. 
		 * 
		 */
		public clear ():void;
		
		
		public close ():void;
		
		
		public connect (myConnection:NetConnection, params?:string):void;
		
		
		// #if flash
		// @:noCompletion @:dox(hide) public static deleteAll (url:string):Int;
		// #end
		
		
		/**
		 * Immediately writes a locally persistent shared object to a local file. If
		 * you don't use this method, Flash Player writes the shared object to a file
		 * when the shared object session ends  -  that is, when the SWF file is
		 * closed, when the shared object is garbage-collected because it no longer
		 * has any references to it, or when you call
		 * `SharedObject.clear()` or `SharedObject.close()`.
		 *
		 * If this method returns `SharedObjectFlushStatus.PENDING`,
		 * Flash Player displays a dialog box asking the user to increase the amount
		 * of disk space available to objects from this domain. To allow space for
		 * the shared object to grow when it is saved in the future, which avoids
		 * return values of `PENDING`, pass a value for
		 * `minDiskSpace`. When Flash Player tries to write the file, it
		 * looks for the number of bytes passed to `minDiskSpace`, instead
		 * of looking for enough space to save the shared object at its current size.
		 * 
		 *
		 * For example, if you expect a shared object to grow to a maximum size of
		 * 500 bytes, even though it might start out much smaller, pass 500 for
		 * `minDiskSpace`. If Flash asks the user to allot disk space for
		 * the shared object, it asks for 500 bytes. After the user allots the
		 * requested amount of space, Flash won't have to ask for more space on
		 * future attempts to flush the object(as long as its size doesn't exceed
		 * 500 bytes). 
		 *
		 * After the user responds to the dialog box, this method is called again.
		 * A `netStatus` event is dispatched with a `code`
		 * property of `SharedObject.Flush.Success` or
		 * `SharedObject.Flush.Failed`. 
		 * 
		 * @param minDiskSpace The minimum disk space, in bytes, that must be
		 *                     allotted for this object.
		 * @return Either of the following values:
		 *         
		 *          * `SharedObjectFlushStatus.PENDING`: The user has
		 *         permitted local information storage for objects from this domain,
		 *         but the amount of space allotted is not sufficient to store the
		 *         object. Flash Player prompts the user to allow more space. To
		 *         allow space for the shared object to grow when it is saved, thus
		 *         avoiding a `SharedObjectFlushStatus.PENDING` return
		 *         value, pass a value for `minDiskSpace`. 
		 *          * `SharedObjectFlushStatus.FLUSHED`: The shared
		 *         object has been successfully written to a file on the local
		 *         disk.
		 *         
		 * @throws Error Flash Player cannot write the shared object to disk. This
		 *               error might occur if the user has permanently disallowed
		 *               local information storage for objects from this domain.
		 *
		 *               **Note:** Local content can always write shared
		 *               objects from third-party domains(domains other than the
		 *               domain in the current browser address bar) to disk, even if
		 *               writing of third-party shared objects to disk is
		 *               disallowed.
		 */
		public flush (minDiskSpace?:number):SharedObjectFlushStatus;
		
		
		// #if flash
		// @:noCompletion @:dox(hide) public static getDiskUsage (url:string):Int;
		// #end
		
		
		/**
		 * Returns a reference to a locally persistent shared object that is only
		 * available to the current client. If the shared object does not already
		 * exist, this method creates one. If any values passed to
		 * `getLocal()` are invalid or if the call fails, Flash Player
		 * throws an exception.
		 *
		 * The following code shows how you assign the returned shared object
		 * reference to a variable:
		 *
		 * `so:SharedObject =
		 * SharedObject.getLocal("savedData");`
		 *
		 * **Note:** If the user has chosen to never allow local storage for
		 * this domain, the object is not saved locally, even if a value for
		 * `localPath` is specified. The exception to this rule is local
		 * content. Local content can always write shared objects from third-party
		 * domains(domains other than the domain in the current browser address bar)
		 * to disk, even if writing of third-party shared objects to disk is
		 * disallowed. 
		 *
		 * To avoid name conflicts, Flash looks at the location of the SWF file
		 * creating the shared object. For example, if a SWF file at
		 * www.myCompany.com/apps/stockwatcher.swf creates a shared object named
		 * `portfolio`, that shared object does not conflict with another
		 * object named `portfolio` that was created by a SWF file at
		 * www.yourCompany.com/photoshoot.swf because the SWF files originate from
		 * different directories. 
		 *
		 * Although the `localPath` parameter is optional, you should
		 * give some thought to its use, especially if other SWF files need to access
		 * the shared object. If the data in the shared object is specific to one SWF
		 * file that will not be moved to another location, then use of the default
		 * value makes sense. If other SWF files need access to the shared object, or
		 * if the SWF file that creates the shared object will later be moved, then
		 * the value of this parameter affects how accessible the shared object will
		 * be. For example, if you create a shared object with `localPath`
		 * set to the default value of the full path to the SWF file, no other SWF
		 * file can access that shared object. If you later move the original SWF
		 * file to another location, not even that SWF file can access the data
		 * already stored in the shared object.
		 *
		 * To avoid inadvertently restricting access to a shared object, use the
		 * `localpath` parameter. The most permissive approach is to set
		 * `localPath` to `/`(slash), which makes the shared
		 * object available to all SWF files in the domain, but increases the
		 * likelihood of name conflicts with other shared objects in the domain. A
		 * more restrictive approach is to append `localPath` with folder
		 * names that are in the full path to the SWF file. For example, for a
		 * `portfolio` shared object created by the SWF file at
		 * www.myCompany.com/apps/stockwatcher.swf, you could set the
		 * `localPath` parameter to `/`, `/apps`, or
		 * `/apps/stockwatcher.swf`. You must determine which approach
		 * provides optimal flexibility for your application.
		 *
		 * When using this method, consider the following security model:
		 * 
		 *  * You cannot access shared objects across sandbox boundaries.
		 *  * Users can restrict shared object access by using the Flash Player
		 * Settings dialog box or the Settings Manager. By default, an application
		 * can create shared objects of up 100 KB of data per domain. Administrators
		 * and users can also place restrictions on the ability to write to the file
		 * system.
		 * 
		 * 
		 *
		 * Suppose you publish SWF file content to be played back as local files
		 * (either locally installed SWF files or EXE files), and you need to access
		 * a specific shared object from more than one local SWF file. In this
		 * situation, be aware that for local files, two different locations might be
		 * used to store shared objects. The domain that is used depends on the
		 * security permissions granted to the local file that created the shared
		 * object. Local files can have three different levels of permissions:
		 *
		 *  1. Access to the local filesystem only.
		 *  2. Access to the network only.
		 *  3. Access to both the network and the local filesystem.
		 *
		 * Local files with access to the local filesystem(level 1 or 3) store
		 * their shared objects in one location. Local files without access to the
		 * local filesystem(level 2) store their shared objects in another
		 * location.
		 *
		 * You can prevent a SWF file from using this method by setting the
		 * `allowNetworking` parameter of the the `object` and
		 * `embed` tags in the HTML page that contains the SWF
		 * content.
		 *
		 * For more information, see the Flash Player Developer Center Topic:
		 * [Security](http://www.adobe.com/go/devnet_security_en).
		 * 
		 * @param name      The name of the object. The name can include forward
		 *                  slashes(`/`); for example,
		 *                  `work/addresses` is a legal name. Spaces are
		 *                  not allowed in a shared object name, nor are the
		 *                  following characters: `~ % & \
		 *                  ; : " ' , < > ? #`
		 * @param localPath The full or partial path to the SWF file that created the
		 *                  shared object, and that determines where the shared
		 *                  object will be stored locally. If you do not specify this
		 *                  parameter, the full path is used.
		 * @param secure    Determines whether access to this shared object is
		 *                  restricted to SWF files that are delivered over an HTTPS
		 *                  connection. If your SWF file is delivered over HTTPS,
		 *                  this parameter's value has the following effects:
		 *                  
		 *                   * If this parameter is set to `true`,
		 *                  Flash Player creates a new secure shared object or gets a
		 *                  reference to an existing secure shared object. This
		 *                  secure shared object can be read from or written to only
		 *                  by SWF files delivered over HTTPS that call
		 *                  `SharedObject.getLocal()` with the
		 *                  `secure` parameter set to
		 *                  `true`.
		 *                   * If this parameter is set to `false`,
		 *                  Flash Player creates a new shared object or gets a
		 *                  reference to an existing shared object that can be read
		 *                  from or written to by SWF files delivered over non-HTTPS
		 *                  connections.
		 *                  
		 *
		 *                  If your SWF file is delivered over a non-HTTPS
		 *                  connection and you try to set this parameter to
		 *                  `true`, the creation of a new shared object
		 *                 (or the access of a previously created secure shared
		 *                  object) fails and `null` is returned.
		 *                  Regardless of the value of this parameter, the created
		 *                  shared objects count toward the total amount of disk
		 *                  space allowed for a domain.
		 *
		 *                  The following diagram shows the use of the
		 *                  `secure` parameter:
		 * @return A reference to a shared object that is persistent locally and is
		 *         available only to the current client. If Flash Player can't create
		 *         or find the shared object(for example, if `localPath`
		 *         was specified but no such directory exists), this method throws an
		 *         exception.
		 * @throws Error Flash Player cannot create the shared object for whatever
		 *               reason. This error might occur is if persistent shared
		 *               object creation and storage by third-party Flash content is
		 *               prohibited(does not apply to local content). Users can
		 *               prohibit third-party persistent shared objects on the Global
		 *               Storage Settings panel of the Settings Manager, located at
		 *               [http://www.adobe.com/support/documentation/en/flashplayer/help/settings_manager03.html](http://www.adobe.com/support/documentation/en/flashplayer/help/settings_manager03.html).
		 */
		public static getLocal (name:string, localPath?:string, secure?:boolean):SharedObject;
		
		
		public static getRemote (name:string, remotePath?:string, persistence?:boolean | string, secure?:boolean):SharedObject;
		
		
		public send (message:Array<any>):void;
		
		
		public setDirty (propertyName:string):void;
		
		
		public setProperty (propertyName:string, value?:any):void;
		
		
	}
	
	
}


export default openfl.net.SharedObject;