AIR/파일시스템 연동2008. 12. 24. 15:50


AIR에는 EncryptedLocalStore라는 암호화된 로컬 데이터 스토리지(저장소)에서 객체를 설정하고 가져오기 위한 메서드를 제공한다. 즉 사용자별로 분리된 보안 스토리지 영역을 할당 받아 사용 할 수 있는 것이다.
EncryptedLocalStore를 통해 보안 스토리지에 저장되는 모든 데이터는 AES-CBC 128비트 암호화 알고리즘을 사용하며 작업시 암호화/복호화는 모두 EncryptedLocalStore가 알아서 처리한다.

암호화된 보안 스토리지 영역에 저장되는 데이터들은 유니크한 Key에 의해 식별되며 이 키는 데이터를 가져오기 위해 사용하는 문자열에 해당된다.

[ Public 메서드 ]
getItem(name:String):ByteArray
[정적] 암호화된 로컬 저장소에서 지정한 이름의 항목에 대한 데이터를 반환합니다.

setItem(name:String, data:ByteArray, stronglyBound:Boolean = false):void
[정적] 지정된 이름의 항목을 제공된 ByteArray 데이터로 설정하여 저장합니다.

removeItem(name:String):void
[정적] 암호화된 로컬 저장소에서 지정된 이름의 항목을 제거합니다.

reset():void
[정적] 암호화된 로컬 저장소 전체를 지우고 모든 데이터를 삭제합니다.

Posted by 버터백통
AIR/파일시스템 연동2008. 12. 9. 19:06

FileReference()에 기본적으로 OS다이얼로그 창을 제공하는 메서드를 지원한다. player10 이후에는 FileReference()만으로 무비에 불러오고 로컬에 저장까지 가능하다.  
이러한 클래스를 상속받은 File()클래스는 같은 방법으로 로컬상의 파일을 불러오거나 저장을 할 수 있다.

* 다이얼로그 창 여는 메서드
File.browse() : 업로드할 파일을 선택할 수 있는 대화상자를 연다.
File.browseForDirectory() : 폴더를 선택하는 대화상자를 연다.
File.browseForOpen() : 파일을 오픈(불러오는)기능의 대화상자를 연다.
File.browseForOpenMultiple() : 여러개의 파일을 오픈(불러오는)기능의 대화상자를 연다.
File.browseForSave() : 파일을 저장하는 기능의 대화상자를 연다


이러한 메서드들을 호출하면 그림과 같은 대화상자(다이얼로그창)이 나타난다.

그림을 보면 파일형식에 images라고 적혀 있고 실제로 jpg, gif, png 등 이미지 파일만 보여지고 불러올 수 있다 .
이는 browserXXX( 이름 , 파일필터 )를 호출 할 때 대화상자 이름과 파일필터를 인수 값으로 설정할 수 있다. 대화상자의 이름은 문자열로 설정하며 파일필터는 FileFilter()를 담은 배열이나 단독적인 파일필터를 사용하여 설정한다. FileFilter()에 설정된 파일형태만 다이얼로그창에 표현할 수 있다. 단 로드하고자 하는 형태가 아닌 다른형태의 파일형태가 존재하고 해당 이름을 창에서 직접 입력하여 불러오면 무비속으로 불려 진다. 당연히 사용할 수 없는 포맷이므로 그냥 사용하지 말고 내부에서 확장자 검사를 다시 한번 하여 사용하는 예외처리를 하는 것을 잊지말자.

이처럼 File을 delegate한 객체에 Event.SELECT이벤트를 사용하면 어떠한 파일을 선택하였거나 저장시 저장할 파일을 선택 또는 생성 하였을 때  Select이벤트가 발생하며 리스너에서 처리하면 된다.

AIR에서는 FileListEvent라는 이벤트를 추가로 제공한다. browseForOpenMultiple() 호출을 통해 여러개의 파일을 선택하였을 때 객체에 FileListEvent.SELECT_MULTIPLE을 리스너로 등록하면 이벤트의 files에 배열 형태로 파일들이 저장되게 된다. 또한 FileListEvent.DIRECTORY_LISTING 역시 디렉토리에 포함된 내용을 배열에 등록하는 이벤트도 지원한다.


Posted by 버터백통
AIR/파일시스템 연동2008. 12. 9. 15:23


AIR에는 FileReference를 상속받은 File()이라는 클래스가 있다.
File클래스의 주된 기능은 로컬의 디렉토리나 파일로 접근하여 데이터를 읽어 오거나 디렉토리 생성 삭제, 파일 생성 삭제 등 File 시스템 작업을 하는 클래스 이다.

