IT 설계과제의 가장 이슈가 되는 동영상 재생부분에 좋은 해결책을 줄듯.

[스크랩 ] VLS를 이용한 스트리밍 서버 환경구현 上

Projects/Server 2008.01.29 22:29 Posted by soulfree >동네청년<
작성환경 : Asianux Server 2.0 Base (kernel 2.6.9-34.26AX 환경)
작성일자 : 2007. 08. 10.
작 성 자 : 시스템 엔지니어 최광민(1979. 08. 06. 인천)
최종수정 : 2007. 08. 11. - 이문서의 최종 수정버전은 오소리(
http://www.osori.org)에서 확인 하실 수 있습니다.
수정요청 : help@osori.org
배포조건 : Creative Commons License
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

출처 : http://osori.org/?article_srl=78600


VLS는 프랑스에서 개발한 리눅스 기반 스트리밍을 구현해 주는 솔루션중 가장 강력한 오픈소스 솔루션입니다.

GNU/Public 공중 라이센스하에 개발되었기 때문에 어떤 사용자든 자유롭게 사용할수 있으며 무엇보다 리눅스 기반 스트리밍 서비스의 한계였던 Windows 미디어 포멧 방식의 (ASF, WMV, AVI등등) 미디어들을 아파치 웹서버 상에서 간단하게 스트리밍을 구현할수 있다는 장점이 있습니다.

이에 VLS를 설치하시려는 리눅스 사용자 분들이 많았지만 설치에 어려움을 겪는것 같아 이렇게 직접 설치기를 올립니다.

아무쪼록 도움이 되었으면 하는 바램입니다.

이문서는 CCL 라이센스를 따르며 원작성자는 본인 최광민 입니다.



[ 간단한 설명 ]

배포 및 개발사이트 - http://www.videolan.org

VLC - 리눅스 기반 미디어 플레이어

VLS - 리눅스 기반 스트리밍 서버

VLS 다운로드 - http://download.videolan.org/pub/videolan/vls/0.5.6/

VLS 의존 라이브러리 다운로드 - http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/

VLS 사용자 매뉴얼(영문) - http://www.videolan.org/doc/vls-user-guide/en/vls-user-guide-en.html

[ 설치 과정 ]


[root@Asianux2 ~]#
[root@Asianux2 ~]#
[root@Asianux2 ~]# uname -a
Linux Asianux2.0 2.6.9-34.26AX #1 Wed Jan 10 16:13:36 KST 2007 i686 i686 i386 GNU/Linux
[root@Asianux2 ~]#
[root@Asianux2 ~]#
[root@Asianux2 ~]#

 

[root@Asianux2 ~]# rpm -qi gcc
Name        : gcc                          Relocations: (not relocatable)
Version     : 3.4.5                             Vendor: Asianux
Release     : 2.1                           Build Date: 2006년 04월 04일 (화) 오후 06시 02분 52초
Install Date: 2007년 08월 08일 (수) 오후 06시 52분 48초      Build Host: Trinity-IA32.asianux.com
Group       : Development/Languages         Source RPM: gcc-3.4.5-2.1.src.rpm
Size        : 12923972                         License: GPL
Signature   : DSA/SHA1, 2006년 04월 04일 (화) 오후 06시 02분 54초, Key ID 1246298df47bed1d
Packager    : packager@asianux.com
URL         : http://gcc.gnu.org
Summary     : Various compilers (C, C++, Objective-C, Java, ...)
Description :
The gcc package contains the GNU Compiler Collection version 3.4.
You'll need this package in order to compile C code.
[root@Asianux2 ~]#
[root@Asianux2 ~]#



[root@Asianux2 ~]#
[root@Asianux2 ~]# cd /usr/local/src/
[root@Asianux2 src]#
[root@Asianux2 src]#


[root@Asianux2 src]# ll
합계 0
[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# wget http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvb-0.2.2.tar.gz
--11:24:02--  http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvb-0.2.2.tar.gz
           => `libdvb-0.2.2.tar.gz'
Resolving download.videolan.org... 88.191.250.9
Connecting to download.videolan.org|88.191.250.9|:80... connected.
HTTP 요청이 전달되었습니다, 응답을 기다리는 중... 200 OK
길이: 64,345 (63K) [application/x-gzip]

100%[========================================================================================>] 64,345        35.75K/s           

11:24:05 (35.68 KB/s) - `libdvb-0.2.2.tar.gz' saved [64345/64345]

[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# wget http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvbpsi3-0.1.4.tar.gz
--11:24:16--  http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvbpsi3-0.1.4.tar.gz
           => `libdvbpsi3-0.1.4.tar.gz'
Resolving download.videolan.org... 88.191.250.9
Connecting to download.videolan.org|88.191.250.9|:80... connected.
HTTP 요청이 전달되었습니다, 응답을 기다리는 중... 200 OK
길이: 359,515 (351K) [application/x-gzip]

100%[========================================================================================>] 359,515      106.55K/s    ETA 00:00

11:24:22 (106.34 KB/s) - `libdvbpsi3-0.1.4.tar.gz' saved [359515/359515]

[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# wget http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvdcss-1.2.8.tar.gz
--11:24:30--  http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvdcss-1.2.8.tar.gz
           => `libdvdcss-1.2.8.tar.gz'
Resolving download.videolan.org... 88.191.250.9
Connecting to download.videolan.org|88.191.250.9|:80... connected.
HTTP 요청이 전달되었습니다, 응답을 기다리는 중... 200 OK
길이: 273,715 (267K) [application/x-gzip]

100%[========================================================================================>] 273,715       89.81K/s           

11:24:35 (89.61 KB/s) - `libdvdcss-1.2.8.tar.gz' saved [273715/273715]

[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# wget http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvdread-0.9.4.tar.gz
--11:24:44--  http://download.videolan.org/pub/videolan/vls/0.5.6/contrib/libdvdread-0.9.4.tar.gz
           => `libdvdread-0.9.4.tar.gz'
Resolving download.videolan.org... 88.191.250.9
Connecting to download.videolan.org|88.191.250.9|:80... connected.
HTTP 요청이 전달되었습니다, 응답을 기다리는 중... 200 OK
길이: 256,858 (251K) [application/x-gzip]

100%[========================================================================================>] 256,858       85.06K/s           

11:24:47 (84.93 KB/s) - `libdvdread-0.9.4.tar.gz' saved [256858/256858]

[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]# ll
합계 952
-rw-r--r--  1 root root  64345 12월  5  2004 libdvb-0.2.2.tar.gz
-rw-r--r--  1 root root 359515 12월  5  2004 libdvbpsi3-0.1.4.tar.gz
-rw-r--r--  1 root root 273715 12월  5  2004 libdvdcss-1.2.8.tar.gz
-rw-r--r--  1 root root 256858 12월  5  2004 libdvdread-0.9.4.tar.gz
[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# tar -zxvf libdvb-0.2.2.tar.gz
 

[root@Asianux2 src]# tar -zxvf libdvbpsi3-0.1.4.tar.gz


[root@Asianux2 src]# tar -zxvf libdvdcss-1.2.8.tar.gz
 

[root@Asianux2 src]# tar -zxvf libdvdread-0.9.4.tar.gz


[root@Asianux2 src]# ll
합계 968
drwxr-xr-x  2  500 users   4096  3월  8  2003 libdvb-0.2.2
-rw-r--r--  1 root root   64345 12월  5  2004 libdvb-0.2.2.tar.gz
drwxrwsrwx  8 1000  1000   4096  1월  2  2004 libdvbpsi3-0.1.4
-rw-r--r--  1 root root  359515 12월  5  2004 libdvbpsi3-0.1.4.tar.gz
drwxrwxrwx  7 1000  1000   4096  7월 30  2003 libdvdcss-1.2.8
-rw-r--r--  1 root root  273715 12월  5  2004 libdvdcss-1.2.8.tar.gz
drwxrwsrwx  4 6581 30099   4096  2월 23  2003 libdvdread-0.9.4
-rw-r--r--  1 root root  256858 12월  5  2004 libdvdread-0.9.4.tar.gz

 

 

[root@Asianux2 src]# rm -rf ./*.tar.gz
[root@Asianux2 src]# ll
합계 16
drwxr-xr-x  2  500 users 4096  3월  8  2003 libdvb-0.2.2
drwxrwsrwx  8 1000  1000 4096  1월  2  2004 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000 4096  7월 30  2003 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099 4096  2월 23  2003 libdvdread-0.9.4
[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# wget http://download.videolan.org/pub/videolan/vls/0.5.6/vls-0.5.6.tar.gz
--11:26:30--  http://download.videolan.org/pub/videolan/vls/0.5.6/vls-0.5.6.tar.gz
           => `vls-0.5.6.tar.gz'
Resolving download.videolan.org... 88.191.250.9
Connecting to download.videolan.org|88.191.250.9|:80... connected.
HTTP 요청이 전달되었습니다, 응답을 기다리는 중... 200 OK
길이: 802,901 (784K) [application/x-gzip]

100%[========================================================================================>] 802,901      141.39K/s    ETA 00:00

11:26:42 (128.75 KB/s) - `vls-0.5.6.tar.gz' saved [802901/802901]

[root@Asianux2 src]#
[root@Asianux2 src]#


[root@Asianux2 src]# ll
합계 808
drwxr-xr-x  2  500 users   4096  3월  8  2003 libdvb-0.2.2
drwxrwsrwx  8 1000  1000   4096  1월  2  2004 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000   4096  7월 30  2003 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099   4096  2월 23  2003 libdvdread-0.9.4
-rw-r--r--  1 root root  802901 12월 12  2004 vls-0.5.6.tar.gz
[root@Asianux2 src]#

 
[root@Asianux2 src]# tar -zxvf vls-0.5.6.tar.gz



[root@Asianux2 src]# rm -rf vls-0.5.6.tar.gz
 

[root@Asianux2 src]# ls
libdvb-0.2.2  libdvbpsi3-0.1.4  libdvdcss-1.2.8  libdvdread-0.9.4  vls-0.5.6
[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]#

 

[root@Asianux2 src]# cd libdvb-0.2.2/
[root@Asianux2 libdvb-0.2.2]#
[root@Asianux2 libdvb-0.2.2]#
[root@Asianux2 libdvb-0.2.2]# ll
합계 392
-rw-r--r--  1 500 users  55177  3월  8  2003 DVB.cc
-rw-r--r--  1 500 users   8362  3월  8  2003 DVB.hh
-rw-r--r--  1 500 users   1093  3월  8  2003 Makefile
-rw-r--r--  1 500 users   3614  3월  8  2003 OSD.c
-rw-r--r--  1 500 users   1037  3월  8  2003 OSD.h
-rw-r--r--  1 500 users    373  3월  8  2003 README
-rw-r--r--  1 500 users   1159  3월  8  2003 channel.h
-rw-r--r--  1 500 users    152  3월  8  2003 conv.cc
-rw-r--r--  1 500 users  10323  3월  8  2003 devices.cc
-rw-r--r--  1 500 users   5840  3월  8  2003 devices.hh
-rw-r--r--  1 500 users 100746  3월  8  2003 dvbrc.3sats
-rw-r--r--  1 500 users 100746  3월  8  2003 dvbrc.4sats
-rw-r--r--  1 500 users  40635  3월  8  2003 dvbrc.astra
-rw-r--r--  1 500 users  12058  3월  8  2003 dvbrc.cable
-rw-r--r--  1 500 users   1491  3월  8  2003 dvbrc.terra
-rw-r--r--  1 500 users    317  3월  8  2003 merge.cc
-rw-r--r--  1 500 users   2353  3월  8  2003 osd.hh
-rw-r--r--  1 500 users   1561  3월  8  2003 satscan.cc

 

 

[root@Asianux2 libdvb-0.2.2]# cat README
LIBDVB - DVB library for SI parsing, OSD, tuning, ...

There are 2 example programs that show how to work with the library.
You can also look at the tuxzap package for further usage information.

conv
converts from one of the various input formats (xml, satcodx, nokia) to the
libdvb format.

satscan
shows how to scan the transponders of a satellite for new channels.


[root@Asianux2 libdvb-0.2.2]#
[root@Asianux2 libdvb-0.2.2]# make

[root@Asianux2 libdvb-0.2.2]# make install
cp libdvb.a /usr/local/lib/
chmod 644 /usr/local/lib/libdvb.a
[root@Asianux2 libdvb-0.2.2]#
[root@Asianux2 libdvb-0.2.2]#


[root@Asianux2 libdvb-0.2.2]# cd ..
[root@Asianux2 src]# ll
합계 20
drwxr-xr-x  2  500 users 4096  8월  9 11:27 libdvb-0.2.2
drwxrwsrwx  8 1000  1000 4096  1월  2  2004 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000 4096  7월 30  2003 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099 4096  2월 23  2003 libdvdread-0.9.4
drwxr-sr-x  9 1000 dip   4096  2월 17  2004 vls-0.5.6
 

[root@Asianux2 src]# cd libdvbpsi3-0.1.4/
[root@Asianux2 libdvbpsi3-0.1.4]#


[root@Asianux2 libdvbpsi3-0.1.4]# ./configure

[root@Asianux2 libdvbpsi3-0.1.4]# make; make install


[root@Asianux2 libdvbpsi3-0.1.4]# cd ..
[root@Asianux2 src]# ll
합계 20
drwxr-xr-x  2  500 users 4096  8월  9 11:27 libdvb-0.2.2
drwxrwsrwx  8 1000  1000 4096  8월  9 11:29 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000 4096  7월 30  2003 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099 4096  2월 23  2003 libdvdread-0.9.4
drwxr-sr-x  9 1000 dip   4096  2월 17  2004 vls-0.5.6


[root@Asianux2 src]# cd libdvdcss-1.2.8/


[root@Asianux2 libdvdcss-1.2.8]# ./configure


[root@Asianux2 libdvdcss-1.2.8]# make


[root@Asianux2 libdvdcss-1.2.8]# make install
[root@Asianux2 libdvdcss-1.2.8]#
[root@Asianux2 libdvdcss-1.2.8]#
[root@Asianux2 libdvdcss-1.2.8]# cd ..
[root@Asianux2 src]# ll


[root@Asianux2 src]# cd libdvdread-0.9.4/
[root@Asianux2 libdvdread-0.9.4]#
[root@Asianux2 libdvdread-0.9.4]#


[root@Asianux2 libdvdread-0.9.4]# ./configure


[root@Asianux2 libdvdread-0.9.4]# make


[root@Asianux2 libdvdread-0.9.4]# make install


[root@Asianux2 libdvdread-0.9.4]# cd ..
[root@Asianux2 src]# ll
합계 20
drwxr-xr-x  2  500 users 4096  8월  9 11:27 libdvb-0.2.2
drwxrwsrwx  8 1000  1000 4096  8월  9 11:29 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000 4096  8월  9 11:29 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099 4096  8월  9 11:30 libdvdread-0.9.4
drwxr-sr-x  9 1000 dip   4096  2월 17  2004 vls-0.5.6
[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]# vi /etc/ld.so.conf
include ld.so.conf.d/*.conf

/usr/local/lib =========> 추가


"/etc/ld.so.conf" [변환 되었습니다] 3L, 44C 저장 했습니다                                                       
[root@Asianux2 src]#
[root@Asianux2 src]#


[root@Asianux2 src]# ldconfig    ==========> 실행
[root@Asianux2 src]#
[root@Asianux2 src]#
[root@Asianux2 src]# ll
합계 20
drwxr-xr-x  2  500 users 4096  8월  9 11:27 libdvb-0.2.2
drwxrwsrwx  8 1000  1000 4096  8월  9 11:29 libdvbpsi3-0.1.4
drwxrwxrwx  7 1000  1000 4096  8월  9 11:29 libdvdcss-1.2.8
drwxrwsrwx  4 6581 30099 4096  8월  9 11:30 libdvdread-0.9.4
drwxr-sr-x  9 1000 dip   4096  2월 17  2004 vls-0.5.6



[root@Asianux2 src]# cd vls-0.5.6/
[root@Asianux2 vls-0.5.6]# ll
합계 536
-rw-r--r--  1 1000 dip   1296 12월  8  2002 AUTHORS
-rw-r--r--  1 1000 dip  17992  8월 31  2001 COPYING
-rw-r--r--  1 1000 dip   8330  2월 17  2004 ChangeLog
-rw-r--r--  1 1000 dip    337  1월 11  2004 INSTALL
-rw-r--r--  1 1000 dip   7930  1월 11  2004 Makefile
-rw-r--r--  1 1000 dip   2664 12월  8  2002 Makefile.dep
-rw-r--r--  1 1000 dip   2429  2월  4  2003 Makefile.module
-rw-r--r--  1 1000 dip   2372 12월  9  2002 Makefile.module.dep
-rw-r--r--  1 1000 dip   2682  2월  4  2003 Makefile.opts.in
-rw-r--r--  1 1000 dip   1439  1월 11  2004 README
-rw-r--r--  1 1000 dip    761  5월 17  2003 README.win32
-rw-r--r--  1 1000 dip   1209  1월 11  2004 TODO
drwxr-sr-x  2 1000 dip   4096  2월 17  2004 bin
drwxr-sr-x  2 1000 dip   4096  2월 17  2004 build_test
-rw-r--r--  1 1000 dip  41134  3월 26  2003 config.guess
-rw-r--r--  1 1000 dip  29763  3월 26  2003 config.sub
-rwxr-xr-x  1 1000 dip 295021  2월 17  2004 configure
-rw-r--r--  1 1000 dip  13633  2월 17  2004 configure.in
drwxr-sr-x  2 1000 dip   4096  2월 17  2004 debian
drwxr-sr-x  3 1000 dip   4096  2월 17  2004 doc
-rwxr-xr-x  1 1000 dip   5603 10월  6  2001 install-sh
drwxr-sr-x  3 1000 dip   4096  2월 17  2004 interface
drwxr-sr-x  7 1000 dip   4096  2월 17  2004 src
drwxr-sr-x  2 1000 dip   4096  2월 17  2004 test
-rwxr-xr-x  1 1000 dip    318 10월  8  2001 todo.pl
-rw-r--r--  1 1000 dip   4479  6월  5  2003 vls.cfg
-rw-r--r--  1 1000 dip    906  9월 24  2002 vls.sln
-rw-r--r--  1 1000 dip   2777 12월  9  2002 vls.spec
-rw-r--r--  1 1000 dip  14326  5월  3  2003 vls.vcproj


[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]# ./configure --help
`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR           user executables [EPREFIX/bin]
  --sbindir=DIR          system admin executables [EPREFIX/sbin]
  --libexecdir=DIR       program executables [EPREFIX/libexec]
  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
  --libdir=DIR           object code libraries [EPREFIX/lib]
  --includedir=DIR       C header files [PREFIX/include]
  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
  --infodir=DIR          info documentation [PREFIX/info]
  --mandir=DIR           man documentation [PREFIX/man]

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]

Optional Features:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-debug          Enable debug mode (default disabled)
  --enable-profiling      Enable profiling mode (default disabled)
  --disable-syslog         Logging using syslogd (default enable)
  --disable-daemon        Disable daemon mode (default enabled)
  --disable-dvd           DVD support (default enabled)
  --enable-dvb            DVB support (default disabled)

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-dvb=PATH         path to DVB driver header files
  --with-libdvb=PATH      path to libdvb
  --with-dvbpsi=PATH      libdvbpsi headers and libraries
  --with-dvbpsi-tree=PATH libdvbpsi tree for static linking

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
              headers in a nonstandard directory <include dir>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CXXCPP      C++ preprocessor

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.


[root@Asianux2 vls-0.5.6]# whereis gcc32
gcc32: /usr/bin/gcc32
[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]#


[root@Asianux2 vls-0.5.6]# whereis g++32
g++32: /usr/bin/g++32
[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]#


[root@Asianux2 vls-0.5.6]# CC=/usr/bin/gcc32 CXX=/usr/bin/g++32 ./configure --enable-syslog

[root@Asianux2 vls-0.5.6]# make

[root@Asianux2 vls-0.5.6]# make install
mkdir -p /usr/local/bin
/usr/bin/install -c bin/vls /usr/local/bin
/usr/bin/install -c bin/vlsd /usr/local/bin
mkdir -p /usr/local/lib/videolan/vls
/usr/bin/install -c -m 644 bin/dvdreader.so /usr/local/lib/videolan/vls
mkdir -p /usr/local/etc/videolan/vls
test -r /usr/local/etc/videolan/vls/vls.cfg || /usr/bin/install -c -m 644 vls.cfg /usr/local/etc/videolan/vls
Installation succeeded.


[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]#
[root@Asianux2 vls-0.5.6]# cd /usr/local/etc/
[root@Asianux2 etc]# ll
합계 4
drwxr-xr-x  3 root root 4096  8월  9 11:38 videolan
[root@Asianux2 etc]# cd videolan/
[root@Asianux2 videolan]# ll
합계 4
drwxr-xr-x  2 root root 4096  8월  9 11:38 vls
[root@Asianux2 videolan]# cd vls/
[root@Asianux2 vls]# ll
합계 8
-rw-r--r--  1 root root 4479  8월  9 11:38 vls.cfg
[root@Asianux2 vls]#
[root@Asianux2 vls]#
[root@Asianux2 vls]# htpasswd -n monitor  ===========> 중요한 부분이다 밑에 나오는 패스워드를 복사해두자.
New password:
Re-type new password:
monitor:L5UTNxa/HUb62


[root@Asianux2 vls]#
[root@Asianux2 vls]# htpasswd -n master ===========> 역시 중요한 부분이다 밑에 나오는 패스워드를 복사해두자.
New password:
Re-type new password:
master:uWzHbVcKHesWw


[root@Asianux2 vls]#
[root@Asianux2 vls]#
[root@Asianux2 vls]# vi vls.cfg
# vls configuration file (Example)

# Application wide settings
BEGIN "Vls"
  LogFile       = "vls.log"             # log file
  ScreenLog     = "enable"              # log to the console
#  SystemLog     = "disable"             # log to the systemlog
  SystemLog     = "enable"             # log to the systemlog
END

# Security informations :
#
# The section "Groups" describes which group is allowed to use which command.
# Each user who belongs to the 'master" group has all the power on the server.
# Each one who belongs to the "monitor" group is a "read-only" user.
BEGIN "Groups"
# --- Format:
# groupname     = "cmd1|cmd2|..."
# --- Example:
  monitor       = "help|browse|logout"
  master        = "help|browse|start|resume|suspend|stop|shutdown|logout|config|program|input|channel|show"
END

# The section "Users" describes each user
# Use "mkpasswd" to generate the encrypted password.
BEGIN "Users"
# --- Format:
# username      = "encryptedpassword:group"
# --- Example:
  monitor       = "L5UTNxa/HUb62:monitor"    ========> 아까 복사해 두었던 패스워드를 앞쪽에 입력
  master        = "uWzHbVcKHesWw:master"   ========> 아까 복사해 두었던 패스워드를 앞쪽에 입력
END

# Telnet Administration
BEGIN "Telnet"
#  Domain        = "Inet6"              # Inet4 or Inet6
  LocalPort     = "9001"                # Port to use for that purpose
  Use = "true"
END

# Streams sources declaration
BEGIN "Inputs"
# --- Format:
# InputName     = "Type"
# --- Example:
  local1       = "local"                # Local input example
#  kfir         = "video"               # Video input example (mpeg encoder)
#  dvb          = "dvb"                 # Video input example (DVB card)
END

# --- Format:
# BEGIN "program_number"
#   Name     = "program_name"
#   Type     = "type"          # can be Mpeg1-PS, Mpeg2-PS, Mpeg2-TS, or Dvd
#   FileName = "path"          # use this variable if Type is not "Dvd"
#   Device   = "device"        # use this variable with type "Dvd"
# END

# --- Example:
BEGIN "1"     # MPEG2 stream stored in /home/videolan/streams/Dolby.vob
  Name     = "dolby"
  FileName = "/media/films/Dolby_Canyon.vob"
  Type     = "Mpeg2-PS"
END

BEGIN "2"     # another file
  Name     = "canyon"
  FileName = "Dolby_Canyon.vob"
  Type     = "Mpeg2-PS"
END

BEGIN "3"     # DVD
  Name       = "film"
  Device     = "/dev/cdrom"
  Type       = "dvd"
  DvdTitle   = "1"    # Start title
  DvdChapter = "1"    # Start chapter
END

BEGIN "4"     # DVD stored on a hard disk
  Name       = "matrix"
  Device     = "/media/matrix/VIDEO_TS"
  Type       = "dvd"
  DvdTitle   = "1"   # Start title
  DvdChapter = "1"   # Start chapter
END

# Video input configuration
BEGIN "kfir"
# --- Example:
# Device        = "/dev/video"     # Video4linux device (default is /dev/video)
# Type          = "Mpeg2-PS"       # Stream type (default is "Mpeg2-PS")
END

# Video input (DVB) configuration
BEGIN "dvb"
# --- Example:
#  DeviceNumber = "0"                   # /dev/dvb/adapter<i>
#  SendMethod   = "0"                   # 0 - Send All Pids
                                        # 1 - Send only MPEG2 datas
END

# Channel (outputs) declaration
BEGIN "Channels"
# --- Format:
# ChannelName   = "Type"
# --- Example:
  localhost     = "network"
#  client1       = "network"
#  client2       = "network"
#  multicast     = "network"
#  localfile     = "file"
END

# Channels configuration
BEGIN "localhost"         # The client is on the same host as the server
  DstHost = "127.0.0.1"
  DstPort = "1234"
END

#BEGIN "client1"                          # unicast example
#  DstHost = "192.168.1.2"                # destination host
#  DstPort = "1234"                       # destination port
#END

#BEGIN "client2"                          # unicast with IPv6 example
#  Domain  = "inet6"
#  DstHost = "3ffe:ffff::2:12:42"         # destination host
#  DstPort = "1234"                       # destination port
#END

#BEGIN "multicast"                        # multicast example
#  Type    = "multicast"
#  TTL     = "1"                          # Time To Live
#  DstHost = "239.2.12.42"                # multicast address
#  DstPort = "1234"                       # destination port
#END

#BEGIN "localfile"                        # file output example
#  FileName = "stream.ts"
#  Append   = "no"                        # rewrite the file if it exists
#END

# Commands automatically lanched on Startup
# Commands shall be like they would be typed in a telnet console.
BEGIN "LaunchOnStartUp"
#  command1 = "start dolby localhost local1 --loop"
#  command2 = "start 28009 client1 dvb"
"vls.cfg" [변환 되었습니다] 149L, 4543C 저장 했습니다 

 
[root@Asianux2 vls]#
[root@Asianux2 vls]#
[root@Asianux2 vls]# chkconfig --level 35 telnet on
[root@Asianux2 vls]#


[root@Asianux2 vls]# chkconfig --list | grep telnet
        telnet: 활성
        krb5-telnet:    해제
[root@Asianux2 vls]#
[root@Asianux2 vls]#
 

[root@Asianux2 vls]# cat /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        disable = no
        flags           = REUSE
        socket_type     = stream      
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
}



[root@Asianux2 vls]# vi /etc/hosts.allow
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
in.telnetd : 127.0.0.1  ===========> 추가 (스니핑에 취약한 텔넷 보안을 위해 로컬만 허용)
sshd : ALL
httpd : ALL

 
[root@Asianux2 vls]#
[root@Asianux2 vls]# service xinetd restart
xinetd 를 정지함: [  확인  ]
xinetd (을)를 시작합니다: [  확인  ]
[root@Asianux2 vls]#
[root@Asianux2 vls]#


[root@Asianux2 vls]# cd ..
[root@Asianux2 videolan]# ll
합계 4
drwxr-xr-x  2 root root 4096  8월  9 11:42 vls
[root@Asianux2 videolan]# cd ..
[root@Asianux2 etc]# ll
합계 4
drwxr-xr-x  3 root root 4096  8월  9 11:38 videolan
[root@Asianux2 etc]# cd ..


[root@Asianux2 local]# pwd
/usr/local
[root@Asianux2 local]#
[root@Asianux2 local]#
[root@Asianux2 local]# cd bin
[root@Asianux2 bin]# ll
합계 1424
-rwxr-xr-x  1 root root 721970  8월  9 11:38 vls
-rwxr-xr-x  1 root root 721970  8월  9 11:38 vlsd
[root@Asianux2 bin]#


[root@Asianux2 bin]# ./vlsd
VideoLAN Server v 0.5.6 (Aug  9 2007) - (c)1999-2003 VideoLAN
[root@Asianux2 bin]#
[root@Asianux2 bin]#


[root@Asianux2 bin]# ps -ef | grep vls
root     22456     1  0 11:45 ?        00:00:00 ./vlsd
root     22459  2822  0 11:45 pts/0    00:00:00 grep vls
[root@Asianux2 bin]#
[root@Asianux2 bin]#
[root@Asianux2 bin]#
[root@Asianux2 bin]#


[root@Asianux2 bin]# telnet localhost 9001
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.

Videolan Server Administration System

Login: master
Password:

master@vls>
master@vls> help
Provider: Admin
Status: 0
Info: help: gives help on the specified command.
Info: program: configure an input with programs.
Info: logout: terminates the administration session.
Info: show: show running broadcasts, available channels, programs or inputs
Info: start: launches a program.
Info: stop: stops a program.
Info: suspend: suspends streaming.
Info: config: load and save configuration file.
Info: input: configure a new input.
Info: shutdown: stops the server.
Info: browse: gives the program list
Info: channel: configure a new channel.
Info: resume: resumes streaming.

master@vls> logout
Closing connection
Connection closed by foreign host.
[root@Asianux2 bin]#
[root@Asianux2 bin]#


다음편에는 VLS를 이용하여 실제 스트리밍 환경을 궇성하는 예를 설명하고 vls.cfg 상세 설정에 대해서 다뤄보고자 합니다.
감사합니다.

파일서버 사용방법

Projects/Server 2007.12.04 19:49 Posted by soulfree >동네청년<

soulfree.net의 파일서버 사용 방법에 대한 알림

아래사항을 잘 읽어보시고 이용해주세요.

1. 접속 주소는 다음과 같습니다.
ftp://ftp.soulfree.net


ftp://www.soulfree.net 이나 ftp://soulfree.net 으로 접속하는 것이 아니라
ftp://ftp.soulfree.net으로 접속 해야 합니다. <-오른쪽 클릭후 새창에서 열기

2. 접속에 필요한 계정이 필요합니다.
익명접속을 지원하지 않습니다.
계정에 대한 문의는 개인적으로 해주세요.

4. 블로그에 관련된 스킨이나 파일을 올리기 위해 ftp://www.soulfree.net 에 접속해 주세요.
ftp://ftp.soulfree.net과 ftp://www.soulfree.net 는 완전히 다른 서버 입니다.

5. 파일서버는 ftp 클라이언트로 FileZilla라는 무료 ftp 클라이언트 프로그램을 권장합니다.
사용법은 다음과 같습니다.

호스트를 추가합니다.


호스트에 새사이트를 클릭하여 ftp.soulfree.net을 등록합니다.


호스트 주소와 계정 정보를 입력합니다. 계정정보는 개인적으로 문의하여 주세요.


인코딩은 euc_kr로 설정해주시고 확인을 누르면 저장만 되고 연결 누르면 저장과 함께 연결됩니다.


다음부터는 저런 식으로 쉽게 사용가능합니다.

Filazilla 다운하기



6. 업로드를 원하시는 분은 Upload 폴더에 업로드 해주시면 제가 자료의 종류와 범주를 구분하여 정리합니다.

7. 정리 후 또는 신규자료에 대한 정보는 이 곳 제 블로그의 파일서버 카테고리에 포스팅 하겠습니다.
최신 업데이트 목록이나 자신이 업로드한 파일의 위치를 아시고자 한다면 파일서버 카테고리의 포스팅한 글을 참고하여 주세요.

기타 문의는 soulfree33@nate.com 으로 해주세요. 문의 때문에 방명록 글 남기는 것은 사양하겠습니다.  

Java(TM) Media Framework (JMF) 2.1.1e Download Link

Projects/Server 2007.09.18 14:31 Posted by soulfree >동네청년<
http://java.sun.com/products/java-media/jmf/2.1.1/download.html
TAG Java, jmf

error LNK2001: unresolved external symbol __imp__PropertySheetA@4

Projects/CoVNC 2007.09.17 20:26 Posted by soulfree >동네청년<

출처 : http://www.codeguru.com/forum/archive/index.php/t-106735.html
Add comctl32.lib to Project/Settings/Link/Library object modules.

error LNK2001: unresolved external symbol _main

Projects/CoVNC 2007.09.17 20:25 Posted by soulfree >동네청년<

출처 : http://jof4002.net/?%C7%C1%B7%CE%B1%D7%B7%A1%B9%D6%C6%C1/%C4%C4%C6%C4%C0%CF%BF%A1%B7%AFLNK2001

음... 별게 아니라 안쓸려고 했는데... -_-;
error LNK2001: unresolved external symbol _main

질문란에도 잊을만하면 올라오는 질문이더군요. 이 에러가 발생하는 경우는 크게 두가지가 있습니다.


--------------------------------------------------------------------------------

1. API로 프로그래밍을 처음 하시는 분들이 흔히 하는 실수 같습니다.

윈도우에서 프로그램은 크게 두가지로 분류할 수 있습니다. 도스처럼 console 창에 텍스트만을 출력하는 console 프로그램과 흔히 쓰는 GUI를 가진 프로그램이 있죠. (에구 이걸 뭐라고 해야 하나... 그냥 GUI 프로그램이라고 쓸께요)

Visual C++에서 프로젝트를 만들 때 Win32 Application : WinMain 함수에서 시작하게 되는 GUI 프로그램 Win32 Console Application : main 함수에서 시작하는 console 프로그램 이 두가지가 있습니다.

제목에 적은 것 같은 에러가 나는 분들은 대부분 GUI 프로그램을 만드시려고 하고 WinMain은 만드셨는데, 프로젝트를 만들 때 console application을 선택하신겁니다. 반대로 WinMain이 없다고 에러가 나오면 GUI 프로젝트를 선택하고서 main 함수를 작성하신 것이겠죠.

자, 그럼 어떻게 해결하느냐. 설정을 바꿔주면 됩니다. 프로젝트 세팅(Alt + F7)에서 Link탭을 누르면 제일 아래에 에디트 박스가 보이죠? 잘 보면 /subsystem:console 이라고 써있을 겁니다. 이걸 /subsystem:windows로 바꿔주세요. (또는 상황에 따라서 그 반대로 해줄 수도 있겠죠) 이 옵션의 역할은 링커에게 있어서 이 프로그램이 어떤 함수로부터 시작해야 하는지를 알려주는 겁니다. 이 옵션이 console이라면 main을, windows라면 WinMain을 찾아서 그 함수에서부터 프로그램이 시작하게 하는거죠.

아시겠죠? 잘 이해가 안되면 질문 달아주세요. 성실히 답변해드리겠습니다. 그리고 Jeffrey Ritcher 아저씨가 쓴 Programming Applications for Windows 4th. 를 보면 잘 나와 있으니 참고하세요.


--------------------------------------------------------------------------------

2. ATL에서 컨트롤을 만들 때 이 에러가 날 수 있습니다.

디버그에서는 잘 컴파일이 되던게 릴리즈로 빌드하면 저 에러가 날 수 있습니다. ATL에서는 생성되는 코드의 크기를 최소화 하기 위해서 CRT (C RunTime) 함수의 일부를 제한하고 있기 때문이죠(정확히 말하자면 start up 코드를 넣지 않습니다). 그런데 프로젝트에서 특정 C 함수를 사용하면 ATL에서 제한한 CRT의 기능이 필요해지고 따라서 에러가 나는겁니다.

이 해결책도 간단합니다. a. 프로젝트 세팅에서 predefined keyword를 찾아서 _ATL_MIN_CRT를 지워주세요. b. 초기화가 필요한 CRT 함수를 사용하지 마세요. -_-; MSDN에 따르면 strcmp대신 lstrcmp를 사용하는 식으로 피해갈 수 있다고 합니다.

자세한건 MSDN에서 _ATL_MIN_CRT를 찾아보세요. (색인에서 입력하면 나옵니다.)

비스타 공유프린터(네트워크 프린터) 설치하기

Projects/Server 2007.08.27 18:28 Posted by soulfree >동네청년<
연구실에서 쓰는 컴을 거금을 들여 업그레이드를 하고,
비스타 64bit을 설치하였습니다.

프린트 서버에 물려있는 네트워크 프린터를 설치하고하니
"프린터에 대한 서버에 올바른 프린터 드라이버가 설치되어 있지 않습니다. 올바른 드라이버를 검색하려면 [확인]을 클릭하십시오. 그렇지 않으면 [취소]를 클릭한 다음 올바른 프린터 드라이버에 대해 네트워크 관리자나 제조업체에 문의하십시오"
라는 확인 메시지가 뜨더군요.

그래서 해당 프린터 드라이버를 받아두고 확인을 눌러서 드라이버를 선택했습니다만..

0x800f0214 라는 에러 코드와 함께 "프린터 드라이버 설치 오류입니다. 작업을 완료할 수 없습니다"라는 에러메시지를 띄우면서 프린터 추가가 되지 않았습니다....

그러나 설치 방법이 역시 여러 님들의 블로그에 올라와 있더군요...
다음과 같이 설치하면 XP에 설치된 프린터를 비스타에서  공유해서 사용할 수 있다.
1. 비스타에서 "제어판" -> "프린터" -> "프린터 추가"를 클릭한다.
2. 네트워크 프린터 추가가 아닌 "로컬 프린터 추가"를 클릭한다.
3. 새 포트 만들기 - "Local Port"를 선택한다.
4. 포트 이름은 "\\프린터가 설치된 PC의 이름\공유프린터이름"을 입력하면 XP에 설치된 공유 프린터에 접근할 수 있다.
5. 해당 프린터의 드라이버를 설치한다.

2시간 정도 골머리를 앓았네요.
특히나 이틀정도 비스타를 쓰면서 XP때와 구조적으로 많이 달라진 느낌을 받고 있습니다....
또 호환성 문제로 이틀동안 고생을 좀 했는데다가,
제 시스템에서 vmware가 만족할만한 성능을 보여주걸 봐선
리눅스를 기본으로 설치해서 vmware로 윈도 어플들을 실행해볼까하는 욕구도 생기는 군요...

텍스트큐브 위지윅 편집기 작동하지 않던 문제

Projects/Server 2007.08.18 14:06 Posted by soulfree >동네청년<

텍스트큐브 1.5로 블로그 시스템을 교체한 후,
위지윅 편집기가 작동하지않아 포스팅을 하지 못하고 있었습니다.

글쓰기 페이지를 열때 자바 스크립트 에러를 만나면서 hasGD라는 개체의 우항이 비는 문제가 발생 하였습니다.
문제 발생후 테터툴즈 포럼에 가입하여 문제를 게시하니 바로 수정이 되더군요.

수정내용은 다음과 같습니다.
http://dev.textcube.org/changeset/4274
여기서 trunk는 텍스트큐브를 설치한 디렉토리가 되겠습니다.
변수 초기화의 문제더군요.

아마도 조만간 텍스트 큐브 1.5.1 버전이 발표될 듯 보이고
진행률도 현재 75%라고 확인할 수 있습니다.

테터툴즈, 텍스트 큐브 setup시 rewrite 인식 문제

Projects/Server 2007.08.13 03:35 Posted by soulfree >동네청년<
출처 : http://juvat.net:9000/atik/30
===========================================================================

기존의 고정주소를 쓰던 서버에서 가정에서 서버를 구성하기 위해 DDNS서비스를 이용하게 되었다.
따라서 기존의 서버의 구성과 다르게 테터툴즈를 이동하면서 재설정이 불가능한 상황이었다.

분명 rewrite 모듈을 설치하였고, phpinfo() 함수를 이용하여도 문제가 없는데..
테터툴즈 설치 과정에서 rewrite관련 문제가 계속 발생하였다.

몇시간동안의 웹질과 삽질끝에 테터툴즈 소스에 문제가 있는것을 발견하였다.
만약 자신의 서버에 rewrite기능이 확실히 구동된다는 확신이 있고, 테터툴즈 설치및 재설정시 rewrite 부분에서 에러가 없어지지 않는다면, 소스를 좀 수정해서 해결해보기 바란다.

소스는 setup.php 파일에서


863 else{
864 $rewrite=0;
865 @unlink($filename);
866 checkStep(33,false);
867 return false;
868 }

위의 rewrte 부분을 아래와 같이 수정해 주어서 넘어가게 만드는 것이다.


863 else{
864 $rewrite=1;
865 //@unlink($filename);
866 //checkStep(33,false);
867 //return false;
868 }

alftp로 파일 다운로드가 안될때...

Projects/Server 2007.08.08 19:23 Posted by soulfree >동네청년<
soulfree.net의 ftp에서 alftp 프로그램을 이용해서 다운로드를 하실때

99%에서 끊기고 파일다운로드가 안되어 있을때

alftp 대신에 FileZilla라는 무료 ftp 클라이언트 프로그램을 사용하세요.

Filazilla 다운하기

alftp의 인터페이스와 유사한데다

alftp에서는 불가능했던, 다운을 받으면서 ftp 사이트의 폴더를 검색하여 다운로드 받는 것이 가능합니다.

그리고 무엇보다 soulfree.net의 파일들을 쾌적하게 전송받을 수 있습니다.

제목이 우선 그럴듯 합니다 ㅋㅋ 저의 작명센스에 감복하여 주십시오... ㅎㅎ;;

제목 그대로 삼바를 이용해서 리눅스에서 윈도우즈의 스토리지에 읽고 쓸 수 있도록하고,
ftp서비스를 이용해 리눅스 사용자가 자신의 계정에 업로드를 할 때
리눅스 스토리지에 저장되는 것이 아닌, 삼바로 마운트한 윈도우즈 스토리지에 저장하는 시스템을 구축한 것입니다.

리눅스에 그냥 파일을 저장하면 되는데 왜 이러한 시스템을 구축했느냐...
그러한 이유는 다음과 같습니다.

1. 윈도우즈에서 파일을 관리하기 위함입니다.
사람들은 윈도우즈에서 파일을 많이 다룹니다. 따라서 윈도우즈의 파일 형식과 인코딩된 파일이름을 많이 사용하게 됩니다. 그런데 리눅스에서는 한글이나 기타 2바이트 문자들에 대한 인코딩 문제로 심하게는 파일을 인식하지 못하는 문제를 일으키기도 합니다.
 파일을 윈도우즈 스토리지에 저장하므로써, 파일들을 융통성있게 공유할 수 있습니다. 물론 리눅스에서 이러한 일들이 불가능한 것은 아닙니다. 그러나 공동 작업이 많이 이루어지는 윈도우즈 환경에서 편리하고 강력한 네트워크 폴더공유를 이용해, 각자의  ftp공간을 공유할 수 있도록 한다면, 협업 시스템을 위한 공동 작업장 형식의 스토리지 개념이 생성될 수 있습니다. 즉, ftp 공간과 네트워크 공유 공간이 나뉘어진 개념이 아닌 통합된 스토리지 개념이 되므로, 하나로 관리함으로써 더욱 편리해집니다.


2. 서비스 분리
파일을 저장하는 녀석과 파일을 제공하는 녀석은 따로 두고 싶은 마음에서 시도하게 되었습니다. 우리가 보통 대용량 하드디스크를 구입해서 일정 크기로 두 개의 파티션으로 나누고, 하나에는 운영체제를 비롯한 프로그램을 설치하고, 하나에는 일반 문서들이나 음악, 동영상 파일들을 저장하게 됩니다.
그처럼 마치 파티션을 두 개로 나눈듯한 분산 시스템을 구현해보고자 한 것입니다. 또한 웹서비스에서 사용되는 파일업로드와는 구분되게 파일서버 본연의 임무에 충실하게 만들고자 하였습니다. 따라서 대용량 파일 저장에 대한 리눅스서버의 부담을 덜어줄 수 있습니다.

이렇게 구성된 스토리지 서비스를 사용자가 ftp로 접속하게 되면, 다음과 같은 구조의 저장공간을 보게 됩니다.

사용자 루트--+--www
                   |
                   +--ftp

www디렉토리에는 사용자가 http 웹서비스로 보여줄 리소스들(html 파일이나 그림 파일등등)을 저장하는 곳입니다. 그리고 ftp가 바로 윈도우즈 공유폴더와 마운트한 디렉토리입니다.

여기서 사용자 루트를 통채로 마운트해서 www에 저장될 파일들을 윈도우즈 스토리지에 저장하면 안되느냐 의문이 들수 있으실텐데요... 그렇게 하지 않은 이유는 밑에 설명하겠습니다.(미리 말씀 드리자면 리눅스 권한 문제때문)

1.
우선 리눅스가 삼바를 통해 접속 가능하도록 윈도우즈의 계정을 하나 만들어줍니다.
(예를 들면 ftp // 123456 으로 만들었습니다.)
그리고 쓰기가 가능하도록 공유폴더를 하나 추가합니다.
그런데 여기서 폴더를 계정별로 쓰기가능하도록 지정할 수 있습니다.
windows xp의 경우 그런 기능이 숨겨져 있습니다.
폴더옵션을 열어서 보기의 고급설정에 보시면
모든 사용자에게 동일한 폴더 공유 권한을 지정의 체크를 해제하시면
계정별로 권한을 줄 수 있습니다.
ftp 사용자가 공유폴더에 쓰기 가능하도록 지정해줍니다.

2.
그리고 리눅스로 와서 mount 명령으로 윈도우즈 공유 폴더를 마운트 합니다.
우선 윈도우즈 공유폴더를 마운트할 디렉토리를 mkdir 명령으로 만들어 줘야겠죠..

그리고 여기서 ftp에 접속할 사용자의 uid와 gid를 알아두어야 합니다.
uid와 gid는 계정의 id 번호와 사용자가 속한 그룹의 id 번호입니다.
확인은 사용자,그룹 관리 툴을 사용해서 확인하실 수 있으며
/etc/passwd 파일을 열어서 볼 수 있습니다.

uid와 gid 그리고 umask=000을 해주는 이유는
그냥 마운트를 하게 되면 root 계정만 윈도우즈 공유폴더에 삼바를 통해 쓰기가 가능하고,
ftp를 통해 접속하게 되는 사용자는 윈도우즈 공유폴더에 쓰기가 불가능 합니다.
따라서 uid와 gid에 쓰기를 허용하고자 하는 사용자의 정보를 넣어 주는 것입니다.

예를 들어 리눅스의 soulfree(uid:501, gid:501)라는 계정이 ftp에 접속해서 윈도우즈 공유폴더(soulfree_ftp)에 파일 쓰기가 가능하도록 하고자 한다면,

mount -t smbfs -o username=ftp,password=123456,uid=501,gid=501,umask=000 //windows/soulfree_ftp ./ftp

파란색 부분은 윈도우즈에 접속하기 위한 윈도우즈 계정 정보입니다.
핑크색 부분은 마운트한 윈도우즈 공유폴더에 쓰기가 가능한 사용자를 지정해주는 부분입니다.
초록색 부분은 윈도우즈 공유폴더 위치입니다.
회색 부분은 윈도우즈 공유폴더를 리눅스 상에서 마운트시킬 리눅스 폴더입니다.

3.
ftp 서버를 실행합니다..
그리고 이제 ftp 클라이언트로 soulfree라는 계정으로 접속을 하면
마운트 시킨 ftp 디렉토리에 업로드가 가능합니다.
윈도우즈에서 공유폴더에 보면 soulfree 클라이언트가 업로드한 파일이 저장되어 있음을 확인 할 수 있습니다.

※ 그런데 왜 www의 파일들은 이런 방식을 사용하지 않았나?
리눅스 home 디렉토리에는 사용자들 이름으로 사용자 저장공간이 있습니다.
저는 각 사용자의 www 디렉토리에 http 리소스를 저장하도록 하였고, 아파치가 그것을 참조하여, 가상호스트로 작동하도록 하였습니다.
따라서 www내용을 윈도우즈에 저장하기위해서는, 윈도우즈에서 개인별로 www라는 이름의 공유폴더를 만들어 주어야하고, 그렇게 되면 공유폴더가 너무 많아 집니다.
사실 ftp 공유폴더도 개인당 하나씩 공유폴더가 생기는거라 공유폴더가 너무 많아지는 문제가 생깁니다.

그때문에 home 디렉토리 전체를 마운트하는 방법을 시도해봤습니다.
그러나 home 디렉토리 전체를 마운트함에 따라 특정 리눅스 명령어가 home 디렉토리에 쓰기가 제한되는 문제가 발생하더군요.
또한 ftp를 이용해 업로드 도중 접속을 끊었을 경우 I/O 교착상태가 발생해서 시스템이 마비되는 것을 경험했습니다.

그래서 soulfree라는 특정 계정의 공유폴더를 만들고 그것을 사용자 디렉토리에 마운트 하는 방법을 사용했습니다.
이 역시 read는 성공적이었으며, ftp 업로드도 문제없었습니다.
그러나 http 서비스를 이용한 업로드의 경우, 쓰기 권한이 없어 업로드가 되지 않는 문제가 생겼고,
제로보드의 경우, 마운트한 윈도우즈 폴더의 권한을,
chmod 등의 명령을 통한 리눅스 방식으로 설정할 방도를 제가 알지 못해서
사용하지 못하겠다는 결론에 도달했습니다.

그래서 ftp 전용 폴더를 만들게 된 것입니다...

문제점
사실 장점과 제 욕구에만 충실하기 위한 작업이었습니다.
그러나 이러한 작업을 자동화 하는 등의 해결해야할 문제점이 많이 남아 있습니다.

1.사용자 생성시 윈도우즈 공유폴더 추가 문제
쉘 스크립트로 자동화하여 사용할 시 문제입니다.
리눅스 사용자 추가시, 윈도우즈 공유폴더도 사용자 전용으로 자동으로 만들어 주어야합니다.
리눅스에서 윈도우즈에 폴더를 만드는 것 까지는 가능합니다. 그러나 리눅스에서 윈도우즈 폴더를 마운트 포인트로 만드는 것은 불가능합니다.

무슨 이야기인가 하면,
리눅스의 마운트 포인트로는 공유폴더로 지정한 그 위치만 가능하지,
공유폴더의 하위 폴더는 마운트 포인트로 지정할 수 없다는 것입니다.

따라서 윈도우즈 폴더를 자동 생성시키더라도, 공유 폴더 지정을 일일이 손으로 해주어야 합니다.

2. 기존 리눅스 ftp 저장소에 쓰기 문제
IT 공학 공부를 해오고 잠시 일도 해본 경험에서,,
사람들은 개발자들의 요구를 그리 귀기울이지 않습니다.
윈도우즈 공유폴더를 마운트한 ftp디렉토리를 따로 만들어 두었다고해서
반드시 그 디렉토리에 업로드 하지만은 않을 것입니다.
따라서 리눅스 스토리지에 저장한 파일들을 자동으로 ftp 디렉토리에 이동하도록 하는 방법이 있어야 할 것 같습니다.

3. 공유폴더의 숫자...
윈도우즈의 공유폴더는 탐색기에서 모두 나타나게 됩니다. 물론 접근은 안되지만 목록이 보이는 것 조차도 신경쓰이는 일이 아닐 수 없습니다. 이러한 서비스를 사용하는 사람이 얼마나 되는지 등의 정보를 알 수 있기 때문이죠.
그리고 공유폴더가 너무 많아지면 관리하는데 한계가 나타나게 될 것입니다.

너무 두서없이 끄적이고 기술적인 코드는 한줄이 고작이네요^^;;
그러나 나름 이기종간의 분산 파일 스토리지 공간을 이용해, 협업시스템에 적용하고자하는 패러다임을 구현했다고 생각됩니다.

LVM 마운트 방법

Projects/Server 2007.08.06 10:16 Posted by soulfree >동네청년<

출처 : http://cafe.naver.com/linuxcare/13650

오늘 backup 작업하다 fstab의 LVM 파일을 수정하는 바람에 3시간동안 인터넷에서 허우적 거렸습니다.


LVM 마운트 방법을 알려드리겠습니다.

1. 우선 복구 CD를 다운 받으십시오.

기존 페도라나 다른 리눅스 CD에는 rescue모드에서 lvm 프로그램이 구동하지 않기 때문에

꼭 적당한 복구 CD를 만드셔야 합니다.

(저는 여기 http://www.tux.org/pub/people/kent-robotti/looplinux/rip/ 에서 70M 짜라 iso 파일


Bootable CD ISO (RIPLinuX-2.3.iso)


를지고 만들었습니다.)


2. 복구 CD로 부팅을 하는데 부팅방법이 여러가지 있으니 적당한걸 선택하세요.

(전 기냥 엔터를 쳐서 부팅했습니다.  ^^;)


3. 아래와 같이 명령어를 입력하시면 lvm이 구동됩니다.

sh /etc/rd.d/rc.lvm2 start


4. 아래와 같이 입력하면 마운트 하고자 하는 LVM이 보일겁니다.

lvdisplay


4. lvm을 구동하고 아래와 같이 입력하면 마운트가 됩니다.

아래 명령을 입력하기 전에 마운트 포인트를 먼저 만들어야(mkdir /mnt/hdb) 된다는건 상식이겠죠

mount /dev/VolGroup00/LogVol01 /mnt/hdb



--> 정리하는 글,......

    fdisk /dev/hda/ 해서 print 명령어로 보았을 때

     /dev/hda2/   Linux LVM

    을 만났을 때는 직접 mount /dev/hda2 /mnt/hdb 가 되지 않습니다.

    그럴 땐 위와 같이 하시면 됩니다. ^^;


탭스 업로드 3.0

Projects/CoVNC 2007.08.03 14:05 Posted by soulfree >동네청년<


탭스 업로드 컴포넌트입니다.


무료 컴포넌트 중에 퍼포먼스가 좋은편이라고 알려져있죠.


주요 특징입니다.


64비트(x64) 탭스 업로드 (버전 3.0)

이제 64비트 환경(Windows Server 2003 x64)에서도 탭스 업로드 서버 컴포넌트를 사용할 수 있습니다. 64비트 전용으로 제작되어 64비트 IIS에서 최상의 성능을 제공합니다

윈도우 비스타를 지원하는 TABSFileup 액티브액스 컨트롤 (버전 3.0)

비스타의 IE7은 보호 모드(Protect Mode)로 동작하기 때문에 액티브액스 컨트롤에 상당한 제약을 주므로 상당수의 기존 컨트롤들이 정상 동작하지 않거나 실행조차 되지 않습니다. TABSFileup은 보호 모드의 표준 프로그래밍 규약을 준수해서 동작하도록 개발되어 비스타에서도 원할하게 사용할 수 있습니다.


업로드 바이러스 검출(버전 2.3)

Sophos for TABS Upload 안티바이러스 프로그램을 이용해 파일 업로드시 전송된 파일에 대해 바이러스를 검사할 수 있습니다. 서버에 업로드 되는 파일에 대해 실시간으로 바이러스를 검출할 수 있는 기능이 제공되어 보다 안전한 업로드 서버를 구성할 수 있습니다. Sophos for TABS Upload는 업로드시 검사 기능 외에 기본적으로 윈도우 서버를 바이러스 감염으로 부터 보호할 수 있는 기능이 탑재되어 있으므로 서버 보호용으로 별도의 안티 바이러스를 구입할 필요가 없습니다.

프리웨어

TABS Upload는 프리웨어 입니다. 누구나 자유롭게 사용할 수 있습니다. TABS Upload를 사용하시려면 고객등록을 하신 후 등록키를 발급 받아 TABS Upload에 입력하시면 정상적으로 사용할 수 있습니다. [고객등록]에서 등록을 먼저 하십시오. 고객등록 후 [무료 등록키 받기]를 통해서 키를 받으십시오. 키를 e-mail로 받으신 후 해당 키를 제품에 입력십시오.

Upload 컴포넌트와 TABSFileup 컨트롤은 자유롭게 설치하여 사용할 수 있습니다. 그러나 다음과 같은 경우에는 사용할 수 없습니다.

  1. Upload 컴포넌트와 TABSFileup 컨트롤을 임의의 제품 기능에 포함 또는 변형시켜 판매하거나 유통시킬 수 없습니다. 이 경우 구매를 해야 합니다.(Redistribution License, Site License 구매)
  2. Upload 컴포넌트와 TABSFileup 컨트롤을 탭스랩(주)의 허가 없이 판매 또는 수익모델로 사용할 수 없습니다.

탭스 업로드 3.0

html을 클립보드에 복사

Projects/CoVNC 2007.07.25 03:25 Posted by soulfree >동네청년<

rich text의 경우 richedit.h만 include해주면 MFC가 아닌 Win32 API를 사용하는 프로그램에서도CF_RTF를 사용할 수 있었지만 HTML은 아직 발견하지 못했네요.
다음 예는 msdn에 올라와있는 예제입니다만,,, MFC에서만 사용가능 한 것으로 생각됩니다...
RegisterClipboardFormat("HTML Format"); 함수를 사용했고 이것을 사용해 setClipboardData()함수를 호출 하였지만 클립보드에 html 데이터가 들어가지 못합니다...
그나저나 빨리 CF_HTML 을 사용할 수 있도록 하는 방법을 찾아야 하는데,,, 잠도 못자고 죽겠네여....


How To Add HTML Code to the Clipboard by Using Visual C++


 When you use this function to copy an HTML code fragment to the clipboard, it might look like the following:

    char *html = 
        "<b>This is a test</b><hr>"
        "<li>entry 1"
        "<li>entry 2";
    CopyHTML(html);


Additional Note

Using an approach that sends HTML code to the clipboard might be especially beneficial for Office Automation clients. For example, if you have an Automation client that needs to generate formatted data for cells in Microsoft Excel or paragraphs in Microsoft Word, you could build the data in HTML code, send it to the clipboard, and then paste it into the application. By using this technique, you could reduce the number of out-of-process calls to the Automation client.


REFERENCES

To learn more about the specifics of the HTML Clipboard format, see the topic "HTML Clipboard Format" in the MSDN:

'Projects > CoVNC' 카테고리의 다른 글

error LNK2001: unresolved external symbol _main  (1) 2007.09.17
탭스 업로드 3.0  (0) 2007.08.03
html을 클립보드에 복사  (0) 2007.07.25
CF_RTF를 사용하기위해...  (0) 2007.07.24
Msftedit.dll과 CF_RTF  (0) 2007.07.24
다중포멧 클립보드를 위한 글들...  (0) 2007.07.23

CF_RTF를 사용하기위해...

Projects/CoVNC 2007.07.24 17:51 Posted by soulfree >동네청년<
#include <richedit.h>를 추가해줍니다....
이걸 찾기위해 하루를 보냈습니다...

'Projects > CoVNC' 카테고리의 다른 글

탭스 업로드 3.0  (0) 2007.08.03
html을 클립보드에 복사  (0) 2007.07.25
CF_RTF를 사용하기위해...  (0) 2007.07.24
Msftedit.dll과 CF_RTF  (0) 2007.07.24
다중포멧 클립보드를 위한 글들...  (0) 2007.07.23
RTF를 사용하기 위하여  (0) 2007.07.23

Msftedit.dll과 CF_RTF

Projects/CoVNC 2007.07.24 16:31 Posted by soulfree >동네청년<
MFC를 사용하지 않고 win32 API만으로  rich editor 라이브러리인 Msftedit.dll을 사용하는 방법을 잘 모르겠네요...
영어나 우리말로 잘 되어있는 문서도 없고, 라틴어?? (맞나??)로 된 글을 복사해둡니다. 참고하시길...

 

Page 1

Note sul controllo Rich Edit

[di Matteo Mecucci – v.1.3 del 28 settembre 2006]

Introduzione

Come per tante altre parti delle API Win32, anche il Rich Edit a volte si comporta in modi inattesi o

non documentati, perciò mi piacerebbe appuntare qui alcune note relative al suo uso. La lista

crescerà man mano che avrò tempo di stilarla e man mano che i problemi si presenteranno.

In questi giorni in ufficio stiamo creando un software che usa intensamente un controllo rich–text

full–featured. Per realizzarlo ho scelto di partire dal Rich Edit Control di base delle API Win32,

contenuto in un controllo custom che ne gestisca gli eventi e l'interazione con le altre parti del

software. Questa scelta ha portato ovviamente alcuni vantaggi e alcuni svantaggi ma per i nostri

scopi al momento sembra che possiamo accontentarci e possiamo raggiungere più o meno ogni

obbiettivo previsto.

Licenza

Questo documento è distribuito con Licenza Creative Commons BY-NC-SA 2.0. I

termini della licenza sono disponibili presso il sito:

http://creativecommons.org/licenses/by-nc-sa/2.0/it/

Eventuali marchi e copyright nominati ed utilizzati in questo documento appartengono ai rispettivi

proprietari.

Il materiale fornito è da considerarsi "AS IS" e l'autore declina ogni responsabilità per danni

derivanti dal suo utilizzo.

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 1


Page 2

La versione del controllo da utilizzare

La scelta della versione del controllo da utilizzare non è necessariamente banale. Sebbene

siano "papabili" per il controllo sia la classe RICHEDIT_CLASS (versione 2.0 o 3.0) che la classe

MSFTEDIT_CLASS (versione 4.1 disponibile con XP SP1), quest'ultima ha un supporto

decisamente migliore delle tabelle RTF (non al livello di Word, comunque) e offre un'anteprima

di stampa più fedele, ma renderizza in modo pessimo le tabelle con colonne a larghezza

automatica (assegna a tutte larghezza nulla, mentre la versione precedente gli assegna una larghezza

fissa). Inoltre l'ultima versione del controllo non supporta ‘nativamente’ il set di caratteri ANSI ma

solo quello UTF–16.

Se si sceglie il controllo MSFTEDIT_CLASS, bisogna fare attenzione alle impostazioni del

progetto rispetto all'encoding dei caratteri. Se si utilizza, come accade nella maggior parte dei

progetti legacy, la versione ANSI e non quella Unicode UTF–16 delle API, ci sono alcuni punti su

cui soffermarsi.

Prima di tutto non può essere utilizzato nel CreateWindow il define della classe perché anche

quello è una stringa wide, quindi bisogna usare direttamente il nome della classe

"RichEdit50W" (notate che al contrario delle versioni precedenti non esiste alcuna classe

"RichEdit50A").

m_pRichEditDll = ::LoadLibrary("msftedit.dll");

if(m_pRichEditDll != NULL)

{

// si assicura che i controlli avanzati siano attivi

INITCOMMONCONTROLSEX icc;

icc.dwSize = sizeof(INITCOMMONCONTROLSEX);

icc.dwICC = ICC_WIN95_CLASSES;

InitCommonControlsEx(&icc);

// crea il controllo rich text

m_pRTHwnd = ::CreateWindowEx(exStyle, TEXT("RICHEDIT50W"), TEXT(""),

style, 0, 0, rc.width(), rc.height(), m_pHwnd, NULL, NULL, NULL);

}

Si deve anche tenere presente che tutti i messaggi al controllo possono essere inviati

tranquillamente con le strutture in versione Ansi (ad esempio EM_SETCHARFORMAT può

utilizzare CHARFORMAT = CHARFORMATA) in quanto vengono inviati per default con

SendMessage = SendMessageA, TRANNE i messaggi che LEGGONO il testo dal controllo,

ovvero EM_GETSELTEXT e EM_GETTEXTRANGE, in quanto i buffer vengono comunque

interpretati come wchar_t* e quindi riempiti con testo Unicode, non Ansi; quindi va utilizzato nel

primo caso un buffer wchar_t* e nel secondo la struttura TEXTRANGEW e non TEXTRANGE.

Nessun problema invece per i messaggi che impostano il testo, come EM_REPLACESEL o

EM_SETTEXTEX.

// copia in textw tutto il testo del controllo in formato UTF-16

wchar_t* textw = (wchar_t*)malloc(...);

// dimensione opportuna

TEXTRANGEW tr = { {0, -1}, textw };

int read = ::SendMessage(m_pRTHwnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr);

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 2


Page 3

Impostazioni del formato del testo

Tutte le misure del rich text sono espresse in twip: 1 cm = 567 twips; 1 pollice = 1440 twip.

Questi numeri possono essere utili ad esempio nei CHARFORMAT e nei PARAFORMAT.

Per evitare il wordwrap del testo è necessario inviare il messaggio EM_SETTARGETDEVICE

con wParam=0 e lParam=1. Se si vuole il wordwrap (come di default), lParam va messo pari a 0.

Nella stampa questo messaggio va utilizzato in modo più accorto, impostando il device context

della stampante come wParam e la larghezza del foglio come lParam.

// disattiva il wordwrap in base ad un flag

::SendMessage(m_pRTHwnd, EM_SETTARGETDEVICE, NULL, m_fTextOnlyMode ? 1 : 0);

Per poter utilizzare l'allineamento giustificato è necessario prima aver impostato il flag

TO_ADVANCEDTYPOGRAPHY col messaggio EM_SETTYPOGRAPHYOPTIONS.

Per utilizzare il controllo RichEdit come editor di testo non formattato imposto il flag

SES_EMULATESYSEDIT

nel

messaggio

EM_SETEDITSTYLE,

il

flag

TO_SIMPLELINEBREAK nel messaggio EM_SETTYPOGRAPHYOPTIONS. La cosa più

seccante però è la necessità di filtrare il tentativo di incollare testo formattato nel controllo: ne

parliamo in maggiore dettaglio in seguito. Basti dire che il flag TM_PLAINTEXT nel messaggio

EM_SETTEXTMODE, che la documentazione indica come sufficiente allo scopo sembra non avere

alcun effetto sul problema.

// imposta i flag in base al flag text-only

::SendMessage(m_pRTHwnd, EM_SETTYPOGRAPHYOPTIONS,

m_fTextOnlyMode ? TO_SIMPLELINEBREAK : TO_ADVANCEDTYPOGRAPHY,

m_fTextOnlyMode ? TO_SIMPLELINEBREAK : TO_ADVANCEDTYPOGRAPHY);

::SendMessage(m_pRTHwnd, EM_SETEDITSTYLE,

m_fTextOnlyMode ? SES_EMULATESYSEDIT : 0, SES_EMULATESYSEDIT);

Il default per il massimo di caratteri che il controllo accetta è in molte occasioni basso: 2

15

(32767) caratteri. È sufficiente impostarlo con EM_EXLIMITTEXT, mettendo in lParam un

numero più alto (noi usiamo ad esempio 0xffffff = 2

24

-1). Questo messaggio deve essere inviato

quando il controllo è vuoto.

// svuota il controllo ed imposta il numero di caratteri che esso accetta

SETTEXTEX st = {ST_DEFAULT, CP_ACP};

::SendMessage(m_pRTHwnd,EM_SETTEXTEX,(WPARAM)&st,(LPARAM)TEXT(""));

::SendMessage(m_pRTHwnd, EM_EXLIMITTEXT, 0, 0xffffff);

Quando si aggiunge del testo non RTF al controllo esso assume la formattazione corrente ma

alla fine viene reimpostata quella di default. Se tenete alla formattazione esistente nel punto di

inserimento, abbiate cura di chiedere la formattazione con EM_GETCHARFORMAT prima di

inserire il testo e di reimpostarla con EM_SETCHARFORMAT dopo averlo inserito. Fate anche

attenzione che aggiungere del testo programmaticamente non sposta il cursore nel controllo: se

dovete aggiungere testo di seguito ogni volta dovete anche spostare il cursore.

// inserisce del testo UTF-16 non formattato in fondo al controllo

::SendMessage(m_pRTHwnd, EM_SETSEL, (WPARAM)-1, (LPARAM)-1);

CHARFORMAT2 cf;

cf.cbSize = sizeof(cf);

::SendMessage(m_pRTHwnd, EM_GETCHARFORMAT, SCF_SELECTION, ( LPARAM ) &cf );

cf.dwMask = CFM_ALL2;

SETTEXTEX st = {ST_SELECTION, 1200};

::SendMessage(m_pRTHwnd, EM_SETTEXTEX, (WPARAM)&st, (LPARAM)textw);

::SendMessage(m_pRTHwnd, EM_SETCHARFORMAT, SCF_SELECTION, ( LPARAM ) &cf );

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 3


Page 4

Creare una tabella direttamente attraverso PARAFORMAT non è possibile (i pochi attributi

relativi sono in sola lettura e non possono essere impostati in un EM_SETPARAFORMAT). Il

metodo migliore che abbiamo trovato è stato quello di costruire un testo RTF che descrivesse la

tabella voluta e inserirlo nel controllo già bello e pronto. Documentazione essenziale per lo scopo

la specifica RTF della Microsoft, ovviamente.

La numerazione con PFM_NUMBERING sa contare solo fino a 255. Se si imposta il numero

iniziale ad X con PFM_NUMBERINGSTART, il massimo numero che si può ottenere (senza

reimpostare a mano PFM_NUMBERINGSTART) è X+255.

Per quanto strano, il numero o il pallino della numerazione assumono il CHARFORMAT

dell'accapo della riga dove si trovano: se si vuole il numero in grassetto, ad esempio, è necessario

impostare il CFM_BOLD dell'ultimo carattere della riga dove si trova il numero.

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 4


Page 5

Sovraccaricare la gestione degli eventi di default

Si possono facilmente intercettare eventi di mouse, tastiera e altro genere col messaggio

EM_SETEVENTMASK e gestendo i messaggi sul controllo parent.

Si può ad esempio bloccare un tasto per impedirgli di fare edit e collegarlo ad una funzione sul

testo — è sufficiente restituire un valore non nullo nella WindowProc in risposta all'evento

EN_MSGFILTER relativo; ho usato questo metodo ad esempio per gestire il Tab e lo Shift-Tab

per aumentare e diminuire l'indentazione di una selezione, mentre senza selezione il Tab

aggiunge una tabulazione, come di default. Inoltre gestisco l'evento EN_SELCHANGE per

aggiornare la toolbar rispetto al CHARFORMAT e al PARAFORMAT del testo selezionato e

l'evento EN_CHANGE per impostare un documento come modificato.

// frammento della WindowProc del controllo parent del rich-text

if(uMsg == WM_NOTIFY &&((LPNMHDR)lParam)->code == EN_MSGFILTER)

{

// controlla se il tasto premuto e' tab e se c'e' una selezione attiva.

// in questo caso fa l'indentazione del testo selezionato

// e non la sostituzione col carattere di tabulazione.

MSGFILTER* filter = (MSGFILTER*)lParam;

if(filter->msg==WM_CHAR &&filter->wParam=='\t')

{

CHARRANGE cr;

SendMessage(((LPNMHDR)lParam)->hwndFrom, EM_EXGETSEL, 0, (LPARAM)&cr);

if(cr.cpMax != cr.cpMin)

{

if(IsShiftDown())

ctrl->Outdent();

else

ctrl->Indent();

return 1;

}

}

}

Per verificare se il controllo è stato modificato è sufficiente nella maggior parte dei casi usare

il messaggio EM_GETMODIFY. Se però prevedete di poter inserire oggetti OLE all'interno del

testo, dovete occuparvi voi di controllare se qualcuno di essi è modificato. Ho scelto di farlo

enumerando tutti gli oggetti attraverso l'interfaccia OLE del controllo ottenibile col messaggio

EM_GETOLEINTERFACE. Nell'enumerazione (ottenuta con GetObjectCount()/GetObject()),

controllo se l'oggetto corrente ha l'interfaccia IPersistStorage (con QueryInterface) e quindi

controllo le modifiche col metodo IsDirty().

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 5


Page 6

// se il flag di modificato non e' settato, controlla

// prima che il controllo stesso non lo abbia attivo

m_fModified = ::SendMessage(m_pRTHwnd, EM_GETMODIFY, 0, 0)!=0;

if(m_fModified || !m_pOleObj)

return;

// poi controlla se un oggetto contenuto nel controllo e' per caso modificato

// andando a cercare il flag IsDirty sulla sua interfaccia IPersistStorage

HRESULT hr = 0;

int objectCount = m_pOleObj->GetObjectCount();

for (int i = 0; !m_fModified &&i <objectCount; i++)

{

REOBJECT reObj;

ZeroMemory(&reObj, sizeof(REOBJECT));

reObj.cbStruct = sizeof(REOBJECT);

hr = m_pOleObj->GetObject(i, &reObj, REO_GETOBJ_POLEOBJ);

if(SUCCEEDED(hr))

{

IPersistStorage* pstg=NULL;

if(SUCCEEDED(reObj.poleobj->QueryInterface(

IID_PPV_ARG(IPersistStorage, &pstg))))

{

if(pstg &&pstg->IsDirty()==S_OK)

m_fModified=true;

pstg->Release();

}

reObj.poleobj->Release();

}

}

Per intercettare alcuni eventi OLE è possibile impostare un oggetto di callback attraverso il

messaggio EM_SETOLECALLBACK. La classe dell'oggetto deve derivare dall'interfaccia

IRichEditOleCallback e può risultare utile (necessaria) per diverse cose, di cui parleremo in seguito.

La definizione della classe è agevolata dal fatto che tutti i metodi che non vogliamo implementare

possono semplicemente restituire E_NOTIMPL o in alcuni casi S_OK (ad esempio in

QueryInsertObject e in DeleteObject) per ottenere il comportamento di default. Fornendo l'oggetto

di callback è possibile:

inserire oggetti OLE nel controllo fornendo l'implementazione di GetNewStorage,

deputata a creare oggetti di storage.

// implementazione molto banale e poco efficiente di GetNewStorage

HRESULT TRichTextOleCallback::GetNewStorage(LPSTORAGE* ppStg)

{

if (!ppStg)

return E_INVALIDARG;

*ppStg = NULL;

LPLOCKBYTES pLockBytes;

HRESULT hr = CreateILockBytesOnHGlobal(NULL, TRUE, &pLockBytes);

if (FAILED(hr))

return hr;

hr = StgCreateDocfileOnILockBytes(pLockBytes, STGM_SHARE_EXCLUSIVE |

STGM_CREATE | STGM_READWRITE, 0, ppStg);

pLockBytes->Release();

return (hr);

}

gestire l'interazione con la nostra applicazione dei controlli che supportano

l'attivazione in–place, implementando i metodi GetInPlaceContext e ShowContainerUI.

Questa interazione coinvolge a fondo altre parti dell'applicazione (toolbar, menu, palette e

quant'altro?), quindi può essere di difficile attuazione in applicazioni legacy non realizzate

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 6


Page 7

dall'inizio con certi criteri. Tra l'altro non è sempre desiderabile che questa attivazione

inplace abbia luogo: in alcuni casi è molto meglio che con un doppio click si apra

l'applicazione relativa all'oggetto OLE nel suo ambiente esclusivo, senza interagire

direttamente col nostro; è molto comodo il fatto che questo sia esattamente il

comportamento di default.

filtrare gli oggetti OLE che si possono inserire (magari con un paste dalla clipboard, con

un caricamento da file o con un dialogo "Inserisci oggetto?") implementando il metodo

QueryInsertObject.

filtrare dati in ingresso dalla clipboard o dal drag&drop (come vedremo più avanti)

implementando il metodo QueryAcceptData.

fornire un help basato sul contesto implementando il metodo ContextSensitiveHelp.

mostrare un menu contestuale in risposta al tasto destro del mouse (praticamente

obbligatorio), implementando il metodo GetContextMenu.

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 7


Page 8

Salvataggio e caricamento

Serializzare il contenuto del controllo su file RTF o su un buffer in memoria è molto semplice

attraverso il messaggio EM_STREAMOUT. Questo messaggio permette anche di specificare

un'eventuale pagina di codici per la codifica del testo. In particolare mi sembrava molto interessante

la possibilità di usare la codifica UTF–8, usando come wParam «(CP_UTF8 <<16) |

SF_USECODEPAGE | SF_RTF», in base alla documentazione. Ebbene queste impostazioni

generano file perfettamente validi (come si verifica leggendo il file attraverso un relativo

EM_STREAMIN) ma purtroppo non leggibili da Word e da Wordpad. A parte la questione assurda

che il Wordpad nient'altro dovrebbe essere che un contenitore per lo stesso controllo che stiamo

realizzando (usa l'mfstedit), il motivo si legge nella specifica dell'RTF (della Microsoft,

ovviamente): il tag \urtf1, quello utilizzato in questa codifica, è generato dall'applicazione "Pocket

Word" (della Microsoft, ovviamente) e NON viene riconosciuto da Word. Non riesco a spiegarmi

questa cosa. Comunque per i file bisogna di fatto usare SF_RTF e basta. Il problema è relativo

per fortuna, in quanto la specifica RTF prevede comunque precise modalità per la memorizzazione

di caratteri Unicode, quindi non si perde niente…

Anche salvare un pezzo di testo selezionato e non tutto il contenuto come file RTF è

abbastanza semplice. È sufficiente utilizzare il metodo GetClipboardData dell'oggetto

IRichEditOle ottenibile con il messaggio EM_GETOLEINTERFACE. Questo metodo restituisce un

oggetto IDataObject per un certo range di caratteri, che è possibile interrogare con un opportuno

FORMATETC per ottenere i dati relativi nel formato desiderato (CF_RTF o CF_TEXT nel nostro

caso).

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 8


Page 9

Bug e work–around

Come accennato prima, quando si utilizza il controllo richtext in modalità solo testo si ha lo

spiacevole comportamento di default che per quanti flag si impostino il testo formattato continua

a poter entrare nel controllo dalla clipboard o con i drag&drop. Per evitare tutto ciò è

necessario, come accennato, implementare la funzione QueryAcceptData dell'interfaccia

IRichTextOleCallback. Al suo interno va controllato innanzitutto se ci viene richiesto il formato che

preferiamo (quando *pcfFormat==0): in tal caso specifichiamo che vogliamo ovviamente

CF_TEXT. Se al contrario il formato è imposto, si restituisce DATA_E_FORMATETC (per

convenzione, ma va bene un errore qualsiasi) se esso è appunto diverso da CF_TEXT.

Con questo metodo è uscito fuori però un bacherello (almeno pare tale): il richtext elimina

l'eventuale end–of–line dell'ultima riga del testo da incollare: se ad esempio si copia una linea

intera di testo, compreso l'accapo, quando eseguiamo l'incolla l'accapo non viene incollato. Questo

comportamento è ancora più evidente quando si fa il drag&drop del testo: se una linea intera di

testo viene spostata e poi il drop viene annullato o finisce nella posizione originale, l'accapo viene

eliminato. Per evitare tutto ciò possiamo modificare ancora la QueryAcceptData in modo che,

quando il paste stia avvenendo (segnalato da fReally==1), essa esegua direttamente l'operazione,

chiedendo al pDataObj i dati CF_TEXT col metodo GetData ed inserendoli nel controllo con un

EM_SETTEXTEX. A quel punto essa può restituire S_FALSE, ovvero un codice di successo ma

negativo che indica al chiamante che il dato è stato accettato ma che si è già provveduto

all'inserimento. Infatti restituire S_OK farebbe inserire un'altra volta il testo mentre restituire un

codice d'errore eviterebbe ad esempio la cancellazione del testo originale in un drag&drop.

// implementazione del metodo QueryAcceptData per gestire correttamente

// la copia del testo non formattato

HRESULT TrichTextOleCallback::QueryAcceptData(

LPDATAOBJECT pDataObj, CLIPFORMAT* pcfFormat,

DWORD reco, BOOL fReally, HGLOBAL hMetaPict)

{

// se il controllo e' in modalita' solo testo, pretende di ottenere

// il formato CF_TEXT, altrimenti restituisce errore

if(m_pCtrl &&m_pCtrl->IsInTextOnlyMode())

{

// workaround per inserire gli accapo alla fine del testo

if(fReally)

{

FORMATETC ftc; STGMEDIUM stg;

ftc.cfFormat = CF_TEXT;

ftc.dwAspect = DVASPECT_CONTENT;

ftc.lindex = -1; ftc.ptd = NULL;

ftc.tymed = TYMED_HGLOBAL;

if(pDataObj &&SUCCEEDED(pDataObj->GetData(&ftc, &stg)) &&

stg.hGlobal)

{

char* text = (char*)GlobalLock(stg.hGlobal);

if(text)

{

// inserisce il testo al posto della selezione corrente

m_pCtrl->InsertText(text);

GlobalUnlock(stg.hGlobal);

}

if(stg.pUnkForRelease)

stg.pUnkForRelease->Release();

else

GlobalFree(stg.hGlobal);

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 9


Page 10

if(text)

// codice per dire che questa funzione ha accettato

// il testo ma l'ha anche inserito direttamente lei

return S_FALSE;

}

}

if(*pcfFormat == 0)

{

// chiediamo solo testo non formattato

*pcfFormat = CF_TEXT;

return S_OK;

}

if(*pcfFormat != CF_TEXT) // errore: formato non valido

return DATA_E_FORMATETC;

}

return S_OK;

}

In alcuni strani casi in cui nella clipboard c'è tra i formati disponibili "RTF in UTF8", ci è capitato

di ottenere un testo vuoto utilizzando il WM_PASTE standard. Per questo abbiamo preferito

intercettare i comandi di incolla (non col QueryAcceptData ma direttamente da dove viene inviato il

WM_PASTE) e chiedere esplicitamente l'inserimento dei dati CF_RTF con un bel

EM_PASTESPECIAL.

// workaround necessario per strani casi in cui c'e' "RTF in UTF8"

// tra i formati nella clipboard

static int cf_rtf = RegisterClipboardFormat(CF_RTF);

if(!m_fTextOnlyMode &&::SendMessage(m_pRTHwnd, EM_CANPASTE, cf_rtf, 0))

{

::SendMessage(m_pRTHwnd, EM_PASTESPECIAL, cf_rtf, 0);

return;

}

::SendMessage(m_pRTHwnd, WM_PASTE, 0, 0);

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 10


Page 11

Riferimenti

Descrizione del RichEdit Control su MSDN:

http://msdn.microsoft.com/library/en-us/shellcc/platform/commctls/RichEdit/RichEditControls.asp

Rich Text Format Specification, version 1.8:

http://go.microsoft.com/?linkid=5467681

Il mio sito:

http://www.digitalwaters.net/

© 2006 Matteo Mecucci, DigitalWaters.net

pag. 11

'Projects > CoVNC' 카테고리의 다른 글

html을 클립보드에 복사  (0) 2007.07.25
CF_RTF를 사용하기위해...  (0) 2007.07.24
Msftedit.dll과 CF_RTF  (0) 2007.07.24
다중포멧 클립보드를 위한 글들...  (0) 2007.07.23
RTF를 사용하기 위하여  (0) 2007.07.23
소스코드 검색 사이트  (0) 2007.06.09

다중포멧 클립보드를 위한 글들...

Projects/CoVNC 2007.07.23 23:59 Posted by soulfree >동네청년<
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=217&MAEULNo=8&no=21266&ref=21266

http://pds2.egloos.com/pds/1/200609/23/17/MyWord(0).zip

http://blog.empas.com/swguru/10848091

'Projects > CoVNC' 카테고리의 다른 글

CF_RTF를 사용하기위해...  (0) 2007.07.24
Msftedit.dll과 CF_RTF  (0) 2007.07.24
다중포멧 클립보드를 위한 글들...  (0) 2007.07.23
RTF를 사용하기 위하여  (0) 2007.07.23
소스코드 검색 사이트  (0) 2007.06.09
겨우 찾아낸 제대로 된 XML 파싱  (3) 2007.06.01

RTF를 사용하기 위하여

Projects/CoVNC 2007.07.23 21:16 Posted by soulfree >동네청년<
출처 : msdn

==============================================================================================

About Rich Edit Controls

The original specification for rich edit controls is Microsoft Rich Edit 1.0; the current specification is Rich Edit 4.1. Each version of rich edit is a superset of the preceding one, except that only Asian builds of Rich Edit 1.0 have a vertical text option. Before creating a rich edit control, you should call the LoadLibrary function to verify which version of Rich Edit is installed. For more information, see What's New in Rich Edit.

The following table shows which DLL corresponds with which version of Rich Edit. Note that the name of the file did not change from version 2.0 to version 3.0. This allows version 2.0 to be upgraded to version 3.0 without breaking existing code.

Rich Edit version DLL
1.0 Riched32.dll
2.0 Riched20.dll
3.0 Riched20.dll
4.1 Msftedit.dll

The following list describes which versions of Rich Edit are included in which releases of Microsoft Windows.

Windows XP SP1 Includes Rich Edit 4.1, Rich Edit 3.0, and a Rich Edit 1.0 emulator.
Windows XP Includes Rich Edit 3.0 with a Rich Edit 1.0 emulator.
Windows Me Includes Rich Edit 1.0 and 3.0.
Windows 2000 Includes Rich Edit 3.0 with a Rich Edit 1.0 emulator.
Windows NT 4.0 Includes Rich Edit 1.0 and 2.0.
Windows 98 Includes Rich Edit 1.0 and 2.0.
Windows 95 Includes only Rich Edit 1.0. However, Riched20.dll is compatible with Windows 95 and may be installed by an application that requires it.

On Windows 95/98/Me, Rich Edit 1.0 is localized so that it works with a particular operating system that is similarly localized. For example, on Japanese versions of an operating system, Rich Edit 1.0 can display Japanese, but not Arabic.

The following topics are discussed in this section.

What's New in Rich Edit

The following topics describe the new features introduced in each version of Rich Edit.

Rich Edit Version 1.0

Rich Edit 1.0 includes the following features.

Text entry and selection Mostly standard (system-edit control) selection and entry of text. Selection bar support (the selection bar is an unmarked area to the left of each paragraph that when clicked, selects the line). Word-wrap and auto-word-select options. Single-, double-, and triple-click selection.
ANSI (single-byte character set (SBCS) and multibyte character set (MBCS)) editing However, there is no Unicode editing.
Basic set of character/paragraph formatting properties See CHARFORMAT and PARAFORMAT.
Character formatting properties Font name and size, bold, italic, solid underline, strike-out, protected, link, offset, and text color.
Paragraph formatting properties Start indent, right indent, subsequent line offset, bullet, alignment (left, center, right), and tabs.
Find forward Includes case-insensitive and match-whole-word options.
Message-based interface Almost a superset of the system edit-control message set plus two interfaces, IRichEditOle and IRichEditCallback.
Embedded objects Requires client collaboration based on IRichEditOle and IRichEditCallback interfaces.
Right-button menu support Uses IRichEditCallback interface.
Drag-and-drop editing Drag-and-drop editing is supported.
Notifications WM_COMMAND messages sent to client plus a number of others. This is a superset of common-control notifications.
Single-level undo/redo Behaves similarly to the system edit control. Selecting Undo reverses the last action, and that action then becomes the new Redo action.
Simple vertical text (Asian builds only).
Input Method Editor (IME) support (Asian builds only).
WYSIWYG editing using printer metrics This feature is needed for Microsoft WordPad, in particular.
Cut/Copy/Paste/StreamIn/StreamOut With plain text (CF_TEXT) or Rich Text Format (RTF) with and without objects.
C code base The code is written in C, which provides a solid and versatile foundation.
Different builds for different scripts Rich Edit 1.0 addresses localization issues with different builds.

Rich Edit Version 2.0

Rich Edit 2.0 incorporated several additional features, such as support for Unicode and Asian languages, multilevel Undo, Component Object Model (COM) interfaces, and numerous user interface (UI) enhancements.

Rich Edit 2.0 includes the following features in addition to the features provided by  .

Unicode Unicode eases the effort in handling international text. However effort is needed to maintain compatibility with existing non-Unicode documents—that is, the ability to convert to/from non-Unicode plain and rich text. Also, substantial effort is needed to run correctly on Windows 95/98/Me.
General international support General line breaking algorithm (extension of Kinsoku rules), simple font linking, keyboard font switching.
Asian support Level 2 (dialog box) and 3 (inline) is supported in IMEs.
Find Up/Find Down support Searching forward and backward is supported.
Bidirectional support This is included in Rich Edit 2.1
Multilevel undo An extensible Undo architecture allows client to participate in application-wide Undo model.
Magellan mouse support This is the mouse with a roller for scrolling.
Dual-font support The keyboard can automatically switch fonts when the active font is inappropriate for current keyboard, for example, Kanji characters in Times New Roman.
Smart font apply Font change request does not apply Western fonts to Asian characters.
Improved display An off-screen bitmap is used when multiple fonts occur on the same line. This allows, for example, the last letter of the word cool not to be chopped off.
Transparency support Also in windowless mode.
System selection colors Used for selecting text.
Automatic URL recognition Can check for a number of URL formats (for example, http:)
Microsoft Word edit UI compatibility Selection, cursor-keypad semantics.
Word standard EOP The end-of-paragraph mark (CR) can also handle carriage return/line feed (CR/LF) (carriage return, line-feed).
Plain-text as well as rich-text functionality Single-character format and single-paragraph format.
Single-line and multiline controls Truncate at first end-of-paragraph and no wordwrap.
Accelerator keys Accelerator keys are supported.
Password window style Password edit controls are supplied through EM_GETPASSWORDCHAR and EM_SETPASSWORDCHAR.
Scalable architecture To reduce instance size.
Windowless operation and interfaces This is provided through the ITextHost and ITextServices interfaces.
COM dual interfaces Text Object Model (TOM) interfaces.
CHARFORMAT2 Added font weight, background color, locale identifier, underline type, superscript and subscript (in addition to offset), disabled effect. For RTF roundtripping only, added amount to space between letters, twip size above which to kern character pair, animated-text type, various effects: font shadow/outline, all caps, small caps, hidden, embossed, imprint, and revised.
PARAFORMAT2 Added space before and after and Word line spacing. For RTF roundtripping only, added shading weight/style, numbering start/style/tab, border space/width/sides, tab alignment/leaders, various Word paragraph effects: RTL paragraph, keep, keep-next, page-break-before, no-line-number, no-widow-control, do-not-hyphenate, side-by-side.
More RTF roundtripping All of the Word FormatFont and FormatParagraph properties.
Code stability and stabilization Examples: parameter and object validation, function invariants, reentrancy guards, object stabilization.
Strong testing infrastructure Including extensive regressions tests.
Improved performance Smaller working set, faster load and redisplay times, etc.
C++ code base The code is written in C++, which provides a solid foundation on which to build Rich Edit 3.0.

With a few exceptions, Rich Edit 2.0 uses the same functions, structures, and messages as Rich Edit 1.0. Note, however, the following differences:

  • The name of the Rich Edit 1.0 window class is RichEdit. Rich Edit 2.0 has both ANSI and Unicode window classes—RichEdit20A and RichEdit20W, respectively. To specify the appropriate rich edit window class, use the RICHEDIT_CLASS constant, which the Richedit.h file defines depending on the definition of the UNICODE compile flag.
  • In Rich Edit 2.0, if you create a Unicode rich edit control (one that expects Unicode text messages), you must specify only Unicode data in any window messages sent to the control. Similarly, if you create an ANSI rich edit control, send only ANSI or double-byte character set (DBCS) data. You can use the IsWindowUnicode function to determine whether a rich edit control uses Unicode text messages. Note that the rich edit COM interfaces use Unicode text unless they encounter a code page argument.
  • Rich Edit 1.0 used CR/LF character combinations for paragraph markers. Rich Edit 2.0 used only a carriage return character ('\r'). Rich Edit 3.0 uses only a carriage return character but can emulate Rich Edit 1.0 in this regard.
  • Rich Edit 2.0 introduced the following new messages.
    Message Description
    EM_AUTOURLDETECT Enables or disables automatic URL detection.
    EM_CANREDO Determines whether there are any actions in the redo queue.
    EM_GETIMECOMPMODE Retrieves the current input method editor (IME) mode.
    EM_GETLANGOPTIONS Retrieves options for IME and Asian language support.
    EM_GETREDONAME Retrieves the type name of the next action in the redo queue.
    EM_GETTEXTMODE Retrieves the text mode or undo level.
    EM_GETUNDONAME Retrieves the type name of the next action in the undo queue.
    EM_REDO Redoes the next action in the redo queue.
    EM_SETLANGOPTIONS Sets options for IME and Asian language support.
    EM_SETTEXTMODE Sets the text mode or undo level.
    EM_SETUNDOLIMIT Sets the maximum number of actions in the undo queue.
    EM_STOPGROUPTYPING Stops grouping consecutive typing actions into the current undo action.
  • Rich Edit 2.0 introduced the following new structures.
    Structure Description
    CHARFORMAT2 Contains information about character formatting.
    PARAFORMAT2 Contains information about paragraph formatting.
  • Rich Edit versions 2.0 and 3.0 do not support the following messages that were previously supported in Asian-language versions of Rich Edit 1.0.

    EM_CONVPOSITION

    EM_GETIMECOLOR

    EM_GETIMEOPTIONS

    EM_GETPUNCTUATION

    EM_GETWORDWRAPMODE

    EM_SETIMECOLOR

    EM_SETIMEOPTIONS

    EM_SETPUNCTUATION

    EM_SETWORDWRAPMODE

Rich Edit Version 3.0

Rich Edit 3.0 is a single, scalable, world-wide DLL that offers high performance and compatibility with Word in a small package. New features for Rich Edit 3.0 include richer text, zoom, font binding, more powerful IME support, and rich complex script support (bidirectional, Indic, and Thai).

Rich Edit 3.0 includes the following features in addition to the features provided by Rich Edit Version 2.0.

Zoom The zoom factor is given by a ratio.
Paragraph numbering (single-level) Numeric, upper and lower alphabetic, or Roman numeral.
Simple tables Deleting and inserting rows is possible, but not resizing nor wrapping inside cells. With advanced typography turned on (see EM_GETTYPOGRAPHYOPTIONS), Rich Edit 3.0 can align columns centered or flush right, and include decimals. Cells are simulated by tabs, so text tabs and carriage returns are replaced by blanks.
Normal and heading styles Built-in normal style and heading styles 1 through 9 are supported by the EM_SETPARAFORMAT and Text Object Model (TOM) interfaces.
More underline types Dashed, dash-dot, dash-dot-dot, and dot underlining has been added.
Underline coloring Underlined text can be tagged with one of 15 document choices for underline colors.
Hidden text Marked by CHARFORMAT2 attribute. Handy for roundtripping (writing out to a file what was read in) of information that ordinarily should not be displayed.
More default hot keys These hot keys function the same as those in Word. For example, European accent dead keys (U.S. keyboards only). Number hot key (CTRL+L) cycles through numbering options available, starting with bullet.
HexToUnicode IME Allows a user to convert between hexadecimal and Unicode by using hot keys.
Smart quotes This feature is toggled on and off by CTRL+ALT+' for U.S. keyboards.
Soft hyphens For plain text, use 0xAD. For RTF, use \-.
Italics cursor In addition, the mouse cursor changes to a hand when over URLs.
Advanced typography option Rich Edit 3.0 can use an advanced typography option for line breaking and display (see EM_GETTYPOGRAPHYOPTIONS). This elegant option was added primarily to facilitate handling complex scripts (bidirectional, Indic, and Thai). In addition, a number of improvements occur for simple scripts. Examples are:
  • Center, right, decimal tabs
  • Fully justified text
  • Underline averaging, which provides a uniform underline even when adjacent text runs have different font sizes.
Complex script support Rich Edit 3.0 supports bidirectional (text with Arabic and/or Hebrew mixed with other scripts), Indic (Indian scripts like Devangari), and Thai text. For support of these complex scripts, the advanced typography and Uniscribe components are used.
Font binding Rich Edit 3.0 will automatically choose an appropriate font for characters that clearly do not belong to the current character set stamp. This is done by assigning character sets to text runs and associating fonts with those character sets. For more information, see Font Binding.
Charset-specific plain-text read/write options This allows reading a file using one charset, and writing with a different charset.
UTF-8 RTF This is recommended for cutting, copying, and pasting operations. This file format is more compact than ordinary RTF, faster, and compatible with Unicode.
Microsoft Office 9 IME support (IME98) This more powerful IME capability has been separated into an independent module. Features include:
  • Reconversion

    In the earlier versions, the user needed to delete the final string first and then type in a new string to get to the correct candidate. This new feature enables the user to convert the final string back to composition mode, thereby allowing easy selection of a different candidate string.

  • Document feed

    This feature provides IME98 with the text for the current paragraph, which helps IME98 perform more accurate conversion during typing.

  • Mouse operation

    This feature provides better control over the candidate and UI windows during typing.

  • Caret position

    This feature provides the current caret and line information, which IME98 uses to position UI windows (for example, a candidate list).

Active Input Method Manager (IMM) support Users can invoke the Active IMM object, which enables users to enter Asian characters on U.S. systems.
HexToUnicode support Users can convert between hexadecimal notation and Unicode by using hot keys.
More RTF roundtripping RTF text that is read in from a file will be written back out intact.
Improved 1.0 compatibility mode Rich Edit 3.0 can emulate Rich Edit 1.0 behavior. For example, it is possible to change between MBCS and Unicode character-position (cp) mappings. This feature emulates Rich Edit 1.0 in Windows 2000.
Increased freeze control The display can be frozen over multiple API calls and then unfrozen to display the updates.
Increased undo control Undo can be suspended and resumed (an IME requirement).
Increase/decrease font size Increases or decreases font size to one of six standard values (12, 28, 36, 48, 72, and 80 points).

Rich Edit Version 4.1

New features for Rich Edit 4.1 include hyphenation, page rotation, and Text Services Framework (TSF) support.

Rich Edit 4.1 includes the following features in addition to the features provided by Rich Edit Version 3.0.

Hyphenation Hyphenation is supported through the following APIs: HyphenateProc, EM_SETHYPHENATEINFO, and EM_GETHYPHENATEINFO.
Page rotation Top-to-bottom and bottom-to-top layout is supported through EM_SETPAGEROTATE and EM_GETPAGEROTATE.
Text Services Framework support
Additional IME support
Additional EM_SETEDITSTYLE settings Besides the TSF settings, there are new settings that exclude IMEs, set bidirectional text flow, use draftmode fonts, and more.
Additional EM_SETCHARFORMAT settings New flags allow the client to set the default font and font sizes for a given LCID or charset, to set the default font for the control, to prevent keyboard switching to match the font, and more.
Restricting input to ANSI text Using TM_SINGLECODEPAGE in EM_SETTEXTMODE prevents Unicode input from entering a Rich Edit control.
Unsupported RTF keyword notification EN_LOWFIRTF warns an application when there is an unsupported RTF keyword.
Additional language support Additional languages include Armenian, Divehi, Telugu, and others.
Improved table support Features include: wrapping within cells, improved handling via RTF, and improved navigation.
ES_VERTICAL The ES_VERTICAL windows style is supported.
WM_UNICHAR Notification support To send or post Unicode characters to ANSI windows, use WM_UNICHAR Notification. It is equivalent to WM_CHAR, but it uses (UTF)-32.
Tags What's this?: Add a tag

'Projects > CoVNC' 카테고리의 다른 글

Msftedit.dll과 CF_RTF  (0) 2007.07.24
다중포멧 클립보드를 위한 글들...  (0) 2007.07.23
RTF를 사용하기 위하여  (0) 2007.07.23
소스코드 검색 사이트  (0) 2007.06.09
겨우 찾아낸 제대로 된 XML 파싱  (3) 2007.06.01
BSTR  (0) 2007.05.31

하룻동안 soulfree.net 서버가 쉽니다

Projects/Server 2007.06.30 00:37 Posted by soulfree >동네청년<

soulfree.net 서버는
저희 연구실에서 제게 떨어진 연구용 PC에 설치되어
제게 떨어진 연구실 IP 두개중 하나로 돌아가고 있습니다.
따라서 저희 학교의 전력상황이나 인터넷 상황에 영향아래 있습니다...

7월 1일 일요일에 학교의 전력을 일시 중단한다고 합니다.
그래서 soulfree.net이 7월1일 일요일 하룻동안 쉬어야 할 듯 합니다.

혹시나 즐겨 찾으시던 분들이나, 7월 1일에 검색 결과로 제 블로그를 방문하셨던 분들께서
짜증 나시질 않길 바랍니다...

7월 2일엔 예비군 훈련이 있어서 훈련 다녀와서나 서버를 온전하게 다시 실행할 거 같군요.
살아 돌아오겠습니다 ㅋ;;

ftp는 보통 명령 전송용 포트와 메시지 전송용 포트인 20, 21 을 사용해서 ftp 서비스를 하게 됩니다.
그런데 실제 클라이언트가 서버와 컨넥션이 설정되면
클라이언트가 서버에게, 전송에 사용할 1023 이상의 임의의 포트를 지정하게 됩니다.
따라서, 클라이언트가 공유기, NAT등의 방화벽 하위에 위치한 ftp 서버에 접속하여 파일을 전송 받기 위해서는
서버에서 1023이상의 포트를 열어주어야하는 문제가 발생하고,
보안상으로나, 열어주는 과정이 귀찮아 질 수 있습니다.

이런 점을 해결하기 위해 고안된 것이 passive 모드 ftp입니다.
이것은 클라이언트가 통신에 사용할 포트를 선택하는 것이 아니라,
서버가 클라이언트에게 통신에 사용할 포트를 지정하도록 하는 것입니다.

여러 문서를 검색해 본 결과,
익스플로러에서 passive 모드로 ftp에 접속할 수 없다는 글을 자주 보아서 안되는 것으로 알고 있었는데
익스플로러도 지원하고 있습니다.
passive모드로 접속하는 방법은
도구 > 인터넷 옵션 > 고급 > 탐색 +
                                               |
                                               +--방화벽 및 DSL 모뎀과 호환되는 수동 FTP 사용
에 체크를 해주는 것입니다.

액세스 권한이 없다, 제한 시간이 초과되었다는 메시지를 보시며 접속이 안되시는 분은
위의 옵션을 체크 여부를 확인 해보시는 것도 좋을 거 같습니다.