108 lines
4 KiB
Python
108 lines
4 KiB
Python
|
# Sample implementation of IFileOperationProgressSink that just prints
|
||
|
# some basic info
|
||
|
|
||
|
import pythoncom
|
||
|
from win32com.shell import shell, shellcon
|
||
|
from win32com.server.policy import DesignatedWrapPolicy
|
||
|
|
||
|
tsf_flags = list((k,v) for k,v in list(shellcon.__dict__.items()) if k.startswith('TSF_'))
|
||
|
def decode_flags(flags):
|
||
|
if flags == 0:
|
||
|
return 'TSF_NORMAL'
|
||
|
flag_txt = ''
|
||
|
for k,v in tsf_flags:
|
||
|
if flags & v:
|
||
|
if flag_txt:
|
||
|
flag_txt = flag_txt + '|' + k
|
||
|
else:
|
||
|
flag_txt = k
|
||
|
return flag_txt
|
||
|
|
||
|
class FileOperationProgressSink(DesignatedWrapPolicy):
|
||
|
_com_interfaces_ = [shell.IID_IFileOperationProgressSink]
|
||
|
_public_methods_ = [
|
||
|
"StartOperations", "FinishOperations", "PreRenameItem", "PostRenameItem",
|
||
|
"PreMoveItem", "PostMoveItem", "PreCopyItem", "PostCopyItem", "PreDeleteItem",
|
||
|
"PostDeleteItem", "PreNewItem", "PostNewItem", "UpdateProgress",
|
||
|
"ResetTimer", "PauseTimer", "ResumeTimer"
|
||
|
]
|
||
|
|
||
|
def __init__(self):
|
||
|
self._wrap_(self)
|
||
|
|
||
|
def StartOperations(self):
|
||
|
print ('StartOperations')
|
||
|
|
||
|
def FinishOperations(self, Result):
|
||
|
print(('FinishOperations: HRESULT ', Result))
|
||
|
|
||
|
def PreRenameItem(self, Flags, Item, NewName):
|
||
|
print(('PreRenameItem: Renaming ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + \
|
||
|
' to ' + NewName))
|
||
|
|
||
|
def PostRenameItem(self, Flags, Item, NewName, hrRename, NewlyCreated):
|
||
|
if NewlyCreated is not None:
|
||
|
newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING)
|
||
|
else:
|
||
|
newfile = 'not renamed, HRESULT ' + str(hrRename)
|
||
|
print(('PostRenameItem: renamed ' + \
|
||
|
Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile))
|
||
|
|
||
|
def PreMoveItem(self, Flags, Item, DestinationFolder, NewName):
|
||
|
print(('PreMoveItem: Moving ' + \
|
||
|
Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \
|
||
|
DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + str(NewName)))
|
||
|
|
||
|
def PostMoveItem(self, Flags, Item, DestinationFolder, NewName, hrMove, NewlyCreated):
|
||
|
if NewlyCreated is not None:
|
||
|
newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING)
|
||
|
else:
|
||
|
newfile = 'not copied, HRESULT ' + str(hrMove)
|
||
|
print(('PostMoveItem: Moved ' + \
|
||
|
Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile))
|
||
|
|
||
|
def PreCopyItem(self, Flags, Item, DestinationFolder, NewName):
|
||
|
if not NewName:
|
||
|
NewName = ''
|
||
|
print(('PreCopyItem: Copying ' + \
|
||
|
Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + \
|
||
|
DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName))
|
||
|
print(('Flags: ', decode_flags(Flags)))
|
||
|
|
||
|
def PostCopyItem(self, Flags, Item, DestinationFolder, NewName, hrCopy, NewlyCreated):
|
||
|
if NewlyCreated is not None:
|
||
|
newfile = NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING)
|
||
|
else:
|
||
|
newfile = 'not copied, HRESULT ' + str(hrCopy)
|
||
|
print(('PostCopyItem: Copied ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING) + ' to ' + newfile))
|
||
|
print(('Flags: ', decode_flags(Flags)))
|
||
|
|
||
|
def PreDeleteItem(self, Flags, Item):
|
||
|
print(('PreDeleteItem: Deleting ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING)))
|
||
|
|
||
|
def PostDeleteItem(self, Flags, Item, hrDelete, NewlyCreated):
|
||
|
print(('PostDeleteItem: Deleted ' + Item.GetDisplayName(shellcon.SHGDN_FORPARSING)))
|
||
|
if NewlyCreated:
|
||
|
print((' Moved to recycle bin - ' + NewlyCreated.GetDisplayName(shellcon.SHGDN_FORPARSING)))
|
||
|
|
||
|
def PreNewItem(self, Flags, DestinationFolder, NewName):
|
||
|
print(('PreNewItem: Creating ' + DestinationFolder.GetDisplayName(shellcon.SHGDN_FORPARSING) + '\\' + NewName))
|
||
|
|
||
|
def PostNewItem(self, Flags, DestinationFolder, NewName, TemplateName, FileAttributes, hrNew, NewItem):
|
||
|
print(('PostNewItem: Created ' + NewItem.GetDisplayName(shellcon.SHGDN_FORPARSING)))
|
||
|
|
||
|
def UpdateProgress(self, WorkTotal, WorkSoFar):
|
||
|
print(('UpdateProgress: ', WorkSoFar, WorkTotal))
|
||
|
|
||
|
def ResetTimer(self):
|
||
|
print ('ResetTimer')
|
||
|
|
||
|
def PauseTimer(self):
|
||
|
print ('PauseTimer')
|
||
|
|
||
|
def ResumeTimer(self):
|
||
|
print ('ResumeTimer')
|
||
|
|
||
|
def CreateSink():
|
||
|
return pythoncom.WrapObject(FileOperationProgressSink(), shell.IID_IFileOperationProgressSink)
|