Skip to main content

AS3: Swf Communicator

This class could be used for two-way communication in between parent swf and child swf; where the child swf is loaded inside the parent swf.

SOURCE CODE
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package
{
 import CEvent;
 
 import flash.events.Event;
 import flash.events.IEventDispatcher;
 
 import mx.events.FlexEvent;
 import mx.managers.SystemManager;
 
 import spark.components.Application;
 
 /**
  * @file CSwfCommunicator.as
  * @author Abhishek Kumar
  */
 public class CSwfCommunicator
 {
  public var prepare:Function;
  public var procedure:Function;
  public var proceed:Function;
  
  private var holder:SystemManager;
  
  private var childApp:Application;
  private var childFunc:Function;
  
  public function CSwfCommunicator()
  {
   trace("CSwfCommunicator -> constructor");
  }
  
  public function instantiate(data:*):void
  {
   trace("CSwfCommunicator -> instantiate");
   holder = data as SystemManager;    
   attachListeners(holder);
  }
  
  public function terminate():void
  {
   trace("CSwfCommunicator -> terminate");
   terminateChildApp();
   holder = null;
  }
  
  private function attachListeners(dispatcher:IEventDispatcher):void
  {
   trace("CSwfCommunicator -> attachListeners");
   dispatcher.addEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler);
  }
  
  private function detachListeners(dispatcher:IEventDispatcher):void
  {
   trace("CSwfCommunicator -> detachListeners");
   dispatcher.removeEventListener(FlexEvent.APPLICATION_COMPLETE, applicationCompleteHandler);
  }
  
  private function applicationCompleteHandler(event:FlexEvent):void
  {
   trace("CSwfCommunicator -> applicationCompleteHandler:", event);
   detachListeners(holder);
   initializeChildApp(holder.application);
   if(prepare != null) 
    prepare(holder.application);
  }
  
  // Child App
  
  public function initializeChildApp(data:*):void
  {
   trace("CSwfCommunicator -> initializeChildApp");
   childApp = Application(data);
   attachListeners_childApp(childApp);
  }
  
  public function terminateChildApp():void
  {
   trace("CSwfCommunicator -> terminateChildApp");
   detachListeners_childApp(childApp);
   childApp = null;
  }
  
  private function attachListeners_childApp(dispatcher:IEventDispatcher):void
  {
   trace("CSwfCommunicator -> attachListeners_childApp");
   dispatcher.addEventListener(CEvent.CALL_PARENT_METHOD, callParentMethodHandler);
  }
  
  private function detachListeners_childApp(dispatcher:IEventDispatcher):void
  {
   trace("CSwfCommunicator -> detachListeners_childApp");
   dispatcher.removeEventListener(CEvent.CALL_PARENT_METHOD, callParentMethodHandler);
  }
  
  // Comunicators ... for parent
  
  private function callParentMethodHandler(e:CEvent):void
  {
   trace("CSwfCommunicator -> callParentMethodHandler:", e);
   var o:Object = e.data;
   //trace("CSwfCommunicator -> callParentMethodHandler:", o.method, o.args, o.revert);   
   if(o.revert != null)
   {
    if(procedure != null) 
     callChildMethod(o.revert, procedure(o.method, o.args));
   }
   else
   {
    if(proceed != null) 
     proceed(o.method, o.args);
   }
  }
  
  public function callChildMethod(method:String, args:Object):Object
  {  
   trace("CSwfCommunicator -> callChildMethod:", method, args);
   if (childApp.hasOwnProperty(method))
   {
    childFunc = childApp[method] as Function;
    return childFunc(args);
   }
   return null;
  }
  
  /*
  // Comunicators ... for child
  public function callParentMethod(method:String, param:Object, ack:String):void
  {
   trace("CSwfCommunicator -> callParentMethod:", method, param, ack);
   var o:Object = {
    method: method, 
    args: param, 
    revert: ack
   };
   dispatchEvent(new CEvent(CEvent.CALL_PARENT_METHOD, o));
  }
  */
 }
}

USAGE (Parent)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private function onLoad_ChildSwf():void
{
 var sc:CSwfCommunicator = new CSwfCommunicator();
 sc.procedure = commander1;
 sc.proceed = commander2;
 sc.instantiate(swfholder_sl.content);
}

private function commander1(method:String, o:Object):Object
{
 trace('commander1', method, o);
 var ack:Object = {};
 switch(method)
 {
  case 'foo': ack.text = JSON.encode(o);
   break;
 }
 return ack;
}

private function commander2(method:String, o:Object):void
{
 trace('commander2', method, o);
 switch(method)
 {
  case 'foo': display_lbl.text = JSON.encode(o);
   break;
 }
}

USAGE (Child)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import CEvent;
import CSwfCommunicator;

// Important Method
public function callParentMethod(method:String, param:Object, ack:String):void
{
 trace("callParentMethod:", method, param, ack);
 var o:Object = {
  method: method, 
  args: param, 
  revert: ack
 };
 dispatchEvent(new CEvent(CEvent.CALL_PARENT_METHOD, o));
}

protected function btn_clickHandler(event:MouseEvent):void
{
 callParentMethod('foo', {a:1, b:2}, 'acknowledge');
}

public function acknowledge(o:Object):void
{
 display_tb.text = o.text;
}

Comments

Popular posts from this blog

Unlock protected blocks in Siemens SIMATIC Step 7

Recently I'd been called by Hindalco's Fabrication Plant division to unlock the protected blocks in Siemens SIMATIC Step 7. They were in need to unlock those blocks since an year because of 1 million Rupees of loss per month. They want to re-program those blocks but it was locked by the man who'd done the setup. From the people working in that department, I came to know that they were trying to call that man (someone from Italy) right here but he's not coming. Actually, what he'd done was that he'd locked some of the blocks and deleted the source file. And Siemens didn't provide any feature to unlock. Department people also told me that even the people working in Siemens don't know how to do it. Being a software engineer I know that any thing can be reverse engineered. So I took up the challenge. How did I unlocked the blocks? The first thing I'd done was searched about this software at Google and read about what is this software all about. Aft

App: Calculate your job experience or age in years

Usually, all of those who works have to put years of experience on their resume or curriculum vitae. But 90% people put it wrong when they convert their experience in years only. Although they know the exact number of months and years but the conversion, they do is wrong. This happens because there are 12 months while the digit after decimal would be 0-9, i.e., 10 digits. Which means that we have to represent the number of months in terms of year. So here I have provided a small gadget to calculate it. Just put the date when you had started working in the From Date field and put current date in the To Date field. You can also calculate your age as well with this tool by putting your date of birth in the From Date field and put current date in the To Date field. As an alternative, you can use the hassle-free and simple to use  Date Differentiator  micro webapp. Bookmark it so you may easily access it later.

How to convert JIRA story into sub-task or defect?

Many times we entangled in the situation where we have made a  story  in JIRA but later on realised that it should have to be  defect  or in other case,  sub-task  of another  story . Story → Sub-task So the workaround for converting the story into defect is given below: Open your  story Click on  more  option Click on the  Convert to sub-task  option in the dropdown You would be asked to choose  Parent  story, so chose relevant story After submit, your  story  gets converted into  sub-task Story → Defect Now if you want the story to be converted into defect, then you should first convert it into sub-task. Thereafter, you can convert that sub-task into defect as given below: Open the  sub-task Click on  more  option Click on the  Convert to issue  option in the dropdown You would be asked to fill up relevant fields required for raising a  defect , fill them up as required After submit, your  sub-task  gets converted into  defect .