switch to new MPL based Fraunhofer FOKUS Public License
[senf.git] / senf / Socket / Protocols / Raw / MACAddress.cc
1 // $Id$
2 //
3 // Copyright (C) 2007
4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
5 //
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at 
9 // http://senf.berlios.de/license.html
10 //
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on, 
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
14 //
15 // Software distributed under the License is distributed on an "AS IS" basis, 
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License 
17 // for the specific language governing rights and limitations under the License.
18 //
19 // The Original Code is Fraunhofer FOKUS code.
20 //
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V. 
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
24 //
25 // Contributor(s):
26 //   Stefan Bund <g0dil@berlios.de>
27
28 /** \file
29     \brief MACAddress non-inline non-template implementation */
30
31 #include "MACAddress.hh"
32 //#include "MACAddress.ih"
33
34 // Custom includes
35 #include <iomanip>
36 #include <boost/io/ios_state.hpp>
37 #include <senf/Socket/Protocols/AddressExceptions.hh>
38 #include "ParseString.hh"
39 #include "EUI64.hh"
40
41 //#include "MACAddress.mpp"
42 #define prefix_
43 //-/////////////////////////////////////////////////////////////////////////////////////////////////
44
45 //-/////////////////////////////////////////////////////////////////////////////////////////////////
46 // senf::MACAddress
47
48 prefix_ senf::MACAddress senf::MACAddress::from_string(std::string const & s)
49 {
50     MACAddress mac (senf::noinit);
51     detail::parseHexString(s, ":-", mac.begin(), mac.end());
52     return mac;
53 }
54
55 prefix_ senf::MACAddress senf::MACAddress::from_eui64(senf::EUI64 const & eui)
56 {
57     if (eui[3] != 0xffu || eui[4] != 0xfeu)
58         throw AddressSyntaxException() << ": EUI64 is not MAC compatible: " << eui;
59     MACAddress mac (senf::noinit);
60     mac[0] = eui[0];
61     mac[1] = eui[1];
62     mac[2] = eui[2];
63     mac[3] = eui[5];
64     mac[4] = eui[6];
65     mac[5] = eui[7];
66     return mac;
67 }
68
69 senf::MACAddress const senf::MACAddress::Broadcast = senf::MACAddress(0xFFFFFFFFFFFFull);
70 senf::MACAddress const senf::MACAddress::None;
71
72
73 //-/////////////////////////////////////////////////////////////////////////////////////////////////
74 // namespace members
75
76 prefix_ std::ostream & senf::operator<<(std::ostream & os, MACAddress const & mac)
77 {
78     boost::io::ios_all_saver ias (os);
79     os << std::hex << std::setfill('0') << std::right;
80     for (MACAddress::const_iterator i (mac.begin()); i != mac.end(); ++i) {
81         if (i != mac.begin())
82             os << ':';
83         os << std::setw(2) << unsigned(*i);
84     }
85     return os;
86 }
87
88 prefix_ std::istream & senf::operator>>(std::istream & is, MACAddress & mac)
89 {
90     std::string s;
91     if (!(is >> s))
92         return is;
93     try {
94         mac = MACAddress::from_string(s);
95     }
96     catch (AddressException &) {
97         is.setstate(std::ios::failbit);
98     }
99     return is;
100 }
101
102 //-/////////////////////////////////////////////////////////////////////////////////////////////////
103 #undef prefix_
104 //#include "MACAddress.mpp"
105
106 \f
107 // Local Variables:
108 // mode: c++
109 // fill-column: 100
110 // comment-column: 40
111 // c-file-style: "senf"
112 // indent-tabs-mode: nil
113 // ispell-local-dictionary: "american"
114 // compile-command: "scons -u test"
115 // End: