'삽질+돈되는짓/Adobe AIR/Flex'에 해당되는 글 5건

  1. 2010.02.22 WPF, XAML을 보며 단상... (2)
  2. 2009.06.21 RTMP (2)
  3. 2009.06.21 AMF
  4. 2009.06.21 Local Db
  5. 2009.06.21 Native Drag & Drop
posted by 아겔-_- 2010.02.22 23:09
솔까말... 어쩔수없다만... 그때는 좋은 선택이었다고 생각했는데 지금에 와서는 좀 거시기해진 지식/기술을 꼽으라면 개인적으로 ActionScript/Flex라고 생각함...

대세에서 밀려 버린 느낌에 이제는 스타크래프트 UI 만드는데 정도만 유용한거 같은 지식;; (도대체 Array.map에 넘겨주는 함수객체의 시그니쳐가 뭔지 알게뭐고, DataGrid에서 ItemRenderer을 적절히 쓰는 방법이 그 영역 이외에 어떤 도움을 줄지 미지수였다;;;)

다르게 말하면 최근에는 단말성 지식으로 다른 영역에 적용할 방법이 없거나 무의미한짓이라고 생각했었다... (좀 우울하게 자기부정이었었다.)

그런데 꼭 그렇진 않더라도, 그냥 조금 여유로운 시선으로 C#, .NET, WPF, XAML, SilverLight등을 보면 꼭 그렇지도 않다는 느낌이 든다. 나름 어제보다 더 나아진 모습이고 그것들을 알고 있음으로 또 도움이 된다는 긍정적인 생각을 해본다.


ps. 하악하악 MS완소... 하악하악...




신고

'삽질+돈되는짓 > Adobe AIR/Flex' 카테고리의 다른 글

WPF, XAML을 보며 단상...  (2) 2010.02.22
RTMP  (2) 2009.06.21
AMF  (0) 2009.06.21
Local Db  (0) 2009.06.21
Native Drag & Drop  (0) 2009.06.21
posted by 아겔-_- 2009.06.21 21:19

RTMP?

 

플래쉬, Flex, AIR에서 서버측과 연동을 위해서 이용하는 프로토콜.

 

RPC와 같이 생각하면 될듯. 메시지의 내용(결과/예외)은 AMF을 통해서 직렬화하고(포맷), 그를 위한 포맷으로 RTMP을 이용.

 

"Adobe Message Format" : SOAP에 기반한 바이너리 포맷. RPC을 이용하여 플래쉬와 서버간 연동을 위한 프로토콜.

  1. RTMP : 첫번째 변형: tcp/1935 "plain" . 포트가 사용불가면 RTMPT등으로 우회통신.
  2. RTMPT : HTTP을 통해서 방화벽을 우회. 아무래도 완전 바이너리가 아니니까 약간 오버헤드.
  3. RTMPS : HTTPS을 이용해서. RTMPT와 같음.
  4. RTMPE(RTMP Encrypted) : 128비트 암호화를 통해 전달. 약간의 성능 영향.
  5. RTMPTE : RTMPE + RTMPT. Flash 9 이상?
  6. RTMFP (Real Time Media Flow Protocol) : UDP용. 항상 암호화하여 전달.

 

 

사실 역활은 3가지인듯.

  1. 오디오
  2. 비디오
  3. RPC

 

기본 TCP, RTMP 바이너리 프로토콜은 상태를 갖는 연속적인 연결을 유지함.

데이터는 조각으로 나누어 전달. 이는 서버와 클라이언트간에 합의가 가능함.

  • 비디오 및 기타는 128바이트가 기본 조각크기
  • 오디오는 64바이트

 

사실 여러개의 채널을 갖고 있음

  • 비디오 스트리밍 (FLV...)
  • 오디오 스트리밍 (MP3...)
  • RPC 호출 (AMF0/3)
  • out-of-band 제어 (조각크기협상등을 위한..)

이러한 채널들은 하나의 세션에 동시에 활성화가 가능

 

 

패킷헤더에는

  • 채널 아이디
  • 타임스탬프 (필요하다면)
  • 그리고 payload의 크기등...