File에는 몇 가지 디렉토리로 접근하는 경로가 상수로 잡혀있다.
File.userDirectory: 사용자 계정의 폴더경로
File.applicationDirectory : AIR어플리케리션 파일이 있는 경로(읽기만 가능)
File.applicationStorageDirectory : AIR어플리케이션 storage 경로(읽기와 쓰기가 가능)
File.desktopDirectory : 바탕화면 경로(읽기와 쓰기가 가능)
File.documentsDirectory : 내문서 경로(읽기와 쓰기가 가능)


위와 같은 기본 경로를 토대로 resolvePath()를 사용하여 경로를 완성한다.

* 하위 경로를 설정하는 resolvePath( path:String ) 메서드
resolvePath( )의 path에 문자열로 하위 폴더나 또는 접근하고자 하는 파일을 설정하면 해당 파일이나 폴더로 접근이 가능하다. 가령 윈도우OS의 내문서 폴더로 접근하려면 File.documentsDirectory 까지만 사용하면 되지만 내문서에 "My Folder"라는 폴더로 접근하고자 할 때는 resolvePath()를 사용하여 File.documentsDirectory.resolvePath("My Folder")라고 하위 디렉토리 명까지 적어 주어야 한다. 물론 파일에도 접근이 가능하다. 만약 My Folder에 sys.txt파일로 접근하여 데이터를 가져오고자 한다면
File.documentsDirectory.resolvePath("My Folder/sys.txt")라고 적어준다. 또한 한 단계 상위로 이동하고자 할때는 "../" 또는 ".."을 사용하면 현재위치에서 한 단계 상위 폴더로 이동한다.

* 현재 위치를 확인하는 nativePath 속성과 url속성
현재 위치를 알고 싶을 때는 nativePath속성을 사용한다. nativePath는 현재 File의 지점이 어디인지를 확인할 수 있도록 자세한 경로를 나타낸다.
가령 var myDoc:File = File.documentsDirectory.resolvePath("My Folder");
trace( myDoc.nativePath )
trace결과는 "C:\Documents and Settings\Administrator\My Documents\My Folder"라고 출력을 한다. 위의 경로에서 "C:\Documents and Settings\Administrator\My Documents"까지가 File.documentsDirectory에서 기본 제공하는 경로이며 resolvePath("My Folder") 에 의하여 내문서 폴더안에 "My Folder"라는 이름의 디렉토리까지 접근이 가능하다.

또한 비슷한 형태로 URL 스키마로 표현하는 url이라는 속성이 있다. 이 속성으로 추출된 값은 URL경로로 사용이 가능하다. 아래 테스트 결과(URL scheme)에 마우스 오버하면 링크가 걸린다는 사실을 확인할 수 있다.
trace( myDoc.url)를 출력하면 결과는 다음과 같다.
"file:///C:/Documents%20and%20Settings/Administrator/My%20Documents/My%20Folder"






Posted by 버터백통
AIR/메뉴2008. 12. 9. 14:38

시스템 메뉴를 사용하다 보면 좌클릭 이벤트 뿐만 아니라 휠이나 우클릭 등 여러가지 사용자 이벤트를 사용하여야 하는 경우가 필요하다. 이처럼 좌클릭에 다른 이벤트가 걸려있고 다른 기능을 우클릭에서 활용하고자 할때는 AIR에서 제공하는 contextMenu를 사용한다. 일반적인 AS기반의 우클릭 메뉴에는 "player버전"과 "인쇄" 등 원치 않는 내용이 포함되어 있지만 AIR의 contextMenu는 그러한 메뉴항목이 없고 개발시에 제공하는 순수한 메뉴 항목만 제공한다.

요전에 일반 시스템(크롬)메뉴를 NativeMenu()와 NativeMenuItem()를 활용하여 만들어 보았는데 마찬가지로 우클릭 메뉴도 위의 두개의 클래스들을 가지고 만들어 준다. 그러나 contextMenu는 만든 delegator를 NativeApplication.nativeApplication.menu속성에 대입하는것이 아니고 우클릭 영역의 디스플레이 객체에 contextMenu라는 속성에 대입한다.

var rec:Sprite = new Sprite();
rec.graphics.lineStyle( 0 , 0 , 1 );
rec.graphics.beginFill( 0 , 1 );
rec.graphics.drawRect( 0 , 0 , 100 , 100 );
rec.graphics.endFill();
    
var ui:UIComponent = new UIComponent();
addChild( ui );
ui.addChild( rec );
    
var menu:NativeMenu = new NativeMenu();
var item:NativeMenuItem = new NativeMenuItem("copy");
menu.addItem( item );
rec.contextMenu  = menu;  

 

