147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2009 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_FAKENETWORK_H_
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_FAKENETWORK_H_
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <string>
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <vector>
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/network.h"
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/messagehandler.h"
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/socketaddress.h"
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/stringencode.h"
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/thread.h"
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int kFakeIPv4NetworkPrefixLength = 24;
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgconst int kFakeIPv6NetworkPrefixLength = 64;
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Fake network manager that allows us to manually specify the IPs to use.
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgclass FakeNetworkManager : public NetworkManagerBase,
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                           public MessageHandler {
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org public:
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  FakeNetworkManager()
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      : thread_(Thread::Current()),
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        next_index_(0),
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        started_(false),
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        sent_first_update_(false) {
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  typedef std::vector<SocketAddress> IfaceList;
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void AddInterface(const SocketAddress& iface) {
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    // ensure a unique name for the interface
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    SocketAddress address("test" + rtc::ToString(next_index_++), 0);
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    address.SetResolvedIP(iface.ipaddr());
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    ifaces_.push_back(address);
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    DoUpdateNetworks();
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void RemoveInterface(const SocketAddress& iface) {
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    for (IfaceList::iterator it = ifaces_.begin();
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org         it != ifaces_.end(); ++it) {
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      if (it->EqualIPs(iface)) {
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        ifaces_.erase(it);
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        break;
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      }
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    DoUpdateNetworks();
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void StartUpdating() {
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (started_) {
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      if (sent_first_update_)
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        SignalNetworksChanged();
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return;
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    started_ = true;
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    sent_first_update_ = false;
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    thread_->Post(this);
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void StopUpdating() {
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    started_ = false;
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  // MessageHandler interface.
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  virtual void OnMessage(Message* msg) {
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    DoUpdateNetworks();
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org private:
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  void DoUpdateNetworks() {
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (!started_)
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      return;
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    std::vector<Network*> networks;
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    for (IfaceList::iterator it = ifaces_.begin();
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org         it != ifaces_.end(); ++it) {
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      int prefix_length = 0;
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      if (it->ipaddr().family() == AF_INET) {
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        prefix_length = kFakeIPv4NetworkPrefixLength;
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      } else if (it->ipaddr().family() == AF_INET6) {
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org        prefix_length = kFakeIPv6NetworkPrefixLength;
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      }
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      IPAddress prefix = TruncateIP(it->ipaddr(), prefix_length);
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      scoped_ptr<Network> net(new Network(it->hostname(),
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                          it->hostname(),
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                          prefix,
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                                          prefix_length));
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      net->AddIP(it->ipaddr());
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      networks.push_back(net.release());
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    bool changed;
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    MergeNetworkList(networks, &changed);
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    if (changed || !sent_first_update_) {
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      SignalNetworksChanged();
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      sent_first_update_ = true;
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org    }
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  }
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Thread* thread_;
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  IfaceList ifaces_;
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  int next_index_;
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool started_;
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  bool sent_first_update_;
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org};
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_BASE_FAKENETWORK_H_
120