그리고 그 뒤에 payload가 따라오겠지. payload은 협의한 조각의 크기만큼.

 

 

참조문서

 

슬프지만 2009년 1/4분기에 스펙을 발표한다고는 했는데...

 

 

 

 

대충 설명을 번역해봤음 : http://wiki.gnashdev.org/RTMP

 

동시에 64개의 같은 네트웍 연결에 지원

 

각각의 AMF 헤더는 스트림의 색인번호를 담음

 

각 AMF 패킷은 128바이트. (오디오 스트리밍을 제외하고 == 64바이트)



모든 통신의 0x3 한 바이트 메시지를 서버로 보내며 클라이언트가 개시. 그리고 1536 바이트의 데이터 블록이 뒤 따르는데 형식은 알수없으며, handshake을 위한것으로 보임. 그리고 서버는 다시 같은 메시지를 반송한다. 이것으로 통신이 시작. 클라이언트가 다시 이 1536바이트 블럭을 수신하고 이것이 원본과 일치함을 확인.


두번째 패킷에 "NetConnection"객체를 서버에 보냄. (이를 이용해 플래쉬측에서 서버에 접속하는)


세번째 패킷은 "NetStream"객체를 보냄. (이는 플래쉬측에서 서버에서 얻을 파일을 지정함)


예제 패킷은 다음과 같음:

 

  1.     030000190000c91400000000020007connect00?f0000000000000030003app0200#
        software/gnash/tests/1153948634.flv0008flashVer02000cLNX 6,0,82,0 0006
        swfUrl02001dfile:///file|%2Ftmp%2Fout.swfc30005tcUrl\002\0004
        rtmp://localhost/software/gnash/tests/1153948634.flv\000\000\t
        \002\000\005userx
  2.  


3개의 AMF 패킷이 이 한 메시지에 속함을 보임. 128바이트 블럭들에 담기며, 마지막 블럭은 그보다 작다. 그리고 RTMP 메시지의 전체크기는 헤더에 저장함.

 

  1. RTMP헤더가 처음. "connect message"를 나타내는 메시지 몸체가 따름.
  2. 그리고 그 다음 AMF 패킷이 NetConnection(플래쉬측에서 넘기는), 이에 서버측에 원하는 파일을 지정. 그리고 버젼번호가 따라서 플래쉬 플레이어위 버젼을 지정.
  3. 그리고 세번째로 NetStream. 파일이름. 그리고 보안을 위한 사용자 이름.


세부적인 사항을 위해 AMF의 형식을 설명. 플래쉬 객체는 AMF 패킷으로 변환하여 통신 (오디오, 비디오도)


RTMP 헤더의 첫번째 바이트는 메시지의 나머지를 결정함. 첫번째 2비트는 RTMP헤더의 크기를 표현.

 

  • 00 : 12바이트. (이 바이트도 포함)
  • 01 : 8바이트 (상동)
  • 02 : 4바이트 (상동)
  • 03 : 1바이트 (이것으로 헤더끝)


첫번째 바이트의 나머지 6비트는 AMF index. 하나의 RTMP연결은 multiple data stream을 지원. AMF index을 통해서 어떤 객체가 완전히 전송되기 전까기 그 객체를 위해 할당. (그래서 한번에 64개?)


메시지를 위한 헤더는 총 4바이트고, 나머지 3바이트는 오디오, 비디오 데이터 패킷을 위함. 그런데 이 예제에서는 이 필드의 의미를 알수없음.


8바이트나 그 이상의 크기인 메시지일때는 다음 3바이트는 RTMP 메시지의 크기를 나타냄. 1바이트나 4바이트 헤더는 표준크기의 메시지를 나타냄. 128바이트=비디오, 64바이트=오디오. 만일 1, 4바이트의 헤더라면 메시지의 내용은 그 이전 메시지와 동일.


8바이트나 더큰 헤더의 메시지라면 다음 바이트는 AMF객체의 타입.

  • 0x3 : RTMP 패킷의 타입이 읽을 바이트수를 의미. RTMP 연결의 시작을 위해 사용
  • 0x4 : RTMP ping 패킷
  • 0x5 : 서버측 응답
  • 0x6 : 클라이언트측 요청
  • 0x8 : 오디오
  • 0x9 : 비디오
  • 0x12 : notify
  • 0x13 : shared object
  • 0x14 : remote procedure call, 플래쉬 클래스의 메서드를 호출.

 

 


두가지 데이터 타입을 고려.

  1. AMF 객체의 내용형식
  2. 액션스크립트 데이터타입 태그

 

다음은 initial type byte의 값들:

  • 0x0 : numeric value (64bits, big-endian)
  • 0x1 : boolean
  • 0x2 : ASCII string
  • 0x3 : Flash object.The Flash object data type field further along in the message specifies which type of ActionScript object it is.
  • 0x4 : Flash movie
  • 0x5 : NULL
  • 0x6 : undefined
  • 0x7 : reference
  • 0x8 : ECMA array
  • 0x9 : end of object definition. 어떤 객체의 끝에 도달했음을 표기.
  • 0xa : Strict array
  • 0xb : date
  • 0xc : multi-byte string.
  • 0xd : unsupported feature.
  • 0xe : recordset
  • 0xf : AML object. XML ActionScript class.
  • 0x10 : typed object

 

12바이트 헤더에서, 마지막 4바이트는 메시지의 라우팅. 서버가 목적지라면 값은 NetStream object source. 만일 목적지가 클라이언트라면, 이는 RTMP 메시지를 위한 NetStream object. 0x00000000값은 NetConnection객체를 표현하기위함.

 

다수의 AMF 스트림은 하나의 RTMP 메시지에 포함가능. 그러므로 AMF 패킷의 index을 잘 맞추어야...

 

마지막으로 다음과 같은 헤더는...

 

  1.     03 000019 0000c9 14 000000000
  • 03 : 처음 2비트는 헤더의 크기. 여기서는 00 == 12바이트 헤더. 다음 6비트는 AMF stream index, 예제에서는 0x3.
  • 000019 : 처음 3바이트는 타임스탬프. When the timestamp is greater than 0xffffff, this field is set to 0xffffff and the value in 32 bits big endian is append to the header and to the following one byte compressed headers for the same channel (so then, they are 5 bytes long).
  • 0000c9 : 12바이트 헤더이므로, 이는 RTMP 메시지의 크기. 201바이트임.
  • 14 : RTMP 메시지의 본문타입. 여기서는 RPC.
  • 00000000 : The source is the NetConnection object used to start this connection.


RTMP status codes: http://wiki.gnashdev.org/RTMP_Messages_Decoded

 

 

 

이 글은 스프링노트에서 작성되었습니다.

신고

'삽질+돈되는짓 > Adobe AIR/Flex' 카테고리의 다른 글

WPF, XAML을 보며 단상...  (2) 2010.02.22
RTMP  (2) 2009.06.21
AMF  (0) 2009.06.21
Local Db  (0) 2009.06.21
Native Drag & Drop  (0) 2009.06.21

AMF

posted by 아겔-_- 2009.06.21 21:19

AMF 연구

 

  • 어도비 AMF을 연구? 2009/05/31 23:08:36

 

 

궁금증

  1. 대충 어떻게 구조/구현?

    • AMF, RTMP에 따른 문서들에 대한 설명이 전부인듯. 2009/06/06 02:51:37
    • 내부적으로 NetConnection, NetStream을 이용한다는것과 RTMP을 통해서 메시지가 오고 가는것을 알수있었고
    • RPC 호출의 경우에도 AMF0/3을 통해서 대략적으로 어떻게 직렬화하는지 알수있었음
  2. 그렇다면 현재의 GDS와 같은 애들과 .swf측에서의 연동을 위한 service-config.xml와 같은것을 대체할수있도록 어떻게할지?
  3. 앞으로는 단순히 AJAX와 같은 주소을 통한 연동으로 가능할정도로 발전하려면?

    • 질문2와 같은 내용일듯. 2009/06/06 02:51:00
  4. AMF0와 AMF3의 차이?

 

 

