From 42339921e34c3b832a5af684ca288866cb034736 Mon Sep 17 00:00:00 2001 From: "radostin.dimitrov" Date: Mon, 22 Apr 2019 18:08:59 +0300 Subject: [PATCH 1/2] fixed updating, removing link functionality;fixed test; --- .gitignore | 9 ++ apps/roster/src/protocol/roster_link.erl | 184 +++++++++++++++-------- apps/roster/src/roster.erl | 2 +- apps/roster/src/test/room_test.erl | 144 +++++++++++------- 4 files changed, 220 insertions(+), 119 deletions(-) diff --git a/.gitignore b/.gitignore index 2726ae357..727e3341c 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,12 @@ priv/protobuf/service_room/jobType.proto priv/protobuf/service_room/messageEvent.proto priv/protobuf/service_room/messageStatus.proto priv/protobuf/service_room/messageType.proto +apps/roster/priv/macbert/Model/FakeNumbers.swift +apps/roster/priv/macbert/Model/Presence.swift +apps/roster/priv/macbert/Model/cx.swift +apps/roster/priv/macbert/Model/load.swift +apps/roster/priv/macbert/Spec/FakeNumbers_Spec.swift +apps/roster/priv/macbert/Spec/Presence_Spec.swift +apps/roster/priv/macbert/Spec/cx_Spec.swift +apps/roster/priv/macbert/Spec/load_Spec.swift +apps/service/priv/ diff --git a/apps/roster/src/protocol/roster_link.erl b/apps/roster/src/protocol/roster_link.erl index 74be0db6f..87f933d54 100644 --- a/apps/roster/src/protocol/roster_link.erl +++ b/apps/roster/src/protocol/roster_link.erl @@ -4,38 +4,30 @@ -include_lib("roster/include/static/roster_var.hrl"). -include_lib("roster/include/static/main_text.hrl"). -include_lib("n2o/include/n2o.hrl"). + +-import(lists, [map/2, member/2, keydelete/3, keymember/3, keystore/4, keyreplace/4]). + -compile(export_all). +% ====================================== +% API +% ====================================== info(#'Link'{id = LinkId, type = group, status = join = LStatus} = RequestData, Req, #cx{params = ClientId} = State) when LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), -Res = case get_room_by_link_Id(LinkId) of - #ok{code = #'Room'{id = RoomId} = Room}-> - #'Member'{id = MemberId, reader = MemberReader} = - Member = case roster:muc_member(ClientId, RoomId) of - #'Member'{} = M -> M; - _ -> - PhoneID = roster:phone_id(ClientId), - Member0 = #'Member'{ - feed_id = #muc{name = RoomId}, - phone_id = PhoneID, - reader = 0, update = 0, - presence = roster:is_online(PhoneID), - status = member}, - #ok{code = Member1} = roster:to_member(PhoneID), - roster:patch_member(Member0, Member1) - end, - Messages = case roster:member_lastmsg(Member) of - {error, _} -> []; - {_, LM} -> LM - end, + Res = case get_room_by_link_id(LinkId) of + #ok{code = #'Room'{id = RoomId} = Room} -> + #'Member'{id = MemberId, reader = MemberReader} = + Member = build_membership_card(ClientId, RoomId), + Messages = member_last_messages(Member), {UnreadMsg, LastMsg, _} = roster:unread_msg({'Message', Messages}, MemberReader, MemberId), {#'Member'{}, [], #'Room'{} = Room1} = roster:add_member(Room, Member, {no_muc_message, Room#'Room'.readers}), {As, Ms} = roster:split_members(roster:members(#muc{name = Room1#'Room'.id}, presence)), - roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Ms, admins = As}); - #error{code = not_found} = Err -> Err - end, + #'Room'{} = Room2 = roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Ms, admins = As}), + ok_code(Room2); + #error{code = not_found} = Err -> Err + end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; @@ -43,12 +35,13 @@ info(#'Link'{id = LinkId, name = RoomId, type = group, status = update = LStatus Req, #cx{params = ClientId} = State) when RoomId /= [], LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), Res = case roster:muc_member(ClientId, RoomId) of - #'Member'{status = admin} = M-> - update_link(RoomId, RequestData); - #'Member'{status = member} -> - error_code(permission_denied); - _-> - error_code(invalide_data) + #'Member'{status = Status} when + Status == owner; Status == admin -> + update_link(RoomId, RequestData); + #'Member'{status = member} -> + error_code(permission_denied); + _ -> + error_code(invalid_data) end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; @@ -56,71 +49,130 @@ info(#'Link'{id = LinkId, name = RoomId, type = group, status = update = LStatus info(#'Link'{id = LinkId, type = group, status = get = LStatus} = RequestData, Req, #cx{params = ClientId} = State) when LinkId /= [] -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), - Res = case get_room_by_link_Id(LinkId) of - #ok{code = #'Room'{id = RoomId} = Room } -> #ok{code = Room#'Room'{status = info}}; - #error{code = not_found} = Err -> Err - end, + Res = case get_room_by_link_id(LinkId) of + #ok{code = #'Room'{} = Room} -> + #ok{code = Room#'Room'{status = info}}; + #error{code = not_found} = Err -> Err + end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; -info(#'Link'{status = delete = LStatus} = RequestData, Req, #cx{params = ClientId} = State) -> +info(#'Link'{type = group, status = delete = LStatus} = RequestData, + Req, #cx{params = ClientId} = State) -> roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), + % Res = delete_link(ClientId, RequestData), Res = error_code(permission_denied), roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), {reply, {bert, Res}, Req, State}; info(#'Link'{} = RequestData, Req, #cx{params = ClientId} = State) -> roster:info(?MODULE, "~p:Link/unknown:~p", [ClientId, RequestData]), - {reply, {bert, io_error_code(invalid_data)}, Req, State}. + {reply, {bert, io_error(invalid_data)}, Req, State}. +% ====================================== +% Helper functions +% ====================================== -gen_link(RoomId)-> +gen_link(RoomId) -> TmpLinkId = hash(RoomId), LinkId = case kvs:get('Link', TmpLinkId) of - #ok{code = #'Link'{id = TmpLinkId}}-> gen_link(RoomId); - #error{code = not_found} -> TmpLinkId - end, - -#'Link'{ + #ok{code = #'Link'{id = TmpLinkId}} -> gen_link(RoomId); + #error{code = not_found} -> TmpLinkId + end, + + #'Link'{ % id = <>, id = LinkId, name = RoomId, - type = group + type = group, + status = get }. -update_link(RoomId, #'Link'{id = LinkId} = Link) -> - Res = case kvs:get('Room', RoomId) of +update_link(#'Link'{name = RoomId} = Link) -> + update_link(RoomId, Link). +update_link(RoomId, #'Link'{id = LinkId}) -> + case kvs:get('Room', RoomId) of #ok{code = #'Room'{links = Links0} = Room} -> - NewLink = gen_link(RoomId), - % Links1 = lists:keyreplace(LinkId, #'Link'.id, Links0, NewLink), - ok = kvs:put(Room#'Room'{links = [NewLink]}), - ok = kvs:delete('Link', LinkId), - ok = kvs:put(NewLink), - NewLink; - #error{code = not_found} = Err -> Err - end, - Res. + % remove case statement for multiple links + case keymember(LinkId, #'Link'.id, Links0) of + true -> + NewLink = gen_link(RoomId), + Links1 = keystore(LinkId, #'Link'.id, Links0, NewLink), + ok = kvs:put(Room#'Room'{links = Links1}), + ok = kvs:delete('Link', LinkId), + ok = kvs:put(NewLink), + ok_code(NewLink); + false -> #error{code = invalid_data} + end; + #error{code = not_found} = Err -> Err + end. + +delete_link(ClientId, #'Link'{id = LinkId, name = RoomId}) -> + map( + fun(#'Member'{status = member}) -> + error_code(permission_denied); + (#'Member'{status = Status}) when + Status == owner; Status == admin -> + case kvs:get('Room', RoomId) of + #ok{code = #'Room'{id = RoomId, links = Links} = Room} -> + ok = kvs:put(Room#'Room'{links = keydelete(LinkId, #'Link'.id, Links)}), + ok = kvs:delete('Link', LinkId); + #error{code = not_found} = Err -> Err + end; + (_) -> error_code(invalid_data) + end, roster:muc_member(ClientId, RoomId)). -purge_link(RoomId)-> - [kvs:delete('Link', Lid) || #'Link'{id = Lid,name = RoomId}<- kvs:all('Link')], +purge_room_links(RoomId) -> + %% TODO: Improve error handling + case kvs:get('Room', RoomId) of + #ok{code = #'Room'{links = Links}} when + is_list(Links), Links /= [] -> + [kvs:delete('Link', Lid) || #'Link'{id = Lid, name = RoomId} <- Links]; + _ -> [] + end, ok. hash(Data) -> {_, <>} = roster:gen_token([], Data), Hash. -get_room_by_link_Id(<>)-> - get_room_by_link_Id(LinkId); -get_room_by_link_Id(Id) -> - case kvs:get('Link',Id) of - #ok{code = #'Link'{name = RoomId}}-> - case kvs:get('Room',RoomId) of + +get_room_by_link_id(<>) -> + get_room_by_link_id(LinkId); +get_room_by_link_id(Id) -> + case kvs:get('Link', Id) of + #ok{code = #'Link'{name = RoomId}} -> + case kvs:get('Room', RoomId) of #ok{code = #'Room'{}} = Ok -> Ok; #error{code = not_found} = Err -> Err end; #error{code = not_found} = Err -> Err - end. -io_error_code(Payload) -> io_code(error_code(Payload)). -io_ok_code(Payload) -> io_code(ok_code(Payload)). + end. + +build_membership_card(ClientId, RoomId) -> + case roster:muc_member(ClientId, RoomId) of + #'Member'{} = M -> M; + _ -> + PhoneID = roster:phone_id(ClientId), + Member0 = #'Member'{ + feed_id = #muc{name = RoomId}, + phone_id = PhoneID, + reader = 0, update = 0, + presence = roster:is_online(PhoneID), + status = member}, + #ok{code = Member1} = roster:to_member(PhoneID), + roster:patch_member(Member0, Member1) + end. + +member_last_messages(Member) -> + case roster:member_lastmsg(Member) of + {error, _} -> []; + {_, LM} -> LM + end. + +ok_code(Payload) -> #ok{code = Payload}. +error_code(Payload) -> #error{code = Payload}. + +io_ok(Payload) -> io_code(ok_code(Payload)). +io_error(Payload) -> io_code(error_code(Payload)). + io_code(Payload) -> #io{code = Payload}. -error_code(Payload) -> #error{code = Payload}. -ok_code(Payload) -> #ok{code =Payload}. diff --git a/apps/roster/src/roster.erl b/apps/roster/src/roster.erl index 8efcefd88..46f60f057 100644 --- a/apps/roster/src/roster.erl +++ b/apps/roster/src/roster.erl @@ -779,7 +779,7 @@ validate(Payload, ClientId) -> %% MUC API purge_room(false) -> []; purge_room(Room) -> - roster_link:purge_link(Room), + roster_link:purge_room_links(Room), [begin kvs:remove('Member', Id), kvs:delete(reader, R), unsubscribe_room(M), remove_rooms(PhoneId, [Room]) end || #'Member'{id = Id, phone_id = PhoneId, reader = R} = M <- members(#muc{name = Room})], kvs:delete(writer, {muc, Room}), delete_msg(#muc{name = Room}), diff --git a/apps/roster/src/test/room_test.erl b/apps/roster/src/test/room_test.erl index 0b5a3d8db..96f1a2de5 100644 --- a/apps/roster/src/test/room_test.erl +++ b/apps/roster/src/test/room_test.erl @@ -125,15 +125,12 @@ link() -> roster_client:send_receive(AClientId, Counter + 1, #'Room'{status = add, id = RoomID, admins = [EM]}), true = is_integer(U), %% Get the room link by RoomId - #ok{code = #'Room'{links = [#'Link'{id = LinkId}]}} = kvs:get('Room', Room), + #ok{code = #'Room'{links = [#'Link'{id = LinkId}]}} = kvs:get('Room', Room), %% Assert linkId by Link get request - #ok{code = #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]}} = -roster_client:send_receive(AClientId, 1, #'Link'{type = group, status = get, id = LinkId}), + #ok{code = #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]}} = + roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, type = group, status = get}), %% Update the link from the administrator and compare it with the old one. - % #'Room'{links = LinkId} =/= - X = roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), -io:format("~nXXXXXXXXXXXXXXXXXXXXX~p~n",[X]), - + #ok{code = #'Link'{id = LinkId}} /= roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), %%add member with message size roster:purge_user(FPhone = <<"6789000">>), {FClientId, FToken} = roster_client:reg_fake_user(FPhone), @@ -171,59 +168,102 @@ reg_by_phone(Phones, #'muc'{} = Feed) -> test_joinlink() -> +%%% Initializing test state. RoomName = RoomId = <<"test_room_joinlink">>, roster:purge_room(RoomId), Feed = #muc{name = RoomId}, - GroupAMembers = [{_APhone = <<"9000000001">>, admin}, - {_BPhone = <<"9000000002">>, member}], - GroupACounter = length(GroupAMembers), - [{APhoneId, AClientId, _, _}, {BPhoneId, BClientId, _, _}] = - GroupAPCs = reg_by_phone(GroupAMembers, Feed), - GroupAClientIds = [ClientId || {_, ClientId, _, _} <- GroupAPCs], - roster_client:set_filer(GroupAClientIds, filter), - {[Owner | _], Members} = roster:split_members([M || {_, _, M, _} <- GroupAPCs]), - RoomInit = #'Room'{status = create, type = group, id = RoomId, name = RoomName, - admins = [Owner#'Member'{alias = <<"Radostin">>}], members = [hd(Members)]}, - #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], - admins = [_RoomOwner = #'Member'{phone_id = APhoneId}], - members = [#'Member'{phone_id = BPhoneId}]} = - roster_client:send_receive(AClientId, GroupACounter, RoomInit), - -%% Test: get room info with fake room link - roster_link:io_error_code(room_not_found) == roster_client:send_receive(BClientId, 1, #'Link'{id = ?BLANK_LINK, type = group, status = get}), -%% Test: get room info with correct room link - kvs:get('Room', RoomId) == #ok{code = roster_client:send_receive(BClientId, 1, #'Link'{id = LinkId, type = group, status = get})}, - GroupBMembers = [{<<"9000000003">>, member}, {<<"9000000004">>, member}], -% GroupBCounter = length(GroupBMembers), - [{CPhoneId, CClientId, _, _}, {_, DClientId, _, _}] = - _GroupBPCs = reg_by_phone(GroupBMembers, Feed), - -%% Test: join room - #'Room'{members = Room2Members} = roster_client:send_receive(CClientId, 1, #'Link'{id = LinkId, type = group, status = join}), - true == lists:keymember(CPhoneId, #'Member'.phone_id, Room2Members), -%% Test: update old link and try to join with new one - % #'Link'{name = LinkId1} = -roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = RoomId, type = group, status = update}). -% , -% roster_client:send_receive(DClientId, 1, #'Link'{id = LinkId1, type = group, status = join}), -% %%% Test: Delete joinlink -% %% Non admin user -% roster_link:io_error_code(invalid_data) == roster_client:send_receive(DClientId, 1, #'Link'{id = LinkId, name = RoomId, type = group, status = delete}), -% %% Admin user, unavailable link (old) -% roster_link:io_error_code(invalid_data) == -% roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = RoomId, type = group, status = delete}), -% %% Test join: unexisting link -% [{_, EClientId, _, _}] = reg_by_phone([{<<"9000000005">>, member}], #muc{}), -% roster_link:io_error_code(room_not_found) == roster_client:send_receive(EClientId, 1, #'Link'{id = LinkId1, type = group, status = join}), -% %% Disconnect users -% [roster_client:stop_client(CId) || CId <- GroupAClientIds ++ [CClientId, DClientId, EClientId]], -% ok. + Phones = [ + {_APhone = <<"9000000001">>, admin}, + {_BPhone = <<"9000000002">>, admin}, + {_CPhone = <<"9000000003">>, member}, + {_DPhone = <<"9000000004">>, member}, + {_EPhone = <<"9000000005">>, member} + ], + + PCMT = [ + {_APhoneId, AClientId, _AMember, _AToken}, + {_BPhoneId, BClientId, _BMember, _BToken}, + {CPhoneId, _CClientId, _CMember, _CToken}, + {DPhoneId, DClientId, _DMember, _DToken}, + {EPhoneId, EClientId, _EMember, _EToken} + ] = reg_by_phone(Phones, Feed), + + { + _PhoneIds, + ClientIds, + MembersList, + _Tokens + } = lists:foldr(fun({P, C, M, T}, {Ps, Cs, Ms, Ts}) -> + {[P | Ps], [C | Cs], [M | Ms], [T | Ts]} end, {[], [], [], []}, PCMT), + roster_client:set_filer(ClientIds, filter), + + {[Owner, Admin], RoomMembers} = roster:split_members(MembersList), + +%%% Initializing Room state. + RoomInit = #'Room'{id = RoomId, name = RoomName, + members = [hd(RoomMembers)], + admins = [ + Owner#'Member'{alias = <<"Radostin">>, status = admin}, + Admin#'Member'{alias = <<"Admin">>, status = admin} + ], + type = group, + status = create}, + +%%% Create and join first three clients to the 'Room'. + #'Room'{id = RoomId, links = [#'Link'{id = LinkId} = Link], + admins = RoomAdmins0, + members = [#'Member'{phone_id = CPhoneId}]} = + roster_client:send_receive(AClientId, 3, RoomInit), + lists:all(fun(true)-> true end, [lists:keymember(CId, #'Member'.phone_id, RoomAdmins0) + || CId <- [Owner#'Member'.phone_id, Admin#'Member'.phone_id]]), + +%%% Start tests: +%% Test: try to get room info; fake room link; admin + {error, not_found} = roster_client:send_receive(BClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = get}), + +%% Test: try to get room info; correct room link; admin + {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + roster_client:send_receive(BClientId, 1, Link#'Link'{status = get}), + +%% Test: try to get room info; correct room link; not room member + {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + roster_client:send_receive(DClientId, 1, Link#'Link'{status = get}), + +%% Test: join room + {ok, #'Room'{id = RoomId, status = join} = Room1} = + roster_client:send_receive(DClientId, 1, Link#'Link'{status = join}), +% Check if new member is added + true = lists:keymember(DPhoneId, #'Member'.phone_id, Room1#'Room'.members), +%% Test: try to update room link; room member, non admin + {error, permission_denied} = roster_client:send_receive(DClientId, 1, Link#'Link'{status = update}), +%% Test: try to update room link; non room member, non admin, fake link + {error, invalid_data} = roster_client:send_receive(EClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = update}), +%% Test: try to update room link; non room member + {error, invalid_data} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = update}), +%% Test: try to update room link; room member, admin + {ok, #'Link'{name = RoomId} = Link1} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), +%% Test: try to get room info; correct room link; + {ok, #'Room'{id = RoomId, links = [Link1], status = info}} = + roster_client:send_receive(EClientId, 1, Link1#'Link'{status = get}), +%% Test: try to update room link; non-existent link, room member, admin + {error, invalid_data} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), +%% Test: join room; non-existent link, non room member + {error, not_found} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = join}), +%% Test: join room; non room member + {ok, #'Room'{id = RoomId, links = [Link1], status = join} = Room2} = + roster_client:send_receive(EClientId, 1, Link1#'Link'{status = join}), +% Check if new member is added + true = lists:keymember(EPhoneId, #'Member'.phone_id, Room2#'Room'.members), + %%% Disconnect Clients + [roster_client:stop_client(CId) || CId <- ClientIds], + ok. suite() -> [ check_alias_increment(), - add_many_members() + add_many_members(), + test_joinlink() ]. check() -> roster:check(?MODULE). \ No newline at end of file -- GitLab From 5b497310a5df6a80ce0144c0ccb7a82fde62a60e Mon Sep 17 00:00:00 2001 From: "radostin.dimitrov" Date: Wed, 24 Apr 2019 14:32:20 +0300 Subject: [PATCH 2/2] sync to cluster;fixed nested joinlink response; fixed joinlink test --- apps/roster/priv/macbert/Source/Decoder.swift | 270 ++++++ apps/roster/priv/macbert/json-bert.js | 915 ++++++++++++++++++ apps/roster/src/protocol/roster_link.erl | 7 +- apps/roster/src/test/room_test.erl | 16 +- 4 files changed, 1196 insertions(+), 12 deletions(-) diff --git a/apps/roster/priv/macbert/Source/Decoder.swift b/apps/roster/priv/macbert/Source/Decoder.swift index af2be88aa..d0eb85fde 100644 --- a/apps/roster/priv/macbert/Source/Decoder.swift +++ b/apps/roster/priv/macbert/Source/Decoder.swift @@ -1,6 +1,246 @@ func parseObject(name: String, body:[Model], tuple: BertTuple) -> AnyObject? { switch name { + case "writer": + if body.count != 5 { return nil } + let a_writer = writer() + a_writer.id = body[0].parse(bert: tuple.elements[1]) as? AnyObject + a_writer.count = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_writer.cache = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_writer.args = body[3].parse(bert: tuple.elements[4]) as? AnyObject + a_writer.first = body[4].parse(bert: tuple.elements[5]) as? [AnyObject] + return a_writer + case "reader": + if body.count != 6 { return nil } + let a_reader = reader() + a_reader.id = body[0].parse(bert: tuple.elements[1]) as? AnyObject + a_reader.pos = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_reader.cache = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_reader.args = body[3].parse(bert: tuple.elements[4]) as? AnyObject + a_reader.feed = body[4].parse(bert: tuple.elements[5]) as? AnyObject + a_reader.dir = body[5].parse(bert: tuple.elements[6]) as? AnyObject + return a_reader + case "cur": + if body.count != 11 { return nil } + let a_cur = cur() + a_cur.id = body[0].parse(bert: tuple.elements[1]) as? AnyObject + a_cur.top = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_cur.bot = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_cur.dir = body[3].parse(bert: tuple.elements[4]) as? AnyObject + a_cur.reader = body[4].parse(bert: tuple.elements[5]) as? [AnyObject] + a_cur.writer = body[5].parse(bert: tuple.elements[6]) as? [AnyObject] + a_cur.args = body[8].parse(bert: tuple.elements[9]) as? [AnyObject] + return a_cur + case "iter": + if body.count != 5 { return nil } + let a_iter = iter() + a_iter.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_iter.container = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_iter.feed = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_iter.next = body[3].parse(bert: tuple.elements[4]) as? Int64 + a_iter.prev = body[4].parse(bert: tuple.elements[5]) as? Int64 + return a_iter + case "container": + if body.count != 4 { return nil } + let a_container = container() + a_container.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_container.top = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_container.rear = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_container.count = body[3].parse(bert: tuple.elements[4]) as? Int64 + return a_container + case "iterator": + if body.count != 6 { return nil } + let a_iterator = iterator() + a_iterator.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_iterator.container = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_iterator.feed_id = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_iterator.prev = body[3].parse(bert: tuple.elements[4]) as? Int64 + a_iterator.next = body[4].parse(bert: tuple.elements[5]) as? Int64 + a_iterator.feeds = body[5].parse(bert: tuple.elements[6]) as? [AnyObject] + return a_iterator + case "log": + if body.count != 6 { return nil } + let a_log = log() + a_log.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_log.top = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_log.rear = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_log.count = body[3].parse(bert: tuple.elements[4]) as? Int64 + return a_log + case "operation": + if body.count != 9 { return nil } + let a_operation = operation() + a_operation.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_operation.container = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_operation.feed_id = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_operation.prev = body[3].parse(bert: tuple.elements[4]) as? Int64 + a_operation.next = body[4].parse(bert: tuple.elements[5]) as? Int64 + a_operation.feeds = body[5].parse(bert: tuple.elements[6]) as? [AnyObject] + return a_operation + case "feed": + if body.count != 5 { return nil } + let a_feed = feed() + a_feed.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_feed.top = body[1].parse(bert: tuple.elements[2]) as? Int64 + a_feed.rear = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_feed.count = body[3].parse(bert: tuple.elements[4]) as? Int64 + return a_feed + case "task": + if body.count != 4 { return nil } + let a_task = task() + a_task.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_task.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_task.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_task.roles = body[3].parse(bert: tuple.elements[4]) as? String + return a_task + case "userTask": + if body.count != 4 { return nil } + let a_userTask = userTask() + a_userTask.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_userTask.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_userTask.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_userTask.roles = body[3].parse(bert: tuple.elements[4]) as? String + return a_userTask + case "serviceTask": + if body.count != 4 { return nil } + let a_serviceTask = serviceTask() + a_serviceTask.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_serviceTask.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_serviceTask.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_serviceTask.roles = body[3].parse(bert: tuple.elements[4]) as? String + return a_serviceTask + case "receiveTask": + if body.count != 4 { return nil } + let a_receiveTask = receiveTask() + a_receiveTask.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_receiveTask.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_receiveTask.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_receiveTask.roles = body[3].parse(bert: tuple.elements[4]) as? String + return a_receiveTask + case "messageEvent": + if body.count != 5 { return nil } + let a_messageEvent = messageEvent() + a_messageEvent.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_messageEvent.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_messageEvent.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_messageEvent.payload = body[3].parse(bert: tuple.elements[4]) as? String + a_messageEvent.timeout = body[4].parse(bert: tuple.elements[5]) as? [AnyObject] + return a_messageEvent + case "boundaryEvent": + if body.count != 8 { return nil } + let a_boundaryEvent = boundaryEvent() + a_boundaryEvent.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_boundaryEvent.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_boundaryEvent.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_boundaryEvent.payload = body[3].parse(bert: tuple.elements[4]) as? String + a_boundaryEvent.timeout = body[4].parse(bert: tuple.elements[5]) as? [AnyObject] + a_boundaryEvent.timeDate = body[5].parse(bert: tuple.elements[6]) as? String + a_boundaryEvent.timeDuration = body[6].parse(bert: tuple.elements[7]) as? String + a_boundaryEvent.timeCycle = body[7].parse(bert: tuple.elements[8]) as? String + return a_boundaryEvent + case "timeoutEvent": + if body.count != 8 { return nil } + let a_timeoutEvent = timeoutEvent() + a_timeoutEvent.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_timeoutEvent.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_timeoutEvent.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + a_timeoutEvent.payload = body[3].parse(bert: tuple.elements[4]) as? String + a_timeoutEvent.timeout = body[4].parse(bert: tuple.elements[5]) as? [AnyObject] + a_timeoutEvent.timeDate = body[5].parse(bert: tuple.elements[6]) as? String + a_timeoutEvent.timeDuration = body[6].parse(bert: tuple.elements[7]) as? String + a_timeoutEvent.timeCycle = body[7].parse(bert: tuple.elements[8]) as? String + return a_timeoutEvent + case "beginEvent": + if body.count != 3 { return nil } + let a_beginEvent = beginEvent() + a_beginEvent.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_beginEvent.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_beginEvent.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + return a_beginEvent + case "endEvent": + if body.count != 3 { return nil } + let a_endEvent = endEvent() + a_endEvent.name = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_endEvent.module = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_endEvent.prompt = body[2].parse(bert: tuple.elements[3]) as? [AnyObject] + return a_endEvent + case "sequenceFlow": + if body.count != 2 { return nil } + let a_sequenceFlow = sequenceFlow() + a_sequenceFlow.source = body[0].parse(bert: tuple.elements[1]) as? StringAtom + a_sequenceFlow.target = body[1].parse(bert: tuple.elements[2]) as? AnyObject + return a_sequenceFlow + case "hist": + if body.count != 10 { return nil } + let a_hist = hist() + a_hist.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_hist.container = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_hist.feed_id = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_hist.prev = body[3].parse(bert: tuple.elements[4]) as? Int64 + a_hist.next = body[4].parse(bert: tuple.elements[5]) as? Int64 + a_hist.feeds = body[5].parse(bert: tuple.elements[6]) as? [AnyObject] + a_hist.name = body[6].parse(bert: tuple.elements[7]) as? String + a_hist.task = body[7].parse(bert: tuple.elements[8]) as? StringAtom + a_hist.docs = body[8].parse(bert: tuple.elements[9]) as? [AnyObject] + a_hist.time = body[9].parse(bert: tuple.elements[10]) as? AnyObject + return a_hist + case "process": + if body.count != 22 { return nil } + let a_process = process() + a_process.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_process.container = body[1].parse(bert: tuple.elements[2]) as? StringAtom + a_process.feed_id = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_process.prev = body[3].parse(bert: tuple.elements[4]) as? Int64 + a_process.next = body[4].parse(bert: tuple.elements[5]) as? Int64 + a_process.feeds = body[5].parse(bert: tuple.elements[6]) as? [AnyObject] + a_process.name = body[6].parse(bert: tuple.elements[7]) as? String + a_process.roles = body[7].parse(bert: tuple.elements[8]) as? [AnyObject] + a_process.tasks = body[8].parse(bert: tuple.elements[9]) as? [AnyObject] + a_process.events = body[9].parse(bert: tuple.elements[10]) as? [AnyObject] + a_process.hist = body[10].parse(bert: tuple.elements[11]) as? AnyObject + a_process.flows = body[11].parse(bert: tuple.elements[12]) as? [sequenceFlow] + a_process.rules = body[12].parse(bert: tuple.elements[13]) as? AnyObject + a_process.docs = body[13].parse(bert: tuple.elements[14]) as? [AnyObject] + a_process.options = body[14].parse(bert: tuple.elements[15]) as? AnyObject + a_process.task = body[15].parse(bert: tuple.elements[16]) as? StringAtom + a_process.timer = body[16].parse(bert: tuple.elements[17]) as? String + a_process.notifications = body[17].parse(bert: tuple.elements[18]) as? AnyObject + a_process.result = body[18].parse(bert: tuple.elements[19]) as? String + a_process.started = body[19].parse(bert: tuple.elements[20]) as? [AnyObject] + a_process.beginEvent = body[20].parse(bert: tuple.elements[21]) as? StringAtom + a_process.endEvent = body[21].parse(bert: tuple.elements[22]) as? StringAtom + return a_process + case "complete": + if body.count != 1 { return nil } + let a_complete = complete() + a_complete.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + return a_complete + case "proc": + if body.count != 1 { return nil } + let a_proc = proc() + a_proc.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + return a_proc + case "load": + if body.count != 1 { return nil } + let a_load = load() + a_load.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + return a_load + case "histo": + if body.count != 1 { return nil } + let a_histo = histo() + a_histo.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + return a_histo + case "create": + if body.count != 2 { return nil } + let a_create = create() + a_create.proc = body[0].parse(bert: tuple.elements[1]) as? AnyObject + a_create.docs = body[1].parse(bert: tuple.elements[2]) as? [AnyObject] + return a_create + case "amend": + if body.count != 2 { return nil } + let a_amend = amend() + a_amend.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_amend.docs = body[1].parse(bert: tuple.elements[2]) as? [AnyObject] + return a_amend case "chain": if body.count != 6 { return nil } let a_chain = chain() @@ -314,6 +554,12 @@ func parseObject(name: String, body:[Model], tuple: BertTuple) -> AnyObject? a_Index.id = body[0].parse(bert: tuple.elements[1]) as? AnyObject a_Index.roster = body[1].parse(bert: tuple.elements[2]) as? [AnyObject] return a_Index + case "Whitelist": + if body.count != 2 { return nil } + let a_Whitelist = Whitelist() + a_Whitelist.phone = body[0].parse(bert: tuple.elements[1]) as? String + a_Whitelist.created = body[1].parse(bert: tuple.elements[2]) as? Int64 + return a_Whitelist case "error": if body.count != 1 { return nil } let a_error = error() @@ -371,6 +617,30 @@ func parseObject(name: String, body:[Model], tuple: BertTuple) -> AnyObject? a_PublishService.topic = body[1].parse(bert: tuple.elements[2]) as? String a_PublishService.qos = body[2].parse(bert: tuple.elements[3]) as? Int64 return a_PublishService + case "FakeNumbers": + if body.count != 2 { return nil } + let a_FakeNumbers = FakeNumbers() + a_FakeNumbers.phone = body[0].parse(bert: tuple.elements[1]) as? String + a_FakeNumbers.created = body[1].parse(bert: tuple.elements[2]) as? Int64 + return a_FakeNumbers + case "cx": + if body.count != 14 { return nil } + let a_cx = cx() + a_cx.handlers = body[0].parse(bert: tuple.elements[1]) as? [handler] + a_cx.actions = body[1].parse(bert: tuple.elements[2]) as? [AnyObject] + a_cx.req = body[2].parse(bert: tuple.elements[3]) as? AnyObject + a_cx.module = body[3].parse(bert: tuple.elements[4]) as? StringAtom + a_cx.lang = body[4].parse(bert: tuple.elements[5]) as? StringAtom + a_cx.path = body[5].parse(bert: tuple.elements[6]) as? String + a_cx.session = body[6].parse(bert: tuple.elements[7]) as? String + a_cx.formatter = body[7].parse(bert: tuple.elements[8]) as? AnyObject + a_cx.params = body[8].parse(bert: tuple.elements[9]) as? [AnyObject] + a_cx.node = body[9].parse(bert: tuple.elements[10]) as? StringAtom + a_cx.client_pid = body[10].parse(bert: tuple.elements[11]) as? AnyObject + a_cx.state = body[11].parse(bert: tuple.elements[12]) as? AnyObject + a_cx.from = body[12].parse(bert: tuple.elements[13]) as? String + a_cx.vsn = body[13].parse(bert: tuple.elements[14]) as? String + return a_cx default: return nil } } \ No newline at end of file diff --git a/apps/roster/priv/macbert/json-bert.js b/apps/roster/priv/macbert/json-bert.js index bd7f9a5a3..1d7a3225a 100644 --- a/apps/roster/priv/macbert/json-bert.js +++ b/apps/roster/priv/macbert/json-bert.js @@ -39,6 +39,673 @@ function encode(x) { } else return scalar(x); } +function encwriter(d) { + var tup = atom('writer'); + var id = 'id' in d && d.id ? encode(d.id) : nil(); + var count = 'count' in d && d.count ? number(d.count) : nil(); + var cache = 'cache' in d && d.cache ? encode(d.cache) : nil(); + var args = 'args' in d && d.args ? encode(d.args) : nil(); + var first = 'first' in d && d.first ? encode(d.first) : nil(); + return tuple(tup,id,count,cache,args,first); } + +function lenwriter() { return 6; } +function decwriter(d) { + var r={}; r.tup = 'writer'; + r.id = d && d.v[1] ? decode(d.v[1]) : undefined; + r.count = d && d.v[2] ? d.v[2].v : undefined; + r.cache = d && d.v[3] ? decode(d.v[3]) : undefined; + r.args = d && d.v[4] ? decode(d.v[4]) : undefined; + r.first = d && d.v[5] ? decode(d.v[5]) : undefined; + return clean(r); } + +function encreader(d) { + var tup = atom('reader'); + var id = 'id' in d && d.id ? encode(d.id) : nil(); + var pos = 'pos' in d && d.pos ? number(d.pos) : nil(); + var cache = 'cache' in d && d.cache ? number(d.cache) : nil(); + var args = 'args' in d && d.args ? encode(d.args) : nil(); + var feed = 'feed' in d && d.feed ? encode(d.feed) : nil(); + var dir = 'dir' in d && d.dir ? encode(d.dir) : nil(); + return tuple(tup,id,pos,cache,args,feed,dir); } + +function lenreader() { return 7; } +function decreader(d) { + var r={}; r.tup = 'reader'; + r.id = d && d.v[1] ? decode(d.v[1]) : undefined; + r.pos = d && d.v[2] ? d.v[2].v : undefined; + r.cache = d && d.v[3] ? d.v[3].v : undefined; + r.args = d && d.v[4] ? decode(d.v[4]) : undefined; + r.feed = d && d.v[5] ? decode(d.v[5]) : undefined; + r.dir = d && d.v[6] ? decode(d.v[6]) : undefined; + return clean(r); } + +function enccur(d) { + var tup = atom('cur'); + var id = 'id' in d && d.id ? encode(d.id) : nil(); + var top = 'top' in d && d.top ? number(d.top) : nil(); + var bot = 'bot' in d && d.bot ? number(d.bot) : nil(); + var dir = 'dir' in d && d.dir ? encode(d.dir) : nil(); + var reader = 'reader' in d && d.reader ? encode(d.reader) : nil(); + var writer = 'writer' in d && d.writer ? encode(d.writer) : nil(); + var left = 'left' in d && d.left ? encode(d.left) : nil(); + var right = 'right' in d && d.right ? encode(d.right) : nil(); + var args = []; if ('args' in d && d.args) + { d.args.forEach(function(x){ + args.push(encode(x))}); + args={t:108,v:args}; } else { args = nil() }; + var money = 'money' in d && d.money ? encode(d.money) : nil(); + var status = 'status' in d && d.status ? encode(d.status) : nil(); + return tuple(tup,id,top,bot,dir,reader,writer,left,right,args,money,status); } + +function lencur() { return 12; } +function deccur(d) { + var r={}; r.tup = 'cur'; + r.id = d && d.v[1] ? decode(d.v[1]) : undefined; + r.top = d && d.v[2] ? d.v[2].v : undefined; + r.bot = d && d.v[3] ? d.v[3].v : undefined; + r.dir = d && d.v[4] ? decode(d.v[4]) : undefined; + r.reader = d && d.v[5] ? decode(d.v[5]) : undefined; + r.writer = d && d.v[6] ? decode(d.v[6]) : undefined; + r.left = d && d.v[7] ? decode(d.v[7]) : undefined; + r.right = d && d.v[8] ? decode(d.v[8]) : undefined; + r.args = []; + (d && d.v[9] && d.v[9].v) ? + d.v[9].v.forEach(function(x){r.args.push(decode(x))}) : + r.args = undefined; + r.money = d && d.v[10] ? decode(d.v[10]) : undefined; + r.status = d && d.v[11] ? decode(d.v[11]) : undefined; + return clean(r); } + +function enciter(d) { + var tup = atom('iter'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var container = 'container' in d && d.container ? atom(d.container) : nil(); + var feed = 'feed' in d && d.feed ? encode(d.feed) : nil(); + var next = 'next' in d && d.next ? number(d.next) : nil(); + var prev = 'prev' in d && d.prev ? number(d.prev) : nil(); + return tuple(tup,id,container,feed,next,prev); } + +function leniter() { return 6; } +function deciter(d) { + var r={}; r.tup = 'iter'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.container = d && d.v[2] ? d.v[2].v : undefined; + r.feed = d && d.v[3] ? decode(d.v[3]) : undefined; + r.next = d && d.v[4] ? d.v[4].v : undefined; + r.prev = d && d.v[5] ? d.v[5].v : undefined; + return clean(r); } + +function enccontainer(d) { + var tup = atom('container'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var top = 'top' in d && d.top ? number(d.top) : nil(); + var rear = 'rear' in d && d.rear ? number(d.rear) : nil(); + var count = 'count' in d && d.count ? number(d.count) : nil(); + return tuple(tup,id,top,rear,count); } + +function lencontainer() { return 5; } +function deccontainer(d) { + var r={}; r.tup = 'container'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.top = d && d.v[2] ? d.v[2].v : undefined; + r.rear = d && d.v[3] ? d.v[3].v : undefined; + r.count = d && d.v[4] ? d.v[4].v : undefined; + return clean(r); } + +function enciterator(d) { + var tup = atom('iterator'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var container = 'container' in d && d.container ? atom(d.container) : nil(); + var feed_id = 'feed_id' in d && d.feed_id ? encode(d.feed_id) : nil(); + var prev = 'prev' in d && d.prev ? number(d.prev) : nil(); + var next = 'next' in d && d.next ? number(d.next) : nil(); + var feeds = []; if ('feeds' in d && d.feeds) + { d.feeds.forEach(function(x){ + feeds.push(encode(x))}); + feeds={t:108,v:feeds}; } else { feeds = nil() }; + return tuple(tup,id,container,feed_id,prev,next,feeds); } + +function leniterator() { return 7; } +function deciterator(d) { + var r={}; r.tup = 'iterator'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.container = d && d.v[2] ? d.v[2].v : undefined; + r.feed_id = d && d.v[3] ? decode(d.v[3]) : undefined; + r.prev = d && d.v[4] ? d.v[4].v : undefined; + r.next = d && d.v[5] ? d.v[5].v : undefined; + r.feeds = []; + (d && d.v[6] && d.v[6].v) ? + d.v[6].v.forEach(function(x){r.feeds.push(decode(x))}) : + r.feeds = undefined; + return clean(r); } + +function enclog(d) { + var tup = atom('log'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var top = 'top' in d && d.top ? number(d.top) : nil(); + var rear = 'rear' in d && d.rear ? number(d.rear) : nil(); + var count = 'count' in d && d.count ? number(d.count) : nil(); + return tuple(tup,id,top,rear,count); } + +function lenlog() { return 5; } +function declog(d) { + var r={}; r.tup = 'log'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.top = d && d.v[2] ? d.v[2].v : undefined; + r.rear = d && d.v[3] ? d.v[3].v : undefined; + r.count = d && d.v[4] ? d.v[4].v : undefined; + return clean(r); } + +function encoperation(d) { + var tup = atom('operation'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var container = 'container' in d && d.container ? atom(d.container) : nil(); + var feed_id = 'feed_id' in d && d.feed_id ? encode(d.feed_id) : nil(); + var prev = 'prev' in d && d.prev ? number(d.prev) : nil(); + var next = 'next' in d && d.next ? number(d.next) : nil(); + var feeds = []; if ('feeds' in d && d.feeds) + { d.feeds.forEach(function(x){ + feeds.push(encode(x))}); + feeds={t:108,v:feeds}; } else { feeds = nil() }; + var body = 'body' in d && d.body ? encode(d.body) : nil(); + var name = 'name' in d && d.name ? encode(d.name) : nil(); + var status = 'status' in d && d.status ? encode(d.status) : nil(); + return tuple(tup,id,container,feed_id,prev,next,feeds,body,name,status); } + +function lenoperation() { return 10; } +function decoperation(d) { + var r={}; r.tup = 'operation'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.container = d && d.v[2] ? d.v[2].v : undefined; + r.feed_id = d && d.v[3] ? decode(d.v[3]) : undefined; + r.prev = d && d.v[4] ? d.v[4].v : undefined; + r.next = d && d.v[5] ? d.v[5].v : undefined; + r.feeds = []; + (d && d.v[6] && d.v[6].v) ? + d.v[6].v.forEach(function(x){r.feeds.push(decode(x))}) : + r.feeds = undefined; + r.body = d && d.v[7] ? decode(d.v[7]) : undefined; + r.name = d && d.v[8] ? decode(d.v[8]) : undefined; + r.status = d && d.v[9] ? decode(d.v[9]) : undefined; + return clean(r); } + +function enckvs(d) { + var tup = atom('kvs'); + var mod = 'mod' in d && d.mod ? encode(d.mod) : nil(); + return tuple(tup,mod); } + +function lenkvs() { return 2; } +function deckvs(d) { + var r={}; r.tup = 'kvs'; + r.mod = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encfeed(d) { + var tup = atom('feed'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var top = 'top' in d && d.top ? number(d.top) : nil(); + var rear = 'rear' in d && d.rear ? number(d.rear) : nil(); + var count = 'count' in d && d.count ? number(d.count) : nil(); + var aclver = 'aclver' in d && d.aclver ? encode(d.aclver) : nil(); + return tuple(tup,id,top,rear,count,aclver); } + +function lenfeed() { return 6; } +function decfeed(d) { + var r={}; r.tup = 'feed'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.top = d && d.v[2] ? d.v[2].v : undefined; + r.rear = d && d.v[3] ? d.v[3].v : undefined; + r.count = d && d.v[4] ? d.v[4].v : undefined; + r.aclver = d && d.v[5] ? decode(d.v[5]) : undefined; + return clean(r); } + +function enctask(d) { + var tup = atom('task'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var roles = 'roles' in d && d.roles ? bin(d.roles) : nil(); + return tuple(tup,name,module,prompt,roles); } + +function lentask() { return 5; } +function dectask(d) { + var r={}; r.tup = 'task'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.roles = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + return clean(r); } + +function encuserTask(d) { + var tup = atom('userTask'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var roles = 'roles' in d && d.roles ? bin(d.roles) : nil(); + return tuple(tup,name,module,prompt,roles); } + +function lenuserTask() { return 5; } +function decuserTask(d) { + var r={}; r.tup = 'userTask'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.roles = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + return clean(r); } + +function encserviceTask(d) { + var tup = atom('serviceTask'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var roles = 'roles' in d && d.roles ? bin(d.roles) : nil(); + return tuple(tup,name,module,prompt,roles); } + +function lenserviceTask() { return 5; } +function decserviceTask(d) { + var r={}; r.tup = 'serviceTask'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.roles = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + return clean(r); } + +function encreceiveTask(d) { + var tup = atom('receiveTask'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var roles = 'roles' in d && d.roles ? bin(d.roles) : nil(); + return tuple(tup,name,module,prompt,roles); } + +function lenreceiveTask() { return 5; } +function decreceiveTask(d) { + var r={}; r.tup = 'receiveTask'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.roles = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + return clean(r); } + +function encmessageEvent(d) { + var tup = atom('messageEvent'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var payload = 'payload' in d && d.payload ? bin(d.payload) : nil(); + var timeout = 'timeout' in d && d.timeout ? encode(d.timeout) : nil(); + return tuple(tup,name,module,prompt,payload,timeout); } + +function lenmessageEvent() { return 6; } +function decmessageEvent(d) { + var r={}; r.tup = 'messageEvent'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.payload = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + r.timeout = d && d.v[5] ? decode(d.v[5]) : undefined; + return clean(r); } + +function encboundaryEvent(d) { + var tup = atom('boundaryEvent'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var payload = 'payload' in d && d.payload ? bin(d.payload) : nil(); + var timeout = 'timeout' in d && d.timeout ? encode(d.timeout) : nil(); + var timeDate = 'timeDate' in d && d.timeDate ? bin(d.timeDate) : nil(); + var timeDuration = 'timeDuration' in d && d.timeDuration ? bin(d.timeDuration) : nil(); + var timeCycle = 'timeCycle' in d && d.timeCycle ? bin(d.timeCycle) : nil(); + return tuple(tup,name,module,prompt,payload,timeout,timeDate,timeDuration,timeCycle); } + +function lenboundaryEvent() { return 9; } +function decboundaryEvent(d) { + var r={}; r.tup = 'boundaryEvent'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.payload = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + r.timeout = d && d.v[5] ? decode(d.v[5]) : undefined; + r.timeDate = d && d.v[6] ? utf8_arr(d.v[6].v) : undefined; + r.timeDuration = d && d.v[7] ? utf8_arr(d.v[7].v) : undefined; + r.timeCycle = d && d.v[8] ? utf8_arr(d.v[8].v) : undefined; + return clean(r); } + +function enctimeoutEvent(d) { + var tup = atom('timeoutEvent'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + var payload = 'payload' in d && d.payload ? bin(d.payload) : nil(); + var timeout = 'timeout' in d && d.timeout ? encode(d.timeout) : nil(); + var timeDate = 'timeDate' in d && d.timeDate ? bin(d.timeDate) : nil(); + var timeDuration = 'timeDuration' in d && d.timeDuration ? bin(d.timeDuration) : nil(); + var timeCycle = 'timeCycle' in d && d.timeCycle ? bin(d.timeCycle) : nil(); + return tuple(tup,name,module,prompt,payload,timeout,timeDate,timeDuration,timeCycle); } + +function lentimeoutEvent() { return 9; } +function dectimeoutEvent(d) { + var r={}; r.tup = 'timeoutEvent'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + r.payload = d && d.v[4] ? utf8_arr(d.v[4].v) : undefined; + r.timeout = d && d.v[5] ? decode(d.v[5]) : undefined; + r.timeDate = d && d.v[6] ? utf8_arr(d.v[6].v) : undefined; + r.timeDuration = d && d.v[7] ? utf8_arr(d.v[7].v) : undefined; + r.timeCycle = d && d.v[8] ? utf8_arr(d.v[8].v) : undefined; + return clean(r); } + +function encbeginEvent(d) { + var tup = atom('beginEvent'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + return tuple(tup,name,module,prompt); } + +function lenbeginEvent() { return 4; } +function decbeginEvent(d) { + var r={}; r.tup = 'beginEvent'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + return clean(r); } + +function encendEvent(d) { + var tup = atom('endEvent'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var prompt = []; if ('prompt' in d && d.prompt) + { d.prompt.forEach(function(x){ + prompt.push(encode(x))}); + prompt={t:108,v:prompt}; } else { prompt = nil() }; + return tuple(tup,name,module,prompt); } + +function lenendEvent() { return 4; } +function decendEvent(d) { + var r={}; r.tup = 'endEvent'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.prompt = []; + (d && d.v[3] && d.v[3].v) ? + d.v[3].v.forEach(function(x){r.prompt.push(decode(x))}) : + r.prompt = undefined; + return clean(r); } + +function encsequenceFlow(d) { + var tup = atom('sequenceFlow'); + var source = 'source' in d && d.source ? atom(d.source) : nil(); + var target = 'target' in d && d.target ? encode(d.target) : nil(); + return tuple(tup,source,target); } + +function lensequenceFlow() { return 3; } +function decsequenceFlow(d) { + var r={}; r.tup = 'sequenceFlow'; + r.source = d && d.v[1] ? d.v[1].v : undefined; + r.target = d && d.v[2] ? decode(d.v[2]) : undefined; + return clean(r); } + +function enchist(d) { + var tup = atom('hist'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var container = 'container' in d && d.container ? atom(d.container) : nil(); + var feed_id = 'feed_id' in d && d.feed_id ? encode(d.feed_id) : nil(); + var prev = 'prev' in d && d.prev ? number(d.prev) : nil(); + var next = 'next' in d && d.next ? number(d.next) : nil(); + var feeds = []; if ('feeds' in d && d.feeds) + { d.feeds.forEach(function(x){ + feeds.push(encode(x))}); + feeds={t:108,v:feeds}; } else { feeds = nil() }; + var name = 'name' in d && d.name ? bin(d.name) : nil(); + var task = 'task' in d && d.task ? atom(d.task) : nil(); + var docs = []; if ('docs' in d && d.docs) + { d.docs.forEach(function(x){ + docs.push(encode(x))}); + docs={t:108,v:docs}; } else { docs = nil() }; + var time = 'time' in d && d.time ? encode(d.time) : nil(); + return tuple(tup,id,container,feed_id,prev,next,feeds,name,task,docs,time); } + +function lenhist() { return 11; } +function dechist(d) { + var r={}; r.tup = 'hist'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.container = d && d.v[2] ? d.v[2].v : undefined; + r.feed_id = d && d.v[3] ? decode(d.v[3]) : undefined; + r.prev = d && d.v[4] ? d.v[4].v : undefined; + r.next = d && d.v[5] ? d.v[5].v : undefined; + r.feeds = []; + (d && d.v[6] && d.v[6].v) ? + d.v[6].v.forEach(function(x){r.feeds.push(decode(x))}) : + r.feeds = undefined; + r.name = d && d.v[7] ? utf8_arr(d.v[7].v) : undefined; + r.task = d && d.v[8] ? d.v[8].v : undefined; + r.docs = []; + (d && d.v[9] && d.v[9].v) ? + d.v[9].v.forEach(function(x){r.docs.push(decode(x))}) : + r.docs = undefined; + r.time = d && d.v[10] ? decode(d.v[10]) : undefined; + return clean(r); } + +function encprocess(d) { + var tup = atom('process'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var container = 'container' in d && d.container ? atom(d.container) : nil(); + var feed_id = 'feed_id' in d && d.feed_id ? encode(d.feed_id) : nil(); + var prev = 'prev' in d && d.prev ? number(d.prev) : nil(); + var next = 'next' in d && d.next ? number(d.next) : nil(); + var feeds = []; if ('feeds' in d && d.feeds) + { d.feeds.forEach(function(x){ + feeds.push(encode(x))}); + feeds={t:108,v:feeds}; } else { feeds = nil() }; + var name = 'name' in d && d.name ? bin(d.name) : nil(); + var roles = []; if ('roles' in d && d.roles) + { d.roles.forEach(function(x){ + roles.push(encode(x))}); + roles={t:108,v:roles}; } else { roles = nil() }; + var tasks = []; if ('tasks' in d && d.tasks) + { d.tasks.forEach(function(x){ + tasks.push(encode(x))}); + tasks={t:108,v:tasks}; } else { tasks = nil() }; + var events = []; if ('events' in d && d.events) + { d.events.forEach(function(x){ + events.push(encode(x))}); + events={t:108,v:events}; } else { events = nil() }; + var hist = 'hist' in d && d.hist ? encode(d.hist) : nil(); + var flows = []; if ('flows' in d && d.flows) + { d.flows.forEach(function(x){ + flows.push(encode(x))}); + flows={t:108,v:flows}; } else { flows = nil() }; + var rules = 'rules' in d && d.rules ? encode(d.rules) : nil(); + var docs = []; if ('docs' in d && d.docs) + { d.docs.forEach(function(x){ + docs.push(encode(x))}); + docs={t:108,v:docs}; } else { docs = nil() }; + var options = 'options' in d && d.options ? encode(d.options) : nil(); + var task = 'task' in d && d.task ? atom(d.task) : nil(); + var timer = 'timer' in d && d.timer ? bin(d.timer) : nil(); + var notifications = 'notifications' in d && d.notifications ? encode(d.notifications) : nil(); + var result = 'result' in d && d.result ? bin(d.result) : nil(); + var started = 'started' in d && d.started ? encode(d.started) : nil(); + var beginEvent = 'beginEvent' in d && d.beginEvent ? atom(d.beginEvent) : nil(); + var endEvent = 'endEvent' in d && d.endEvent ? atom(d.endEvent) : nil(); + return tuple(tup,id,container,feed_id,prev,next,feeds,name,roles,tasks,events, + hist,flows,rules,docs,options,task,timer,notifications,result,started,beginEvent,endEvent); } + +function lenprocess() { return 23; } +function decprocess(d) { + var r={}; r.tup = 'process'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.container = d && d.v[2] ? d.v[2].v : undefined; + r.feed_id = d && d.v[3] ? decode(d.v[3]) : undefined; + r.prev = d && d.v[4] ? d.v[4].v : undefined; + r.next = d && d.v[5] ? d.v[5].v : undefined; + r.feeds = []; + (d && d.v[6] && d.v[6].v) ? + d.v[6].v.forEach(function(x){r.feeds.push(decode(x))}) : + r.feeds = undefined; + r.name = d && d.v[7] ? utf8_arr(d.v[7].v) : undefined; + r.roles = []; + (d && d.v[8] && d.v[8].v) ? + d.v[8].v.forEach(function(x){r.roles.push(decode(x))}) : + r.roles = undefined; + r.tasks = []; + (d && d.v[9] && d.v[9].v) ? + d.v[9].v.forEach(function(x){r.tasks.push(decode(x))}) : + r.tasks = undefined; + r.events = []; + (d && d.v[10] && d.v[10].v) ? + d.v[10].v.forEach(function(x){r.events.push(decode(x))}) : + r.events = undefined; + r.hist = d && d.v[11] ? decode(d.v[11]) : undefined; + r.flows = []; + (d && d.v[12] && d.v[12].v) ? + d.v[12].v.forEach(function(x){r.flows.push(decode(x))}) : + r.flows = undefined; + r.rules = d && d.v[13] ? decode(d.v[13]) : undefined; + r.docs = []; + (d && d.v[14] && d.v[14].v) ? + d.v[14].v.forEach(function(x){r.docs.push(decode(x))}) : + r.docs = undefined; + r.options = d && d.v[15] ? decode(d.v[15]) : undefined; + r.task = d && d.v[16] ? d.v[16].v : undefined; + r.timer = d && d.v[17] ? utf8_arr(d.v[17].v) : undefined; + r.notifications = d && d.v[18] ? decode(d.v[18]) : undefined; + r.result = d && d.v[19] ? utf8_arr(d.v[19].v) : undefined; + r.started = d && d.v[20] ? decode(d.v[20]) : undefined; + r.beginEvent = d && d.v[21] ? d.v[21].v : undefined; + r.endEvent = d && d.v[22] ? d.v[22].v : undefined; + return clean(r); } + +function enccomplete(d) { + var tup = atom('complete'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + return tuple(tup,id); } + +function lencomplete() { return 2; } +function deccomplete(d) { + var r={}; r.tup = 'complete'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + return clean(r); } + +function encproc(d) { + var tup = atom('proc'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + return tuple(tup,id); } + +function lenproc() { return 2; } +function decproc(d) { + var r={}; r.tup = 'proc'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + return clean(r); } + +function encload(d) { + var tup = atom('load'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + return tuple(tup,id); } + +function lenload() { return 2; } +function decload(d) { + var r={}; r.tup = 'load'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + return clean(r); } + +function enchisto(d) { + var tup = atom('histo'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + return tuple(tup,id); } + +function lenhisto() { return 2; } +function dechisto(d) { + var r={}; r.tup = 'histo'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + return clean(r); } + +function enccreate(d) { + var tup = atom('create'); + var proc = 'proc' in d && d.proc ? encode(d.proc) : nil(); + var docs = []; if ('docs' in d && d.docs) + { d.docs.forEach(function(x){ + docs.push(encode(x))}); + docs={t:108,v:docs}; } else { docs = nil() }; + return tuple(tup,proc,docs); } + +function lencreate() { return 3; } +function deccreate(d) { + var r={}; r.tup = 'create'; + r.proc = d && d.v[1] ? decode(d.v[1]) : undefined; + r.docs = []; + (d && d.v[2] && d.v[2].v) ? + d.v[2].v.forEach(function(x){r.docs.push(decode(x))}) : + r.docs = undefined; + return clean(r); } + +function encamend(d) { + var tup = atom('amend'); + var id = 'id' in d && d.id ? number(d.id) : nil(); + var docs = []; if ('docs' in d && d.docs) + { d.docs.forEach(function(x){ + docs.push(encode(x))}); + docs={t:108,v:docs}; } else { docs = nil() }; + return tuple(tup,id,docs); } + +function lenamend() { return 3; } +function decamend(d) { + var r={}; r.tup = 'amend'; + r.id = d && d.v[1] ? d.v[1].v : undefined; + r.docs = []; + (d && d.v[2] && d.v[2].v) ? + d.v[2].v.forEach(function(x){r.docs.push(decode(x))}) : + r.docs = undefined; + return clean(r); } + function encchain(d) { var tup = atom('chain'); var id = 'id' in d && d.id ? number(d.id) : nil(); @@ -1094,3 +1761,251 @@ function decFakeNumbers(d) { r.created = d && d.v[2] ? d.v[2].v : undefined; return clean(r); } +function enchandler(d) { + var tup = atom('handler'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var class = 'class' in d && d.class ? encode(d.class) : nil(); + var group = 'group' in d && d.group ? atom(d.group) : nil(); + var config = 'config' in d && d.config ? encode(d.config) : nil(); + var state = 'state' in d && d.state ? encode(d.state) : nil(); + var seq = 'seq' in d && d.seq ? encode(d.seq) : nil(); + return tuple(tup,name,module,class,group,config,state,seq); } + +function lenhandler() { return 8; } +function dechandler(d) { + var r={}; r.tup = 'handler'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.module = d && d.v[2] ? d.v[2].v : undefined; + r.class = d && d.v[3] ? decode(d.v[3]) : undefined; + r.group = d && d.v[4] ? d.v[4].v : undefined; + r.config = d && d.v[5] ? decode(d.v[5]) : undefined; + r.state = d && d.v[6] ? decode(d.v[6]) : undefined; + r.seq = d && d.v[7] ? decode(d.v[7]) : undefined; + return clean(r); } + +function encpi(d) { + var tup = atom('pi'); + var name = 'name' in d && d.name ? atom(d.name) : nil(); + var sup = 'sup' in d && d.sup ? atom(d.sup) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var state = 'state' in d && d.state ? encode(d.state) : nil(); + return tuple(tup,name,sup,module,state); } + +function lenpi() { return 5; } +function decpi(d) { + var r={}; r.tup = 'pi'; + r.name = d && d.v[1] ? d.v[1].v : undefined; + r.sup = d && d.v[2] ? d.v[2].v : undefined; + r.module = d && d.v[3] ? d.v[3].v : undefined; + r.state = d && d.v[4] ? decode(d.v[4]) : undefined; + return clean(r); } + +function enccx(d) { + var tup = atom('cx'); + var handlers = []; if ('handlers' in d && d.handlers) + { d.handlers.forEach(function(x){ + handlers.push(encode(x))}); + handlers={t:108,v:handlers}; } else { handlers = nil() }; + var actions = []; if ('actions' in d && d.actions) + { d.actions.forEach(function(x){ + actions.push(encode(x))}); + actions={t:108,v:actions}; } else { actions = nil() }; + var req = 'req' in d && d.req ? encode(d.req) : nil(); + var module = 'module' in d && d.module ? atom(d.module) : nil(); + var lang = 'lang' in d && d.lang ? atom(d.lang) : nil(); + var path = 'path' in d && d.path ? bin(d.path) : nil(); + var session = 'session' in d && d.session ? bin(d.session) : nil(); + var formatter = 'formatter' in d && d.formatter ? atom(d.formatter) : nil(); + var params = []; if ('params' in d && d.params) + { d.params.forEach(function(x){ + params.push(encode(x))}); + params={t:108,v:params}; } else { params = nil() }; + var node = 'node' in d && d.node ? atom(d.node) : nil(); + var client_pid = 'client_pid' in d && d.client_pid ? encode(d.client_pid) : nil(); + var state = 'state' in d && d.state ? encode(d.state) : nil(); + var from = 'from' in d && d.from ? bin(d.from) : nil(); + var vsn = 'vsn' in d && d.vsn ? bin(d.vsn) : nil(); + return tuple(tup,handlers,actions,req,module,lang,path,session,formatter,params,node, + client_pid,state,from,vsn); } + +function lencx() { return 15; } +function deccx(d) { + var r={}; r.tup = 'cx'; + r.handlers = []; + (d && d.v[1] && d.v[1].v) ? + d.v[1].v.forEach(function(x){r.handlers.push(decode(x))}) : + r.handlers = undefined; + r.actions = []; + (d && d.v[2] && d.v[2].v) ? + d.v[2].v.forEach(function(x){r.actions.push(decode(x))}) : + r.actions = undefined; + r.req = d && d.v[3] ? decode(d.v[3]) : undefined; + r.module = d && d.v[4] ? d.v[4].v : undefined; + r.lang = d && d.v[5] ? d.v[5].v : undefined; + r.path = d && d.v[6] ? utf8_arr(d.v[6].v) : undefined; + r.session = d && d.v[7] ? utf8_arr(d.v[7].v) : undefined; + r.formatter = d && d.v[8] ? decode(d.v[8]) : undefined; + r.params = []; + (d && d.v[9] && d.v[9].v) ? + d.v[9].v.forEach(function(x){r.params.push(decode(x))}) : + r.params = undefined; + r.node = d && d.v[10] ? d.v[10].v : undefined; + r.client_pid = d && d.v[11] ? decode(d.v[11]) : undefined; + r.state = d && d.v[12] ? decode(d.v[12]) : undefined; + r.from = d && d.v[13] ? utf8_arr(d.v[13].v) : undefined; + r.vsn = d && d.v[14] ? utf8_arr(d.v[14].v) : undefined; + return clean(r); } + +function encbin(d) { + var tup = atom('bin'); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + return tuple(tup,data); } + +function lenbin() { return 2; } +function decbin(d) { + var r={}; r.tup = 'bin'; + r.data = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encclient(d) { + var tup = atom('client'); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + return tuple(tup,data); } + +function lenclient() { return 2; } +function decclient(d) { + var r={}; r.tup = 'client'; + r.data = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encserver(d) { + var tup = atom('server'); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + return tuple(tup,data); } + +function lenserver() { return 2; } +function decserver(d) { + var r={}; r.tup = 'server'; + r.data = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encinit(d) { + var tup = atom('init'); + var token = 'token' in d && d.token ? encode(d.token) : nil(); + return tuple(tup,token); } + +function leninit() { return 2; } +function decinit(d) { + var r={}; r.tup = 'init'; + r.token = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encpickle(d) { + var tup = atom('pickle'); + var source = 'source' in d && d.source ? encode(d.source) : nil(); + var pickled = 'pickled' in d && d.pickled ? encode(d.pickled) : nil(); + var args = 'args' in d && d.args ? encode(d.args) : nil(); + return tuple(tup,source,pickled,args); } + +function lenpickle() { return 4; } +function decpickle(d) { + var r={}; r.tup = 'pickle'; + r.source = d && d.v[1] ? decode(d.v[1]) : undefined; + r.pickled = d && d.v[2] ? decode(d.v[2]) : undefined; + r.args = d && d.v[3] ? decode(d.v[3]) : undefined; + return clean(r); } + +function encflush(d) { + var tup = atom('flush'); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + return tuple(tup,data); } + +function lenflush() { return 2; } +function decflush(d) { + var r={}; r.tup = 'flush'; + r.data = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encdirect(d) { + var tup = atom('direct'); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + return tuple(tup,data); } + +function lendirect() { return 2; } +function decdirect(d) { + var r={}; r.tup = 'direct'; + r.data = d && d.v[1] ? decode(d.v[1]) : undefined; + return clean(r); } + +function encev(d) { + var tup = atom('ev'); + var module = 'module' in d && d.module ? encode(d.module) : nil(); + var msg = 'msg' in d && d.msg ? encode(d.msg) : nil(); + var trigger = 'trigger' in d && d.trigger ? encode(d.trigger) : nil(); + var name = 'name' in d && d.name ? encode(d.name) : nil(); + return tuple(tup,module,msg,trigger,name); } + +function lenev() { return 5; } +function decev(d) { + var r={}; r.tup = 'ev'; + r.module = d && d.v[1] ? decode(d.v[1]) : undefined; + r.msg = d && d.v[2] ? decode(d.v[2]) : undefined; + r.trigger = d && d.v[3] ? decode(d.v[3]) : undefined; + r.name = d && d.v[4] ? decode(d.v[4]) : undefined; + return clean(r); } + +function encftp(d) { + var tup = atom('ftp'); + var id = 'id' in d && d.id ? encode(d.id) : nil(); + var sid = 'sid' in d && d.sid ? encode(d.sid) : nil(); + var filename = 'filename' in d && d.filename ? encode(d.filename) : nil(); + var meta = 'meta' in d && d.meta ? encode(d.meta) : nil(); + var size = 'size' in d && d.size ? encode(d.size) : nil(); + var offset = 'offset' in d && d.offset ? encode(d.offset) : nil(); + var block = 'block' in d && d.block ? encode(d.block) : nil(); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + var status = 'status' in d && d.status ? encode(d.status) : nil(); + return tuple(tup,id,sid,filename,meta,size,offset,block,data,status); } + +function lenftp() { return 10; } +function decftp(d) { + var r={}; r.tup = 'ftp'; + r.id = d && d.v[1] ? decode(d.v[1]) : undefined; + r.sid = d && d.v[2] ? decode(d.v[2]) : undefined; + r.filename = d && d.v[3] ? decode(d.v[3]) : undefined; + r.meta = d && d.v[4] ? decode(d.v[4]) : undefined; + r.size = d && d.v[5] ? decode(d.v[5]) : undefined; + r.offset = d && d.v[6] ? decode(d.v[6]) : undefined; + r.block = d && d.v[7] ? decode(d.v[7]) : undefined; + r.data = d && d.v[8] ? decode(d.v[8]) : undefined; + r.status = d && d.v[9] ? decode(d.v[9]) : undefined; + return clean(r); } + +function encftpack(d) { + var tup = atom('ftpack'); + var id = 'id' in d && d.id ? encode(d.id) : nil(); + var sid = 'sid' in d && d.sid ? encode(d.sid) : nil(); + var filename = 'filename' in d && d.filename ? encode(d.filename) : nil(); + var meta = 'meta' in d && d.meta ? encode(d.meta) : nil(); + var size = 'size' in d && d.size ? encode(d.size) : nil(); + var offset = 'offset' in d && d.offset ? encode(d.offset) : nil(); + var block = 'block' in d && d.block ? encode(d.block) : nil(); + var data = 'data' in d && d.data ? encode(d.data) : nil(); + var status = 'status' in d && d.status ? encode(d.status) : nil(); + return tuple(tup,id,sid,filename,meta,size,offset,block,data,status); } + +function lenftpack() { return 10; } +function decftpack(d) { + var r={}; r.tup = 'ftpack'; + r.id = d && d.v[1] ? decode(d.v[1]) : undefined; + r.sid = d && d.v[2] ? decode(d.v[2]) : undefined; + r.filename = d && d.v[3] ? decode(d.v[3]) : undefined; + r.meta = d && d.v[4] ? decode(d.v[4]) : undefined; + r.size = d && d.v[5] ? decode(d.v[5]) : undefined; + r.offset = d && d.v[6] ? decode(d.v[6]) : undefined; + r.block = d && d.v[7] ? decode(d.v[7]) : undefined; + r.data = d && d.v[8] ? decode(d.v[8]) : undefined; + r.status = d && d.v[9] ? decode(d.v[9]) : undefined; + return clean(r); } + diff --git a/apps/roster/src/protocol/roster_link.erl b/apps/roster/src/protocol/roster_link.erl index 87f933d54..fd53f53cb 100644 --- a/apps/roster/src/protocol/roster_link.erl +++ b/apps/roster/src/protocol/roster_link.erl @@ -24,8 +24,7 @@ info(#'Link'{id = LinkId, type = group, status = join = LStatus} = RequestData, {#'Member'{}, [], #'Room'{} = Room1} = roster:add_member(Room, Member, {no_muc_message, Room#'Room'.readers}), {As, Ms} = roster:split_members(roster:members(#muc{name = Room1#'Room'.id}, presence)), - #'Room'{} = Room2 = roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Ms, admins = As}), - ok_code(Room2); + roster:reader_cache(Room1#'Room'{status = join, last_msg = LastMsg, unread = UnreadMsg, members = Ms, admins = As}); #error{code = not_found} = Err -> Err end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), @@ -51,7 +50,7 @@ info(#'Link'{id = LinkId, type = group, status = get = LStatus} = RequestData, roster:info(?MODULE, "~p:Link/~p:~p", [ClientId, LStatus, RequestData]), Res = case get_room_by_link_id(LinkId) of #ok{code = #'Room'{} = Room} -> - #ok{code = Room#'Room'{status = info}}; + Room#'Room'{status = info}; #error{code = not_found} = Err -> Err end, roster:info(?MODULE, "Link/~p.Response:~p", [Res, LStatus]), @@ -101,7 +100,7 @@ update_link(RoomId, #'Link'{id = LinkId}) -> ok = kvs:put(Room#'Room'{links = Links1}), ok = kvs:delete('Link', LinkId), ok = kvs:put(NewLink), - ok_code(NewLink); + NewLink; false -> #error{code = invalid_data} end; #error{code = not_found} = Err -> Err diff --git a/apps/roster/src/test/room_test.erl b/apps/roster/src/test/room_test.erl index 96f1a2de5..2711669a7 100644 --- a/apps/roster/src/test/room_test.erl +++ b/apps/roster/src/test/room_test.erl @@ -127,10 +127,10 @@ link() -> %% Get the room link by RoomId #ok{code = #'Room'{links = [#'Link'{id = LinkId}]}} = kvs:get('Room', Room), %% Assert linkId by Link get request - #ok{code = #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]}} = + #'Room'{links = [#'Link'{id = LinkId}], readers = [_ | _]} = roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, type = group, status = get}), %% Update the link from the administrator and compare it with the old one. - #ok{code = #'Link'{id = LinkId}} /= roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), + #'Link'{id = LinkId} /= roster_client:send_receive(AClientId, 1, #'Link'{id = LinkId, name = Room, type = group, status = update}), %%add member with message size roster:purge_user(FPhone = <<"6789000">>), {FClientId, FToken} = roster_client:reg_fake_user(FPhone), @@ -223,15 +223,15 @@ test_joinlink() -> {error, not_found} = roster_client:send_receive(BClientId, 1, Link#'Link'{id = ?BLANK_LINK, status = get}), %% Test: try to get room info; correct room link; admin - {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = get}), %% Test: try to get room info; correct room link; not room member - {ok, #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info}} = + #'Room'{id = RoomId, links = [#'Link'{id = LinkId}], status = info} = roster_client:send_receive(DClientId, 1, Link#'Link'{status = get}), %% Test: join room - {ok, #'Room'{id = RoomId, status = join} = Room1} = + #'Room'{id = RoomId, status = join} = Room1 = roster_client:send_receive(DClientId, 1, Link#'Link'{status = join}), % Check if new member is added true = lists:keymember(DPhoneId, #'Member'.phone_id, Room1#'Room'.members), @@ -242,16 +242,16 @@ test_joinlink() -> %% Test: try to update room link; non room member {error, invalid_data} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = update}), %% Test: try to update room link; room member, admin - {ok, #'Link'{name = RoomId} = Link1} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), + #'Link'{name = RoomId} = Link1 = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), %% Test: try to get room info; correct room link; - {ok, #'Room'{id = RoomId, links = [Link1], status = info}} = + #'Room'{id = RoomId, links = [Link1], status = info} = roster_client:send_receive(EClientId, 1, Link1#'Link'{status = get}), %% Test: try to update room link; non-existent link, room member, admin {error, invalid_data} = roster_client:send_receive(BClientId, 1, Link#'Link'{status = update}), %% Test: join room; non-existent link, non room member {error, not_found} = roster_client:send_receive(EClientId, 1, Link#'Link'{status = join}), %% Test: join room; non room member - {ok, #'Room'{id = RoomId, links = [Link1], status = join} = Room2} = + #'Room'{id = RoomId, links = [Link1], status = join} = Room2 = roster_client:send_receive(EClientId, 1, Link1#'Link'{status = join}), % Check if new member is added true = lists:keymember(EPhoneId, #'Member'.phone_id, Room2#'Room'.members), -- GitLab