%%% ==================================================================== %%% ``The contents of this file are subject to the Erlang Public License, %%% Version 1.1, (the "License"); you may not use this file except in %%% compliance with the License. You should have received a copy of the %%% Erlang Public License along with this software. If not, it can be %%% retrieved via the world wide web at http://www.erlang.org/. %%% %%% Software distributed under the License is distributed on an "AS IS" %%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See %%% the License for the specific language governing rights and limitations %%% under the License. %%% %%% The Initial Developer of the Original Code is ProcessOne. %%% Portions created by ProcessOne are Copyright 2006-2013, ProcessOne %%% All Rights Reserved.'' %%% This software is copyright 2006-2013, ProcessOne. %%% %%% @copyright 2006-2013 ProcessOne %%% @author Karim Gemayel %%% [http://www.process-one.net/] %%% @version {@vsn}, {@date} {@time} %%% @end %%% ==================================================================== %%% @headerfile "pubsub_dev.hrl" -module(pubsub_parser). -author('karim.gemayel@process-one.net'). -compile({no_auto_import,[node/1]}). -compile(export_all). -include("pubsub_dev.hrl"). -include("pubsub_api.hrl"). -import(xml, [ get_tag_attr_s/2, get_attr_s/2, remove_cdata/1 ]). %-type('xmlel_affiliations#'() :: % #xmlel{ns::?NS_PUBSUB, name::'affiliations', children::[]} %). %-type('xmlel_affiliations#owner'() :: % #xmlel{ns::?NS_PUBSUB_OWNER, name::'affiliations', children::[]} %). %-type('xmlel_configure#'() :: % #xmlel{ns::?NS_PUBSUB, name::'configure'} %). %-type('xmlel_configure#owner'() :: % #xmlel{ns::?NS_PUBSUB_OWNER, name::'configure', children::[]} %). %-type('xmlel_create#'() :: % #xmlel{ns::?NS_PUBSUB, name::'create', children::[]} %). %-type('xmlel_default#'() :: % #xmlel{ns::?NS_PUBSUB, name::'default'} %). %-type('xmlel_default#owner'() :: %% #xmlel{ns::?NS_PUBSUB_OWNER, name::'default', attrs::[], children::[]} % #xmlel{ns::?NS_PUBSUB_OWNER, name::'default', children::[]} %). %-type('xmlel_delete#owner'() :: % #xmlel{ns::?NS_PUBSUB_OWNER, name::'delete'} %). %-type('xmlel_items#'() :: % #xmlel{ns::?NS_PUBSUB, name::'items'} %). %-type('xmlel_options1#'() :: % #xmlel{ns::?NS_PUBSUB, name::'options', attrs::[]} %). %-type('xmlel_options2#'() :: % #xmlel{ns::?NS_PUBSUB, name::'options'} %). %-type('xmlel_publish#'() :: % #xmlel{ns::?NS_PUBSUB, name::'publish'} %). %-type('xmlel_publish-options#'() :: % #xmlel{ns::?NS_PUBSUB, name::'publish-options'} %). %-type('xmlel_purge#owner'() :: % #xmlel{ns::?NS_PUBSUB_OWNER, name::'purge', children::[]} %). %-type('xmlel_retract#'() :: % #xmlel{ns::?NS_PUBSUB, name::'retract'} %). %-type('xmlel_subscribe#'() :: % #xmlel{ns::?NS_PUBSUB, name::'subscribe', children::[]} %). %-type('xmlel_subscriptions#'() :: % #xmlel{ns::?NS_PUBSUB, name::'subscriptions', children::[]} %). %-type('xmlel_subscriptions#owner'() :: % #xmlel{ns::?NS_PUBSUB_OWNER, name::'subscriptions', children::[]} %). %-type('xmlel_unsubscribe#'() :: % #xmlel{ns::?NS_PUBSUB, name::'unsubscribe', children::[]} %). -define(Is_Xmlel_Affiliations(Xmlel), ( Xmlel#xmlel.name == <<"affiliations">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Configure(Xmlel), ( Xmlel#xmlel.name == <<"configure">> andalso Xmlel#xmlel.attrs == [] )). -define(Is_Xmlel_Create(Xmlel), ( Xmlel#xmlel.name == <<"create">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Default(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"default">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Delete(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB_OWNER andalso Xmlel#xmlel.name == <<"delete">> )). -define(Is_Xmlel_Item(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"item">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Items1(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"items">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Items2(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"items">> )). -define(Is_Xmlel_Options1(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"options">> andalso Xmlel#xmlel.attrs == [] )). -define(Is_Xmlel_Options2(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"options">> )). -define(Is_Xmlel_Publish(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"publish">> )). -define(Is_Xmlel_Publish_Options(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"publish-options">> andalso Xmlel#xmlel.attrs == [] )). -define(Is_Xmlel_Purge(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB_OWNER andalso Xmlel#xmlel.name == <<"purge">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Redirect(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB_OWNER andalso Xmlel#xmlel.name == <<"redirect">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Retract(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"retract">> andalso Xmlel#xmlel.children =/= [] )). -define(Is_Xmlel_Subscribe(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"subscribe">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Subscriptions(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"subscriptions">> andalso Xmlel#xmlel.children == [] )). -define(Is_Xmlel_Unsubscribe(Xmlel), ( %Xmlel#xmlel.ns == ?NS_PUBSUB andalso Xmlel#xmlel.name == <<"unsubscribe">> andalso Xmlel#xmlel.children == [] )). %% -spec(parse/4 :: ( IQ_Type :: 'get' | 'set', Xmlels :: %-- Create_Node --% % ['xmlel_create#'(),...] | % %% % ['xmlel_create#'() % |'xmlel_configure#'(),...] | % %% %-- Delete_Node --% % ['xmlel_delete#owner'(),...] | % %% %-- Purge_Node --% % ['xmlel_purge#owner'(),...] | % %% %-- Publish_Item --% % ['xmlel_publish#'(),...] | % %% % ['xmlel_publish#'() % |'xmlel_configure#'(),...] | % %% % ['xmlel_publish#'() % |'xmlel_publish-options#'(),...] | % %% % ['xmlel_publish#'() % |'xmlel_configure#'() % |'xmlel_publish-options#'(),...] | % %% %-- Retract_Item --% % ['xmlel_retract#'(),...] | % %% %-- Subscribe_Node --% % ['xmlel_subscribe#'(),...] | % ['xmlel_subscribe#'() % |'xmlel_options1#'(),...] | % %% %-- Unsubscribe_Node --% % ['xmlel_unsubscribe#'(),...] | % %% %-- Set_Configure_Subscription --% % ['xmlel_options2#'(),...] | % %% %-- Get_Items --% % ['xmlel_items#'(),...] | % %% %-- Get_Entity_Affiliations --% % ['xmlel_affiliations#'(),...] | % %% %-- Get_Entity_Subscriptions --% % ['xmlel_subscriptions#'(),...] | % %% %-- Get_Node_Affiliations --% % ['xmlel_affiliations#owner'(),...] | % %% %-- Get_Node_Subscriptions --% % ['xmlel_subscriptions#owner'(),...] | % %% %-- Get_Configure_Subscription_Default --% % ['xmlel_default#'(),...] | % %% %-- Get_Configure_Subscription --% % ['xmlel_options2#'(),...] | % %% %-- Get_Configure_Node_Default --% % ['xmlel_default#owner'(),...] | % %% %-- Get_Configure_Node --% % ['xmlel_configure#owner'(),...] | %% %-- Other Stanza --% [xmlel()], %% Rsm :: boolean(), API_Core :: #api_core{}) -> %-- Create_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'create_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Node_Config :: [Xmlel::xmlel()] } } | %-- Delete_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'delete_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), RedirectURI :: undefined | binary() } } | %-- Purge_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'purge_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Publish_Item --% {result, Module :: 'pubsub_core' | module(), Function :: 'publish_item', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Item :: 0, ItemId :: undefined, Payload :: exmpp_pubsub:payload_empty(), Node_Config :: [Xmlel::xmlel()], Publish_Options :: [Xmlel::xmlel()] } } | {result, Module :: 'pubsub_core' | module(), Function :: 'publish_item', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Item :: 1, ItemId :: undefined | exmpp_pubsub:itemId(), Payload :: exmpp_pubsub:payload() | [Xmlel::xmlel(),...], Node_Config :: [Xmlel::xmlel()], Publish_Options :: [Xmlel::xmlel()] } } | %-- Retract_Item --% {result, Module :: 'pubsub_core' | module(), Function :: 'retract_item', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), ItemId :: undefined | exmpp_pubsub:itemId(), Notify :: undefined | boolean() } } | %-- Subscribe_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'subscribe_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Jid :: binary() | undefined, Subscribe_Options :: [Xmlel::xmlel()] } } | %-- Unsubscribe_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'unsubscribe_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Jid :: binary() | undefined, SubId :: undefined | exmpp_pubsub:subId() } } | %-- Set_Configure_Subscription --% {result, Module :: 'pubsub_core' | module(), Function :: 'set_configure_subscription', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Jid :: binary() | undefined, SubId :: undefined | exmpp_pubsub:subId(), Subscribe_Options :: [Xmlel::xmlel()] } } | %-- Get_Items --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_items', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), SubId :: undefined | exmpp_pubsub:subId(), Max_Items :: non_neg_integer(), ItemIds :: undefined } } | {result, Module :: 'pubsub_core' | module(), Function :: 'get_items', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), SubId :: undefined | exmpp_pubsub:subId(), Max_Items :: undefined, ItemIds :: [] | exmpp_pubsub:itemIds() } } | %-- Get_Entity_Affiliations --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_entity_affiliations', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Entity_Subscriptions --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_entity_subscriptions', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Node_Affiliations --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_node_affiliations', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Node_Subscriptions --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_node_subscriptions', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Configure_Subscription_Default --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_configure_subscription_default', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Configure_Subscription --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_configure_subscription', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId(), Jid :: binary() | undefined, SubId :: undefined | exmpp_pubsub:subId() } } | %-- Get_Configure_Node_Default --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_configure_node_default', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } | %-- Get_Configure_Node --% {result, Module :: 'pubsub_core' | module(), Function :: 'get_configure_node', Parameters :: { NodeId :: undefined | exmpp_pubsub:nodeId() } } %%% | {error, 'invalid-payload'} ). %-- Create_Node --% %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Create], _Rsm, API_Core) when ?Is_Xmlel_Create(Xmlel_Create) -> case xmlns(Xmlel_Create) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.create_node, _Function = 'create_node', _Parameters = { _NodeId = node(Xmlel_Create), _Node_Config = [] } }; _ -> {error, 'invalid-payload'} end; %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#node_config %% %% Princely Musings (Atom) %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Create, Xmlel_Configure], _Rsm, API_Core) when ?Is_Xmlel_Create(Xmlel_Create) andalso ?Is_Xmlel_Configure(Xmlel_Configure) -> case {xmlns(Xmlel_Create), xmlns(Xmlel_Configure)} of {NS, NS} when NS == ?NS_PUBSUB -> {result, _Module = API_Core#api_core.create_node, _Function = 'create_node', _Parameters = { _NodeId = node(Xmlel_Create), _Node_Config = remove_cdata(Xmlel_Configure#xmlel.children) } }; _ -> {error, 'invalid-payload'} end; %-- Delete_Node --% %% %% %% %% %% %% %% %% %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Delete], _Rsm, API_Core) when ?Is_Xmlel_Delete(Xmlel_Delete) -> case {xmlns(Xmlel_Delete), remove_cdata(Xmlel_Delete#xmlel.children)} of {?NS_PUBSUB_OWNER, []} -> {result, _Module = API_Core#api_core.delete_node, _Function = 'delete_node', _Parameters = { _NodeId = node(Xmlel_Delete), _RedirectURI = undefined } }; {?NS_PUBSUB_OWNER, [Xmlel_Redirect]} when ?Is_Xmlel_Redirect(Xmlel_Redirect) -> case xmlns(Xmlel_Redirect) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.delete_node, _Function = 'delete_node', _Parameters = { _NodeId = node(Xmlel_Delete), _RedirectURI = uri(Xmlel_Redirect) } }; _ -> {error, 'invalid-payload'} end; _ -> {error, 'invalid-payload'} end; %-- Purge_Node --% %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Purge], _Rsm, API_Core) when ?Is_Xmlel_Purge(Xmlel_Purge) -> case xmlns(Xmlel_Purge) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.purge_node, _Function = 'purge_node', _Parameters = { _NodeId = node(Xmlel_Purge) } }; _ -> {error, 'invalid-payload'} end; %-- Publish_Item --% %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#node_config %% %% Princely Musings (Atom) %% %% %% %% %% %% http://jabber.org/protocol/pubsub#publish-options %% %% presence %% %% %% %% %% %% %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#node_config %% %% Princely Musings (Atom) %% %% %% %% %% %% http://jabber.org/protocol/pubsub#publish-options %% %% presence %% %% %% %% %% %% %% %% %% %% Soliloquy %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#publish-options %% %% presence %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Publish], _Rsm, API_Core) when ?Is_Xmlel_Publish(Xmlel_Publish) -> case {xmlns(Xmlel_Publish), remove_cdata(Xmlel_Publish#xmlel.children)} of %% {?NS_PUBSUB, []} -> {result, _Module = API_Core#api_core.publish_item, _Function = 'publish_item', _Parameters = { _NodeId = node(Xmlel_Publish), _Item = 0, _ItemId = undefined, _Payload = [], _Node_Config = [], _Publish_Options = [] } }; %% % [#xmlel{ns = ?NS_PUBSUB, name = 'item'} = Xmlel_Item] -> {?NS_PUBSUB, [#xmlel{name = <<"item">>} = Xmlel_Item]} -> {result, _Module = API_Core#api_core.publish_item, _Function = 'publish_item', _Parameters = { _NodeId = node(Xmlel_Publish), _Item = 1, _ItemId = id(Xmlel_Item), _Payload = remove_cdata(Xmlel_Item#xmlel.children), _Node_Config = [], _Publish_Options = [] } }; %% _ -> {error, 'invalid-payload'} end; %% parse('set' = _IQ_Type, [Xmlel_Publish, Xmlel_Configure], _Rsm, API_Core) when ?Is_Xmlel_Publish(Xmlel_Publish) andalso ?Is_Xmlel_Configure(Xmlel_Configure) -> case {xmlns(Xmlel_Publish), xmlns(Xmlel_Configure)} of {NS, NS} when NS == ?NS_PUBSUB -> case parse('set', [Xmlel_Publish], _Rsm, API_Core) of {result, Module, Function, {NodeId, Item, ItemId, Payload, _, _}} -> {result, Module, Function, _Parameters = { NodeId, Item, ItemId, Payload, _Node_Config = remove_cdata(Xmlel_Configure#xmlel.children), _Publish_Options = [] } }; Error -> Error end; _ -> {error, 'invalid-paylaod'} end; %% parse('set' = _IQ_Type, [Xmlel_Publish, Xmlel_Publish_Options], _Rsm, API_Core) when ?Is_Xmlel_Publish(Xmlel_Publish) andalso ?Is_Xmlel_Publish_Options(Xmlel_Publish_Options) -> case {xmlns(Xmlel_Publish), xmlns(Xmlel_Publish_Options)} of {NS, NS} when NS == ?NS_PUBSUB -> case parse('set', [Xmlel_Publish], _Rsm, API_Core) of {result, Module, Function, {NodeId, Item, ItemId, Payload, _, _}} -> {result, Module, Function, _Parameters = { NodeId, Item, ItemId, Payload, _Node_Config = [], _Publish_Options = remove_cdata( Xmlel_Publish_Options#xmlel.children) } }; Error -> Error end; _ -> {error, 'invalid-payload'} end; %% parse('set' = _IQ_Type, [Xmlel_Publish, Xmlel_Configure, Xmlel_Publish_Options], _Rsm, API_Core) when ?Is_Xmlel_Publish(Xmlel_Publish) andalso ?Is_Xmlel_Configure(Xmlel_Configure) andalso ?Is_Xmlel_Publish_Options(Xmlel_Publish_Options) -> case {xmlns(Xmlel_Publish), xmlns(Xmlel_Configure), xmlns(Xmlel_Publish_Options)} of {NS, NS, NS} when NS == ?NS_PUBSUB -> case parse('set', [Xmlel_Publish, Xmlel_Configure], _Rsm, API_Core) of {result, Module, Function, {NodeId, Item, ItemId, Payload, Node_Config, _}} -> {result, Module, Function, _Parameters = { NodeId, Item, ItemId, Payload, Node_Config, _Publish_Options = remove_cdata( Xmlel_Publish_Options#xmlel.children) } }; Error -> Error end; _ -> {error, 'invalid-payload'} end; %% %% parse('set' = _IQ_Type, [Xmlel_Publish, Xmlel_Publish_Options, Xmlel_Configure], Rsm, API_Core) when ?Is_Xmlel_Publish(Xmlel_Publish) andalso ?Is_Xmlel_Publish_Options(Xmlel_Publish_Options) andalso ?Is_Xmlel_Configure(Xmlel_Configure) -> case {xmlns(Xmlel_Publish), xmlns(Xmlel_Publish_Options), xmlns(Xmlel_Configure)} of {NS, NS, NS} when NS == ?NS_PUBSUB -> parse('set', [Xmlel_Publish, Xmlel_Configure, Xmlel_Publish_Options], Rsm, API_Core); _ -> {error, 'invalid-payload'} end; %-- Get_Entity_Affiliations --% %% %% %% %% %% %% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Affiliations], _Rsm, API_Core) when ?Is_Xmlel_Affiliations(Xmlel_Affiliations) -> case xmlns(Xmlel_Affiliations) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.get_entity_affiliations, _Function = 'get_entity_affiliations', _Parameters = { _NodeId = node(Xmlel_Affiliations) } }; _ -> {error, 'invalid-payload'} end; %% TODO : RSM %-- Get_Entity_Subscriptions --% %% %% %% %% %% %% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Subscriptions], _Rsm, API_Core) when ?Is_Xmlel_Subscriptions(Xmlel_Subscriptions) -> case xmlns(Xmlel_Subscriptions) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.get_entity_subscriptions, _Function = 'get_entity_subscriptions', _Parameters = { _NodeId = node(Xmlel_Subscriptions) } }; _ -> {error, 'invalid-payload'} end; %% TODO : RSM %-- Get_Node_Affiliations --% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Affiliations], _Rsm, API_Core) when ?Is_Xmlel_Affiliations(Xmlel_Affiliations) -> case xmlns(Xmlel_Affiliations) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.get_node_affiliations, _Function = 'get_node_affiliations', _Parameters = { _NodeId = node(Xmlel_Affiliations) } }; _ -> {error, 'invalid-payload'} end; %% TODO : RSM %-- Get_Node_Subscriptions --% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Subscriptions], _Rsm, API_Core) when ?Is_Xmlel_Subscriptions(Xmlel_Subscriptions) -> case xmlns(Xmlel_Subscriptions) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.get_node_subscriptions, _Function = 'get_node_subscriptions', _Parameters = { _NodeId = node(Xmlel_Subscriptions) } }; _ -> {error, 'invalid-payload'} end; %% TODO : RSM %-- Retract_Item --% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Retract], _Rsm, API_Core) when ?Is_Xmlel_Retract(Xmlel_Retract) -> case {xmlns(Xmlel_Retract), notify(Xmlel_Retract)} of {?NS_PUBSUB, undefined} -> {result, _Module = API_Core#api_core.retract_item, _Function = 'retract_item', _Parameters = { _NodeId = node(Xmlel_Retract), _ItemId = case remove_cdata(Xmlel_Retract#xmlel.children) of [Xmlel_Item] when ?Is_Xmlel_Item(Xmlel_Item) -> case xmlns(Xmlel_Item) of ?NS_PUBSUB -> id(Xmlel_Item); _ -> undefined end; _ -> undefined end, _Notify = undefined } }; {?NS_PUBSUB, False} when False == <<"false">> orelse False == <<"0">> -> {result, _Module = API_Core#api_core.retract_item, _Function = 'retract_item', _Parameters = { _NodeId = node(Xmlel_Retract), _ItemId = case remove_cdata(Xmlel_Retract#xmlel.children) of [Xmlel_Item] when ?Is_Xmlel_Item(Xmlel_Item) -> case xmlns(Xmlel_Item) of ?NS_PUBSUB -> id(Xmlel_Item); _ -> undefined end; _ -> undefined end, _Notify = false } }; {?NS_PUBSUB, True} when True == <<"true">> orelse True == <<"1">> -> {result, _Module = API_Core#api_core.retract_item, _Function = 'retract_item', _Parameters = { _NodeId = node(Xmlel_Retract), _ItemId = case remove_cdata(Xmlel_Retract#xmlel.children) of [Xmlel_Item] when ?Is_Xmlel_Item(Xmlel_Item) -> case xmlns(Xmlel_Item) of ?NS_PUBSUB -> id(Xmlel_Item); _ -> undefined end; _ -> undefined end, _Notify = true } }; _ -> {error, 'invalid-payload'} end; %-- Subscribe_Node --% %% %% %% %% %% %% %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#subscribe_options %% %% 1 %% %% chat %% online %% away %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Subscribe], _Rsm, API_Core) when ?Is_Xmlel_Subscribe(Xmlel_Subscribe) -> case xmlns(Xmlel_Subscribe) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.subscribe_node, _Function = 'subscribe_node', _Parameters = { _NodeId = node(Xmlel_Subscribe), _Jid = id(Xmlel_Subscribe), _Subscribe_Options = [] } }; _ -> {error, 'invalid-payload'} end; %% parse('set' = _IQ_Type, [Xmlel_Subscribe, Xmlel_Options], _Rsm, API_Core) when ?Is_Xmlel_Subscribe(Xmlel_Subscribe) andalso ?Is_Xmlel_Options1(Xmlel_Options) -> case {xmlns(Xmlel_Subscribe), xmlns(Xmlel_Options)} of {NS, NS} when NS == ?NS_PUBSUB -> {result, _Module = API_Core#api_core.subscribe_node, _Function = 'subscribe_node', _Parameters = { _NodeId = node(Xmlel_Subscribe), _Jid = jid(Xmlel_Subscribe), _Subscribe_Options = remove_cdata(Xmlel_Options#xmlel.children) } }; _ -> {error, 'invalid-payload'} end; %-- Unsubscribe_Node --% %% %% %% %% %% %% %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Unsubscribe], _Rsm, API_Core) when ?Is_Xmlel_Unsubscribe(Xmlel_Unsubscribe) -> case xmlns(Xmlel_Unsubscribe) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.unsubscribe_node, _Function = 'unsubscribe_node', _Parameters = { _NodeId = node(Xmlel_Unsubscribe), _Jid = jid(Xmlel_Unsubscribe), _SubId = subid(Xmlel_Unsubscribe) } }; _ -> {error, 'invalid-payload'} end; %-- Set_Configure_Subscription --% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#subscribe_options %% %% 1 %% %% chat %% online %% away %% %% %% %% %% %% %% %% %% %% %% %% http://jabber.org/protocol/pubsub#subscribe_options %% %% 1 %% %% chat %% online %% away %% %% %% %% %% parse('set' = _IQ_Type, [Xmlel_Options], _Rsm, API_Core) when ?Is_Xmlel_Options2(Xmlel_Options) -> case xmlns(Xmlel_Options) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.set_configure_subscription, _Function = 'set_configure_subscription', _Parameters = { _NodeId = node(Xmlel_Options), _Jid = jid(Xmlel_Options), _SubId = subid(Xmlel_Options), _Subscribe_Options = remove_cdata(Xmlel_Options#xmlel.children) } }; _ -> {error, 'invalid-payload'} end; %-- Get_Items --% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Items], _Rsm, API_Core) when ?Is_Xmlel_Items1(Xmlel_Items) -> case {xmlns(Xmlel_Items), max_items(Xmlel_Items)} of {?NS_PUBSUB, undefined} -> {result, _Module = API_Core#api_core.get_items, _Function = 'get_items', _Parameters = { _NodeId = node(Xmlel_Items), _SubId = subid(Xmlel_Items), _Max_Items = undefined, _ItemIds = [] } }; {?NS_PUBSUB, Binary} -> case catch list_to_integer(binary_to_list(Binary)) of Integer when is_integer(Integer) andalso Integer >= 0 -> {result, _Module = API_Core#api_core.get_items, _Function = 'get_items', _Parameters = { _NodeId = node(Xmlel_Items), _SubId = subid(Xmlel_Items), _Max_Items = Integer, _ItemIds = undefined } }; _ -> {error, 'invalid-payload'} end; _ -> {error, 'invalid-payload'} end; %% parse('get' = _IQ_Type, [Xmlel_Items], _Rsm, API_Core) when ?Is_Xmlel_Items2(Xmlel_Items) -> case {xmlns(Xmlel_Items), parse_xmlels_item(remove_cdata(Xmlel_Items#xmlel.children))} of {?NS_PUBSUB, {ok, ItemIds}} -> {result, _Module = API_Core#api_core.get_items, _Function = 'get_items', _Parameters = { _NodeId = node(Xmlel_Items), _SubId = subid(Xmlel_Items), _Max_Items = undefined, ItemIds } }; {_, _Error} -> {error, 'invalid-payload'} end; %-- Get_Configure_Subscription_Default --% %% %% %% %% %% %% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Default], _Rsm, API_Core) when ?Is_Xmlel_Default(Xmlel_Default) -> case xmlns(Xmlel_Default) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.get_configure_subscription_default, _Function = 'get_configure_subscription_default', _Parameters = { _NodeId = node(Xmlel_Default) } }; _ -> {error, 'invalid-payload'} end; %-- Get_Configure_Subscription --% %% %% %% %% %% %% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Options], _Rsm, API_Core) when ?Is_Xmlel_Options2(Xmlel_Options) -> case xmlns(Xmlel_Options) of ?NS_PUBSUB -> {result, _Module = API_Core#api_core.get_configure_subscription, _Function = 'get_configure_subscription', _Parameters = { _NodeId = node(Xmlel_Options), _Jid = jid(Xmlel_Options), _SubId = subid(Xmlel_Options) } }; _ -> {error, 'invalid-payload'} end; %-- Get_Configure_Node_Default --% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Default], _Rsm, API_Core) when ?Is_Xmlel_Default(Xmlel_Default) -> case xmlns(Xmlel_Default) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.get_configure_node_default, _Function = 'get_configure_node_default', _Parameters = { _NodeId = node(Xmlel_Default) } }; _ -> {error, 'invalid-payload'} end; %-- Get_Configure_Node --% %% %% %% %% %% parse('get' = _IQ_Type, [Xmlel_Configure], _Rsm, API_Core) when ?Is_Xmlel_Configure(Xmlel_Configure) -> case xmlns(Xmlel_Configure) of ?NS_PUBSUB_OWNER -> {result, _Module = API_Core#api_core.get_configure_node, _Function = 'get_configure_node', _Parameters = { _NodeId = node(Xmlel_Configure) } }; _ -> {error, 'invalid-payload'} end; %% parse(_IQ_Type, _Xmlels, _Rsm, _API_Core) -> {error, 'invalid-payload'}. %%%%%%%%%%%%%%%%%%%%% %% Parsing Helpers %% %%%%%%%%%%%%%%%%%%%%% %% -spec(parse_xmlels_item/1 :: ( Xmlels :: [Xmlel_Item::xmlel(),...]) -> {ok, ItemIds :: [] | exmpp_pubsub:itemIds()} %%% | {error, 'invalid-payload'} ). parse_xmlels_item(Xmlels) -> parse_xmlels_item(Xmlels, []). %% -spec(parse_xmlels_item/2 :: ( Xmlels :: [Xmlel_Item::xmlel(),...], ItemIds :: [] | exmpp_pubsub:itemIds()) -> {ok, ItemIds :: [] | exmpp_pubsub:itemIds()} %%% | {error, 'invalid-payload'} ). %% parse_xmlels_item([Xmlel_Item | Xmlels], ItemIds) when ?Is_Xmlel_Item(Xmlel_Item) -> case {xmlns(Xmlel_Item), id(Xmlel_Item)} of {?NS_PUBSUB, ItemId} when ItemId /= undefined -> parse_xmlels_item(Xmlels, [ItemId | ItemIds]); _ -> {error, 'invalid-payload'} end; parse_xmlels_item([] = _Xmlels_Item, ItemIds) -> {ok, ItemIds}; %% parse_xmlels_item(_Xmlels, _ItemIds) -> {error, 'invalid-payload'}. xmlns(Xmlel) -> get_tag_attr_s(<<"xmlns">>, Xmlel). node(Xmlel) -> case get_tag_attr_s(<<"node">>, Xmlel) of <<>> -> undefined; NodeId -> NodeId end. id(Xmlel) -> case get_tag_attr_s(<<"id">>, Xmlel) of <<>> -> undefined; ItemId -> ItemId end. uri(Xmlel) -> case get_tag_attr_s(<<"uri">>, Xmlel) of <<>> -> undefined; URI -> URI end. jid(Xmlel) -> case get_tag_attr_s(<<"jid">>, Xmlel) of <<>> -> undefined; Jid -> Jid end. subid(Xmlel) -> case get_tag_attr_s(<<"subid">>, Xmlel) of <<>> -> undefined; SubId -> SubId end. notify(Xmlel) -> case get_tag_attr_s(<<"notify">>, Xmlel) of <<>> -> undefined; Notify -> Notify end. max_items(Xmlel) -> case get_tag_attr_s(<<"max_items">>, Xmlel) of <<>> -> undefined; Max_Items -> Max_Items end.