AMF?

 

 

 

관심가는 프로젝트

 

결론적으로 red5, PyAMF을 분석해보는게 좋을듯. 특히 PyAMF은 문서화에 많은 신경을 쓴듯.

 

RTMP/AMF에 대해서는 문서화가 잘 되어있어서 굳이 소스를 뜯어볼 필요까진 없을듯.

 

 

 


 

 

 

 

AMF의 구조 : http://wiki.gnashdev.org/AMF

 

  • 이 문서는 AMF0을 기준으로한듯. AMF3의 내용은 AMF0/3의 차이점을 분석해보니 '개선'에 속하며, 이 내용을 확장한것이므로 개념적으로 이를 통해도 무방할듯.
  • 개념적 이해를 완료했고, 세부적인 사항이 필요하다면 당연히 AMF0/AMF3 스펙을 읽어보는게 가장 정확한 정보의 출처일듯.

 

AMF 포맷
  • LocalConnection
  • SharedObject
  • NetConnection
  • NetStream

뭐 이런 액션스크립트 클래스를 표현하는데 이용.

 

플래쉬무비간, 플래쉬무비와 플래쉬서버간 통신에 이용.

 

RTMP헤더와 같이 가변길이헤더임. RTMP와 같은 사이즈의 헤더이거나 1바이트 헤더임. (1바이트는 오디오, 비디오 스트리밍을 위해서)

 

예를 들어 다음의 헤더는... (공백은 그냥 넣어본거임)

  1. 02 0007 636f6e6e656374
  • 02 : 단일바이트 헤더임. 이후 데이터의 타입을 표기. (이따가 설명)
  • 0007 : 문자열의 길이 (big-endiang)
  • 63 6f 6e 6e 65 63 74 : 문자열인데, null-terminated 문자열이 아님. (길이를 지정할수있으니까)

 

데이터타입들

 

타입 / 설명

NUMBER

 8바이트(big-endian) float double.

0x00

BOOLEAN

 1바이트

0x01

STRING

 2바이트(BE) count(바이트크기).

 그리고 텍스트바이트열. (아마도 UTF-8)

0x02

OBJECT

  • key/value 짝의 리스트.
  • key은 위의 문자열과 같이 타입바이트 없이 지정
  • value은 다른 AMF값과 같이.
  • 모든 객체는 OBJECT_END로 끝냄.
0x03
MOVIECLIP 0x04

NULL_VALUE

 타입만 있고, 내용은 0바이트.

0x05

UNDEFINED

 NULL_VALUE와 마찬가지로 내용은 0바이트.

0x06
REFERENCE 0x07
ECMA_ARRAY 0x08

OBJECT_END

  • 0x000009
  • zero-length string key
  • OBJECT의 마지막 요소임을 나타내는 AMF-value로 이용
0x09

STRICT_ARRAY

  •  ["foo", "bar", 1]와 같은 배열을 위한 타입. 해쉬를 위해서는 OBJECT을 씀.
  • 4바이트(BE)을 이용해서 요소의 길이를 지정하고,
  • 배열의 요소는 뒤따르는 AMF객체들로 나타냄
0x0a
DATE 0x0b
LONG_STRING 0x0c
UNSUPPORTED 0x0d
RECORD_SET 0x0e
XML_OBJECT 0x0f
TYPED_OBJECT 0x10

 

 

SharedObject의 경우
  • 타입필드를 제외하고
  • 길이가 뒤따르고
  • 바이트 카운트가 포함되고
  • 그리고 이름이.
  • 그리고 AMF type field, 길이, 데이터.

 

 

NetConnection::Call의 경우
  • RPC호출/응답을 위해 이용함
  • AMF 패킷의 첫번째 2바이트는 AMF type

    • 0x0 : AMF0
    • 0x11 : AMF3
  • 다음은 타입필드

    • 2개의 16비트 헤더필드
    • 첫번째는 패킷에 몇개의 헤더가 존재하는지 카운트.
    • 두번째는 패킷에 담은 메시지의 카운트.
  • 각 메시지는 해당하는 헤더가 있음

    • 첫번째 필드는 문자열 : 2바이트의 문자열 길이와
    • 두번째 또 다른 문자열과 문자열 길이 필드 : 요청한 메시지의 (객체.메서드?) 문자열
    • 그리고 4바이트는 이후 데이터 필드의 길이
    • 나머지는 데이터 필드들

 

 

 

 

 

 


 

 

 

 

AMF0/3의 차이점

AMF3 스펙을 보니 나와있네용.

  • Object traits can now be sent by reference
  • Strings can now be sent by reference
  • int/uint type support
  • flash.utils.ByteArray type support, can also be sent by reference
  • flash.utils.IExternalizable support
  • Variable length encoding scheme for integers to reduce data size
  • References are sent using variable length integer
  • String UTF-8 length uses variable length integer
  • Array count uses variable length integer
  • A single Array type marker covers both strict and ECMA Arrays
  • Dates no longer send timezone information
  • Dates can now be sent by reference
  • XMLDocument UTF-8 length uses variable length integer
  • XMLDocument can now be sent by reference
  • XML type support, can also be sent by reference
  • XML UTF-8 length uses variable length integer
  • ByteArray type length uses variable length integer
  • Boolean true and false are now sent as one byte type markers
  • Unsupported type marker has been removed
  • Reserved RecordSet and Movieclip type markers have been removed

거의 대부분 정리를 해보면...

  • Boolean타입의 true/false을 한 바이트 타입마커로 지정
  • Array로 ECMA array와 strict array을 동시지원
  • 레퍼런스값, 길이값등을 가변정수로 대체
  • reference에 의해서 상대측 FlashPlayer에 있는 객체라면 전부 새로보낼 필요없이 참조번호만을 보낼수있나봄. (bandwitdh절약/성능개선)

    • Date, XMLDocument, XML, ByteArray, ByteArray, Object traits, String...
  • int/uint, flash.utils.ByteArray, flash.utils.IExternalizable, XML등을 추가지원.
  • DATE에서 timezone정보를 제외
  • 몇몇 타입을 제거

    • UNSUPPORTED, RECORD_SET, MOVIECLIP

 

결국...

  • 불필요한 타입을 없앴고(플래쉬스러운 MOVIECLIP, RECORD_SET, DATE의 timezone...),
  • 더 액션스크립트스럽게했고(Array = StrictArray + EcmaArray, Boolean = true or false),
  • 참조값을 도입하여 성능을 개선했고,
  • XML지원을 강화했으며,
  • 길이값의 제한을 없애는 한편 전송성능을 향상

 

 

 

 

 


 

 

 

 

service-config.xml에 관한 궁금증

 

  • Flex3 SDK의 "/frameworks/projects/rpc/src/mx/messaging/config/ServerConfig.as"의 소스코드를 살펴보면될듯.
  • "dynamically load flex service-config.xml in client" : http://njulf04.blog.163.com/blog/static/7319348200948762243/
  • 결정적 답변인듯 : http://www.nabble.com/services-config.xml:-compc-or-just-mxmlc--td20889795.html
  • When you compile with mxmlc and -services, a subset of your config is baked in the swf. It looks like compc doesn't complain about a -services option, although the 'baked in' aspect of this is code-gen'ed into the generated Flex init code. I don't know whether any of that is generated for a swc, but feel free to give it a try. You could test by compiling a swc with -services, then building a swf (including this swc) without -services and checking for baked in config.

    The baked in subset of config ends up living here at runtime: mx.messaging.config.ServerConfig#xml

    If you change services-config.xml, you should recompile the artifact that it's baked into. Avoid compiling it into multiple artifacts. After changes to [RemoteClass]'s you should recompile the respective artifacts they live in.

  • http://pyamf.org/wiki/RemoteObjectConfig 코딩으로 service-config.xml 대신하기.
  1. // Create the AMF Channelvar channel:AMFChannel = new AMFChannel( "pyamf-channel", "http://localhost:8080/services" );

    // Create a channel set and add your channel(s) to itvar channels:ChannelSet = new ChannelSet();
    channels.addChannel( channel );

    // Create a new remote object and add listener(s)var remoteObject:RemoteObject = new RemoteObject( "EchoService" ); // this is the service idremoteObject.channelSet = channels;
    remoteObject.echo.addEventListener( ResultEvent.RESULT, onEchoComplete );

    // Make a call to the remote objectremoteObject.echo( "Hello World" );

    // Here is the result event listenerprivate function onEchoComplete( event:ResultEvent ):void
    { Alert.show( event.result.toString() ); }

 

 

 

  1.  

