a oe_@szddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZddlmZmZddlmZmZddlmZdZerddlZdZdd ZiZd d ZGd d d ZGdddeZGdddeZGdddeZ GdddeZ!GdddeZ"GdddZ#GdddZ$ddZ%ddZ&e'd krvdd!l(m)Z)e)j*e"ee%e&d"dS)#N) scintillacon) COMException)NewEnumwrap)shellshellcon)IIDToInterfaceNameTcCs^t}|ddtj|}|\}}}|}t|dkrV|d}||gdtj }q,||fS)Nr) rZSHGetDesktopFolderParseDisplayNameospathabspathlenpop BindToObjectIID_IShellFolder)filenameZdesktopinfoZcchEatenpidlattrfolderthisrKC:\Program Files\Certbot\pkgs\win32comext\shell\demos\servers\shell_view.pyGetFolderAndPIDLForPathPs   rcCsZz t|}WnHtyTtj|\}}tj|\}}t||g}|t|<Yn0|SN) clbr_modulesKeyErrorr r splitsplitextpyclbrZ readmodule_ex)r objectsdirrbaseextrrrget_clbr_for_filebs  r%c@sReZdZejejejejgZ e j e j e j ZddZddZddZddZd S) ShellFolderBasecCsdSNrr)selfmaskrrrGetFrameOptionsszShellFolderBase.GetFrameOptionscCstd|dS)Nr print)r(hwndZreservedZ displayNamerrrrr sz ShellFolderBase.ParseDisplayNamecCstd|t|dS)NZBTS)r,r)r(rbciidrrr BindToStorageszShellFolderBase.BindToStoragec Csl|d}|dd\}}|dkr&t}n,|dkr4t}n|dkrBt}ntdt|t|||tdkd }|S) Nr directoryfileobjectzWhat is r useDispatcher)rShellFolderDirectoryShellFolderFileShellFolderObject RuntimeErrorreprrdebug) r(rr.r/ final_pidltypZextraklassretrrrrszShellFolderBase.BindToObjectN)__name__ __module__ __qualname__rZIID_IBrowserFrameOptions pythoncomZ IID_IPersistZIID_IPersistFolderr_com_interfaces_rZIBrowserFrame_MethodsZIPersistFolder_MethodsZIShellFolder_Methods_public_methods_r*r r0rrrrrr&ssr&c@s4eZdZddZddZddZddZd d Zd S) ShellFolderFileSystemcCs|dd\}}t|S)Nrr2)rr)r(Zmy_idlr?namerrr_GetFolderAndPIDLForPIDLsz.ShellFolderFileSystem._GetFolderAndPIDLForPIDLcCs||kr dS||krdSdS)Nr1rr r)r(ZparamZid1Zid2rrr CompareIDss z ShellFolderFileSystem.CompareIDsc Cst|dksJd|d}||\}}z|||g|||\}}Wn2tjyx} zt| jdWYd} ~ n d} ~ 00||fS)Nr z%oops - arent expecting more than one!rhresult)rrJ GetUIObjectOfrE com_errorrrM) r( hwndOwnerpidlsr/inoutrr child_pidlrAexcrrrrNs"z#ShellFolderFileSystem.GetUIObjectOfcCs||\}}|||}|Sr)rJGetDisplayNameOf)r(rflagsrrSrArrrrUs z&ShellFolderFileSystem.GetDisplayNameOfcCsrd}|D]d}|d}|d\}}tj}t|d|\}} | \} } } }} tjtjBtjBtjB}|| |BM}q|S)Nr1rr2) rrZSHGFI_ATTRIBUTESrZ SHGetFileInfoSFGAO_HASSUBFOLDER SFGAO_FOLDERSFGAO_FILESYSANCESTORSFGAO_BROWSABLE)r(rQ attrFlags ret_flagsrr?rIrVrcrZhIconZiIconZdwAttrZtypeNameextrasrrrGetAttributesOfs"z%ShellFolderFileSystem.GetAttributesOfN)rBrCrDrJrKrNrUr_rrrrrHs  rHc@s4eZdZddZddZddZddZd d Zd S) r8cCstj||_dSrr r r r(r rrr__init__szShellFolderDirectory.__init__cCst|j\}}|||Sr)rr CreateViewObject)r(r-r/rrSrrrrcsz%ShellFolderDirectory.CreateViewObjectc Csg}t|jD]l}tj|j|}tj|r:d}t}n&tj|\}} | dvr\t}d}nd}|dur||d|gqt |t j t dkdS)Nr3)z.pyz.pywr4r2rr/r7) r listdirr joinisdirr8rr9appendrrIID_IEnumIDListr=) r(rPrVrQfnameZfqn type_nameZ type_classr#r$rrr EnumObjectss z ShellFolderDirectory.EnumObjectscCs&|d}|dd}tj|dSNr1r2)rr r )r(rrVr>Z full_fnamerrrrUsz%ShellFolderDirectory.GetDisplayNameOfcCstjtjBtjBtjBSr)rrWrXrYrZ)r(rQr[rrrr_sz$ShellFolderDirectory.GetAttributesOfNrBrCrDrbrcrlrUr_rrrrr8s r8c@s4eZdZddZddZddZddZd d Zd S) r9cCstj||_dSrr`rarrrrbszShellFolderFile.__init__cCsNt|j}g}|D]"\}}|d|jd|gqt|tjtdkdS)Nobjectr2rrd)r%r itemsrhrrrir=)r(rPrVr!rQrIobrrrrls  zShellFolderFile.EnumObjectsc Cs|d}|D]n}t|dks Jd|d}|d\}}}t|}||} tjtjBtjB} t| drn| tjO} || M}q|S)Nr1r Expecting relative pidlsrr2methods) rrr%rrZrXrYhasattrrW) r(rQr[r\rr?robnameZobsrqrVrrrr_ s"   zShellFolderFile.GetAttributesOfcCsXt|dksJd|dd\}}}tj|dd|}|tj@rP|}n|}|SNr zExpecting relative PIDLrr2.rrr r rrZSHGDN_INFOLDER)r(rrVr?rjrufqnamerArrrrUs z ShellFolderFile.GetDisplayNameOfcCstt||j|tdkdSNrr6)rScintillaShellViewr r=r(r-r/rrrrc(sz ShellFolderFile.CreateViewObjectN)rBrCrDrbrlr_rUrcrrrrr9s  r9c@s4eZdZddZddZddZddZd d Zd S) r:cCsB|d\|_}|ddkr2|d\|_|_n ||_d|_dS)Nr2rwr)rr find class_name method_name)r(detailsrrrrb.s zShellFolderObject.__init__cCsRt|j}||j}|jdur&|j}n(|j|j}tt||j||tdkdSdSrz) r%r r~rlinenorsrr{r=)r(r-r/ mod_objectsr5rrrrrc6s     z"ShellFolderObject.CreateViewObjectc Csz|jdusJdt|j}||j}g}|jD]0\}}d|jd|jd|g}||q4t|tj t dkdS)NzShould not be enuming methods!ror2rwrrd) rr%r r~rsrprhrrrir=) r(rPrVrZ my_objectsrQZ func_namerrrrrrlCs   zShellFolderObject.EnumObjectsc Csft|dksJd|dd\}}}|d\}}tj|dd|}|tj@r^|} n|} | Srvrx) r(rrVr?rjrur~rryrArrrrUMs z"ShellFolderObject.GetDisplayNameOfcCs@d}|D]2}t|dks JdtjtjBtjB}||M}q|S)Nr1r rr)rrrZrXrY)r(rQr[r\rrVrrrr_Ys z!ShellFolderObject.GetAttributesOfNrnrrrrr:-s    r:c@s@eZdZdZdZdZddZddZdd Zd d Z d d Z dS)ShellFolderRootzPython.ShellExtension.FolderzPython Path Shell Browserz&{f6287035-3074-4cb5-a8a6-d3c80e206944}cCs|jSr) _reg_clsid_r(rrr GetClassIDnszShellFolderRoot.GetClassIDcCs ||_dSr)r)r(rrrr InitializeqszShellFolderRoot.InitializecCstt|||tdkdSrz)rFileSystemViewr=r|rrrrcxsz ShellFolderRoot.CreateViewObjectcCs$ddtjD}t|tjtdkdS)NcSs"g|]}tj|rd|gqS)z directory)r r rg).0prrr |z/ShellFolderRoot.EnumObjects..rrd)sysr rrrir=)r(rPrVrprrrrl{szShellFolderRoot.EnumObjectscCs|d}|dd}|Srm)r)r(rrVr>Z display_namerrrrUsz ShellFolderRoot.GetDisplayNameOfN) rBrCrDZ _reg_progid_ _reg_desc_rrrrcrlrUrrrrrisrc@seZdZejZejej gZ ddZ ddZ ddZ ddZd d Zd d Zd dZddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd)d*Zd+S),rcCs4||_d|_d|_d|_d|_d|_||_d|_dSr) hwnd_parentr- hwnd_childactivate_statehmenubrowserrchildren)r(rr-rrrrbszFileSystemView.__init__cCs|jSrr-rrrr GetWindowszFileSystemView.GetWindowcCsttjddSNrLrwinerrorZ E_NOTIMPL)r(Z enter_moderrrContextSensitiveHelpsz#FileSystemView.ContextSensitiveHelpcCstd||||||_||_|||||||t|jtj ddd}t |t j }||kshJ||ks|JdS)NFileSystemView.CreateViewWindowr)r,cur_foldersettingsr_CreateMainWindow_CreateChildWindowwin32gui SendMessagerwin32conZWM_USERrEZObjectFromAddressrZIID_IShellBrowserZQueryActiveShellView)r(prevsettingsrrectZ browser_adZ browser_obrrrCreateViewWindows  rc CstjtjB}d}t}tj|_||_tjtj B|_ zt |Wn6tj yx}z|dt jkrdWYd}~n d}~00tj|jtj|jtj|jtj|jtj|ji} t|d||d|d|d|d|d|d|jdtjd |_t|jtj| td|j|jS)NZShellViewDemo_DefViewrr zView 's hwnd is)rWS_CHILD WS_VISIBLErZWNDCLASS dllhandleZ hInstanceZ lpszClassNameZ CS_VREDRAWZ CS_HREDRAWstyleZ RegisterClasserrorrZERROR_CLASS_ALREADY_EXISTSZ WM_DESTROY OnDestroyZ WM_COMMAND OnCommandZ WM_NOTIFYOnNotifyZWM_CONTEXTMENU OnContextMenuWM_SIZEOnSize CreateWindowrr-Z SetWindowLongZ GWL_WNDPROCr,) r(rrrrrZ wclass_nameZwcr message_maprrrrsB   z FileSystemView._CreateMainWindowc Cs|jdusJd|jdus$JdtjtjBtjBtjBtjB}|j\}}|t j krh|tj tj BO}nj|t j kr|tjtj BO}nN|t jkr|tjtj BO}n2|t jkr|tjtj BO}nt j}|tjtj BO}t jtjft jtjft jtjffD]\}}||@r||O}qttjdd|dddd|jddd |_t|j}t|jdd|d|d|d|dd tj tj!dd d d \}} t"|jtj#d|tj tj$dd dd \}} t"|jtj#d||%dS)Nzalready have a windowz no settingsZ SysListView32rrrr TNamei,)ZfmtsubItemtextZcxZExists2)&rrrrrZ WS_BORDERcommctrlZLVS_SHAREIMAGELISTSZLVS_EDITLABELSrZFVM_ICONZLVS_ICONZLVS_AUTOARRANGEZ FVM_SMALLICONZ LVS_SMALLICONZFVM_LISTZLVS_LISTZ FVM_DETAILSZ LVS_REPORTZ FWF_SINGLESELZ LVS_SINGLESELZ FWF_ALIGNLEFTZ LVS_ALIGNLEFTZFWF_SHOWSELALWAYSZLVS_SHOWSELALWAYSrZCreateWindowExZWS_EX_CLIENTEDGEr-Z GetClientRect MoveWindowwin32gui_structZ PackLVCOLUMNZ LVCFMT_LEFTrZLVM_INSERTCOLUMNZ LVCFMT_RIGHTRefresh) r(rrZ view_modeZ view_flagsf_flagZl_flagZcrZlvcr^rrrrsl          .  z!FileSystemView._CreateChildWindowcCs|jSr)rrrrrGetCurrentInfo!szFileSystemView.GetCurrentInfocCs tddSNZ OnActivater+r(rrrr UIActivate$szFileSystemView.UIActivatecCsx|j|krdS||tjkrn|jdus2Jdt|_d}|j|j|| ||j |jd|j ||_dS)NzShould have destroyed it!)rrrrrrr) r _OnDeactivaterSVUIA_DEACTIVATErr CreateMenurZ InsertMenusSB _MergeMenus SetMenuSBr-)r(rZwidthsrrr _OnActivate's    zFileSystemView._OnActivatecCsV|jdurD|jdurD|jddd|j|jt|jd|_d|_tj|_ dSr') rrrZ RemoveMenusSBr DestroyMenuZ hsubmenusrrrrrrrr6s zFileSystemView._OnDeactivatecCsP|tjk}tj}ttj\}}t|j |d|t |}|d}t ddS)NFrzDo someting with the file menu!) rSVUIA_ACTIVATE_FOCUSZFCIDM_MENU_FILErZEmptyMENUITEMINFOrZ MIIM_SUBMENUrZGetMenuItemInforZUnpackMENUITEMINFOr,)r(rZhave_selZmidbufr^dataZsubmenurrrr?s  zFileSystemView._MergeMenusc CstjtjB}d}g|_|j|jdD]}|j|q&t|jD]\}}t |dks^Jd|d d\}}t j |rdpd}||f} tj|d| d||d\}} t|jtj||d} | ddD]4} tj|| | d\}} t|jtjd|| d7} qqBdS) Nrr zexpecting just a child PIDLr2ZYesZNo)itemrrstate stateMask)rrr)rZ LVIS_SELECTEDZLVIS_DROPHILITEDrrrlr-rh enumeraterrr r existsrZ PackLVITEMrrrZLVM_INSERTITEMZ LVM_SETITEM) r(rrZcidZ row_indexrr?r ZdescZ prop_valsr^Z col_indexZprop_valrrrrMs6    zFileSystemView.RefreshcCstd|dS)Nz$Please implement SelectItem for PIDLr+)r(rflagrrr SelectItemoszFileSystemView.SelectItemcCsttjddSrr)r(Zitem_numr/rrr GetItemObjectuszFileSystemView.GetItemObjectcCstjSrrZS_FALSEr(msgrrrTranslateAcceleratorxsz#FileSystemView.TranslateAcceleratorcCst|jd|_tddS)NzDestroyed view windowrZ DestroyWindowr-r,rrrrDestroyViewWindow{s z FileSystemView.DestroyViewWindowcCs tddS)NZ OnDestoryr+r(r-rwparamlparamrrrrszFileSystemView.OnDestroycCs tddS)Nrr+rrrrrszFileSystemView.OnCommandc CsNt|\}}}|tjkr@|jdur0|jd|tjn |tj krT| n|tj krJg}d} t |jtj| tj} | dkrq||j| ddqhtd|t } z|j|j|tjd\} } tj} z|jtj| tjO} WntjyYn0tj |jt!j"dd|dd}td|Wt #| n t #| 0dS)Nr1z Selection isrrZexplore)r-ZnShowZlpClassZlpVerbZlpIDListzShellExecuteEx returned)$rZUnpackWMNOTIFYrZ NM_SETFOCUSrZOnViewWindowActiverrrZ NM_KILLFOCUSrZ NM_DBLCLKrrrLVM_GETNEXTITEM LVNI_SELECTEDrhrr,rrrNrrIID_IContextMenuZCMF_DEFAULTONLYGetControlWindowFCW_TREE CMF_EXPLORErErOZShellExecuteExrZ SW_NORMALr)r(r-rrrZhwndFromZidFromcodeselnrrRcmrVrvrrrrsJ          zFileSystemView.OnNotifyc CsRg}d}t|jtj|tj}|dkr(qB||j|ddqt }|sZt ddS|j |j |tjd\}} t} d} zd} z|jtj| tjO} WntjyYn0d} | | d| d| tjtjBtjB}t| ||d|dd|jd} t d| Wt| n t| 0| rNd|j | | dddddf}| |dS)Nr1zIgnoring background clickrr zTrackPopupMenu returned)!rrrrrrrhrwin32apiZ GetCursorPosr,rrNrrrZCreatePopupMenurrrrrrErOZQueryContextMenurZ TPM_LEFTALIGNZ TPM_RETURNCMDZTPM_RIGHTBUTTONZTrackPopupMenur-rZ InvokeCommand)r(r-rrrrQrZsptrRrrrrVZ id_cmd_firstZ tpm_flagsZcirrrrsP  zFileSystemView.OnContextMenucCs8|jdur4t|}t|}t|jdd||ddSNrF)rrLOWORDHIWORDrrr(r-rrrxyrrrrs   zFileSystemView.OnSizeN) rBrCrDrIShellView_MethodsrGrEIID_IOleWindowrIID_IShellViewrFrbrrrrrrrrrrrrrrrrrrrrrrrrrs2 *B "W0rc@sjeZdZejZejej gZ dddZ dddZ ddZ d d Zd d Zd dZddZddZddZdS)r{NcCs||_||_||_d|_dSr)rrrr-)r(r-rrrrrrbszScintillaShellView.__init__rcCst|j|||Sr)rrr-)r(rrrrrr_SendSci%szScintillaShellView._SendScic CsPtd||||ztdWnltjytjD]H}tj|d}tj|sbtj|dd}tj|r4t |qq4t dYn0t j t j Bt jBt jBt jB}tdd||d|d|d|d|d |d|jd dd |_t j|ji}t|jd } ||tjt| | |jdkr@|tj |jtd |jdS) N#ScintillaShellView.CreateViewWindowz Scintilla.dllZBuildzCan't find scintilla!Z Scintillarr rrrUzScintilla's hwnd is)!r,rZGetModuleHandlerrr r rfisfileZ LoadLibraryr;rrZ WS_VSCROLLZ WS_HSCROLLZWS_CLIPCHILDRENrrrrr-rrr4rread _SetupLexerrrZ SCI_ADDTEXTrrZ SCI_GOTOLINE) r(rrrrrrjrrZ file_datarrrr)sV     rcCs|j}ddtjfddtjfddtjfddtjfddtjfddtjfddtjfddtj fddtj fddtj fd dtj fd dtj fddtjfddtjfg}|tjtjd |tjd d }|D]\}}}|tj||d|tj||d|dd@r|tj|dn|tj|d |dd@r@|tj|dn|tj|d |tj|t|dd|dur|tj|||tj|dqdS)N)rrr退)rrrri)rrrrr)rrrr)rrrr退)rrrrrr)rr rri)rr rri)rr rrrr)irrrrr1z Courier Newrr r)r-rZ SCE_P_DEFAULTZSCE_P_COMMENTLINEZSCE_P_COMMENTBLOCKZ SCE_P_NUMBERZ SCE_P_STRINGZSCE_P_CHARACTERZ SCE_P_TRIPLEZSCE_P_TRIPLEDOUBLEZSCE_P_STRINGEOLZ SCE_P_WORDZSCE_P_CLASSNAMEZ SCE_P_DEFNAMEZSCE_P_OPERATORZSCE_P_IDENTIFIERrZ SCI_SETLEXERZ SCLEX_PYTHONZSCI_SETSTYLEBITSZSCI_STYLESETFOREZSCI_STYLESETFONTZSCI_STYLESETBOLDZSCI_STYLESETITALICZSCI_STYLESETSIZEintZSCI_STYLESETBACKZSCI_STYLESETEOLFILLED)r(hZstylesZ baseFormatfbgZstylenumrrrr\sH               zScintillaShellView._SetupLexercCs|jSrrrrrrrszScintillaShellView.GetWindowcCs tddSrr+rrrrrszScintillaShellView.UIActivatecCst|jd|_tddS)NzDestroyed scintilla windowrrrrrrs z$ScintillaShellView.DestroyViewWindowcCstjSrrrrrrrsz'ScintillaShellView.TranslateAcceleratorcCs.t|}t|}t|jdd||ddSr)rrrrrr-rrrrrs  zScintillaShellView.OnSize)N)rr)rBrCrDrrrGrErrrrFrbrrrrrrrrrrrrr{s  3*r{cCsddl}||jdtj}||dd|jtj||jdtjd}t j t j Bt j B}ddl }|d|}||dd|j|ttjddS)NrESOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Desktop\Namespace\zCLSID\z \ShellFolderiZ Attributeszregistration complete.)winreg CreateKeyHKEY_LOCAL_MACHINErr SetValueExREG_SZrHKEY_CLASSES_ROOTrrXrWrZstructpack REG_BINARYr,)r keyrrsrrrDllRegisterServers$  rc Cslddl}z||jdtj}Wn:tyZ}z"ddl}|j|jkrFWYd}~n d}~00ttj ddS)Nrrzunregistration complete.) r  DeleteKeyr rr WindowsErrorerrnoENOENTr,r)r rrrrrrDllUnregisterServers r__main__)register)r=Zfinalize_registerZfinalize_unregister)+_threadr r rrrErrrrrZpywin.scintillarZwin32com.server.exceptionrZwin32com.server.utilrrZwin32com.shellrrZ win32com.utilrr=Zwin32traceutilZcom_auto_reloadrrr%r&rHr8r9r:rrr{rrrBZwin32com.serverrZUseCommandLinerrrr1sX   02+-<"