2 #############################################################
6 # Contains functions that are used to pack and unpack data
7 # from Samba's tdb databases. Samba sometimes represents complex
8 # data structures as a single value in a database. These functions
9 # allow other python scripts to package data types into a single python
10 # string and unpackage them.
13 # XXXXX: This code is no longer used; it's just here for testing
14 # compatibility with the new (much faster) C implementation.
16 ##############################################################
19 def pack(format
,list):
23 # Cycle through format entries
25 # Null Terminated String
26 if (type == 'f' or type == 'P'):
27 retstring
= retstring
+ list[listind
] + "\000"
30 retstring
= retstring
+ PackNum(list[listind
],4)
33 retstring
= retstring
+ PackNum(list[listind
],2)
37 retstring
= retstring
+ PackNum(1,4)
39 retstring
= retstring
+ PackNum(0,4)
43 length
= list[listind
]
44 retstring
= retstring
+ PackNum(length
,4)
48 retstring
= retstring
+ list[listind
][:length
]
54 def unpack(format
,buffer):
62 newvalue
= UnpackNum(buffer[bufind
:bufind
+4])
68 retlist
.append(newvalue
)
69 # Previous character till end of data
72 while (bufind
< len(buffer)):
74 while (buffer[bufind
] != '\000'):
75 newstring
= newstring
+ buffer[bufind
]
78 retlist
.append(newstring
)
79 # Null Terminated String
80 elif (type == 'f' or type == 'P'):
82 while (buffer[bufind
] != '\000'):
83 newstring
= newstring
+ buffer[bufind
]
86 retlist
.append(newstring
)
89 newvalue
= UnpackNum(buffer[bufind
:bufind
+4])
91 retlist
.append(newvalue
)
94 newvalue
= UnpackNum(buffer[bufind
:bufind
+2])
96 retlist
.append(newvalue
)
100 length
= UnpackNum(buffer[bufind
:bufind
+4])
102 retlist
.append(length
)
105 retlist
.append(buffer[bufind
:bufind
+length
])
106 bufind
= bufind
+ length
110 return ((retlist
,buffer[bufind
:]))
112 def PackNum(myint
,size
):
115 hint
= hex(myint
)[2:]
117 # Check for long notation
118 if (hint
[-1:] == 'L'):
121 addon
= size
- len(hint
)
122 for i
in range(0,addon
):
126 val
= string
.atoi(hint
[size
-2:size
],16)
127 retstring
= retstring
+ chr(val
)
132 def UnpackNum(buffer):
136 for i
in range(size
-1,-1,-1):
137 val
= hex(ord(buffer[i
]))[2:]
140 mystring
= mystring
+ val
141 if (len(mystring
) > 4):
142 return string
.atol(mystring
,16)
144 return string
.atoi(mystring
,16)