private void reply(string chal, CharpCtx ctx) { Uri uri = new Uri(baseUrl + "reply"); string hash = GetHexHash(sha, login + chal + passwd); NameValueCollection data = new NameValueCollection() { { "login", login }, { "chal", chal }, { "hash", hash } }; if (ctx.reply_handler != null) { ctx.reply_handler(uri, data, ctx); return; } ctx.wc = new WebClient(); if (ctx.fileName != null) { ctx.wc.UploadDataCompleted += new UploadDataCompletedEventHandler(replyCompleteH); UploadFileAsync(uri, data, ctx); return; } ctx.wc.UploadValuesCompleted += new UploadValuesCompletedEventHandler(replyCompleteH); ctx.wc.UploadValuesAsync(uri, "POST", data, ctx); }
public bool resultHandleHttpErrors(CharpCtx ctx) { if (ctx.status.Cancelled) { handleError(ERRORS [(int)ERR.HTTP_CANCEL], ctx); return(false); } if (ctx.status.Error != null) { CharpError err = ERRORS [(int)ERR.HTTP_SRVERR]; err.msg = String.Format(Catalog.GetString("HTTP WebClient error: {0}"), ctx.status.Error.ToString()); handleError(err, ctx); return(false); } byte[] result = ctx.Result; if (result == null || result.Length == 0) { handleError(ERRORS[(int)ERR.HTTP_CONNECT], ctx); return(false); } return(true); }
private void cacheSet(CharpCtx ctx, object res) { Dictionary <string, object> cache = (ctx.cacheIsPrivate)? privateCache: commonCache; if (!cache.ContainsKey(ctx.cacheArea)) { cache[ctx.cacheArea] = new Dictionary <string, object> (); } Dictionary <string, object> area = (Dictionary <string, object>)cache[ctx.cacheArea]; string path = cacheCtxToPath(ctx); area[path] = res; }
private void replySuccess(JObject data, CharpCtx ctx) { if (data["fields"] == null || data["data"] == null) { handleError(ERRORS [(int)ERR.DATA_BADMSG], ctx); } object res; JArray fields = (JArray)data["fields"]; JArray dat = (JArray)data["data"]; if (fields.Count == 1 && (string)fields[0] == "rp_" + ctx.reqData["res"]) { // Remote procedure returning a single row with a single value. res = dat[0][0]; } else if (ctx.asArray) { // Just return the resulting array of arrays as requested. res = dat; } else if (ctx.asSingle) { // Assume only one row is returned, return its transformation into object. res = buildObject(fields, (JArray)dat[0]); } else { // Transform array of arrays into an array of objects. JArray arr = new JArray(); JArray row; for (int i = 0; i < dat.Count; i++) { row = (JArray)dat[i]; JObject so = buildObject(fields, row); arr.Add(so); } res = arr; } if (ctx.useCache) { cacheSet(ctx, res); } if (ctx.success != null) { ctx.success(res, ctx); } }
public void handleError(JToken err, CharpCtx ctx = null) { CharpError cerr = new CharpError { code = (int)err["code"], sev = (ERR_SEV)((int)err["sev"]), desc = (string)err["desc"], msg = (string)err["msg"], lvl = (ERR_LEVEL)((int)err["level"]), key = (string)err["key"], state = err["state"] != null? (string)err["state"]: "", statestr = (string)err["statestr"] }; handleError(cerr, ctx); }
private void requestSuccess(JObject data, CharpCtx ctx) { if (ctx.asAnon) { replySuccess(data, ctx); return; } if (data["chal"] != null) { reply((string)data ["chal"], ctx); return; } handleError(ERRORS [(int)ERR.DATA_BADMSG], ctx); }
public override void handleError(CharpError err, CharpCtx ctx = null) { if (ctx != null && ctx.error != null && !ctx.error (err, ctx)) { return; } Gtk.Application.Invoke (delegate { CharpGtkErrorDlg dlg = new CharpGtkErrorDlg (err, ctx); if (ctx is CharpGtkCtx && ((CharpGtkCtx) ctx).parent != null) { dlg.TransientFor = ((CharpGtkCtx) ctx).parent; } else if (parent != null) { dlg.TransientFor = parent; } dlg.Run (); }); }
private object cacheGet(CharpCtx ctx) { Dictionary <string, object> cache = (ctx.cacheIsPrivate)? privateCache: commonCache; if (!cache.ContainsKey(ctx.cacheArea)) { return(null); } Dictionary <string, object> area = (Dictionary <string, object>)cache[ctx.cacheArea]; string path = cacheCtxToPath(ctx); if (!area.ContainsKey(path)) { return(null); } return(area[path]); }
private string cacheCtxToPath(CharpCtx ctx) { PathBuilder path = new PathBuilder(); if (ctx.cacheIsPrivate) { path.Append("u:").AppendNode(ctx.reqData["login"]); } else { path.AppendNode("public"); } path.AppendNode(ctx.reqData["res"]) .AppendNode(ctx.reqData["params"]); return(path.ToString()); }
private static void requestCompleteH(object sender, AsyncCompletedEventArgs status) { CharpCtx ctx = (CharpCtx)status.UserState; ctx.status = status; Charp charp = ctx.charp; JObject data = charp.handleResult(ctx, false); if (data != null) { charp.requestSuccess(data, ctx); } if (ctx.req_complete != null) { ctx.req_complete(ctx); } }
private void UploadFileAsync(Uri uri, NameValueCollection data, CharpCtx ctx) { string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x"); byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n"); MemoryStream rs = new MemoryStream(); string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}"; foreach (string key in data.Keys) { rs.Write(boundarybytes, 0, boundarybytes.Length); string formitem = string.Format(formdataTemplate, key, data[key]); byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); rs.Write(formitembytes, 0, formitembytes.Length); } rs.Write(boundarybytes, 0, boundarybytes.Length); string header = "Content-Disposition: form-data; name=\"file\"\r\nContent-Type: application/octet-stream\r\n\r\n"; byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header); rs.Write(headerbytes, 0, headerbytes.Length); FileStream fileStream = new FileStream(ctx.fileName, FileMode.Open, FileAccess.Read); byte[] buffer = new byte[4096]; int bytesRead = 0; while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0) { rs.Write(buffer, 0, bytesRead); } fileStream.Close(); byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n"); rs.Write(trailer, 0, trailer.Length); rs.Close(); ctx.wc.Headers.Set("Content-Type", "multipart/form-data; boundary=" + boundary); ctx.wc.UploadDataAsync(uri, "POST", rs.ToArray(), ctx); }
public override void handleError(CharpError err, CharpCtx ctx = null) { if (ctx != null && ctx.error != null && !ctx.error(err, ctx)) { return; } Gtk.Application.Invoke(delegate { CharpGtkErrorDlg dlg = new CharpGtkErrorDlg(err, ctx); if (ctx is CharpGtkCtx && ((CharpGtkCtx)ctx).parent != null) { dlg.TransientFor = ((CharpGtkCtx)ctx).parent; } else if (parent != null) { dlg.TransientFor = parent; } dlg.Run(); }); }
private JObject handleResult(CharpCtx ctx, bool isReply) { if (!resultHandleHttpErrors(ctx)) { return(null); } if ((isReply || ctx.asAnon) && ctx.reply_complete_handler != null) { if (ctx.useCache) { cacheSet(ctx, ctx.status); } if (ctx.reply_complete_handler(ctx)) { return(null); } } byte[] result = ctx.Result; JObject data; try { data = JSON.decode(result); } catch (Exception e) { CharpError err = ERRORS [(int)ERR.AJAX_JSON]; err.msg = String.Format(Catalog.GetString("Error: {0}, Data: {1}"), e.Message, Encoding.UTF8.GetString(result)); handleError(err, ctx); return(null); } if (data["error"] != null) { handleError(data ["error"], ctx); return(null); } return(data); }
public string ToString(CharpCtx ctx = null) { StringBuilder b = new StringBuilder(); b.Append(((int)sev < 3) ? Catalog.GetString("Error") : Catalog.GetString("Warning")); b.AppendFormat(Catalog.GetString(" {0}: \n{1}\n"), key, desc); if (ctx != null) { b.AppendFormat(Catalog.GetString("{0}: "), ctx.reqData ["res"]); } if (statestr != null) { b.Append(statestr); } if (state != "") { b.AppendFormat(Catalog.GetString(" ({0})\n"), state); } b.AppendFormat(Catalog.GetString("{0}\n"), msg); b.AppendFormat(Catalog.GetString("{0}\n"), ERR_SEV_MSG [(int)sev]); return(b.ToString()); }
private void replySuccess(Dictionary<string, object> data, UploadValuesCompletedEventArgs status, CharpCtx ctx) { if (!data.ContainsKey ("fields") || !data.ContainsKey ("data")) { handleError (ERRORS [(int) ERR.DATA_BADMSG], ctx); } object res; ArrayList fields = (ArrayList) data["fields"]; ArrayList dat = (ArrayList) data["data"]; if (fields.Count == 1 && (string) fields[0] == "rp_" + ctx.reqData["res"]) { res = ((ArrayList) dat[0])[0]; } else if (!ctx.asArray) { ArrayList arr = new ArrayList (); ArrayList d; for (int i = 0; i < dat.Count; i++) { d = (ArrayList) dat[i]; Dictionary<string, object> so = null; StringDictionary ss = null; if (ctx.valuesAsObjects) { so = new Dictionary<string, object> (); } else { ss = new StringDictionary (); } string f; for (int j = 0; j < fields.Count; j++) { f = (string) fields[j]; if (ctx.valuesAsObjects) { so[f] = d[j]; } else { ss[f] = (string) d[j]; } } if (ctx.valuesAsObjects) { arr.Add (so); } else { arr.Add (ss); } } res = arr; } else { res = dat; } if (ctx.useCache) cacheSet (ctx, res); if (ctx.success != null) ctx.success (res, status, ctx); }
private void reply(string chal, CharpCtx ctx) { Uri uri = new Uri (baseUrl + "reply"); string hash = GetHexHash (sha, login + chal + passwd); NameValueCollection data = new NameValueCollection (); data["login"] = login; data["chal"] = chal; data["hash"] = hash; if (ctx.reply_handler != null) { ctx.reply_handler (uri, data, ctx); return; } ctx.wc = new WebClient (); ctx.wc.UploadValuesCompleted += new UploadValuesCompletedEventHandler (replyCompleteH); ctx.wc.UploadValuesAsync (uri, "POST", data, ctx); }
private Dictionary<string, object> handleResult(UploadValuesCompletedEventArgs status, CharpCtx ctx) { if (!resultHandleErrors (status, ctx)) return null; if (ctx.success_handler != null) { if (ctx.useCache) cacheSet (ctx, status); ctx.success_handler (status, ctx); return null; } Dictionary<string, object> data; try { data = (Dictionary<string, object>) JSON.decode (status.Result); } catch (Exception e) { CharpError err = ERRORS [(int) ERR.AJAX_JSON]; err.msg = String.Format (Catalog.GetString ("Error: {0}, Data: {1}"), e.Message, Encoding.UTF8.GetString (status.Result)); handleError (err, ctx); return null; } if (data.ContainsKey ("error")) { handleError ((Dictionary<string, object>) data ["error"], ctx); return null; } return data; }
private void cacheSet(CharpCtx ctx, object res) { Dictionary<string, object> cache = (ctx.cacheIsPrivate)? privateCache: commonCache; if (!cache.ContainsKey (ctx.cacheArea)) cache[ctx.cacheArea] = new Dictionary<string, object> (); Dictionary<string, object> area = (Dictionary<string, object>) cache[ctx.cacheArea]; string path = cacheCtxToPath (ctx); area[path] = res; }
private object cacheGet(CharpCtx ctx) { Dictionary<string, object> cache = (ctx.cacheIsPrivate)? privateCache: commonCache; if (!cache.ContainsKey (ctx.cacheArea)) return null; Dictionary<string, object> area = (Dictionary<string, object>) cache[ctx.cacheArea]; string path = cacheCtxToPath (ctx); if (!area.ContainsKey (path)) return null; return area[path]; }
private string cacheCtxToPath(CharpCtx ctx) { PathBuilder path = new PathBuilder (); if (ctx.cacheIsPrivate) path.Append ("u:").AppendNode (ctx.reqData["login"]); else path.AppendNode ("public"); path.AppendNode (ctx.reqData["res"]) .AppendNode (ctx.reqData["params"]); return path.ToString (); }
public void request(string resource, object[] parms = null, CharpCtx ctx = null) { if (ctx == null) { ctx = new CharpCtx (); } if (parms == null) { parms = new object[] {}; } if (login == "!anonymous") { ctx.asAnon = true; } NameValueCollection data = new NameValueCollection (); data["login"] = (login == null)? "!anonymous": login; data["res"] = resource; if (ctx.asAnon) { data["anon"] = "1"; } data["params"] = JSON.encode (parms); ctx.reqData = data; if (ctx.useCache && !ctx.cacheRefresh) { object res = cacheGet (ctx); if (res != null) { if (ctx.req_complete != null) ctx.req_complete (null, ctx); if (ctx.success_handler != null) { ctx.success_handler ((UploadValuesCompletedEventArgs) res, ctx); } else { if (ctx.success != null) ctx.success (res, null, ctx); } if (ctx.complete != null) ctx.complete (null, ctx); return; } } ctx.charp = this; ctx.wc = new WebClient (); ctx.wc.UploadValuesCompleted += new UploadValuesCompletedEventHandler (requestCompleteH); ctx.wc.UploadValuesAsync (new Uri (baseUrl + "request"), "POST", data, ctx); }
public void handleError(Dictionary<string, object> err, CharpCtx ctx = null) { CharpError cerr = new CharpError { code = Int32.Parse ((string) err["code"]), sev = (ERR_SEV) Int32.Parse ((string) err["sev"]), desc = (string) err["desc"], msg = (string) err["msg"], lvl = (ERR_LEVEL) Int32.Parse ((string) err["level"]), key = (string) err["key"], state = (string) err["state"], statestr = (string) err["statestr"] }; handleError (cerr, ctx); }
public abstract void handleError(CharpError err, CharpCtx ctx = null);
public void request(string resource, object[] parms = null, CharpCtx ctx = null) { Uri uri = new Uri(baseUrl + "request"); if (ctx == null) { ctx = new CharpCtx(); } if (parms == null) { parms = new object[] {}; } if (login == "!anonymous") { ctx.asAnon = true; } NameValueCollection data = new NameValueCollection() { { "login", (login == null)? "!anonymous" : login }, { "res", resource }, { "params", JSON.encode(parms) } }; if (ctx.asAnon) { data["anon"] = "1"; } ctx.reqData = data; if (ctx.useCache && !ctx.cacheRefresh) { object res = cacheGet(ctx); if (res != null) { if (ctx.req_complete != null) { ctx.req_complete(ctx); } if (ctx.reply_complete_handler != null) { ctx.status = (AsyncCompletedEventArgs)res; ctx.reply_complete_handler(ctx); } else { if (ctx.success != null) { ctx.success(res, ctx); } } if (ctx.complete != null) { ctx.complete(ctx); } return; } } ctx.charp = this; ctx.wc = new WebClient(); if (ctx.asAnon && ctx.fileName != null) { ctx.wc.UploadDataCompleted += new UploadDataCompletedEventHandler(requestCompleteH); UploadFileAsync(uri, data, ctx); return; } ctx.wc.UploadValuesCompleted += new UploadValuesCompletedEventHandler(requestCompleteH); ctx.wc.UploadValuesAsync(uri, "POST", data, ctx); }
private void requestSuccess(Dictionary<string, object> data, UploadValuesCompletedEventArgs status, CharpCtx ctx) { if (ctx.asAnon) { replySuccess (data, status, ctx); return; } if (data.ContainsKey ("chal")) { reply ((string) data ["chal"], ctx); return; } handleError (ERRORS [(int) ERR.DATA_BADMSG], ctx); }
public string ToString(CharpCtx ctx = null) { StringBuilder b = new StringBuilder (); b.Append (((int)sev < 3) ? Catalog.GetString ("Error") : Catalog.GetString ("Warning")); b.AppendFormat (Catalog.GetString (" {0}: \n{1}\n"), key, desc); if (ctx != null) { b.AppendFormat (Catalog.GetString ("{0}: "), ctx.reqData ["res"]); } if (statestr != null) { b.Append (statestr); } if (state != "") { b.AppendFormat (Catalog.GetString (" ({0})\n"), state); } b.AppendFormat (Catalog.GetString ("{0}\n"), msg); b.AppendFormat (Catalog.GetString ("{0}\n"), ERR_SEV_MSG [(int)sev]); return b.ToString (); }
public bool resultHandleErrors(UploadValuesCompletedEventArgs status, CharpCtx ctx) { if (status.Cancelled) { handleError (ERRORS [(int) ERR.HTTP_CANCEL], ctx); return false; } if (status.Error != null) { CharpError err = ERRORS [(int) ERR.HTTP_SRVERR]; err.msg = String.Format (Catalog.GetString ("HTTP WebClient error: {0}"), status.Error.ToString ()); handleError (err, ctx); return false; } if (status.Result == null || status.Result.Length == 0) { handleError (ERRORS [(int) ERR.HTTP_CONNECT], ctx); return false; } return true; }