MediaWiki  1.23.8
MWMessagePack.php
Go to the documentation of this file.
1 <?php
36 
38  public static $bigendian = null;
39 
51  public static function pack( $value ) {
52  if ( self::$bigendian === null ) {
53  self::$bigendian = pack( 'S', 1 ) === pack( 'n', 1 );
54  }
55 
56  switch ( gettype( $value ) ) {
57  case 'NULL':
58  return "\xC0";
59 
60  case 'boolean':
61  return $value ? "\xC3" : "\xC2";
62 
63  case 'double':
64  case 'float':
65  return self::$bigendian
66  ? "\xCB" . pack( 'd', $value )
67  : "\xCB" . strrev( pack( 'd', $value ) );
68 
69  case 'string':
70  $length = strlen( $value );
71  if ( $length < 32 ) {
72  return pack( 'Ca*', 0xA0 | $length, $value );
73  } elseif ( $length <= 0xFFFF ) {
74  return pack( 'Cna*', 0xDA, $length, $value );
75  } elseif ( $length <= 0xFFFFFFFF ) {
76  return pack( 'CNa*', 0xDB, $length, $value );
77  }
78  throw new InvalidArgumentException( __METHOD__ . ": string too long (length: $length; max: 4294967295)" );
79 
80  case 'integer':
81  if ( $value >= 0 ) {
82  if ( $value <= 0x7F ) {
83  // positive fixnum
84  return chr( $value );
85  }
86  if ( $value <= 0xFF ) {
87  // uint8
88  return pack( 'CC', 0xCC, $value );
89  }
90  if ( $value <= 0xFFFF ) {
91  // uint16
92  return pack( 'Cn', 0xCD, $value );
93  }
94  if ( $value <= 0xFFFFFFFF ) {
95  // uint32
96  return pack( 'CN', 0xCE, $value );
97  }
98  if ( $value <= 0xFFFFFFFFFFFFFFFF ) {
99  // uint64
100  $hi = ( $value & 0xFFFFFFFF00000000 ) >> 32;
101  $lo = $value & 0xFFFFFFFF;
102  return self::$bigendian
103  ? pack( 'CNN', 0xCF, $lo, $hi )
104  : pack( 'CNN', 0xCF, $hi, $lo );
105  }
106  } else {
107  if ( $value >= -32 ) {
108  // negative fixnum
109  return pack( 'c', $value );
110  }
111  if ( $value >= -0x80 ) {
112  // int8
113  return pack( 'Cc', 0xD0, $value );
114  }
115  if ( $value >= -0x8000 ) {
116  // int16
117  $p = pack( 's', $value );
118  return self::$bigendian
119  ? pack( 'Ca2', 0xD1, $p )
120  : pack( 'Ca2', 0xD1, strrev( $p ) );
121  }
122  if ( $value >= -0x80000000 ) {
123  // int32
124  $p = pack( 'l', $value );
125  return self::$bigendian
126  ? pack( 'Ca4', 0xD2, $p )
127  : pack( 'Ca4', 0xD2, strrev( $p ) );
128  }
129  if ( $value >= -0x8000000000000000 ) {
130  // int64
131  // pack() does not support 64-bit ints either so pack into two 32-bits
132  $p1 = pack( 'l', $value & 0xFFFFFFFF );
133  $p2 = pack( 'l', ( $value >> 32 ) & 0xFFFFFFFF );
134  return self::$bigendian
135  ? pack( 'Ca4a4', 0xD3, $p1, $p2 )
136  : pack( 'Ca4a4', 0xD3, strrev( $p2 ), strrev( $p1 ) );
137  }
138  }
139  throw new InvalidArgumentException( __METHOD__ . ": invalid integer '$value'" );
140 
141  case 'array':
142  $buffer = '';
143  $length = count( $value );
144  if ( $length > 0xFFFFFFFF ) {
145  throw new InvalidArgumentException( __METHOD__ . ": array too long (length: $length, max: 4294967295)" );
146  }
147 
148  $index = 0;
149  foreach ( $value as $k => $v ) {
150  if ( $index !== $k || $index === $length ) {
151  break;
152  } else {
153  $index++;
154  }
155  }
156  $associative = $index !== $length;
157 
158  if ( $associative ) {
159  if ( $length < 16 ) {
160  $buffer .= pack( 'C', 0x80 | $length );
161  } elseif ( $length <= 0xFFFF ) {
162  $buffer .= pack( 'Cn', 0xDE, $length );
163  } else {
164  $buffer .= pack( 'CN', 0xDF, $length );
165  }
166  foreach ( $value as $k => $v ) {
167  $buffer .= self::pack( $k );
168  $buffer .= self::pack( $v );
169  }
170  } else {
171  if ( $length < 16 ) {
172  $buffer .= pack( 'C', 0x90 | $length );
173  } elseif ( $length <= 0xFFFF ) {
174  $buffer .= pack( 'Cn', 0xDC, $length );
175  } else {
176  $buffer .= pack( 'CN', 0xDD, $length );
177  }
178  foreach ( $value as $v ) {
179  $buffer .= self::pack( $v );
180  }
181  }
182  return $buffer;
183 
184  default:
185  throw new InvalidArgumentException( __METHOD__ . ': unsupported type ' . gettype( $value ) );
186  }
187  }
188 }
php
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those in etc for skin dependent CSS etc for skin dependent JavaScript These can also be customised on a per user by etc This feature has led to a wide variety of user styles becoming that gallery is a good place to ending in php
Definition: skin.txt:62
MWMessagePack
Definition: MWMessagePack.php:35
MWMessagePack\$bigendian
static $bigendian
Definition: MWMessagePack.php:38
$value
$value
Definition: styleTest.css.php:45
MWMessagePack\pack
static pack( $value)
Encode a value using MessagePack.
Definition: MWMessagePack.php:51
as
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
Definition: distributors.txt:9