Skip to content

Commit

Permalink
#143 ネットワークリソース一覧をドライブリストに追加
Browse files Browse the repository at this point in the history
  • Loading branch information
yamahubuki committed Apr 1, 2020
1 parent 897b38f commit 1afb423
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 11 deletions.
30 changes: 24 additions & 6 deletions browsableObjects.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,11 @@ def GetListTuple(self):
class Drive(FalconBrowsableBase):
"""ドライブを表す。"""
def Initialize(self, letter, free, total, type, name=""):
"""必要な情報をセットする"""
"""
必要な情報をセットする
変数名はNetworkResourceと互換しているため、変更した場合は両方に反映すること!
"""
self.letter=letter
self.free=free
self.total=total
Expand Down Expand Up @@ -130,7 +134,10 @@ def UpdateTypeString(self):


def GetListTuple(self):
"""表示に必要なタプルを返す。"""
"""
表示に必要なタプルを返す。
変更した場合はNetworkResourceの方にも反映すること!
"""
return (self.basename, self.letter, misc.ConvertBytesTo(self.free, misc.UNIT_AUTO, True), misc.ConvertBytesTo(self.total, misc.UNIT_AUTO, True), self.typeString)

class Stream(FalconBrowsableBase):
Expand All @@ -149,11 +156,22 @@ def GetListTuple(self):
class NetworkResource(FalconBrowsableBase):
"""ネットワーク上のディスクリソースを表す。このオブジェクトは情報を保持するだけで、指し示すリソースにアクセスすることはない。フルパスは計算可能なのだが、二重に値を生成したくはないので、あえて値を渡すようにしている。"""
def Initialize(self,basename="", fullpath="", address=""):
"""必要な情報をセットする"""
"""
必要な情報をセットする
ドライブリストに表示するため、変数名はDriveのものと互換
"""
self.basename=basename
self.fullpath=fullpath
self.size=-1
self.letter=""
self.free=-1
self.total=-1
self.type=-1
self.typeString=_("ネットワークリソース")
self.address=address

def GetListTuple(self):
"""表示に必要なタプルを返す。"""
return (self.basename, self.basename, address)
"""
表示に必要なタプルを返す。
ここもDriveと同じ内容に統一
"""
return (self.basename, self.letter,"", "", self.typeString)
71 changes: 66 additions & 5 deletions lists/drive.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,16 @@
import logging
import win32api
import win32file
import win32wnet
import socket

import pywintypes
import constants
import misc
import browsableObjects
import globalVars
import errorCodes

from simpleDialog import dialog
from .base import *
from .constants import *
Expand All @@ -37,8 +41,9 @@ def Initialize(self,lst,silent=False):
t=misc.Timer()
self.drives=[]
self.unusableDrives=[]
self.networkResources=[]
if isinstance(lst,list):#パラメータがリストなら、browsableObjects のリストとして処理刷る(ファイルリストを取得しないでコピーする)
self.drives=lst
self._copyFromList(lst)
return errorCodes.OK
#end copy

Expand All @@ -50,11 +55,47 @@ def Initialize(self,lst,silent=False):
if drv&check: self.Append(i)#ドライブ検出
check<<=1
#end ドライブ25個分調べる

#ネットワークリソースの追加
self._GetNetworkResources()

self.log.debug("Drives list created in %d seconds." % t.elapsed)
self.log.debug(str(len(self.drives))+" drives found.")
self.log.debug(str(len(self.drives))+" drives,"+str(len(self.unusableDrives))+" unusableDrives and "+str(len(self.networkResources))+" networkResources found.")
self.ApplySort()
return errorCodes.OK

def _copyFromList(self,lst):
self.log.debug("Copying from list...")
for elem in lst:
if isinstance(elem,browsableObjects.NetworkResource):
self.networkResources.append(elem)
elif elem.total>=0:
self.drives.append(elem)
else:
self.unusableDrives.append(elem)
#end ファイルかフォルダか
#end for
#end _copyFromList

def _GetNetworkResources(self):
self.log.debug("Getting networkResource list...")
try:
h=win32wnet.WNetOpenEnum(5,1,0,None)
#5=RESOURCE_CONTEXT
#1=RESOURCETYPE_DISK
lst=win32wnet.WNetEnumResource(h,64) #65以上の指定不可
win32wnet.WNetCloseEnum(h);
except win32net.error as er:
dialog(_("エラー"), _("ネットワーク上のリソース一覧を取得できませんでした(%(error)s)") % {"error": str(er)})
return
#end 情報取得失敗
lst.pop(0) #先頭はドライブではない者が入るので省く
for l in lst:
s=browsableObjects.NetworkResource()
s.Initialize(l.lpRemoteName[2:],l.lpRemoteName,socket.getaddrinfo(l.lpRemoteName[2:],None)[0][4][0])
self.networkResources.append(s)
#end 追加ループ

def GetColumns(self):
"""このリストのカラム情報を返す。"""
return {
Expand Down Expand Up @@ -97,6 +138,8 @@ def GetItems(self):
lst.append(elem.GetListTuple())
for elem in self.unusableDrives:
lst.append(elem.GetListTuple())
for elem in self.networkResources:
lst.append(elem.GetListTuple())
return lst

def GetItemPaths(self):
Expand All @@ -106,11 +149,29 @@ def GetItemPaths(self):
lst.append(elem.fullpath)
for elem in self.unusableDrives:
lst.append(elem.fullpath)
for elem in self.networkResources:
lst.append(elem.fullpath)
return lst

def GetElement(self,index):
"""インデックスを指定して、対応するリスト内のオブジェクトを返す。"""
return self.drives[index] if index<len(self.drives) else self.unusableDrives[index-len(self.drives)]
if index<len(self.drives):
return self.drives[index]
elif index<len(self.drives)+len(self.unusableDrives):
return self.unusableDrives[index-len(self.drives)]
else:
return self.networkResources[index-len(self.drives)-len(self.unusableDrives)]

def GetItemNames(self):
"""リストの中身をボリュームラベルのリストで取得する。"""
lst=[]
for elem in self.drives:
lst.append(elem.basename)
for elem in self.unusableDrives:
lst.append(elem.basename)
for elem in self.networkResources:
lst.append(elem.basename)
return lst

def _sort(self,attrib, descending):
"""指定した要素で、リストを並べ替える。"""
Expand All @@ -121,7 +182,7 @@ def _sort(self,attrib, descending):
self.log.debug("Finished sorting (%f seconds)" % t.elapsed)

def __iter__(self):
return self.drives.__iter__()
return (self.drives+self.unusableDrives+self.networkResources).__iter__()

def __len__(self):
return len(self.drives)+len(self.unusableDrives)
return len(self.drives)+len(self.unusableDrives)+len(self.networkResources)

0 comments on commit 1afb423

Please sign in to comment.