def findSimpleElementLocation(self, avpCode, msgSize):
        codeFound = False
        size = self.nwBuffer.tell() #bytes

        o_ParsedData = ParsedData()

        while (size < msgSize) and not codeFound:
            #print "DEBUG: {0} : {1} : {2}".format(size, msgSize, self.nwBuffer.tell())
            # read the AVP Code
            fmt = struct.Struct('>I')
            try:
                (avp,) = fmt.unpack(self.nwBuffer.read(4))
            except Exception, e:
                print "ERROR: Major formatting Issue {0}. Exception : {1}".format(avpCode, str(e))
                return o_ParsedData

            if avp == avpCode:
                codeFound = True

            ## Flags And Length
            [avpLen, avpFlags] = utils.getFlagAndLength(self.nwBuffer.read(4))
            avpLenPadded = avpLen + utils.calculatePadding(avpLen)

            size += 8
            if codeFound:
                o_ParsedData.isParsed = True
                o_ParsedData.avpSize  = avpLen
                o_ParsedData.padding  = utils.calculatePadding(avpLen)

                if (utils.existVendorID(avpFlags)):
                    # read vendor-id
                    (vendorID,) = fmt.unpack(self.nwBuffer.read(4))
                    o_ParsedData.vendorID = vendorID
                    size += 4
                    ## Set the network buffer to the data.
                    ## It's already set to data due to above read.
                    ## So, we can return safely from here

                codeFound = False
                return o_ParsedData
            else:
                unwanted = self.nwBuffer.read(avpLenPadded - 8)  ## (8 bytes is already read)
                size += (avpLenPadded - 8)
    def setFlags(self, avpFlags):
        if utils.existVendorID(avpFlags):
            self.avp['Vendor-ID'] = 1
        else:
            self.avp['Vendor-ID'] = 0
            self.clrVendorBit()

        if utils.existMandatory(avpFlags):
            self.avp['Mandatory'] = 1
            self.setMandatoryBit()
        else:
            self.avp['Mandatory'] = 0
            self.clrMandatoryBit()

        if utils.existPersistent(avpFlags):
            self.avp['Protected'] = 1
            self.setEncryptionBit()
        else:
            self.avp['Protected'] = 0
            self.clrEncryptionBit()
 def atomHandler(self, avpName, avpValue, fileRec = None):
     if fileRec:
         index = self.getIndexFromHeader(avpName)
         if index is not None:
             #avpValue = utils.format(avpName, fileRec[index].strip()) #what if we want spaces ? 
             avpValue = utils.format(avpName, fileRec[index])
     try:
         self.formatter.addElement(avpName, avpValue)
     except Exception, e:
         print "ERROR for AVP {0}".format(avpName)
         print "Exception:\n{0}".format(str(e))
 def initParser(self):
     if self.fileName:
         try:
             fd = open(self.fileName, "rb")
         except Exception, e:
             print "ERROR: file not loaded. Exception = {0}".format(str(e))
         
         # Read first 4 bytes of diameter event(which is part of 20 byte header)
         [msgLen, Version] = utils.getFlagAndLength(fd.read(4))
         # set file descriptor to start of file
         fd.seek(0)
         data = fd.read(msgLen)
         fd.close()
    def __init__(self, File = None, eventType = None):
        self.fileName  = File
        self.eventType = eventType
        self.parser    = None
        self.event = evtStruct.eventStructure[eventType]

        self.avpObject = dict()
        self.code2Name = dict()
        self.decodeBF  = dict()  ## key = data_type ; value = Function
        self.decodeBF  = utils.bindDecodingFunc(self.decodeBF)

        self.mapCode2Name()
        self.initParser()
    def getElement(self, avpName = None, msgSize = None):
        if not msgSize:
            msgSize = self.nwEventSize

        if avpName:
            avpCode = utils.getAVPCode(avpName) 

            if avpCode:
                return  self.findSimpleElementLocation(avpCode, msgSize)
            else:
                print "ERROR: AVP code not found for {0}".format(avpName)
                return False
        else:
            print "ERROR: AVP Name not provided {0}".format(avpName)
            return False
        
        return True
    def groupHandler(self, avpName, child, fileRec = None):
        grpAvp = Node.DiameterGroup(avpName) 

        for name, value in child.iteritems():
            if isinstance(value, dict):
                grpAVP_N = self.groupHandler(name, value, fileRec)
                try:
                    grpAvp.addItem(grpAVP_N)
                except Exception, e:
                    print "ERROR for AVP {0}".format(name)
                    print "Exception:\n{0}".format(str(e))
                pass
            else:
                if fileRec:
                    index = self.getIndexFromHeader(name)
                    if index is not None:
                        value = utils.format(name, fileRec[index].strip())
                try:
                    atmAvp = Node.DiameterAtom(name)
                    atmAvp.setContent(value)
                    grpAvp.addItem(atmAvp)
                except Exception, e:
                    print "ERROR for AVP {0}".format(name)
                    print "Exception:\n{0}".format(str(e))
 def bindEncodingFunc(self):
     self.encodeBF = utils.bindEncodingFunc(self.encodeBF)
def stringEncoder(content):
    padding = utils.calculatePadding(len(content))
    packedData = struct.pack("{0}s{1}x".format(len(content), padding), str(content))

    return [packedData, len(content), padding]
    padding = utils.calculatePadding(len(content))
    packedData = struct.pack("{0}s{1}x".format(len(content), padding), str(content))

    return [packedData, len(content), padding]


def ipv4AddressEncoder(content):
    import socket

    try:
        packedData = socket.inet_aton(content)
    except Exception, e:
        print "WARN: incorrect IP address: {0}".format(content)
        packedData = socket.inet_aton("10.10.10.10")

    return [packedData, 4, 0]


def ipv4AddressEncoderE164(content):
    import socket

    try:
        ip = socket.inet_aton(content)
        pack = struct.pack("!2B4s", 0, 1, ip).encode("hex")
    except Exception, e:
        print "WARN: incorrect IP address: {0}".format(content)
        pack = socket.inet_aton("10.10.10.10")
        pack = struct.pack("!2B4s", 0, 1, pack).encode("hex")

    return [pack, len(pack), utils.calculatePadding(len(pack))]
        print "ERROR: {0}".format(str(e))
        return False

    fileSize = os.path.getsize(FileName) 
    try:
        [part_1, ext] = os.path.basename(FileName).split('.')
    except Exception, e:
        print "Provide some extension to the file"
        sys.exit(1)

    eventCount= 0  
    fileCount = 1

    while True: 
        # Read first 4 bytes of diameter event(which is part of 20 byte header)
        [msgLen, _version] = utils.getFlagAndLength(fd.read(4)) 
        # move back by 4 bytes
        fd.seek(-4, 1) 
        data = fd.read(msgLen)
        eventCount += 1

        curSize = fd.tell()
        if fileSize == curSize:
            break
        
    fd.close()

    return eventCount

if __name__ == "__main__":
    if len(sys.argv) < 2: