182 lines
5.0 KiB
Python
182 lines
5.0 KiB
Python
|
# Sample implementation of IFileOperationProgressSink that just prints
|
||
|
# some basic info
|
||
|
|
||
|
import pythoncom
|
||
|
from win32com.server.policy import DesignatedWrapPolicy
|
||
|
from win32com.shell import shell, shellcon
|
||
|
|
||
|
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
|
||
|
)
|