??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲视频无码高清在线,精品国产香蕉伊思人在线在线亚洲一区二区 ,午夜亚洲国产成人不卡在线http://www.tkk7.com/charles/以JEEZ攻,以Flex为点~Q以Eclipse RCPZ?lt;br/> 误?lt;a >http://www.inframesh.org</a>zh-cnSun, 11 May 2025 13:59:30 GMTSun, 11 May 2025 13:59:30 GMT60Flexlg生命周期http://www.tkk7.com/charles/archive/2009/07/05/285578.htmlsuprasoft Inc,.suprasoft Inc,.Sun, 05 Jul 2009 11:28:00 GMThttp://www.tkk7.com/charles/archive/2009/07/05/285578.htmlhttp://www.tkk7.com/charles/comments/285578.htmlhttp://www.tkk7.com/charles/archive/2009/07/05/285578.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/285578.htmlhttp://www.tkk7.com/charles/services/trackbacks/285578.htmlFlexlg生命周期大概可以分ؓ3步:
1. Intiliazition
  • Construction
  • Construction是组件构造阶D,lg的构造器不能有必ȝ参数。在构造函C可以d事g监听器,初始化属性。这个阶D只做很的事情?

  • Configuration
  • Configuration是组件的配置阶段Q组件的属性,事g回调函数Q样式和效果定义都在q个阶段完成。你不应该把q些d推迟到Attachment和Initlization阶段之后?

  • Attachment
  • Attachment阶段是把该组件追加到昄列表当中Q一个Flexlg会被一个Flex容器IContianer以addChildҎd到显C列表当中?

  • Initlization
  • 在Initlization初始化阶D,lg会执行一ơ完整的invalidation/validation周期。这个阶D做的工作流E是Q?

    • 发出preinitialize事g?
    • 执行ҎcreateChildren()
    • 发出initialize事g?
    • 行一ơ完整的invalidation/validation周期?
    • 发出creationComplete事g?
    2. Updating

    用户可能会与lg产生交互Q组件的位置大小可能改变Q样式可能被重新赋|也可能获得焦Ҏ者被用{等。这些情늚发生都用影响到组件外观的变化。所以组仉要重l自w来响应q些变化?

  • Invalidation
  • 如果一个组件的属性改变,它可能就会标记组件ؓ失效状态?

  • Validation
  • 一个组件被标记失效后,会验证是否需要更新组Ӟ如果需要会调用相关的方法来更新。组件有三个极其重要的方法来更新自己Q?

    • commitProperties()
    • measure()
    • updateDisplayList(unscaledWidth,unscaledHeight)

    除了q三个方法,q有一个重要的Ҏ是styleChanged(styleName)Q当某个样式改变ӞstyleChanged被调用,然后执行Invalidation标记lg。如果你有自定义一个组Ӟ有一些法则必要得遵守Q?

    不要在子cM昑ּ调用commitPropertiesQmeasure和updateDisplayListq三个方法,你要做的是overrideQ而不是call。如果你d了新的样式,同样是要l承styleChangedҎQ加入自q逻辑?

    3. Destruction
  • Detachment
  • 当不需要这个组件时Q把它从昄列表中移出。把lg从一个容器中Ud再添加到另一个容器中比创建新的组件有更小的开销?

  • Garbage Collection
  • 如果lg不再被引用时Q它成为符合垃圑֛收的对象了,所以垃圑֛收的W一条准则是不再有活动的引用?br>更加值得注意的是W二条准则,即不包含使用了强引用的事件监听器QDictionary和Timer?br>所以尽量用弱引用是多么重要,但是同样Q小心你的弱引用在不该回收的时刻被回收了。例如对函数中的临时变量使用弱引用,你可能得不到你想要的异步l果?/p>

    suprasoft Inc,. 2009-07-05 19:28 发表评论
    ]]>
    What Tamarin really means ?(zz)http://www.tkk7.com/charles/archive/2009/07/01/285012.htmlsuprasoft Inc,.suprasoft Inc,.Wed, 01 Jul 2009 11:41:00 GMThttp://www.tkk7.com/charles/archive/2009/07/01/285012.htmlhttp://www.tkk7.com/charles/comments/285012.htmlhttp://www.tkk7.com/charles/archive/2009/07/01/285012.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/285012.htmlhttp://www.tkk7.com/charles/services/trackbacks/285012.htmlAdobe 开?AVM2 source 加入 Tamarin 计画的新dl出来两天,在各大forum与blogs里都引v热烈讨论Q毕竟能?javascrīpt 跑的比现在快 10倍,实是g大事啊?

    但很有趣的是虽然官方已提供了详细?FAQ 回答常见的问题,但仍然有许多误解存在Q也因此我特别针对这些问题请教了 Gordon Smith (from Adobe Flex team) 两h一?email 往q后Q大概已得出最佛_的答案,下面我试者将学到的资讯整理出来?

    QActionscrīpt 3 ?Javascrīpt 2 的差?

    AS3 ?JS2 都是依@ Ecmacript 4 规格所实作出来的语aQ它们的 core language 是完全一L?

    Core language 包含: sealed classes, interfaces, namespaces, method closures, exceptions, strong typing, E4X {,所以像 Array, String, int {也都包含在内?

    但在 core language 之上Q就会依它执行的环境不同Q而加上不同的 extension?

    AS3: ?flash player 里执行,因此会加?flash所需?DOM (Document Object Model) 例如 Sprite, MovieClip, Socket{?

    JS2: ?Browser 里执行,׃加上 Browser 相关?DOM, 例如 Document, Form{?

    QTamarin 是什么?

    Tamarin 是由 AVM2 延而来Q它只负责执?Ecmacript 4 core language 的部份?

    因此 Mozilla Foundation 拿到 Tamarin engine 后,W一件要做的事就是在上面实作 Browser 相关?DOMQ例?Form 要怎么生成、Document 物g要如何存取?

    Adobe 要做的事则是在上面实?Flash 相关?DOM, 例如 Sprite 要如何画出来QVideo 要怎么串流与播放?Audio 的蝲入与音量控制{?很显然的Q这部䆾工作已经做完Q不然你手上?flash player 9 是打那儿来的Q?

    QAdobe ?Tamarin 往后的关系

    如果日后QMozilla ?developer community 针对 Tamarin 做了某些最佛_Q例如有童出现?E4X 的执行效率提高了100?例如他写了一?routine/library 可以?xml ?processing time ~短为原本的1/100)Q这些改变一旦被加入 Tamarin ?codebaseQAdobe 也就可以׃n成果?

    因此每当 Tamarin 有重大升U或改版ӞFlash Player 可能也跟者推出新版,因ؓ它内部的 core language scrīpt engine 也需要升U才能整?Tamarin 的改变?

    Q这代表 Adobe 也将 Flash Player open source了吗Q?

    不?

    Flash Player = Tamarin + Flash-specific DOM

    而这ơ开攑ևȝ只有核心?Tamarin engineQ因此跟 open source flash player 完全没关pR?

    实际上做Z?universal platformQ最好也不要有太多的 branch/forkQ所以在可见的将来也不太可能见到官方做这件事?

    Q将?Firefox 不再需?flash player 了吗Q?

    不,从上面可知,Firefox + Tamarin 只是取得了一个快速的 Ecmascrīpt 4 core language engine, 但它q没有内?flash DOMQ所以用 Flash 开发的E式(swf)q是要乖乖在 flash player 里跑?

    不然Qadobe q投入h力开?64bit ?linux playerQ难不成是做心酸的吗Q?

    QTamarin 可以用在其它地方吗?

    可以?

    ?Dreamweaver ZQ它有内?javascrīpt engineQ可以让user写一些巨集之cȝ指oQ自动化做某些事?

    目前它是?javascrīpt 1.5 语法Q底层则是内Z SpiderMonkey engineQ然后在q之上,加入?Dreamweaver 独有?DOM, 例如 MenuCommand, EditorWindowQ让user可以?js1.5 L?Dreamweaver 的某些行为?

    来QDreamweaver 可以选择改用 Tamarin 取代?SpiderMonkey 做ؓ内徏?scrīpt engine, q样user可以写 OO 式的 JS2 巨集?

    q就是一个不同的应用实例Q而实际上 Fireworks, Flash, Acrobat {也都有q样的能力,知名?Red5 目前?Rhino 来也可以考虑改用 TamarinQ毕竟有?0倍速的免钱 scrīpt engineQ何乐不为呢Q?

    QTamarin ?Flex developer 的媄?

    q部份就很有,单来_影响都是正面的,只是要把旉N来看Q正面的效应大概要一Cq后才会出现Q但最多三q?2009)后就可以看出q步下的完全正,而且可能是决定性的一步?br>以上文字来自Q?a >http://ria.richtechmedia.com/



    suprasoft Inc,. 2009-07-01 19:41 发表评论
    ]]>
    记V8与SquirrleFish/Tamarin的对比点(zz)http://www.tkk7.com/charles/archive/2009/07/01/285011.htmlsuprasoft Inc,.suprasoft Inc,.Wed, 01 Jul 2009 11:38:00 GMThttp://www.tkk7.com/charles/archive/2009/07/01/285011.htmlhttp://www.tkk7.com/charles/comments/285011.htmlhttp://www.tkk7.com/charles/archive/2009/07/01/285011.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/285011.htmlhttp://www.tkk7.com/charles/services/trackbacks/285011.html记V8与SquirrleFish/Tamarin的对比点

    刚才q是忍不住到V8的官|读了些文档Q想看看到底它的技术特Ҏ什么?
    V8官网Q?a >Google V8 JavaScript Engine
    设计概念的文档:Design Elements
    有h初试V8的经q:http://d.hatena.ne.jp/amachang/20080903/1220405193
    V8是BSD许可证的Q比较自由,方便用在各种目中?
    它是一个相当快的JavaScript实现。根据其设计概念的文档,它的高性能主要来自Q?

    • 快速的属性访?
    • 动态机器码生成
    • 高效的垃圾收?/li>
    其中前两点应该是紧密相关联的。在JavaScript引擎的实CQV8特别q别在“隐藏类”(hidden classQ的使用。Hidden class的概念可以到那篇文档ȝQ解释得比较生动。简单来_对于某个对象Q每ơ属性的数量Q或cdQ这个得回头仔细研究下)发生改变Ӟ虚拟机就会新创徏一个对应的隐藏c,记录下其中各个属性的相对偏移量,q将原本的隐藏类与新的隐藏类之间建立一个关联。当再次有同一cd的对象创建时则不会重复创建隐藏类Q而能复用前面已经出现的隐藏类?
    其它JavaScript引擎Q以及许多其它脚本语a的实玎ͼ一般用某UŞ式的兌容器来储存所有变量;通常叫字典,也会被称为映表或者关联数l,典型的实现方式是哈希表或者红黑树{。对象中的成员变量(下面称为“属性”)一般也是这样与某个对象兌在一L。访问某个对象的某个属性时需要动态查询这L兌容器Q是不可忽视的开销?
    V8则不使用兌容器来储存属性,而是采用更接q于静态编译的cȝ形式Q将对象中每个属性的相对偏移量记下来Q在生成机器码时直接把偏U量写到指o中。这P讉K某个对象的某个属性就只需要很量的指令就能完成,比v兌容器的方式高效许多?
    V8使用动态机器码生成Q先把要执行的JavaScript代码直接~译为机器码Q而不使用字节码也不通过解释的方式来执行。这样在执行一些被大量重读执行的代码时效果会特别好。与之相对,Apple Webkit的JavaScriptCore/SquirrelFish是先JavaScript~译到字节码Q然后以U解释的方式执行字节码;Mozilla/Adobe?a >Tamarin则是先将JavaScript~译到字节码Q然后以x~译QJITQ的方式执行。SquirrelFish与Tamarin的字节码设计思\又不一P前者是Z寄存器的Q而后者是Z栈的。一般认为基于寄存器形式的字节码比较快,而基于栈形式的字节码比较,M也是各有特点?
    与“隐藏类”相关的是,V8会预先猜某D代码中的对象对应的隐藏c,如果命中的话p直接用已l生成到机器码里的偏U量Q如果没有命中,则用实际的隐藏cM的信息来修改已生成的机器码。这P如果多次执行中对象的“实际类型”都与猜一P执行速度可以非常的快?
    Mozilla的新JavaScript执行引擎QTraceMonkey则通过别的方式来提高执行速度。通过记录代码执行的\径,当发现某条执行\径回C某个早先l过的节点,发C一个“trace”;然后对trace花时间做重点优化Q编译ؓ高效的机器码。与HotSpot JVM不同的是Qtrace不是以函敎ͼ或者说ҎQؓ单位的,可以在更的范围内做_的优化,减少不必要的优化开销?
    在垃圾收集器斚wQV8采用的是一个两代的分代式准垃圾收集器。相对的QJavaScriptCore的GCl承自KJSQ没记错的话是一个没有分代的准确M&S式(mark-and-sweepQ垃圾收集器QTamarin使用的则是Adobe提供?a >MMgcQ主要算法是“gq的引用计数”(DRCQDeffered Reference CountingQ,外加增量式保守M&S的垃圾收集器。这三种实现方式各有特点Q实际效果要比较h恐怕比较难。准式的垃圾收集器必须知道堆的位置和布局Q所以难以做成通用的;保守式收集器则可以做得很通用Q著名的Boehm GC是个典型的例子。但保守式收集器有潜在的内存泄漏的危险,因ؓ可能会把q不是对象指针的数据识别为指针,使本来应该已l可以释攄I间无法被释放?
    ===========================================================================
    V8中用了下列W三方库Q?

    引用

      - Jscre, located under third_party/jscre.  This code is copyrighted
        by the University of Cambridge and Apple Inc. and released under a
        2-clause BSD license.
      - Dtoa, located under third_party/dtoa.  This code is copyrighted by
        David M. Gay and released under an MIT license.
      - Strongtalk assembler, the basis of the files assembler-arm-inl.h,
        assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
        assembler-ia32.cc, assembler-ia32.h, assembler.cc and assembler.h.
        This code is copyrighted by Sun Microsystems Inc. and released
        under a 3-clause BSD license.

    Jscre我没怎么听说q,不知道跟PCREQPerl Compatible Regular ExpressionsQ的关系是怎样的。在Jscre源码的目录里看到?pcre"的字P不过详细情况q是以后再看看好了。Apple Webkit里的JavaScriptCore应该是直接用了PCRE的吧Q还是说我看漏了…?
    ===========================================================================
    今天Mozilla斚w也没忘记对Chrome/V8的发布作出反应。Brendan EichQJavaScript的创始者,在其blog上发表了一相兌论:
    Brendan Eich: TraceMonkey Update

    Brendan Eich 写道

    Q向叛_的是TraceMonkey比较快,向左多的是V8比较快)
    可以看到在Brendan做的SunSpider试中,TraceMonkey在递归密集的程序中速度会比V8慢许多,而在正则表达式等斚w则比V8快。据BrendanUͼTraceMonkey的开发时间还不长Q递归斚w的traceq没多少q度Q所以在q部分是比较慢的。但下一步将会解册个问题?

    suprasoft Inc,. 2009-07-01 19:38 发表评论
    ]]>
    DB2 递归查询http://www.tkk7.com/charles/archive/2009/06/25/284074.htmlsuprasoft Inc,.suprasoft Inc,.Thu, 25 Jun 2009 02:45:00 GMThttp://www.tkk7.com/charles/archive/2009/06/25/284074.htmlhttp://www.tkk7.com/charles/comments/284074.htmlhttp://www.tkk7.com/charles/archive/2009/06/25/284074.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/284074.htmlhttp://www.tkk7.com/charles/services/trackbacks/284074.html
    CREATE
        TABLE FAMILY
        (
            PERSON_ID INTEGER,
            NAME VARCHAR(50),
            AGE INTEGER,
            GENDER CHARACTER(1),
            PARENT_ID INTEGER
        )

     

    insert into FAMILY (PERSON_ID, NAME, AGE, GENDER, PARENT_ID) values 
    (1, 'Apple', 10, 'F', 10),
    (2, 'Zoe', 11, 'F', 3),
    (3, 'John', 30, 'M', 13),
    (4, 'Mary', 25, 'F', 24),
    (5, 'Peter', 14, 'M', 4),
    (6, 'Jenny', 13, 'F', 4),
    (24, 'Robert', 60, 'M', 30);

    查询Jenny的祖?/p>

    WITH temptab (person_id, name, parent_id, LEVEL) AS          
         (SELECT person_id, name, parent_id, 0               
            FROM FAMILY
           WHERE name = 'Jenny'
     
          UNION ALL                                      
     
          SELECT SUPER.person_id, SUPER.name, SUPER.parent_id, CHILD.LEVEL+1         
            FROM FAMILY SUPER, temptab CHILD
           WHERE SUPER.person_id = CHILD.parent_id
     
    ) SELECT * FROM temptab                               

    查询Robert的子?/p>

    WITH temptab (person_id, name, parent_id, level) AS          
         (SELECT person_id, name, parent_id, 0               
            FROM FAMILY
           WHERE name = 'Robert'
     
          UNION ALL                                      
     
          SELECT CHILD.person_id, CHILD.name, CHILD.parent_id, SUPER.LEVEL+1         
            FROM FAMILY CHILD, temptab SUPER
           WHERE SUPER.person_id = CHILD.parent_id AND level < 2
     
    ) SELECT * FROM temptab WHERE LEVEL<>0


    suprasoft Inc,. 2009-06-25 10:45 发表评论
    ]]>
    IPMSG协议http://www.tkk7.com/charles/archive/2009/05/07/269350.htmlsuprasoft Inc,.suprasoft Inc,.Thu, 07 May 2009 02:30:00 GMThttp://www.tkk7.com/charles/archive/2009/05/07/269350.htmlhttp://www.tkk7.com/charles/comments/269350.htmlhttp://www.tkk7.com/charles/archive/2009/05/07/269350.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/269350.htmlhttp://www.tkk7.com/charles/services/trackbacks/269350.html本文重点在于寚w鸽协议原理及部分|络知识q行普及性的介绍Q尽量避免用专业的术语吓跑非计算Z业朋友,如果有介l的不合理的地方Q也Ƣ迎高手出来拍砖?br>飞鸽概述
    飞鹆传书作ؓ免费的开源YӞ在全世界各国享有声誉Q其原作者是H.ShirouzuQ其windowsq_的C++源码下蝲地址?a >http://www.azhi.net/IPMsg/ipmsg206src.zip。除windowsq_的实C外,q存在大量其它^台的飞鸽实现Q如MacQLinuxQ甚臌存在q_无关的Java版本?br>本h开发的飞鸽传书Q实际上是在M8q_上实C该协议子集。从而能够实现局域网内用户发玎ͼ接收PC版飞鸽传入的消息、文件、文件夹?br>本h实现的飞鸽,可参考如下两个帖子:
    1 http://bbs.meizu.com/thread-791903-1-1.html
    2 http://bbs.meizu.com/thread-814371-1-1.html
    飞鸽能够实现q种异构q_之间的通信Q在于它的源码和协议是开攄Q只要遵守相应的传输协议Q就可以实现通信?br>q里要强调一个概念,|络传输cd用程序,协议是重中之重。那么,协议到底是什么呢Q协议可以让q行于两个不同^台的E序之间做到“心有灵犀一炚w”,也有点像黑帮内部的切口:A说了天王盖地虎,Bp说宝塔镇荷妖?br>有点扯远了,计算机网l应用中的协议,是要解决一些很实际的问题,比如Q以飞鸽ZQ计机A向计机B可以发消息,也可以传文g。都是通过|络传递数据,B如何能知道,q些数据中什么是消息Q什么是文g呢?q就需要设计通信协议Q通过一些命令字描述当前或即传送的数据是什么内宏V从而得接收方Q能够正理解发送方发出的内宏V?br>|络基础QTCP/IP协议?br>TCP/IP是很复杂的,要介l这个已l远q超出我的能力范_但我仍然可以对它的上层用做单的介绍?br>前面我们׃大量的篇q加口水协议在网l应用中的重要性。那所谓的飞鸽协议Q与我们qx常常听到的TCP/IP有什么区别和联系呢?q个问题问的好(我自己问的)Q?br>计算机网l的设计有着非常多的成功的可取之处,其中之一是分层。按照问题所在的领域Q将问层划分C同的层中去解冻I读者可自行参考OSI的七层模型以及TCP/IP的五层模型)。TCP/IP协议在传输层提供的UDP和TCP传输协议Q成Z我们构徏应用层YӞ如,聊天Q下载,邮gQhttp{等Q的基础?br>TCP传输协议规定了通信双方需要一个“连?接受”这Lq接认q程Q既所谓的三次握手q程。一但连接徏立成功,双方可以通过该连接,q行可靠的数据通信?br>UDP传输协议不需要双方进行连接,发送方只需要指定接收方的地址和端口,若接收方此时正在该端口等待接Ӟ那接收方有可能Q网l质量不好的话,可能会丢Q不q局域网里通常不会发生q样的情况)收到消息?br>除此之外Q还有一个重要的概念是广播,数据包发送到q播地址Q用UDP协议发送)Q则该网D늚所有用P都可以收到这条数据?br>飞鸽协议分析
    飞鸽的协议也属于应用层协议,它描qC飞鸽E序通信时的语法和语义?br>其语法定义如下(所有的命o字,都必需W合q样的格式要求)Q?br>Ver(1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection
    每部分分别对应ؓQ版本号Q现在是1Q?数据包编?发送主?命o:附加数据
    其中Q?br>数据包编P一般是取毫U数。利用这个数据,可以唯一的区别每个数据包Q?br>SenderName指的是发送者的늧Qm8飞鸽被我l一的写Mؓm8Q现在知道怎么定制了吧Q)Q?br>发送主机,指的是发送主机的L名;
    命oQ指的是飞鸽协议中定义的一pd命oQ具体见下文Q?br>附加数据Q指的是对应不同的具体命令,需要提供的数据Q具体见下文?br>上面介绍了数据包的语法,x式,q些命o都是通过UDP协议向其它主机发送的?br>接下来列出协议的命oQ包括命令字及附加选项Q?br>     1) Command functions (Low 8 bits from command number 32 bits)
            IPMSG_NOOPERATION        No Operation
            IPMSG_BR_ENTRY                Entry to service (Start-up with a Broadcast command)
            IPMSG_BR_EXIT                Exit from service (End with a Broadcast command)
            IPMSG_ANSENTRY                Notify a new entry
            IPMSG_BR_ABSENCE        Change absence mode
            IPMSG_BR_ISGETLIST        Search valid sending host members
            IPMSG_OKGETLIST                Host list sending notice
            IPMSG_GETLIST                Host list sending request
            IPMSG_ANSLIST                Host list sending
            IPMSG_SENDMSG                Message transmission
            IPMSG_RECVMSG                Message receiving check
            IPMSG_READMSG                Message open notice
            IPMSG_DELMSG                Message discarded notice
            IPMSG_ANSREADMSG        Message open confirmation notice(added from version-8)
            IPMSG_GETFILEDATA        File Transfer request by TCP
            IPMSG_RELEASEFILES        Discard attachment file
            IPMSG_GETDIRFILES        Attachment hierarchical file request
            IPMSG_GETINFO                Get IPMSG version info.
            IPMSG_SENDINFO                Send IPMSG version info.
            IPMSG_GETABSENCEINFO        Get absence sentence
            IPMSG_SENDABSENCEINFO        Send absence sentence
            IPMSG_GETPUBKEY                RSA Public Key Acquisition
            IPMSG_ANSPUBKEY                RSA Public Key Response
         2) Option flag (High 24 bits from command number 32 bits)
            IPMSG_ABSENCEOPT        Absence mode(Member recognition command)
            IPMSG_SERVEROPT                Server(Reserved)
            IPMSG_DIALUPOPT                Send individual member recognition command
            IPMSG_SENDCHECKOPT        Transmission check
            IPMSG_SECRETOPT                Sealed message
            IPMSG_READCHECKOPT        Sealed message check(added from ver8)
            IPMSG_PASSWORDOPT        Lock
            IPMSG_BROADCASTOPT        Broadcast message
            IPMSG_MULTICASTOPT        Multi-cast(Multiple casts selection)
            IPMSG_NEWMUTIOPT        New version multi-cast(reserved)
            IPMSG_AUTORETOPT        Automatic response(Ping-pong protection)
            IPMSG_NOLOGOPT                No log files
            IPMSG_NOADDLISTOPT        Notice to the members outside of BR_ENTRY
            IPMSG_FILEATTACHOPT        File attachment
            IPMSG_ENCRYPTOPT        Code
            IPMSG_NOPOPUPOPT        (No longer valid)
            IPMSG_RETRYOPT                Re-send flag(Use when acquiring HOSTLIST)
         3) Extended code flag (hex format combination)
            IPMSG_RSA_512
            IPMSG_RSA_1024
            IPMSG_RSA_2048
            IPMSG_RC2_40
            IPMSG_RC2_128
            IPMSG_RC2_256
            IPMSG_BLOWFISH_128
            IPMSG_BLOWFISH_256
            IPMSG_SIGN_MD5
         4) Extended files for attachment (fileattr low 8 bits)
            IPMSG_FILE_REGULAR
            IPMSG_FILE_DIR
            IPMSG_FILE_RETPARENT
            IPMSG_FILE_SYMLINK
            IPMSG_FILE_CDEV
            IPMSG_FILE_BDEV
            IPMSG_FILE_FIFO
            IPMSG_FILE_RESFORK
         5) Attachment file extended attribute(fileattr high 24 bits)
            IPMSG_FILE_RONLYOPT
            IPMSG_FILE_HIDDENOPT
            IPMSG_FILE_EXHIDDENOPT
            IPMSG_FILE_ARCHIVEOPT
            IPMSG_FILE_SYSTEMOPT
         6) Extended file attribute for attachment file
            IPMSG_FILE_UID
            IPMSG_FILE_USERNAME
            IPMSG_FILE_GID
            IPMSG_FILE_GROUPNAME
            IPMSG_FILE_PERM
            IPMSG_FILE_MAJORNO
            IPMSG_FILE_MINORNO
            IPMSG_FILE_CTIME
            IPMSG_FILE_MTIME
            IPMSG_FILE_ATIME
            IPMSG_FILE_CREATETIME
            IPMSG_FILE_CREATOR
            IPMSG_FILE_FILETYPE
            IPMSG_FILE_FINDERINFO
            IPMSG_FILE_ACL
            IPMSG_FILE_ALIASFNAME
            IPMSG_FILE_UNICODEFNAME
    Z上面介绍的内容,我们可以判断Q?br>1:100:shirouzu:jupiter:32:Hello 表示 shirouzu用户发送了 Hello q条消息Q?2对应为IPMSG_SEND_MSGq个命oQ具体需要看源码中的宏定义)?br>==========================================
    以下内容未完待箋Q困了,明天再写
    好,接下来我们进入具体场景的分析Q?br>d/ȝ通知
    dq程需要实现向局域网内的用户q播Q告诉他们,“我来也Q”。收到这条消息的用户则立卛_复,“知道了Q我在这里”,同时新d的用户加入到用户列表中。发送方也可Ҏ收到的回复信息,了解到当前网l中Q都有哪些已l登录了的用戗?br>具体的数据包如下Q?br>d?要发送到q播地址Q如255.255.255.255)Q?br>1:XXX:m8:<L名称>:IPMSG_BR_ENTRY:
    接收方回?发送到发送方的IP地址)Q?br>1:XXX:<接收方主机名>:IPMSG_ANSENTRY:
    相应的,用户ȝӞ应向q播地址发送,“我MQ”,收到q条消息的用P需要将发送方从自q用户列表中移除,q且不需要回复?br>具体的数据包如下Q?br>卛_ȝ用户Q?br>1:XXX:m8:<L名称>:IPMSG_BR_EXIT:
    发?接收消息
    发送消息是飞鸽协议中最重要的部分,通过和一些命令选项Q可以实现复杂的功能Q?br>最基本的情况下Q发送方通过 IPMSG_SEND_MSG 命oQ可以将消息发送到接收?br>1:12345:m8:<L名称>:IPMSG_SEND_MSG:你好Q飞?br>使用命oӞ“附加数据”开使发挥作用了它里面包含了要发送的消息?br>通常情况下,׃UDP的不可靠性,q需要ؓ IPMSG_SEND_MSG 命o讑֮ IPMSG_SENDCHECKOPT选项Q也是要求接收方回复回执信息?br>1:12345:m8:<L名称>:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT:你好Q飞?br>接收Ҏ到IPMSG_SEND_MSGӞ如果遇到IPMSG_SENDCHECKOPT选项Q就要立卛_复如下信息:
    1:XXX:<用户?gt;:<L?gt;:IPMSG_RECVMSG:12345
    IPMSG_RECVMSG命o通过附加数据D中的数据(12345Q,告诉发送方Q我收到了你的编号ؓ12345的消息包?br>除了上面介绍的IPMSG_SENDCHECKOPT选项Q飞鸽还支持加密得选项Q现有的m8版本没有实现该功能,所以暂不对q一块进行介l?br>发?接收文g
    文g的传输,要稍微复杂一些,它是通过 IPMSG_SEND_MSG 命o?IPMSG_FILEATTACHOPT选项的组合,通知接收方“现在有文g要发l你了?同时要将一些描q文件属性的数据Q如文g名、大、创建时间、类别属性如文g夹)Q发送给接收方,具体格式如下Q?br>file1ID:filename:size:mtime:fileattr[:extend-attr=val1[,val2...][:extend-attr2=...]]:\a:file2ID...
    q里需要注意的有几点,W一Q一条文件传送命令,可以携带多条文g信息Q第二,多个文g信息之前Q要用\a分割Q第三,size, mtime和fileattr 是用十六q制数描q的Q;W四Q如果文件名中包含?”,则需要将其{义ؓ?:”?br>相应的,接收Ҏ到文件传送命令后Q首先需要从文g属性的数据中解析出要接收的文g的属性。然后向发送方相同的端口进行TCPq接Q连接成功后Q通过TCP通道向发送方发送IPMSG_GETFILEDATA命o用于接收文g或发送IPMSG_GETDIRFILES命oQ用于接收文件夹。具体接收文件的命o如下Q?br>1:XXX:m8:<L?gt;:IPMSG_GETFILEDATA:packetID:fileID : offset
    q条命o通过packetIDQ让发送方明白Ҏh的文件是源于哪个命o包;通过fileId让发送方定要发哪个文g;通过offsetQ让发送方明白要从哪个字节开始发送?br>发送方的TCP通道收到上面的命令,׃发送对方请求的文gQ而接收方收到的数据保存到磁盘上卛_?/p>

    suprasoft Inc,. 2009-05-07 10:30 发表评论
    ]]>
    Annotation Processing Toolhttp://www.tkk7.com/charles/archive/2009/05/06/269149.htmlsuprasoft Inc,.suprasoft Inc,.Wed, 06 May 2009 01:08:00 GMThttp://www.tkk7.com/charles/archive/2009/05/06/269149.htmlhttp://www.tkk7.com/charles/comments/269149.htmlhttp://www.tkk7.com/charles/archive/2009/05/06/269149.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/269149.htmlhttp://www.tkk7.com/charles/services/trackbacks/269149.html

    http://www.program-transformation.org/Transform/AnnotationProcessingTool

    Annotation Processing Tool

    Program-Transformation.Org: The Program Transformation Wiki

    Annotations

    Official Documentation

    Online Articles

    Javalobby:

    Application of Annotations: EJB

    Annotation Processing

    Official Documentation

    Online Articles

    JavaLobby:

    Presentations

    JavaOne 2005:

    Blog Entries

    Discussions



    suprasoft Inc,. 2009-05-06 09:08 发表评论
    ]]>
    Eclipse 用户界面指南(cn)http://www.tkk7.com/charles/archive/2009/05/05/268991.htmlsuprasoft Inc,.suprasoft Inc,.Tue, 05 May 2009 07:20:00 GMThttp://www.tkk7.com/charles/archive/2009/05/05/268991.htmlhttp://www.tkk7.com/charles/comments/268991.htmlhttp://www.tkk7.com/charles/archive/2009/05/05/268991.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/268991.htmlhttp://www.tkk7.com/charles/services/trackbacks/268991.htmlhttp://www.eclipse.org/articles/Article-UI-Guidelines/index_cn.html



    suprasoft Inc,. 2009-05-05 15:20 发表评论
    ]]>
    Platform UI dialogs and JFace dialogs囄及用?/title><link>http://www.tkk7.com/charles/archive/2009/04/29/268256.html</link><dc:creator>suprasoft Inc,.</dc:creator><author>suprasoft Inc,.</author><pubDate>Wed, 29 Apr 2009 15:10:00 GMT</pubDate><guid>http://www.tkk7.com/charles/archive/2009/04/29/268256.html</guid><wfw:comment>http://www.tkk7.com/charles/comments/268256.html</wfw:comment><comments>http://www.tkk7.com/charles/archive/2009/04/29/268256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/charles/comments/commentRss/268256.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/charles/services/trackbacks/268256.html</trackback:ping><description><![CDATA[ <img src ="http://www.tkk7.com/charles/aggbug/268256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/charles/" target="_blank">suprasoft Inc,.</a> 2009-04-29 23:10 <a href="http://www.tkk7.com/charles/archive/2009/04/29/268256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TitleAreaDialog/TrayDialoghttp://www.tkk7.com/charles/archive/2009/04/29/268255.htmlsuprasoft Inc,.suprasoft Inc,.Wed, 29 Apr 2009 15:09:00 GMThttp://www.tkk7.com/charles/archive/2009/04/29/268255.htmlhttp://www.tkk7.com/charles/comments/268255.htmlhttp://www.tkk7.com/charles/archive/2009/04/29/268255.html#Feedback1http://www.tkk7.com/charles/comments/commentRss/268255.htmlhttp://www.tkk7.com/charles/services/trackbacks/268255.htmlDialog是SWT和JFace的一个重要的l成部分Q我们在开发Plug-in或RCP的时候也l常会用到它们。这随W不会介l?SWT的DialogQ因为我惛_多h都已l非常熟悉它了。在q里Q我要讨论的是JFace的DialogQ或者更q一步说是JFace?TitleAreaDialog。什么是TitleAreaDialog呢?x我们常常用到的New XX Wizardq道了。在我们创徏一个Java Project或Class的时候,我们所使用的Wizard其实是由TitleAreaDialog构成的。这UDialog有如下所C的 TitleArea和一个标准的Button BarQ?br />
          
                                        正常的TitleArea                                                                                                               带有错误信息的TitleArea


                                        标准的Button Bar

    q种GUI的表现力要比SWT的Dialog强很多,而且JFace Dialog装了很多东西,q也使开发工作变得更加简单,所以我极力推荐使用TitleAreaDialog。那么让我们来看一个最基本?TitleAreaDialogQ?br />
    import org.eclipse.jface.dialogs.IDialogConstants;
    import org.eclipse.jface.dialogs.TitleAreaDialog;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.graphics.Point;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Shell;
    import org.jthin.jpssp.ide.configuration.Activator;

    public class MyTitleAreaDialog extends TitleAreaDialog {

        
    /**
         * Create the dialog
         * 
         * 
    @param parentShell
         */

        
    public MyTitleAreaDialog(Shell parentShell) {
            
    super(parentShell);
        }

        
    /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.dialogs.TitleAreaDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
         */

        
    protected Control createDialogArea(Composite parent) {
            Composite area = (Composite) 
    super.createDialogArea(parent);
            Composite container = 
    new Composite(area, SWT.NONE);
            container.setLayoutData(
    new GridData(GridData.FILL_BOTH));

            
    // TitleArea中的Title
            setTitle("My TitleAreaDialog");

            
    // TitleArea中的Message
            setMessage("This is a simple TitleAreaDialog example.");

            // TitleArea中的Image
            setTitleImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/Neptune.png"));

            
    return area;
        }

        
    /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
         */

        
    protected void createButtonsForButtonBar(Composite parent) {
            createButton(parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL,
    true);
            createButton(parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, 
    false);
        }

        
    /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.dialogs.TitleAreaDialog#getInitialSize()
         */

        
    protected Point getInitialSize() {
            
    return new Point(500, 375);
        }

        
    /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
         */

        
    protected void configureShell(Shell newShell) {
            
    super.configureShell(newShell);

            
    // Dialog Title
            newShell.setText("Test TitleAreaDialog Title");

            
    // Dialog Icon
            newShell.setImage(ResourceManager.getPluginImage(Activator.getDefault(), "icons/Neptune.png"));
        }

    }

    q段代码非常Ҏ理解Q从Ҏ{֐中可以看出每个方法做了什么事情。注意createButtonsForButtonBarҎQ其中用createButtonҎ创徏了OK和Cancelq两个ButtonQƈ且把Button的默认点M件也写好了,是关闭?Dialog。ResourceManager.getPluginImage是我自己~写的获得图片的helper methodQ这里就不讨论其实现了。这D代码会产生如下的DialogQ?br />


    有趣的是Q我在这里故意用了一?28×128的大图标Q?TitleAreaDialog不会自动~小或裁减ImageQ而是调整TitleArea的大来适应Image?br />
    接下来我们要为OK Button~写我们自己的事Ӟ例如把用户在Dialog中的输入保存到某处。有人可能会惛_为OK ButtondSelectionListenerQ但实际上这样做是不对的Q因为OK Button是JFace为Dialog装好了的,同时JFace也提供了响应的callbackQ?br />
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.Dialog#okPressed()
     
    */
    protected void okPressed() {
       
    // implement your own function here
        super.okPressed();
    }

    我们可以在这里实现我们自q事gQ不q最后一定要调用super.okPressedҎQ否则Dialog׃会关闭了?

    OKQ以上就是TitleAreaDialog的基本FrameworkQ非常容易理解,下面我们来?TitleArea中动态设|一些信息。你可以把这个scenario惌成在用户输入的同时提C用戯入的合法性。TitleAreaDialog提供了好3个方法可以动态设|TitleArea信息Q具体如下:
    • public void setErrorMessage(String newErrorMessage)Q显CZ入的错误信息。(我们把用q个Ҏ讄的信息叫做error message。)当前昄的信息会被保存v来,{到error message清空之后会再ơ显C,而清Ierror message要传入nullQ而不是传入空字符丌Ӏ?br />
    • setMessage(String newMessage)Q显CZ入的信息Q等同于setMessage(String newMessage, IMessageProvider.NONE)。如果当前显C的是error messageQ那么newMessage会被保存hQ等到error message清空后再昄?br />
    • setMessage(String newMessage, int newType)Q显CZ入的信息Qƈ昄指定的信息类型。可用的cd有NONE、INFORMATION、WARNING和ERROR。需要注意的是, setMessage(String newMessage, int IMessageProvider.ERROR)和setErrorMessage(String newErrorMessage)q不相同。后者会覆盖当前的Q何信息,而前者只会覆盖当前的非error messageQ不会媄响到error messageQ也是说当error message清空后才会显C)?br />
    q样Q我们就可以Z些文本框dModifyListenerQ然后在其中讄TitleArea的信息了?br />
    接着Q再让我们来看看Button Bar。有些时候,我们希望把OK和Cancelq种默认的Button攄在Button Bar的右侧,而把其他Button攄在Button Bar的左侧,如下图中的Customize... ButtonQ?br />


    q又如何实现呢?有h可能惛_?createButtonsForButtonBarҎ中做一些手脚,但是遗憾的是q行不通,我们真正要覆写的是createButtonBarҎQ下面是一个简单的例子Q?br />
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TrayDialog#createButtonBar(org.eclipse.swt.widgets.Composite)
     
    */
    protected Control createButtonBar(Composite parent) {
        Composite composite 
    = new Composite(parent, SWT.NONE);
        GridLayout layout 
    = new GridLayout();
        layout.numColumns 
    = 0;
        layout.marginHeight 
    = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
        layout.marginWidth 
    = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
        layout.verticalSpacing 
    = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
        layout.horizontalSpacing 
    = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);

        composite.setLayout(layout);
        composite.setLayoutData(
    new GridData(GridData.FILL_HORIZONTAL));

       
    if (isHelpAvailable()) {
            createHelpControl(composite);
        }

        createButton(composite, MyConstants.IMPORT_BUTTON_ID, 
    "Import", false).addSelectionListener(new SelectionAdapter() {
           
    public void widgetSelected(SelectionEvent e) {
                MessageDialog.openInformation(MaintainModuleDialog.
    this.getShell(), "Information",
                   
    "\"Import\" button has not been implemented.");
            }
        });

        createButton(composite, MyConstants.EXPORT_BUTTON_ID, 
    "Export", false).addSelectionListener(new SelectionAdapter() {
           
    public void widgetSelected(SelectionEvent e) {
                MessageDialog.openInformation(MaintainModuleDialog.
    this.getShell(), "Information",
               
    "\"Export\" button has not been implemented.");
            }
        });

        createButton(composite, MyConstants.OTHER_BUTTON_ID, 
    "Other"false).addSelectionListener(new SelectionAdapter() {
       
        public void widgetSelected(SelectionEvent e) {
                MessageDialog.openInformation(MaintainModuleDialog.
    this.getShell(), "Information",
               
    "\"Other\" button has not been implemented.");
            }
        });

        Label filler 
    = new Label(composite, SWT.NONE);
        filler.setLayoutData(
    new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
        layout.numColumns
    ++;

       
    super.createButtonsForButtonBar(composite);

       
    return composite;
    }

    正如你所见,我们实际上创Z自己的Button BarQ然后在上面d?个ButtonQImport、Export和OtherQ最?super.createButtonsForButtonBar会创建OK和Cancel Button。filler是用来在两组Button见占位的。代码中用到的两个convertҎ来自 org.eclipse.jface.dialogs.Dialogc,你还可以在这个类中找C个getButton(int)ҎQ它可以Ҏ传入?IDq回用createButton创徏的Button。这些都是非常实用的Ҏ?br />
    回头看一下上面那个完整的 TitleAreaDialog囄Q你会看到在Dialog左下角有一个问LPq其实是一个ButtonQ点d可以昄帮助信息Q当然帮助信息是׃来创建的。让我们看看Eclipse Search的TitleAreaDialog中的帮助信息吧:



    如果我们也想实现q种帮助机制Q那么就要实现如下方法:

    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TrayDialog#createHelpControl(org.eclipse.swt.widgets.Composite)
     
    */
    protected Control createHelpControl(Composite parent) {
        // TODO Auto-generated method stub
        return super.createHelpControl(parent);
    }

    如果不想实现帮助机制Q那么最好不要在Dialog中显C出那个问号W号Q你可以覆写如下Ҏq永q返回falseQ这样就不会昄问号W号了?br />
    /*
     * (non-Javadoc)
     * 
     * @see org.eclipse.jface.dialogs.TrayDialog#isHelpAvailable()
     
    */

    public boolean isHelpAvailable() {
        return false;
    }

    那么q个酷酷的帮助机制到底是个什么东西呢Q实际上Q它的学名叫做DialogTray。TitleAreaDialogl承?
    org.eclipse.jface.dialogs.TrayDialogc,而TrayDialog可以显CU?DialogTrayQ是不是有点儿拗口呢Q实际上Q我们不仅仅可以d帮助信息q一UDialogTrayQ还可以dL的DialogTrayQ现在就让我们动手实C个最单的吧。代码很单,最主要的就是要实现一个DialogTrayQ代码如下:

    import org.eclipse.jface.dialogs.DialogTray;
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Control;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Text;

    public class MyDialogTray extends DialogTray {

        
    /*
         * (non-Javadoc)
         * 
         * @see org.eclipse.jface.dialogs.DialogTray#createContents(org.eclipse.swt.widgets.Composite)
         
    */
        
    protected Control createContents(Composite parent) {
            Composite container 
    = new Composite(parent, SWT.NONE);
            
    final GridLayout gridLayout = new GridLayout();
            gridLayout.numColumns 
    = 2;
            container.setLayout(gridLayout);

            
    final Label label = new Label(container, SWT.NONE);
            label.setText(
    "Name:");

            
    final Text text = new Text(container, SWT.BORDER);
            text.setLayoutData(
    new GridData(SWT.FILL, SWT.CENTER, truefalse));

            
    return container;
        }

    }

    我们只在其中创徏了一个Label和一个TextQ这p够了。最后,我们为MyTitleAreaDialogd两个ButtonQ用来打开和关闭MyDialogTrayQ代码如下:

    final Button openTrayButton = new Button(container, SWT.NONE);
    openTrayButton.setText(
    "Open Tray");

    final Button closeTrayButton = new Button(container, SWT.NONE);
    closeTrayButton.setText(
    "Close Tray");
    closeTrayButton.setEnabled(
    false);

    openTrayButton.addSelectionListener(
    new SelectionAdapter() {
        public void widgetSelected(final SelectionEvent e) {
            // this method is from TrayDialog
            openTray(new MyDialogTray());
            openTrayButton.setEnabled(
    false);
            closeTrayButton.setEnabled(
    true);
        }
    });

    closeTrayButton.addSelectionListener(
    new SelectionAdapter() {
       
    public void widgetSelected(final SelectionEvent e) {
           
    // this method is from TrayDialog
            closeTray();
            openTrayButton.setEnabled(
    true);
            closeTrayButton.setEnabled(
    false);
        }
    });

    最后我们会得到如下对话框:



    好了Q就讲这么多吧。如果能把这些东东适当地用在你的Application中,那么效果一定非常棒?/span>


    suprasoft Inc,. 2009-04-29 23:09 发表评论
    ]]>
    Defensive programming VS Design by contracthttp://www.tkk7.com/charles/archive/2009/04/29/268236.htmlsuprasoft Inc,.suprasoft Inc,.Wed, 29 Apr 2009 13:31:00 GMThttp://www.tkk7.com/charles/archive/2009/04/29/268236.htmlhttp://www.tkk7.com/charles/comments/268236.htmlhttp://www.tkk7.com/charles/archive/2009/04/29/268236.html#Feedback0http://www.tkk7.com/charles/comments/commentRss/268236.htmlhttp://www.tkk7.com/charles/services/trackbacks/268236.htmlArt of Defensive programming

    suprasoft Inc,. 2009-04-29 21:31 发表评论
    ]]>
    վ֩ģ壺 avƬ߹ۿ| ѻվ߿| ۺ| ѻվ߹ۿ| ĻƷ| ѳҹƵ| þֻƷ99re| Ļ| պƷһ | ҹƷ侫֮ѹۿ | 777ӰƬѹۿ| Ƶһѹۿ| ޹˾þۺһ| ҹaëƬ| Ļһ| ޹AV߲| ޹Һվw| պһ| Ʒѿþþ| Ƶ߹ۿ| ޹ۺ| ԭƵ| ձ| ˸Ƶ| ֳִˬֳƵ | ŷߴSUV| ٸ͵˾ƷƵ| ɫaAV| ޾ƷƵѿ| þþƷƷ| ɫ˿ѹۿվ| ٸ͵˾ƷƵ| ˾޾ƷӰԺ߹ۿ| Ļ޾Ʒ| ޾Ʒþþþ66| jizzjizzƵȫ| 97Ƶ˾Ʒ| ¸Ļ| ԲƵ| Ů߾Ʒ| 99͵ͼ|