이 글은 스프링노트에서 작성되었습니다.

신고

'삽질+돈되는짓 > Adobe AIR/Flex' 카테고리의 다른 글

WPF, XAML을 보며 단상...  (2) 2010.02.22
RTMP  (2) 2009.06.21
AMF  (0) 2009.06.21
Local Db  (0) 2009.06.21
Native Drag & Drop  (0) 2009.06.21
posted by 아겔-_- 2009.06.21 21:18

Adobe Air / Local Db

 

2009/06/18 00:09:20

 

소문대로 SQLite3였심. 은근히 사용하기 편리한게 하악하악이었음. 거기에 다른 디비에 대해서보다 훨씬 특화되어있기 때문에 스키마에 대한 접근성등이 뛰어났다.

 

 

쌩기초

 

기본적인 흐름과 추가적인 주목 사항을 나열해보면...

 

  1. SQLConnection : open/openAsync을 통해서 디비를 생성하거나 오픈. 파일이름을 주지 않으면 단순히 in-memory-db로. File.*.resolvePath등을 이용하여 미리 정의된 사용자 폴더등에 디비 파일을 만들기도 쉽고.

    • openAsync와 같은 경우, 비동기로 기존의 RemoteObject등에 콜백을 붙여서 실행하듯이 처리가 가능하다. 이렇게 선택적인 동기적 처리의 지원이 Flex에서는 전혀 없었는데 마음에 든다.
    • attach 메서드를 이용하여 다른 디비 파일을 한 커넥션에서 관리가 가능
    • loadSchema, getSchemaResult등을 이용하여 스키마 정보에 접근이 가능
  2. SQLStatement : 일반적인 DBI, JDBC 프로그래밍에서처럼 prepared statement의 기능을 제공. 훨씬 액션스크립트적으로.

    1. 일단 new하고 sqlConnection, text을 채워줌. (text은 sql문장)
    2. parameters을 변수로 바인딩해주면 되는데

      • text에서 "SELECT * FROM FOO WHERE BAR = :BAR"와 같이 named parameter을 ":BAR"로 지정하면
      • stmt.parameters[":BAR"] = "foobar!!!"
      • 뭐 이렇게 지정하면 되더라
      • 레퍼런스를 보니, "?", "@"도 사용이 가능한 모양.
    3. itemClass로 결과값을 바로 다른 객체의 필드와 매핑이 가능함.

      • "SELECT foo, bar, zoo FROM spam"이라면
      • foo, bar, zoo을 프로퍼티로 갖는 클래스를 지정하면 결과객체가 해당 클래스로!
  3. 마지막으로 실행은 SQLStatement의 execute랑 getResult을 통해 이루어지고, getResult로 얻은 SQLResult로 값을 얻어내면 됨.

 

정말 간단하지않음?

나름 ORM들도 꽤 나와있는듯하니 멋질듯.

그리고 은근히 캐쉬관리나 사용자설정등을 저장하려면 이런게 있는게 좋으니까.

 

 

이 글은 스프링노트에서 작성되었습니다.

신고

'삽질+돈되는짓 > Adobe AIR/Flex' 카테고리의 다른 글

WPF, XAML을 보며 단상...  (2) 2010.02.22
RTMP  (2) 2009.06.21
AMF  (0) 2009.06.21
Local Db  (0) 2009.06.21
Native Drag & Drop  (0) 2009.06.21
posted by 아겔-_- 2009.06.21 21:18

