"""

    Demo a DynamicPolicy használatára

    Attrs példányainak nincs metódusa, de tetszőleges számú tulajdonsága lehet, melyek

    futásidőben egyszerű értékadással keletkeznek. Természetesen hiba generálódik, ha

    olyan tulajdonságra hivatkozunk akinek még nem lett érték adva. Futás közben egy már

    létező tulajdonság tipusa megváltoztatható, egyszerűen egy más tipusú értéket

    pakolunk bele(ez nem ügy hiszen a Python így működik).

"""

import pythoncom

import winerror

from win32com.server.exception import COMException

import string

class Attrs:

    """

        Demo a DynamicPolicy használatára

    """

    # szokásos regisztrációs adatok

    _reg_desc_          = 'Attrs demo class'

    _reg_clsid_         = '{CFFDFAAB-AD71-48B1-A478-695B44617AA0}'

    _reg_progid_        = 'Demo.Attrs'

    _reg_verprogid_     = 'Demo.Attrs.1'

    _reg_policy_spec_   = 'DynamicPolicy'

    # kigyűjtöttem ide azokat a regisztrációhoz és működéshez használatos elmeket,

    # akiket nem akarunk elérhetővé tenni a COM-os felületen keresztül

    _tiltott_nevek_     = ['_reg_desc_',

                           '_reg_clsid_',

                           '_reg_progid_',

                           '_reg_verprogid_',

                           '_reg_policy_spec_',

                           '_tiltott_nevek_',

                           '_dynamic_']

    def _dynamic_(self, name, lcid, wFlags, args):

        name=string.lower(name) # mindent kisbetűre konvertálok, hogy ne legyen kavar

        if name in self._tiltott_nevek_:

            raise COMException("%s használata tiltott!" % name,winerror.DISP_E_EXCEPTION)

        if wFlags & pythoncom.DISPATCH_METHOD:

            raise COMException("A metódushívás tiltott!",winerror.DISP_E_EXCEPTION)

        elif wFlags & pythoncom.DISPATCH_PROPERTYGET:

            # figyelni kell, mert lehet még nincs ilyen tulajdonság

            try:

                return getattr(self,name)

            except AttributeError:

                # DISP_E_MEMBERNOTFOUND nem jó, mert a Python kliens erre azt hiszi, hogy metódusról

                # van szó. A Python számára a metódus is csak egy attributum, ezért először

                # DISPATCH_PROPERTYGET-el próbálkozik és ha DISP_E_MEMBERNOTFOUND-ot kap vissza, akkor

                # metódusnak hiszi

                raise COMException("Nincs %s nevű tulajdonság!" % name,winerror.DISP_E_UNKNOWNNAME)

        elif wFlags & (pythoncom.DISPATCH_PROPERTYPUT | pythoncom.DISPATCH_PROPERTYPUTREF):

            # itt nem lehet hiba

            setattr(self,name,args[0])

            return

        else:

            raise COMException("invalid wFlags", winerror.E_INVALIDARG)

def Register():

    # szokásos regisztrálás, de a policy nem az alapértelmezett DesignatedWrapPolicy lesz,

    # hanem a H2O class _reg_policy_spec_ attributumában beállított DynamicPolicy

    from win32com.server.register import UseCommandLine

    return UseCommandLine(Attrs)

if __name__=='__main__':

    Register()