private Object ReadObject(Stream stream, ArrayList objectContainer) { String typeName = GetString(ReadBinaryString(stream)); Int32 memberCount = Int32.Parse(ReadNumber(stream)); stream.Position++; if (typeName.Equals("PHPRPC_Date")) { return(ReadDateTime(stream, objectContainer)); } Type type = GetTypeByAlias(typeName); Object result; if (type == null) { result = new Hashtable(memberCount); objectContainer.Add(result); for (Int32 i = 0; i < memberCount; i++) { String key = ReadKey(stream); if (key[0] == '\0') { key = key.Substring(key.IndexOf('\0', 1) + 1); } ((Hashtable)result)[key] = Deserialize(stream, objectContainer); } } else { result = CreateInstance(type); objectContainer.Add(result); for (Int32 i = 0; i < memberCount; i++) { FieldInfo field = GetField(type, ReadKey(stream)); Object value = Deserialize(stream, objectContainer); if (field != null) { field.SetValue(result, PHPConvert.ChangeType(value, field.FieldType, encoding)); } } MethodInfo __wakeup; if (__wakeupcache.ContainsKey(type)) { __wakeup = (MethodInfo)__wakeupcache[type]; } else { BindingFlags bindingflags = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase; __wakeup = type.GetMethod("__wakeup", bindingflags, null, new Type[0], new ParameterModifier[0]); __wakeupcache[type] = __wakeup; } if (__wakeup != null) { __wakeup.Invoke(result, null); } } stream.Position++; return(result); }
private void KeyExchange(ref Byte encryptMode) { while (keyExchanging) { Thread.Sleep(1); } if (key != null || encryptMode == 0) { return; } if ((key == null) && keyExchanged) { encryptMode = 0; return; } keyExchanging = true; Hashtable result = POST("phprpc_encrypt=true&phprpc_keylen=" + keylen); if (result.ContainsKey("phprpc_keylen")) { keylen = (UInt32)result["phprpc_keylen"]; } else { keylen = 128; } if (result.ContainsKey("phprpc_encrypt")) { AssocArray encrypt = (AssocArray)Deserialize((Byte[])result["phprpc_encrypt"]); BigInteger x = BigInteger.GenerateRandom((Int32)keylen - 1); x.SetBit(keylen - 2); BigInteger y = BigInteger.Parse(PHPConvert.ToString(encrypt["y"])); BigInteger p = BigInteger.Parse(PHPConvert.ToString(encrypt["p"])); BigInteger g = BigInteger.Parse(PHPConvert.ToString(encrypt["g"])); if (keylen == 128) { this.key = new byte[16]; Byte[] k = y.ModPow(x, p).GetBytes(); for (Int32 i = 1, n = Math.Min(k.Length, 16); i <= n; i++) { this.key[16 - i] = k[n - i]; } } else { key = MD5.Hash(encoding.GetBytes(y.ModPow(x, p).ToString())); } POST("phprpc_encrypt=" + g.ModPow(x, p).ToString()); } else { key = null; keyExchanged = true; encryptMode = 0; } keyExchanging = false; }
private void getFruitType_callback(Hashtable result, Object[] args, String output, PHPRPC_Error error, Boolean failure) { foreach (DictionaryEntry aa in result) { Hashtable line = PHPConvert.ToHashtable(aa.Value); dataGridView1.Rows.Insert(0, new object[] { Encoding.UTF8.GetString((byte[])line["id"]), Encoding.UTF8.GetString((byte[])line["name"]) }); } }
private void InvokeCallback(Object state) { RequestState requestState = state as RequestState; Hashtable result = GetResponseBody(requestState.response, requestState.encryptMode); PHPRPC_Error error; Int32 errno = (Int32)result["phprpc_errno"]; if (errno > 0) { String errstr = (String)result["phprpc_errstr"]; error = new PHPRPC_Error(errno, errstr); } else { error = null; } if (result.ContainsKey("phprpc_output")) { output = (String)result["phprpc_output"]; } else { output = String.Empty; } if (requestState.syncCallback != null) { Delegate callback = (Delegate)requestState.syncCallback; Type callbackType = callback.GetType(); Object[] args = requestState.args; Object retval = error; if (result.ContainsKey("phprpc_result")) { if (result.ContainsKey("phprpc_args")) { args = (Object[])PHPConvert.ToArray((AssocArray)Deserialize(Decrypt((Byte[])result["phprpc_args"], 1, requestState.encryptMode)), typeof(Object[]), encoding); } retval = Deserialize(Decrypt((Byte[])result["phprpc_result"], 2, requestState.encryptMode)); } if (callbackType.IsGenericType) { Type resultType = callbackType.GetGenericArguments()[0]; if (retval != error) { callback.DynamicInvoke(PHPConvert.ChangeType(retval, resultType, encoding), args, output, error, false); } else { callback.DynamicInvoke(null, args, output, error, true); } } else { ((PHPRPC_Callback)callback)(retval, args, output, error); } } }
public Hashtable Invoke(String function, Object[] args, Boolean byRef, Byte encryptMode) { Hashtable data = new Hashtable(); data["warning"] = null; data["output"] = String.Empty; try { KeyExchange(ref encryptMode); StringBuilder requestBody = new StringBuilder(); requestBody.Append("phprpc_func=").Append(function); if (args != null && args.Length > 0) { requestBody.Append("&phprpc_args="); requestBody.Append(Base64Encode(Encrypt(Serialize(args), 1, encryptMode)).Replace("+", "%2B")); } requestBody.Append("&phprpc_encrypt=").Append(encryptMode); if (!byRef) { requestBody.Append("&phprpc_ref=false"); } Hashtable result = POST(requestBody.ToString()); Int32 errno = (Int32)result["phprpc_errno"]; if (errno > 0) { String errstr = (String)result["phprpc_errstr"]; data["warning"] = new PHPRPC_Error(errno, errstr); } if (result.ContainsKey("phprpc_output")) { data["output"] = (String)result["phprpc_output"]; } if (result.ContainsKey("phprpc_result")) { if (result.ContainsKey("phprpc_args")) { Object[] arguments = (Object[])PHPConvert.ToArray((AssocArray)Deserialize(Decrypt((Byte[])result["phprpc_args"], 1, encryptMode)), typeof(Object[]), encoding); for (Int32 i = 0; i < Math.Min(args.Length, arguments.Length); i++) { args[i] = arguments[i]; } } data["result"] = Deserialize(Decrypt((Byte[])result["phprpc_result"], 2, encryptMode)); } else { data["result"] = warning; } } catch (PHPRPC_Error e) { data["result"] = e; } catch (Exception e) { data["result"] = new PHPRPC_Error(1, e.ToString()); } return(data); }
public Object Invoke(Object proxy, MethodInfo method, Object[] args) { Type[] paramTypes = ToTypes(method.GetParameters()); Int32 n = paramTypes.Length; Boolean byRef = false; for (Int32 i = 0; i < n; i++) { if (paramTypes[i].IsByRef) { byRef = true; break; } } #if !NET1 if ((n > 0) && ((paramTypes[n - 1] == typeof(PHPRPC_Callback)) || ((paramTypes[n - 1].IsGenericType) && (paramTypes[n - 1].GetGenericTypeDefinition() == typeof(PHPRPC_Callback <>))))) { Object[] tmpargs = new Object[n - 1]; Array.Copy(args, tmpargs, n - 1); client.Invoke(method.Name, tmpargs, (Delegate)args[n - 1], byRef, client.EncryptMode); return(null); } else if ((n > 1) && ((paramTypes[n - 2] == typeof(PHPRPC_Callback)) || ((paramTypes[n - 2].IsGenericType) && (paramTypes[n - 2].GetGenericTypeDefinition() == typeof(PHPRPC_Callback <>)))) && (paramTypes[n - 1] == typeof(Byte))) { Object[] tmpargs = new Object[n - 2]; Array.Copy(args, tmpargs, n - 2); client.Invoke(method.Name, tmpargs, (Delegate)args[n - 2], byRef, (Byte)args[n - 1]); return(null); } #endif #if SILVERLIGHT throw new PHPRPC_Error(1, "SilverLight do not support synchronous invoke."); #else Object result = client.Invoke(method.Name, args, byRef); if (result is PHPRPC_Error) { throw (PHPRPC_Error)result; } if (byRef) { for (Int32 i = 0; i < n; i++) { if (paramTypes[i].IsByRef) { args[i] = PHPConvert.ChangeType(args[i], paramTypes[i].GetElementType(), client.Charset); } } } return(PHPConvert.ChangeType(result, method.ReturnType, client.Charset)); #endif }
private void getOrder_callback(Hashtable result, Object[] args, String output, PHPRPC_Error error, Boolean failure) { if (result == null) { return; } foreach (DictionaryEntry order in result) { Hashtable line = PHPConvert.ToHashtable(order.Value); OrderControl oc = new OrderControl(line); oc.Dock = DockStyle.Top; list.Controls.Add(oc); } }
private Byte[] Call(MethodInfo function, Object obj, ArrayList arguments) { ParameterInfo[] p = function.GetParameters(); String funcname = function.Name; MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms, encoding); Int32 size = arguments.Count; if (p.Length != size) { if (p.Length == size + 1) { Type type = p[p.Length - 1].ParameterType; if (type == typeof(TextWriter) || type == typeof(StreamWriter)) { arguments.Add(sw); } else { throw new ArgumentException("number of arguments mismatch for " + funcname + "()."); } } else { throw new ArgumentException("number of arguments mismatch for " + funcname + "()."); } } Object[] args = arguments.ToArray(); if (size < arguments.Count) { arguments.RemoveAt(size); } for (Int32 i = 0, n = args.Length; i < n; i++) { if (args[i] != null) { args[i] = PHPConvert.ChangeType(args[i], p[i].ParameterType, encoding); } } Byte[] result = Serialize(function.Invoke(obj, args)); sw.Close(); output = encoding.GetString(ms.ToArray()); ms.Close(); for (Int32 i = 0; i < size; i++) { arguments[i] = args[i]; } return(result); }
private void getOrderItem_callback(Hashtable result, Object[] args, String output, PHPRPC_Error error, Boolean failure) { if (result == null) { return; } foreach (DictionaryEntry aa in result) { Hashtable line = PHPConvert.ToHashtable(aa.Value); dataGridView6.Rows.Insert(0, new object[] { Encoding.UTF8.GetString((byte[])line["id"]), Encoding.UTF8.GetString((byte[])line["product"]), Encoding.UTF8.GetString((byte[])line["quantity"]), Encoding.UTF8.GetString((byte[])line["money"]), Encoding.UTF8.GetString((byte[])line["comment"]) }); } }
private void getOrder_callback(Hashtable result, Object[] args, String output, PHPRPC_Error error, Boolean failure) { if (result == null) { return; } foreach (DictionaryEntry aa in result) { Hashtable line = PHPConvert.ToHashtable(aa.Value); dataGridView5.Rows.Insert(0, new object[] { Encoding.UTF8.GetString((byte[])line["id"]), Encoding.UTF8.GetString((byte[])line["customer"]), Encoding.UTF8.GetString((byte[])line["earliest"]), Encoding.UTF8.GetString((byte[])line["latest"]), Encoding.UTF8.GetString((byte[])line["status"]), Encoding.UTF8.GetString((byte[])line["comment"]), }); } }
private void getPrizeOfUser_callback(Hashtable result, Object[] args, String output, PHPRPC_Error error, Boolean failure) { if (result.Count == 0) { if (pageForPrize > 1) { pageForPrize--; } return; } dataGridView4.Rows.Clear(); foreach (DictionaryEntry aa in result) { Hashtable line = PHPConvert.ToHashtable(aa.Value); dataGridView4.Rows.Insert(0, new object[] { Encoding.UTF8.GetString((byte[])line["id"]), line["phone"] == null ? "": Encoding.UTF8.GetString((byte[])line["phone"]), Encoding.UTF8.GetString((byte[])line["content"]), Encoding.UTF8.GetString((byte[])line["prizeName"]), Encoding.UTF8.GetString((byte[])line["received"]), String.Format("{0}", Util.UTCToDateTime(Convert.ToInt32(Encoding.UTF8.GetString((byte[])line["ctime"])))) }); } }
public OrderControl(Hashtable order) { InitializeComponent(); label1.Text += Encoding.UTF8.GetString((byte[])order["customer"]); label2.Text += Encoding.UTF8.GetString((byte[])order["earliest"]); label3.Text += Encoding.UTF8.GetString((byte[])order["latest"]); label4.Text += Encoding.UTF8.GetString((byte[])order["comment"]); label5.Text += Encoding.UTF8.GetString((byte[])order["status"]); Hashtable items = PHPConvert.ToHashtable(order["orderItems"]); if (items != null) { foreach (DictionaryEntry aa in items) { Hashtable line = PHPConvert.ToHashtable(aa.Value); dataGridView6.Rows.Insert(0, new object[] { Encoding.UTF8.GetString((byte[])line["id"]), Encoding.UTF8.GetString((byte[])line["product"]), Encoding.UTF8.GetString((byte[])line["quantity"]), Encoding.UTF8.GetString((byte[])line["money"]), Encoding.UTF8.GetString((byte[])line["comment"]) }); } } }
public BigInteger GetP() { return(BigInteger.Parse(PHPConvert.ToString(dhParams["p"]))); }
private void NextKeyExchange(Object state) { RequestState requestState = state as RequestState; Hashtable result = GetResponseBody(requestState.response, 0); #if SILVERLIGHT if (result.ContainsKey("phprpc_url")) { String phprpc_url = (String)result["phprpc_url"]; url = new Uri(phprpc_url); if (url.Query == "") { url = new Uri(phprpc_url + "?phprpc_id=" + clientID); } else { url = new Uri(phprpc_url + "&phprpc_id=" + clientID); } } #endif if (result.ContainsKey("phprpc_keylen")) { keylen = (UInt32)result["phprpc_keylen"]; } else { keylen = 128; } if (result.ContainsKey("phprpc_encrypt")) { AssocArray encrypt = (AssocArray)Deserialize((Byte[])result["phprpc_encrypt"]); BigInteger x = BigInteger.GenerateRandom((Int32)keylen - 1); x.SetBit(keylen - 2); BigInteger y = BigInteger.Parse(PHPConvert.ToString(encrypt["y"])); BigInteger p = BigInteger.Parse(PHPConvert.ToString(encrypt["p"])); BigInteger g = BigInteger.Parse(PHPConvert.ToString(encrypt["g"])); if (keylen == 128) { this.key = new byte[16]; Byte[] k = y.ModPow(x, p).GetBytes(); for (Int32 i = 1, n = Math.Min(k.Length, 16); i <= n; i++) { this.key[16 - i] = k[n - i]; } } else { key = MD5.Hash(encoding.GetBytes(y.ModPow(x, p).ToString())); } requestState = new RequestState(); requestState.bufferWrite = encoding.GetBytes("phprpc_encrypt=" + g.ModPow(x, p).ToString()); requestState.asyncCallback = new SendOrPostCallback(EndKeyExchange); POST(requestState); } else { key = null; requestState.encryptMode = 0; keyExchanged = true; EndKeyExchange(null); } }