blob: 3f76f5d40f06287ad8afc34f592d7ed67f0228b2 [file] [log] [blame]
Alexander Afanasyev5ba90362013-07-15 19:58:38 -07001## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -07002#
Alexander Afanasyev5ba90362013-07-15 19:58:38 -07003# Copyright (c) 2011-2013, Regents of the University of California
4# Alexander Afanasyev
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -07005#
Alexander Afanasyev5ba90362013-07-15 19:58:38 -07006# GNU 3.0 license, See the LICENSE file for more information
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -07007#
Alexander Afanasyev5ba90362013-07-15 19:58:38 -07008# Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -07009#
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070010
11#
12# Based on PyCCN code, copyrighted and licensed as follows
13#
14# Copyright (c) 2011-2013, Regents of the University of California
15# BSD license, See the COPYING file for more information
16# Written by: Derek Kulinski <takeda@takeda.tk>
17# Jeff Burke <jburke@ucla.edu>
18#
19
20import ns.core
Alexander Afanasyev39f53162013-07-18 16:24:31 -070021import ns.network
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070022import ns.ndnSIM
Alexander Afanasyev39f53162013-07-18 16:24:31 -070023from Data import Data
24from Interest import Interest
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070025from Name import Name
Alexander Afanasyev39f53162013-07-18 16:24:31 -070026
27import functools
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070028
Alexander Afanasyev76b11572013-07-16 21:49:50 -070029class Face (ns.ndnSIM.ndn.ApiFace):
30 def __init__(self):
31 self.nodeId = ns.core.Simulator.GetContext ()
Alexander Afanasyev39f53162013-07-18 16:24:31 -070032 self.node = ns.network.NodeList.GetNode (self.nodeId)
Alexander Afanasyev76b11572013-07-16 21:49:50 -070033 super(Face, self).__init__ (self.node)
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070034
35 def connect (self):
36 pass
37
38 def disconnect (self):
Alexander Afanasyev76b11572013-07-16 21:49:50 -070039 self.Shutdown ()
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070040
41 def defer_verification (self, deferVerification = True):
42 pass
43
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070044 def expressInterest (self, name, onData, onTimeout, template = None):
Alexander Afanasyev39f53162013-07-18 16:24:31 -070045 """
46 onData: void <interest, name>
47 onTimeout: void <interest>
48 """
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070049
Alexander Afanasyev39f53162013-07-18 16:24:31 -070050 interest = Interest (interest = template)
51 interest.name = name
52
53 class OnDataConvert:
54 def __init__ (self, onData):
55 self.onData = onData
56 def __call__ (self, interest, data):
57 if self.onData:
58 return self.onData (Interest (interest=interest), Data (data = data))
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070059
Alexander Afanasyev39f53162013-07-18 16:24:31 -070060 class OnTimeoutConvert:
61 def __init__ (self, onTimeout):
62 self.onTimeout = onTimeout
63 def __call__ (self, interest):
64 if self.onTimeout:
65 self.onTimeout (Interest (interest=interest))
66
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070067 self.ExpressInterest (interest._interest, OnDataConvert (onData), OnTimeoutConvert (onTimeout))
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070068
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070069 def setInterestFilter (self, name, onInterest, flags = None):
Alexander Afanasyev39f53162013-07-18 16:24:31 -070070 """
71 onInterest: void <name, interest>
72 """
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070073
Alexander Afanasyev39f53162013-07-18 16:24:31 -070074 class OnInterestConvert:
75 def __init__ (self, onInterest):
76 self.onInterest = onInterest
77 def __call__ (self, name, interest):
78 if self.onInterest:
79 self.onInterest (Name (name = name), Interest (interest = interest))
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070080
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070081 if isinstance (name, Name):
82 name = name._name
83 elif isinstance (name, ns.ndnSIM.ndn.Name):
84 pass
85 else:
86 raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
87
Alexander Afanasyev39f53162013-07-18 16:24:31 -070088 self.SetInterestFilter (name, OnInterestConvert (onInterest))
Alexander Afanasyev5ba90362013-07-15 19:58:38 -070089
Alexander Afanasyev39f53162013-07-18 16:24:31 -070090 def clearInterestFilter (self, name):
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070091 if isinstance (name, Name):
92 name = name._name
93 elif isinstance (name, ns.ndnSIM.ndn.Name):
94 pass
Alexander Afanasyev39f53162013-07-18 16:24:31 -070095 else:
96 raise TypeError ("Wrong type for 'name' parameter [%s]" % type (name))
97
Alexander Afanasyevfce5bbd2013-08-07 18:50:00 -070098 self.ClearInterestFilter (name)
99
Alexander Afanasyev39f53162013-07-18 16:24:31 -0700100 def get (self, name, template = None, timeoutms = 3000):
101 raise NotImplementedError ("NS-3 simulation cannot have syncrhonous operations")
102
103 def put (self, data):
Alexander Afanasyev76b11572013-07-16 21:49:50 -0700104 self.Put (data)