위 그림은 rec의 영역에 우클릭하여 copy라는 item을 보여주고 있다.

Posted by 버터백통

윈도우의 상태 즉 모니터상에서 위치나 크기 등 메인 어플리케이션은 WindowedApplication속성이나 디스크립터 또는 <mx:Script>에서 nativeWindow로 접근하여 사용한다.
보통 크기는 width , height 위치는 x , y 등으로 설정되므로 .xml에서 찾아보면 쉽게 발견 할 수 있다.

메인에서 생성된 서브윈도우(NativeWindow)의 위치나 크기 설정도 앞서 투명창 설정한 바와 같이 Delgator에 바로 속성을 설정할 수 있다.
window.width = 300
window.height = 200
window.x = 300
window.y = 400


참고로 이벤트에 의하여 객체를 받아(event.target) Delegator를 처리할때는
아래처럼 stage로 접근하여 붙어있는 nativewindow로 접근한다.
event.target.stage.nativeWindow.x = 0;
event.target.stage.nativeWindow.y = 0;

사용자 모니터의 해상도를 읽어와 항상 가운데에 위치하도록 하기 위해서는 flash.system.Capabilities를 사용한다.

모니터 중앙에 위치
window.x = ( Capabilities.screenResolutionX - width ) / 2;
window.y = ( Capabilities.screenResolutionY - height ) / 2;  

참고로 screenResolutionX는 사용자 모니터의 가로 해상도이며 screenResolutionY는 세로 해상도이다.
Posted by 버터백통
1 메인 어플리케이션 윈도우에 크롬레스적용하기
투명윈도우 창을 만들기위해서는 디스크립터를 이용하여야한다. 물론 플래시는 이부분의 편집을 상당히 쉽게 설정할 수 있도록 되어있지만 플렉스는 .xml에서 <initialWindow>에 크롬레스 등 필요한 설정을 하여야 한다.

플렉스에서는 투명창을 만들기 위해서는 반드시 mx.Window라는 어플리케이션을 포함하고 있어야 한다. 가장 바깥을 감싸고 있는 WindowedApplicationshowFlexChrome="false"로 설정하고  그 안에 Window( UI컴퍼넌트를 포함한 레이아웃컨테이너를 상속받은 클래스 )에 속성을 systemChrome="none" transparent="true" type="lightweight" showFlexChrome="false" 로 설정하여야 정상적인 투명창을 만들 수 있다. 불편한 설정도 플렉스4에서는 많이 개선되리라 기대해본다...

참고로 플렉스의 컴퍼넌트를 사용하면 플래시보다 파일크기가 상당히 커지게 된다. 코딩이 편한 장점이 크지만 결과물에 대한 단점이 매우 치명적이다. 따라서 액션스크립트 프로젝트에서도 AIR가 지원되야 한다고 생각한다.

2 서브 윈도우에 크롬레스 적용하기
메인 윈도우에서 생성된 서브윈도우( 이벤트 디스패쳐를 상속받은 NativeWindow클래스 )는 스테이지가 등록되어있고 Window컴퍼넌트에서 지원하는 메서드와 속성을 제공하고 있다.

//옵션설정
var option:NativeWindowInitOptions = new NativeWindowInitOptions();
option.type = NativeWindowType.LIGHTWEIGHT;
option.systemChrome = NativeWindowSystemChrome.NONE;
option.transparent = true;
    
//새창생성    
var window:NativeWindow = new NativeWindow(option);
window.visible = true;

//배경생성
var bg:Sprite = new Sprite();
bg.graphics.beginFill(0xFFFFFF , 0.5 );
bg.graphics.drawRoundRectComplex(0,0,200,200,10,10,10,10)
bg.graphics.endFill();
    
//환경설정
window.stage.addChild( bg );
window.width = 200
window.height = 200
window.stage.align = StageAlign.TOP_LEFT;
window.stage.scaleMode = StageScaleMode.NO_SCALE;
Posted by 버터백통

AIR는 메인 클래스 또는 도큐먼트 크래스를 어플리케이션으로 설정한다. 따라서 기본 창은 1개를 제공하는데 경우에 따라 서브 윈도우를 열어야 하는 경우 nativeWindow클래스를 사용한다.따라서 어플리케이션(윈도우)과 그와 연계된 서브 프로세스(윈도우)들로 구성된다.

어플리케이션에서 윈도우를 새로 만들기 위해서는 NativeWindow()클래스를 사용한다. 이때 반드시 NativeWindowInitOptions()를 설정하여 NativeWindow()의 파라미터로 설정한다. NativeWindowInitOptions()는 새로 열릴 윈도우의 상태를 설정하는 클래스이다.

type = 새로만들 윈도의 시스템 크롬 설정
NativeWindowType.UTILITY : 시스템 크롬을 부분적 사용
NativeWindowType.NORMAL : 시스템 크롬을 전부 사용(새로운 인스턴스 생성에 적합)
NativeWindowType.LIGHTWEIGHT : 시스템크롬을 비사용(systemChrome = none 설정)
systemChrome = 윈도우창(주변의 크롬 창)의 옵션바 등의 투명도 설정
NativeWindowSystemChrome.STANDARD : OS의 기본 크롬창을 사용한다.
NativeWindowSystemChrome.NONE : 크롬창을 제거한다.
transparent : 투명 여부 설정
minimizable : 최소화 여부 설정
maximizable : 최대화 여부 설정
resizable : 리사이즈 여부 설정
x : 윈도우 창의 x위치
y : 윈도우 창의 y위치
width : 윈도우창의폭
height : 윈도우 창의 높이

NativeWindow()는 디스플레이 오브젝트 컨테이너를 상속받지 않는다. 따라서 이를 담고있는 stage로 가서 객체를 addChild()하여야 한다. 또한 컨텐츠의 정열과 크기의 제어 또한 stage에서 설정한다.
scaleMode : 윈도우 창에 의한 스케일 조절
StageScaleMode.NO_SCALE : 컨텐츠의 스케일 변화 없게
StageScaleMode.EXACT_FIT : 종횡비 없이 강제로 알맞는 크기 제어
StageScaleMode.NO_BORDER : 종횡비를 유지하되 깨짐을 최소화 하여 컨텐츠 크기 제어
StageScaleMode.SHOW_ALL : 종횡비를 유지하고 깨짐을 최소화 하여 전체 내용이 보이도록 크기 제어
align : 윈도우 창에 의한 위치 설정
StageAlign에 여러가지 설정된 상수로 설정한다.

이렇게 생선한 윈도우는 항상 visible = true나 activate(활성화)에 의해 화면에 나타나게 된다.


Posted by 버터백통
AIR/AIR란?2008. 10. 22. 14:08
제가 생각하는 AIR란 예전부터 지금까지 이어온 CS를 보다 화려하게(?) 개발할 수 있는 Actionscript기반의 개발툴이라고 생각합니다.

이미 C나 MFC,VB... 등을 사용하여 사용자 컴퓨터에서 실행되는 데스크탑 어플리케이션을... SWF를 이용하여 화려한 UI로 개발하기 위해서는 별도로 MFC나 C등을 공부하여(또는 위탁하여) SWF를 탑재한 어플리케이션을 설치하고 웹을 통한 DB나 컨텐츠 등을 받아서 활용 하여야만 했습니다. 따라서 작업 절차가 번거롭고 실제로 SWF를 탑재하기 보다는 그냥 VB등으로 어플을 개발하는 사례가 많았습니다.
이러한 번거로운 작업을 AIR라는 툴의 등장으로 이제 AS기반에서 개발에서 배포 및 설치 까지 가능하게 된 것입니다. 제가 생각 했을 때 액션스크립트는 다른 언어(C등)보다 퍼포먼스가 좀 떨어질지는 모르지만 효과나 UI는 어느 언어보다 강력하다고 생각합니다.

이러한 강력한 UI의 CS가 등장함에 따라 데스크탑 어플리케이션들도 정적인 UI에서 동적인 UI로 진화하지 않을까 생각합니다.

아래는 어도비에서 소개한 AIR에 관한 소개글을 발췌하였습니다.
.......................................................................................................................................................
Adobe AIR는 운영체제에 상관 없이 데스크톱에서 RIA(Rich Int-ernet Aapplications)를 개발 및 배포할 수 있는
런임입니다.
여러분은 전통적인 데스크톱 개발 기술을 배우지 않고도 기존에 사용하던 웹 기술(HTML, Javascript, Adobe Flash®, Adobe Flex™, Ajax)로 개발한 웹 어플리케이션을 데스크톱에서 실행할 수 있습니다.

기술적 특징
운영체제에 상관 없이 동작하는 데스크톱 기반 런타임
HTLM을 위한 오픈소스 WebKit 엔진
Flash를 위한 오픈소스 Tamarin VM
Adobe Flash Player 8보다 10배 이상의 속도 향상을 제공하는 AVM 3 JIT 컴파일러
바이너리 호환성 - 운영체제에 상관없이 같은 Adobe AIR 파일로 애플리케이션 설치

Posted by 버터백통