00001 <?php 00002 /*************************************************************************** 00003 * Copyright (C) 2007 by Vladimir A. Altuchov * 00004 * * 00005 * This program is free software; you can redistribute it and/or modify * 00006 * it under the terms of the GNU Lesser General Public License as * 00007 * published by the Free Software Foundation; either version 3 of the * 00008 * License, or (at your option) any later version. * 00009 * * 00010 ***************************************************************************/ 00011 00015 final class IpNetwork implements SingleRange 00016 { 00017 const MASK_MAX_SIZE = 31; 00018 00019 private $ip = null; 00020 private $end = null; 00021 private $mask = null; 00022 private $longMask = null; 00023 00027 public static function create(IpAddress $ip, $mask) 00028 { 00029 return new self($ip, $mask); 00030 } 00031 00032 public function __construct(IpAddress $ip, $mask) 00033 { 00034 Assert::isInteger($mask); 00035 00036 if ($mask == 0 || self::MASK_MAX_SIZE < $mask) 00037 throw new WrongArgumentException('wrong mask given'); 00038 00039 $this->longMask = 00040 (int) (pow(2, (32 - $mask)) * (pow(2, $mask) - 1)); 00041 00042 if (($ip->getLongIp() & $this->longMask) != $ip->getLongIp()) 00043 throw new WrongArgumentException('wrong ip network given'); 00044 00045 $this->ip = $ip; 00046 $this->mask = $mask; 00047 } 00048 00049 public function getMask() 00050 { 00051 return $this->mask; 00052 } 00053 00057 public function getStart() 00058 { 00059 return $this->ip; 00060 } 00061 00065 public function getEnd() 00066 { 00067 if (!$this->end) { 00068 $this->end = 00069 IpAddress::create( 00070 long2ip($this->ip->getLongIp() | ~$this->longMask) 00071 ); 00072 } 00073 00074 return $this->end; 00075 } 00076 00077 public function contains(/* IpAddress */ $probe) 00078 { 00079 Assert::isInstance($probe, 'IpAddress'); 00080 00081 return 00082 ($probe->getLongIp() & $this->longMask) 00083 == $this->ip->getLongIp(); 00084 } 00085 } 00086 ?>