Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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;
        }
Exemple #4
0
        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);
            }
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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 ();
            });
        }
Exemple #8
0
        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]);
        }
Exemple #9
0
        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());
        }
Exemple #10
0
        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);
            }
        }
Exemple #11
0
        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);
        }
Exemple #12
0
        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();
            });
        }
Exemple #13
0
        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);
        }
Exemple #14
0
            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());
            }
Exemple #15
0
        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);
        }
Exemple #16
0
        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);
        }
Exemple #17
0
        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;
        }
Exemple #18
0
        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;
        }
Exemple #19
0
        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];
        }
Exemple #20
0
        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 ();
        }
Exemple #21
0
        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);
        }
Exemple #22
0
        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);
        }
Exemple #23
0
 public abstract void handleError(CharpError err, CharpCtx ctx = null);
Exemple #24
0
        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);
        }
Exemple #25
0
 public abstract void handleError(CharpError err, CharpCtx ctx = null);
Exemple #26
0
        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);
        }
Exemple #27
0
            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 ();
            }
Exemple #28
0
        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;
        }