Hello :)

Tu compliques bien les choses en nous parlant de SecurityDomain etc... pas
besoin de parler de tout cela :)

Les Singletons en AS3 faut utiliser à part cas spécial une constante de
package ou une factory. Utiliser un getInstance() ou autre... c'est une
habitude de développeur JAVA qui n'est pas du tout adapté à la philosophie
proposée par ActionScript et ECMAScript de façon général.

EKA+ :)

Le 21 mars 2011 17:29, Memmie Lenglet <[email protected]> a écrit :

> J'hésitais, mais là je suis trop tenté (même si c'est hors sujet)
>
> Pour moi, si l'on fait du flash on doit principalement se baser sur l'API
> de Flash.
>
> Dans le cas présent je prendrais la classe flash.system.SecurityDomain qui
> représente bien l'usage du singleton et la nécessitée du singleton dans ce
> cas (dans Flash)
> Elle ne peux être instancié : new SecurityDomain(); génère une erreur
> #2012: Impossible d'instancier la classe SecurityDomain.
> On accède au sécurity domain (le seul qui puisse exister par SWF) par le
> getter static SecurityDomain.currentDomain;
>
> Si l'on ne veux pas de Singleton comme celui la (ça aurai été le cas dans
> un autre langage), il aurai fallut par exemple que le SecurityDomain soit
> apposé à l'intance root de l'application, à la class System, par sur le
> LoaderInfo du SWF ...
>
> Pour le cas cité ici, je ne crois pas que faire un connection serveur en
> singleton soit une bonne idée, car on pourrai très bien être dans un cas ou
> on doit être connecté à plusieurs serveur en même temps pour faire des
> upload (dans le même ApplicationDomain, de toute façon on peut bien faire
> autant de NetConnection que l'on veux)
>
> Pour ma part quand j'ai besoin d'un singleton j'utilise cette structure :
>
> package example
> {
>        import flash.events.EventDispatcher;
>        import flash.errors.IllegalOperationError;
>
>        public class Application extends EventDispatcher
>        {
>                private static var _intanciateAllowed:Boolean = false;
>                private static var _currentApplication:Application;
>                public function Application()
>                {
>                        if(!_intanciateAllowed)
>                                throw new
> IllegalOperationError(Error.getErrorMessage().replace("%1", Application ),
> 2012);//#2012: %1 class cannot be instantiated.
>                }
>
>                static public function get currentApplication():Application
>                {
>                        if(_currentApplication == null)
>                        {
>                                _intanciateAllowed = true;
>                                _currentApplication = new Application();
>                                _intanciateAllowed = true;
>                        }
>                        return _currentApplication;
>                }
>        }
> }
>
> Pas besoin de signature du constructeur étrange qui doit recevoir une class
> internal qui sert juste à ça, pas de méthode getInstance() mais juste un
> getter explicite et un classe entièrement accessible (du moins pour
> l'auto-completion).
>
> Ceci reste un débat ouvert, vu qu'aucune règle précise en la matière n'a
> été dictée (par Adobe, par exemple).
> Mais je préfère largement qu'on garde la structure que les concepteurs de
> l'API de Flash on fait, ce qui permet une transition transparent entre les
> dev.
> Par exemple en AS3 on a pas de chaining (dans l'API des DisplayObject) :
> myDO.offset(50, 96).setAlpha(0.5).setWidth(500);
> c'est pas la peine de l'utiliser dans des libraries même si c'est plus
> simple, ça rendre le code hétérogène : "ah oui ! tel libraire l'utilise,
> mais pas tel autre" etc. Après ça deviens un champs de bataille ou on peux
> faire tout et n'importe quoi.
>
> Mais je dis ça ... je dis rien :D
>
>
> Le 21/03/2011 16:36, ekameleon a écrit :
>
>  Hello :)
>>
>> pour les singletons tu devrais lire :
>>
>> http://code.google.com/p/maashaack/wiki/Singleton
>>
>> EKA+ :)
>>
>> Le 21 mars 2011 15:35, Loyat Marc<[email protected]>  a écrit :
>>
>>  Salut,
>>>
>>> j'ai enfin pris le temps de mettre en place le système avec fragmentation
>>> de ByteArray. Comme le rappelait Benoit, on a besoin d'un événement
>>> utilisateur pour l'envoi avec URLLoader, je ne vois toujours pas comment
>>> envoyer des datas avec FileReference quand ces données ne viennent pas
>>> d'un
>>> browse(), du coup j'ai remis en place la solution avec AMF !
>>>
>>> Côté as3 j'ai fait un singleton pour l'envoi des fichier vers le serveur.
>>>
>>>
>>>
>>> package
>>> {
>>> import com.adobe.crypto.MD5;
>>>  import events.AMFEvent;
>>> import flash.events.Event;
>>> import flash.events.EventDispatcher;
>>>  import flash.events.ProgressEvent;
>>> import flash.utils.ByteArray;
>>>   public class Remote extends EventDispatcher
>>> {
>>>  /**
>>>  * instance unique du singleton
>>>  */
>>> private static var _instance:Remote;
>>>  /**
>>>  * geter du singleton
>>>  * @return
>>>  */
>>> public static function getInstance():Remote
>>> {
>>>  if(_instance == null) _instance = new Remote(new PrivateRemote());
>>>             return _instance;
>>> }
>>>    /**
>>>  * lorsqu'on envoie le fichier en plein de petits morceaux,
>>>  * on crée un identifiant unique qui permet de recoller les bouts de
>>> l'autre côté
>>>  */
>>> private var _token:String;
>>>  /**
>>>  * numéro du morceau envoyé
>>>  */
>>>  private var _part:uint;
>>>  /**
>>>  * nombre de morceaux envoyés
>>>  */
>>> private var _length:uint;
>>>  /**
>>>  * stockage du fichier complet
>>>  */
>>> private var _byteArray:ByteArray;
>>>  /**
>>>  * nombre de bytes à prendre par tranche
>>>  */
>>>  private var _slice:uint = 100000;
>>>  /**
>>>  * les paramètres à envoyer
>>>  */
>>> private var _params:Object;
>>>  private var _idMedia:int;
>>> private var _idGabarit:int;
>>> private var _extension:String;
>>>  /**
>>>  * constructeur
>>>  * @param pvt
>>>  */
>>>  public function Remote(pvt:PrivateRemote):void
>>> {
>>> if(pvt == null){
>>>  throw new Error("Error: Instantiation failed: Use getInstance() instead
>>> of new.");
>>> }
>>>  }
>>>  /**
>>>  * envoi d'une déclinaison au serveur
>>>  * @param aIdMedia
>>>  * @param aIdGabarit
>>>  * @param aExtension
>>>  * @param aData
>>>  */
>>>  public function saveDeclinaison(aIdMedia:int, aIdGabarit:int,
>>> aExtension:String, aData:ByteArray):void
>>> {
>>>  AMF.addEventListener(AMFEvent.COMPLETE, this._onComplete);
>>>  _token = MD5.hash("t" + (new Date()).getTime() + "_" +
>>> Math.round(Math.random() * 100000000));
>>> _part = 0;
>>>  _length = Math.ceil(aData.length / _slice);
>>> _byteArray = aData;
>>>  _idMedia = aIdMedia;
>>> _idGabarit = aIdGabarit;
>>> _extension = aExtension;
>>>  _sendSlice();
>>>  }
>>> /**
>>>  * envoie la partie suivante
>>>  */
>>> private function _sendSlice():void
>>> {
>>>  var vOffset:Number = _part * _slice;
>>> var vLength:Number = vOffset + _slice>  _byteArray.length ?
>>> _byteArray.length - vOffset : _slice;
>>>  var vData:ByteArray = new ByteArray();
>>> _byteArray.position = vOffset;
>>>  _byteArray.readBytes(vData, 0, vLength);
>>>  AMF.call('saveDeclinaison', _idMedia, _idGabarit, _extension, vData,
>>> _token, _part, _length);
>>>  }
>>>   /**
>>>  * fin du chargement
>>>  * @param aEvent
>>>  */
>>> private function _onComplete(aEvent:AMFEvent):void
>>> {
>>>  //trace (aEvent.result);
>>>  if (_part<  _length - 1) {
>>>  Preloader.update(Number(_part / _length));
>>> _part += 1;
>>> _sendSlice();
>>>  }
>>> else{
>>> Preloader.hide();
>>>  AMF.removeEventListener(AMFEvent.COMPLETE, this._onComplete);
>>> this.dispatchEvent(new Event(Event.COMPLETE));
>>>  }
>>> }
>>>   }
>>>
>>> }
>>>
>>>
>>> internal class PrivateRemote {}
>>>
>>>
>>> --------------------------
>>> Et côté php (j'utilise le zend framework et Zend_AMF)
>>>
>>>
>>> /**
>>>  * sauve l'image et crée la déclinaison dans la base avec upload du
>>> fichier
>>> en plusieurs morceaux
>>>  * @param int $idMedia
>>>  * @param int $idGabarit
>>>  * @param string $extension
>>>  * @param $aData données du fichier
>>>  * @param string $token identificateur du fichier en cours d'upload
>>>  * @param int $part numéro du fragment en cours d'upload
>>>  * @param int $length nb de fragments de fichiers à uploader
>>>   */
>>> public function saveDeclinaison($idMedia, $idGabarit, $extension, $aData,
>>> $token, $part, $length){
>>>  // upload en plusieurs morceaux
>>>         $tmpFileName = MEDIA_PATH.'/tmp'.$token;
>>>         file_put_contents($tmpFileName, $aData, FILE_APPEND);
>>>         if ($part == $length-1){
>>>          $aData = file_get_contents($tmpFileName);
>>>          unlink($tmpFileName);
>>>        // enregistrement
>>> $media_occ = new Default_Model_Media();
>>> $media_occ->find($idMedia);
>>>  $media_occ->deleteDeclinaison($idGabarit);
>>> $media_occ->createDeclinaison($idGabarit, $extension, $aData);
>>>         }
>>>
>>> }
>>>
>>> ---------------------
>>>
>>> Bon, ça marche, les utilisateurs vont être contents, mais ça fait
>>> beaucoup
>>> d'allers/retours ! :-)
>>>
>>>
>>> @Eka, je viens de me rendre compte que mon précédent message n'a été
>>> adressé qu'à toi, désolé, c'était une erreur de ma part !
>>>
>>>
>>> A+
>>>
>>>  --
>>> Vous recevez ce message, car vous êtes abonné au groupe Google
>>> Groupes FCNG.
>>> Pour envoyer un message à ce groupe, adressez un e-mail à
>>> [email protected].
>>> Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse
>>> [email protected].
>>> Pour plus d'options, consultez la page de ce groupe :
>>> http://groups.google.com/group/fcng?hl=fr
>>>
>>>
>>
> --
> Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes FCNG.
> Pour envoyer un message à ce groupe, adressez un e-mail à
> [email protected].
> Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse
> [email protected].
> Pour plus d'options, consultez la page de ce groupe :
> http://groups.google.com/group/fcng?hl=fr
>
>

-- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes FCNG.
Pour envoyer un message à ce groupe, adressez un e-mail à [email protected].
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse 
[email protected].
Pour plus d'options, consultez la page de ce groupe : 
http://groups.google.com/group/fcng?hl=fr

Répondre à