Adobe Air / Native Drag & Drop

 

2009/06/18 00:25:00

 

Adobe Air/Flex에서 Native OS와 DND연동에 대한 메모.

 

 

기초

  • NativeDrag*등과 같은 기존의 Drag*에 대응하는 AIR<->Native간 DND을 지원하기위한 API들이 추가.
  • 예전 Air/Flex 버젼에서는 TransferableData인가등을 이용했는데, 이제는 아예 Native Clipboard연동을 지원하면서 클립보드 객체를 이용하여 연동을 하게된듯. (Flex3)
  • 완전히 모든 네이티브 DND을 지원하지는않고 다음 종류의 데이터들만 지원하는듯.

    • TEXT, RICHTEXT, URL, FILE_LIST, BITMAP
    • 그리고 그냥 serialized object등... (수신자가 받기 힘들겠지?)

 

 

Native -> AIR

  • NativeDragEvent의 NATIVE_DRAG_ENTER, NATIVE_DRAG_DROP이벤트를 수신한다.
  • NATIVE_DRAG_ENTER의 경우

    • 넘겨받은 클립보드가 해당 drop-target에서 acceptable한지를 판별하여, 가능하다면 DragManager.acceptDragDrop(uiControl)한다.
    • 예를 들어, 파일 리스팅이라면 파일 객체는 받을수있지만, 텍스트 객체는 받기 모호하거나
    • 하나의 파일만을 받아야 하는 경우등을 체크할수있다.
  • NATIVE_DRAG_DROP의 경우

    • 실제 해당 타겟에 대해서 드롭이 일어난 경우이므로 이벤트의 클립보드 객체를 활용하여 적절히 처리한다.

 

AIR -> Native

  • NativeDragManager.doDrag을 이용하여 외부로의 드래그를 initiate.
  • 시작하는 이벤트는 어떠한 이벤트 핸들러여도 좋지만, 일반적으로 dragStart 이벤트를 이용하는게 무난하다.

    • 다른 이벤트의 경우 drag-initiate가 중단되거나 하는 경우가 있음.

 

이상한점&한계성

  • AdvancedDataGrid의 dragStart이벤트로부터 NativeDragManager.doDrag을 이용하여 drag-initiate할 경우 발생하지않거나, 정상적으로 native측에 acceptable하지 않은 drag을 initiate함-_- ListBase을 상속한 컨트롤들에서는 정상적임. (플렉스3)
  • Clipboard.setDataHandler로 지정하는건 함수객체를 지정하게 만든거라 Native측에 Drop했을때만 평가하겠다는 의미인줄로 알았는데(그렇지않다면 Clipboard.setData랑 다를게 뭐임?) 똑같은 시점에 데이터를 평가해서 그 결과를 떨궈주는듯-_- (플렉스3)
  • dragStart이벤트가 NativeDragManager.doDrag을 통해 initiate될 경우 중복적으로 호출될수가 있음.

    • drop-target측이 바뀔때마다 바뀌는듯
  • setDataHandler의 한계성은 물론이고, 실제 native drop-target측에 떨궜을때의 이벤트를 포착하기가 어렵다.
  • FILE_LIST_FORMAT을 넘길 경우에 File객체가 실존하지않는 파일을 지정해도 가능하지만, 실제 수신측에서 이를 처리하기 위한 추가적인 무언가가 필요해지고(에이젼트, 쉘익스텐션...), 실제 native drop-target측의 drop 이벤트를 판별하기 힘들어 정확한 시점에 동기적/실시간으로 다운로드 상황을 표현하기 어렵다.

 

 

이 글은 스프링노트에서 작성되었습니다.

신고

'삽질+돈되는짓 > Adobe AIR/Flex' 카테고리의 다른 글

WPF, XAML을 보며 단상...  (2) 2010.02.22
RTMP  (2) 2009.06.21
AMF  (0) 2009.06.21
Local Db  (0) 2009.06.21
Native Drag & Drop  (0) 2009.06.21

티스토리 툴바