Пример #1
0
    static Upcall.ccn_upcall_res RequestCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info)
    {
        // this will be ran by a NON-Unity thread

        print("RequestCallback: " + kind);
        Egal.ccn_upcall_info Info = Egal.GetInfo(info);
        IntPtr h=Info.h;

        switch (kind) {
        case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT_UNVERIFIED:
        case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT:
            FirstAsteroidName = Egal.GetContentName(Info.content_ccnb);
            FirstAsteroid = Egal.GetContentValue(Info.content_ccnb, Info.pco);
            FirstAsteroidLabel = M.GetLabelFromName(FirstAsteroidName);
            break;
        case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST_TIMED_OUT:
            print("Initialize: request first asteroid interest timed out.");
            break;
        case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL:
            Egal.ccn_set_run_timeout(h, 0);
            Egal.killCurrentThread(); // kill current thread
            break;
        }
        return Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK;
    }
Пример #2
0
    static Upcall.ccn_upcall_res ReadCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info)
    {
        print("ReadCallback! " + kind);
        Upcall.ccn_upcall_res res = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK;

        Egal.ccn_upcall_info Info = new Egal.ccn_upcall_info();
        Info = (Egal.ccn_upcall_info)Marshal.PtrToStructure(info, typeof(Egal.ccn_upcall_info));
        IntPtr h=Info.h;

        switch (kind) {
        case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT:
            //print("ReadCallback: CCN_UPCALL_CONTENT");
            IntPtr source_ptr = Info.content_ccnb;

            Egal.ccn_parsed_ContentObject Pco = new Egal.ccn_parsed_ContentObject();
            Pco = (Egal.ccn_parsed_ContentObject)Marshal.PtrToStructure(Info.content_ccnb, typeof(Egal.ccn_parsed_ContentObject));

            UInt16 source_length = Pco.offset[(int)PCO.ccn_parsed_content_object_offsetid.CCN_PCO_E];

            IntPtr result_ptr = IntPtr.Zero;
            int result_length = 0;
            Egal.ccn_content_get_value(source_ptr, source_length, Info.pco, ref result_ptr, ref result_length);

            String content = Marshal.PtrToStringAnsi(result_ptr);
            print(content);

            break;
        case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL:
            //print("ReadCallback: CCN_UPCALL_FINAL");
            Egal.ccn_set_run_timeout(h, 0);
            break;
        default:
            break;
        }

        return res;
    }
Пример #3
0
    static Upcall.ccn_upcall_res DiscoverFishCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info)
    {
        //print("Fish Callback: " + kind);
        Egal.ccn_upcall_info Info = Egal.GetInfo(info);
        IntPtr h=Info.h;

        switch (kind) {
            case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT_UNVERIFIED:
            case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT:

                string name = Egal.GetContentName(Info.content_ccnb);
                string content = Egal.GetContentValue(Info.content_ccnb, Info.pco);
                FishNameContBuf.Write (name, content);

                string labels = M.GetLabelFromName(name);
                string oldcomponent = M.GetIDFromName(name);
                if(labels == null || oldcomponent == null)
                {
                    print("Ill name: " + name + ", belongs to: " + h);
                    break;
                }

                if(Discovery.nimbus.Contains(labels)==false) // we don't care about this octant any more
                {
                    print("don't care: " + h + ", " + labels);
                    break;
                }

                IntPtr c = Egal.ccn_charbuf_create();
                IntPtr templ = Egal.ccn_charbuf_create();
                IntPtr comp = Egal.ccn_charbuf_create();
                Egal.ccn_name_init(c);
                Egal.ccn_name_init(comp);

                string matchedprefix = M.GetNameTillID(name);
                string [] split = matchedprefix.Split(new char [] {'/'},StringSplitOptions.RemoveEmptyEntries);
                foreach(string s in split)
                {
                    Egal.ccn_name_append_str(c, s);
                }

                Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Interest, (int)TT.ccn_tt.CCN_DTAG);
                Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Name, (int)TT.ccn_tt.CCN_DTAG);
                Egal.ccn_charbuf_append_closer(templ); // </Name>

                Egal.ccn_charbuf_append_tt(templ, (int)Dtag.ccn_dtag.CCN_DTAG_Exclude, (int)TT.ccn_tt.CCN_DTAG);

                Egal.ccn_closure Selfp = (Egal.ccn_closure)Marshal.PtrToStructure(selfp, typeof(Egal.ccn_closure));
                M.Exclude Data = (M.Exclude) Marshal.PtrToStructure(Selfp.data, typeof(M.Exclude));
                Data.filter = Data.filter + "," + oldcomponent;
                Marshal.StructureToPtr(Data, Selfp.data, true);
                Marshal.StructureToPtr(Selfp, selfp, true);

                string newfilterlist = Data.filter;

                string [] filters = newfilterlist.Split(new char [] {','},StringSplitOptions.RemoveEmptyEntries);
                foreach(string s in filters)
                {
                    Egal.ccn_name_append_str(comp, s);
                }

                Egal.ccn_charbuf_append2(templ, comp);

                Egal.ccn_charbuf_append_closer(templ); // </Exclude>
                Egal.ccn_charbuf_append_closer(templ); // </Interest>

                // express interest again
                Handle.Pause();
                Egal.ccn_express_interest(h,c,selfp,templ);
                Handle.Resume();
                break;

            case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL:
                //print("CCN_UPCALL_FINAL: " + h);

                break;
            case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST_TIMED_OUT:
                //print("CCN_UPCALL_INTEREST_TIMED_OUT: " + h);
                break;
            default:
                print("othercallback: " + kind);
                break;
        }
        return Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK;
    }
Пример #4
0
    Upcall.ccn_upcall_res WriteCallback(IntPtr selfp, Upcall.ccn_upcall_kind kind, IntPtr info)
    {
        print("WriteCallback... " + kind);
        Upcall.ccn_upcall_res ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_OK;

        Egal.ccn_upcall_info Info = new Egal.ccn_upcall_info();
        Info = (Egal.ccn_upcall_info)Marshal.PtrToStructure(info, typeof(Egal.ccn_upcall_info));
        IntPtr h = Info.h;

        Egal.ccn_closure Selfp = new Egal.ccn_closure();
        Selfp = (Egal.ccn_closure)Marshal.PtrToStructure(selfp, typeof(Egal.ccn_closure));
        NormalStruct Data = new NormalStruct();
        Data = (NormalStruct) Marshal.PtrToStructure(Selfp.data, typeof(NormalStruct));

        switch(kind)
        {
        case Upcall.ccn_upcall_kind.CCN_UPCALL_FINAL:
           	// Marshal.FreeHGlobal(selfp); // this again, will make Unity crash
            break;

        case Upcall.ccn_upcall_kind.CCN_UPCALL_INTEREST:
            // print ("put content handle: " + h + ", content: " + Data.value);
            int res = PutContent(h, Data);
            if(res >= 0)
            {
                ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_INTEREST_CONSUMED;
                Egal.ccn_set_run_timeout(h, 0);
            }
            else
                print("put content error");

            break;

        case Upcall.ccn_upcall_kind.CCN_UPCALL_CONTENT:
            // repo first returns a content...
            // this is info of the repo...
            break;

        default:
            ret = Upcall.ccn_upcall_res.CCN_UPCALL_RESULT_ERR;
            break;
        }

        // print ("ref count: " + Selfp.refcount);
        // print ("WriteCallback returnning..." + ret);

        return ret;
    }