Diff for /ECHO_content/ECHO_collection.py between versions 1.257 and 1.260

version 1.257, 2005/11/29 15:30:34 version 1.260, 2005/12/13 12:45:21
Line 15  try: Line 15  try:
 except:  except:
         print "PDF generation will not work"          print "PDF generation will not work"
             
   import urlparse
 import string  import string
 import tempfile  import tempfile
 import re  import re
Line 50  from Ft.Xml import EMPTY_NAMESPACE Line 50  from Ft.Xml import EMPTY_NAMESPACE
 import Ft.Xml.XPath  import Ft.Xml.XPath
 import cStringIO  import cStringIO
 import zLOG  import zLOG
   import sys
   
 try:  try:
         from psycopg import libpq          from psycopg import libpq
Line 68  from ECHO_helpers import * Line 69  from ECHO_helpers import *
 from ECHO_language import *  from ECHO_language import *
 from ECHO_movie import *  from ECHO_movie import *
 import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen  import vlp_xmlhelpers #TODO: vlp elemente aus echo herausnehmen
   import xmlrpclib
                           
   
 def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):  def setECHO_collectionInformation(self,title,label,description,contentType,responsible,credits,weight,coordstrs=""):
Line 398  class ECHO_resource(CatalogAware,Folder, Line 399  class ECHO_resource(CatalogAware,Folder,
   
     def reindex(self):      def reindex(self):
         """generate fields for indexing and reindex"""          """generate fields for indexing and reindex"""
         import urlparse          
         #TODO: korrigieren des metalink pfades konfigurierbar machen          #TODO: korrigieren des metalink pfades konfigurierbar machen
         splitted= [x for x in urlparse.urlparse(self.metalink)]          splitted= [x for x in urlparse.urlparse(self.metalink)]
         splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]          splitted[1]="foxridge.mpiwg-berlin.mpg.de"[0:]
Line 511  class ECHO_resource(CatalogAware,Folder, Line 512  class ECHO_resource(CatalogAware,Folder,
             return ret+self.createSubElementRDF(urn=urn)               return ret+self.createSubElementRDF(urn=urn) 
   
       
     def getAccessRightSelectorHTML(self,outlook="select"):      def changeAccessRightForm(self,preselect=None):
             """htmlselector"""          """change the access rights"""
             values=['free','mpiwg']  
                           
             if outlook=="select":          pt=zptFile(self, 'zpt/ChangeECHO_resourceAccessRight.zpt')
                     ret="""<select name="%s">"""%self.getId()          return pt(preselect=preselect)
   
       def changeAccessRight(self):
           """changeRights"""
           argv=self.REQUEST.form
           self.setAccessRightXML(argv["%s_xml"%self.getId()])
           self.accessRight=argv["%s_echo"%self.getId()]
            
           self.REQUEST.RESPONSE.redirect('manage_main')
           
       
       def getAccessRightSelectorHTML(self,outlook="select",xmldominant=None,preselect=None):
               """htmlselector, xmldominant= in der regel wird der wert des xmlfiles ausgegeben ausser er existiert nicht"""
               values=['','free','MPIWG']
               
               if preselect:#set all to the preselected
                   ar=(preselect,preselect)
               else:#else set to actual value
                   ar=self.getAccessRightMD()
                   
               if outlook=="select":
                       ret="""<select name="%s_xml">"""%self.getId()
                       ret1="""<select name="%s_echo">"""%self.getId()
                     for value in values:                      for value in values:
                             if value==self.getAccessRightMD():                              if value==ar[0]:
                                     ret+="<option selected>%s</option>"%value                                      ret+="<option selected>%s</option>"%value
                             else:                              else:
                                     ret+="<option>%s</option>"%value                                      ret+="<option>%s</option>"%value
                               
                               if value==ar[1]:
                                       ret1+="<option selected>%s</option>"%value
                               else:
                                       ret1+="<option>%s</option>"%value
                       
                       
                       if not xmldominant:
                           return ret+"</select>",ret1+"</select>"
                       else:
                           if ar[0] is not None:
                     return ret+"</select>"                      return ret+"</select>"
                           else:
                               return "<p>No xml file (only local selection):"+ret1
   
             else:              else:
                     ret=""                      ret=""
                       ret1=""
                     for value in values:                      for value in values:
                                                           
                             if value==self.getAccessRightMD():                              if value==ar[0]:
                                     ret+="""<input type="radio" name="%s" value="%s" checked>%s"""%(self.getId(),value,value)                                      ret+="""<input type="radio" name="%s_xml" value="%s" checked>%s"""%(self.getId(),value,value)
                             else:                              else:
                                     ret+="""<input type="radio" name="%s" value="%s">%s"""%(self.getId(),value,value)                                      ret+="""<input type="radio" name="%s_xml" value="%s">%s"""%(self.getId(),value,value)
                                       
                               if value==ar[1]:
                                       ret1+="""<input type="radio" name="%s_echo" value="%s" checked>%s"""%(self.getId(),value,value)
                               else:
                                       ret1+="""<input type="radio" name="%s_echo" value="%s">%s"""%(self.getId(),value,value)
   
                       if not xmldominant:                        
                           return ret,ret1
                       else:                         
                           if ar[0]:
                     return ret                      return ret
                           else:
                               return "<p>No xml file (only local selection)</p>"+ret1
   
   
   
       def copyAccessRightsFromMD(self):
               """kopiere rechte aus den metadaten"""
               self.accessRight=self.getAccessRightMD()[0]
               
               
   
   
           
Line 542  class ECHO_resource(CatalogAware,Folder, Line 597  class ECHO_resource(CatalogAware,Folder,
                 url=self.metalink                  url=self.metalink
   
                 try:                  try:
                         geturl=""                      urllib.urlopen(url)
                         for line in ECHO_helpers.urlopen(url).readlines():                  except:
                                 geturl=geturl+line                      zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
   
                       return None,getattr(self,'accessRight','')
   
                 except:  
                         return (None,"Cannot open: "+url)  
   
                 try:                  try:
                         dom=xml.dom.minidom.parseString(geturl)                          dom = NonvalidatingReader.parseUri(url)
                         root=dom.getElementsByTagName('resource')[0]  
                 except:                  except:
                         return (None,"Cannot parse: "+url+"<br>"+geturl)                          zLOG.LOG("ECHO_Resource (getAccessRightMD)", zLOG.INFO,"%s (%s)"%sys.exc_info()[0:2])
                           return (None,"Cannot parse: "+url+"<br>"+"%s (%s)"%sys.exc_info()[0:2])
   
                 internal=dom.getElementsByTagName('internal')  
                 if internal:  
                         institution=dom.getElementsByTagName('institution')  
                         return getText(institution[0].childNodes)  
                   
                 free=dom.getElementsByTagName('free')  
                 if free:  
                         return "free"  
   
                 return "free" #default free                  accessright=dom.xpath("//meta/access-conditions/access/@type")
                   if accessright:
                       accessright=accessright[0].value
                   if str(accessright)=='institution':
                       tmp=dom.xpath("//meta/access-conditions/access/name")
                       if tmp:
                           accessright=getTextFromNode(tmp[0])
   
     def changeAccessRightMD(self,accessright,RESPONSE=None):                  if not accessright:
             """change the rights"""                      accessright=""
                   
                   return accessright,getattr(self,'accessRight','')             
                           
       def changeAccessRightMD(self,accessright,RESPONSE=None):
               """change the rights - not user anymore"""
               #TODO: check if method still needed
             params="accessright=%s"%accessright              params="accessright=%s"%accessright
   
   
             #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()              #print ECHO_helpers.urlopen(self.absolute_url()+'/setAccessRightXML'+'?'+params).read()
   
                           
             ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read()              ECHO_helpers.urlopen('http://echo.mpiwg-berlin.mpg.de/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/setAccessRightXML'+urllib.quote('?'+params))).read()
   
                       
             if RESPONSE is not None:              if RESPONSE is not None:
Line 586  class ECHO_resource(CatalogAware,Folder, Line 643  class ECHO_resource(CatalogAware,Folder,
     def setAccessRightXML(self,accessright):      def setAccessRightXML(self,accessright):
                 """set accessright"""                  """set accessright"""
                 url=self.metalink                  url=self.metalink
                   accessrights=['MPIWG','free']#allowes rights
                   
                   if accessright =='':
                       """do nothing"""
                       return ""
                       
   
                 try:                  try:
                         geturl=""                          geturl=""
Line 602  class ECHO_resource(CatalogAware,Folder, Line 665  class ECHO_resource(CatalogAware,Folder,
                 except:                  except:
                         return (None,"Cannot parse: "+url+"<br>"+geturl)                          return (None,"Cannot parse: "+url+"<br>"+geturl)
   
                 metanodes=dom.getElementsByTagName('access-conditions')                  metamains=dom.getElementsByTagName('meta')
                   
                   if not metamains:
                           nodenew=dom.createElement('meta')
                           root.appendChild(nodenew)
                           metamain=nodenew
                   else:
                           metamain=metamains[0]
                   
                   
                   metanodes=metamain.getElementsByTagName('access-conditions')
   
                 if not metanodes:                  if not metanodes:
                         nodenew=dom.createElement('access-conditions')                          nodenew=dom.createElement('access-conditions')
                         root.appendChild(nodenew)                          metamain.appendChild(nodenew)
                         metanode=nodenew                          metanode=nodenew
                 else:                  else:
                         metanode=metanodes[0]                          metanode=metanodes[0]
   
                 accesses=metanode.getElementsByTagName('access')                  accesses=metanode.getElementsByTagName('access')
   
                 if not accesses:                  #delete old
                   if accesses:
                        metanode.removeChild(accesses[0]).unlink()
   
                   #create new
                       
                         nodenew2=dom.createElement('access')                          nodenew2=dom.createElement('access')
                         metanode.appendChild(nodenew2)                          metanode.appendChild(nodenew2)
                         metanode2=nodenew2                          metanode2=nodenew2
                 else:  
                         metanode2=accesses[0]  
   
                 internal=metanode.getElementsByTagName('internal')                  attribute=metanode2.getAttribute('type')
   
                 if internal:                  if accessright=="free":
                         metanode2.removeChild(internal[0]).unlink()  
   
                 free=metanode.getElementsByTagName('free')                       metanode2.setAttribute('type','free')
                                   
                 if free:                  elif accessright.upper()=='MPIWG':
                         metanode2.removeChild(internal[0]).unlink()                          metanode2.setAttribute('type','institution')
                           nodenew4=dom.createElement('name')
                           metanodetext=dom.createTextNode('MPIWG')
                           nodenew4.appendChild(metanodetext)
                           nodenew2.appendChild(nodenew4)
                   #print dom.toxml().encode('utf-8')
                   string= encodeRPC(dom.toxml().encode('utf-8'))
   
                   #TODO: make server configurable
                   server=xmlrpclib.Server("http://foxridge.mpiwg-berlin.mpg.de/server")
   
                 if accessright=='free':                  path=urlparse.urlparse(self.metalink)[2]
                         nodenew3=dom.createElement('free')  
                         metanode2.appendChild(nodenew3)  
                 elif accessright=='mpiwg':  
                         nodenew3=dom.createElement('internal')  
                         nodenew4=dom.createElement('institution')  
                         metanodetext=dom.createTextNode('mpiwg')  
                         nodenew4.appendChild(metanodetext)  
                         nodenew3.appendChild(nodenew4)  
                         metanode2.appendChild(nodenew3)  
   
                 return dom.toxml().encode('utf-8')                  server.writeMetaDataFile(path,string,"yes")
   
     def setStartPageForm(self):      def setStartPageForm(self):
             """Form for changing the startpage"""              """Form for changing the startpage"""
Line 1113  class ECHO_resource(CatalogAware,Folder, Line 1187  class ECHO_resource(CatalogAware,Folder,
                             self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]                              self.metaDataHash[self.getFieldTag(tags,field)]=self.REQUEST.form[self.getFieldTag(tags,field)]
                             self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]                              self.OSAS_meta[self.getFieldTag(tags,field)]=self.REQUEST.form['OSAS_%s'%self.getFieldTag(tags,field)]
                     except:                      except:
                             """nothing"""                              zLOG.LOG("ECHO_collection (changeECHO_resource_metadata)",zLOG.ERROR,"%s (%s)"%sys.exc_info()[0:2])
   
             ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read()              ECHO_helpers.urlopen('http://xserve02.mpiwg-berlin.mpg.de:18880/echo_nav/storage/downloadExternalXML?index_meta_url=%s&xml_url=%s'%(self.metalink,self.absolute_url()+'/newMetaXML')).read()
   
Line 1125  class ECHO_resource(CatalogAware,Folder, Line 1199  class ECHO_resource(CatalogAware,Folder,
   
     def getMDValueSimpleSearchField(self):      def getMDValueSimpleSearchField(self):
             """returns value for simple search"""              """returns value for simple search"""
               
               try:
             return " ".join([self.getMDValue('title',generic="yes"),              return " ".join([self.getMDValue('title',generic="yes"),
                              self.getMDValue('author',generic="yes"),                               self.getMDValue('author',generic="yes"),
                              self.getMDValue('year',generic="yes"),self.title])                               self.getMDValue('year',generic="yes"),self.getTitle()])
               except:
                   
                   #zLOG.LOG(" ECHO_collection(getMDSimpleSearchField)",zLOG.INFO," ".join([self.getMDValue('title',generic="yes"),
                    #            self.getMDValue('author',generic="yes"),
                     #           self.getMDValue('year',generic="yes"),'']))
                   return ""
                                                             
     def getMDValue(self,fieldNameTest,empty=None,generic=None):      def getMDValue(self,fieldNameTest,empty=None,generic=None):
             """get md values"""              """get md values"""
Line 1160  class ECHO_resource(CatalogAware,Folder, Line 1242  class ECHO_resource(CatalogAware,Folder,
             if not empty:              if not empty:
                #FIXME: warum gibt es manchmal kein metadatahas                 #FIXME: warum gibt es manchmal kein metadatahas
                 try:                  try:
                     return self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)                      
                       ret =self.metaDataHash.get(fieldName,'!!NOT USED HERE in Type: %s'%self.contentType)
                 except:                  except:
                     zLOG.LOG("ECHO (line 1069)",zLOG.ERROR,"no md hash for %s"%self.getId())                       zLOG.LOG("ECHO (line 1069)",zLOG.ERROR,"no md hash for %s"%self.getId()) 
                     return ""                      return ""
                                       
             else:              else:
   
                 return self.metaDataHash.get(fieldNameTest,empty)                     ret= self.metaDataHash.get(fieldNameTest,empty)
              
               if type(ret) is StringType:
                  return ret.decode('utf-8')
               else:
                  return ret
   
     getFieldValue=getMDValue #depricated      getFieldValue=getMDValue #depricated
   
Line 1243  class ECHO_resource(CatalogAware,Folder, Line 1331  class ECHO_resource(CatalogAware,Folder,
         {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},          {'label':'Change TemplateSets and Image Viewer','action':'changeViewerTemplateSetForm'},
         {'label':'set/change startpage','action':'setStartPageForm'},          {'label':'set/change startpage','action':'setStartPageForm'},
         {'label':'Copy MD for indexing and search','action':'copySearchFields'},          {'label':'Copy MD for indexing and search','action':'copySearchFields'},
           {'label':'Change AccessRights','action':'changeAccessRightForm'}, 
         )          )
   
   
Line 1292  class ECHO_resource(CatalogAware,Folder, Line 1381  class ECHO_resource(CatalogAware,Folder,
                 setattr(self,'metaDataHash',{})                  setattr(self,'metaDataHash',{})
         self.metaDataHash[field]=value[0:]          self.metaDataHash[field]=value[0:]
                   
   
     def copySearchFields(self):      def copySearchFields(self):
             """copys metadatafields to the object"""              """copys metadatafields to the object"""
             fields=['author','title','year']              fields=['author','title','year']
Line 1421  class ECHO_resource(CatalogAware,Folder, Line 1509  class ECHO_resource(CatalogAware,Folder,
   
                 return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()                  return zptFile(self, 'zpt/ECHO_getResourceMDErrorContentType.zpt')()
   
         self.REQUEST.SESSION['metadict']=metadict          #self.REQUEST.SESSION['metadict']=metadict
   
                   
                   
         self.REQUEST.SESSION['diffs']=checkDiffs(self,self.REQUEST.SESSION['metadict'])          self.REQUEST.SESSION['diffs']=checkDiffs(self,metadict)
           
   
                                   
         if template=="yes":          if template=="yes":
                   #pt=PageTemplateFile(os.path.join(package_home(globals()), 'zpt/ECHO_resourceMD.zpt'),metadict=metadict).__of__(self)
                 pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')                  pt=zptFile(self, 'zpt/ECHO_resourceMD.zpt')
                 return pt()                  
                   return pt(metadict=metadict)
   
                   
   
Line 1541  class ECHO_externalLink(Folder,ECHO_basi Line 1629  class ECHO_externalLink(Folder,ECHO_basi
         """template fuer content"""          """template fuer content"""
         ret= ECHO_basis.content_html(self,'externalLink')          ret= ECHO_basis.content_html(self,'externalLink')
                   
           if type(ret) is StringType:
               return ret.decode('utf-8')
           else:
              return ret
                   
         try:  
             return ret.encode('utf-8')  
           
         except:  
                     try:   
                         return ret.decode('latin-1')  
                     except:  
                             
                         return ret  
           
     def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):      def __init__(self,id,link,title,label,description,contentType,responsible,credits,weight,coords):
   
Line 1712  def manage_addECHO_link(self,id,title,la Line 1796  def manage_addECHO_link(self,id,title,la
 class ECHO_collection(CatalogAware, Folder, Persistent, Implicit, Cacheable,ECHO_basis):  class ECHO_collection(CatalogAware, Folder, Persistent, Implicit, Cacheable,ECHO_basis):
     """ECHO Collection"""      """ECHO Collection"""
   
       management_page_charset="utf-8"
     security=ClassSecurityInfo()      security=ClassSecurityInfo()
     meta_type='ECHO_collection'      meta_type='ECHO_collection'
     default_catalog='resourceCatalog'      default_catalog='resourceCatalog'
Line 1833  class ECHO_collection(CatalogAware, Fold Line 1918  class ECHO_collection(CatalogAware, Fold
                 pt=zptFile(self, 'zpt/changeMetaDataLinkForm')                  pt=zptFile(self, 'zpt/changeMetaDataLinkForm')
                 pt.content_type="text/html"                  pt.content_type="text/html"
                 return pt()                  return pt()
               
       def changeAccessRightsCollectionForm(self,preselect=None):
           """change access rights of all resources in this collection"""
   
           pt=zptFile(self, 'zpt/changeAccessRightsCollectionForm')
           pt.content_type="text/html"
           return pt(preselect=preselect)
           
           
     def changeAccessRightsCollection(self):      def changeAccessRightsCollection(self):
             """change"""              """change"""
             ret=""              ret=""
Line 1841  class ECHO_collection(CatalogAware, Fold Line 1935  class ECHO_collection(CatalogAware, Fold
             resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])              resources=self.ZopeFind(self,obj_metatypes=['ECHO_resource'])
             for resource in resources:              for resource in resources:
                                         
                     try:                      if argv.has_key(resource[1].getId()+'_xml'):
                             ret+=resource[1].getId()+"   "+argv[resource[1].getId()]+"</br>"                              ret+=resource[1].getId()+"   "+argv[resource[1].getId()+'_xml']+"</br>"
                             resource[1].changeAccessRightMD(argv[resource[1].getId()])                              resource[1].setAccessRightXML(argv[resource[1].getId()+'_xml'])
                     except:                              resource[1].accessRight=argv[resource[1].getId()+'_xml']
                             pass                      elif argv.has_key(resource[1].getId()+'_echo'):
                               ret+="only local:"+resource[1].getId()+"   "+argv[resource[1].getId()+'_echo']+"</br>"
                               resource[1].accessRight=argv[resource[1].getId()+'_echo']
                       else:
                               ret+="ERROR:" +resource[0]
             return ret              return ret
   
     def changeMetaDataLinkInCollection(self):      def changeMetaDataLinkInCollection(self):
Line 2286  class ECHO_collection(CatalogAware, Fold Line 2384  class ECHO_collection(CatalogAware, Fold
         {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},          {'label':'Reload Metadata','action':'reloadMetaDataFromStorageWarning'},
         {'label':'ImportCollection','action':'importCollection'},          {'label':'ImportCollection','action':'importCollection'},
         {'label':'Copy MD for indexing and search','action':'copySearchFields'},          {'label':'Copy MD for indexing and search','action':'copySearchFields'},
           {'label':'Change access rights',  'action':'changeAccessRightsCollectionForm'},
         )          )
   
           
Line 2382  class ECHO_collection(CatalogAware, Fold Line 2481  class ECHO_collection(CatalogAware, Fold
         #print "NN",argv          #print "NN",argv
         ret = ECHO_basis.content_html(self,'collection')          ret = ECHO_basis.content_html(self,'collection')
                   
         try:          if type(ret) is StringType:
                 return ret.encode('utf-8')                 return ret.decode('utf-8')
         except:          else:
               
             try:   
                 return ret.decode('latin-1')  
             except:  
                   
                 return ret                  return ret
                             
                
     def getCredits(self):      def getCredits(self):
         """Ausgabe der credits"""          """Ausgabe der credits"""
         if self.credits:          if self.credits:
Line 2450  class ECHO_collection(CatalogAware, Fold Line 2545  class ECHO_collection(CatalogAware, Fold
   
     getSubCols = ECHO_helpers.getSubCols      getSubCols = ECHO_helpers.getSubCols
   
       def getSubcolsXMLRpc(self,searchSimple):
           """simplesearch results suitable for xml rpc, gives back array objid,url"""
           
           return [x.absolute_url() for x in self.getSubCols(searchSimple=searchSimple)]
       
       
 Globals.InitializeClass(ECHO_collection)  Globals.InitializeClass(ECHO_collection)
           
 def manage_addECHO_collectionForm(self):  def manage_addECHO_collectionForm(self):
Line 2747  class ECHO_root(Folder,Persistent,Implic Line 2848  class ECHO_root(Folder,Persistent,Implic
     security=ClassSecurityInfo()      security=ClassSecurityInfo()
           
     meta_type="ECHO_root"      meta_type="ECHO_root"
               management_page_charset="utf-8"
           
     def mod_re_sub(self,pattern,replace,string):      def mod_re_sub(self,pattern,replace,string):
         """re.sub aus mod re zur Verfuegung stellen"""          """re.sub aus mod re zur Verfuegung stellen"""
Line 3069  class ECHO_root(Folder,Persistent,Implic Line 3170  class ECHO_root(Folder,Persistent,Implic
             return ret              return ret
   
     def getValueFromClass(self,field,found):      def getValueFromClass(self,field,found):
             """retattribute falss existing"""              """ret attribute if existing"""
             try:              try:
                                           
                     return getattr(found,field).decode('ascii','ignore')                      return getattr(found,field).decode('ascii','ignore')

Removed from v.1.257  
changed lines
  Added in v.1.260


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>