InventoryServer.pm 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. package OpenSim::InventoryServer;
  2. use strict;
  3. use XML::Serializer;
  4. use OpenSim::Utility;
  5. use OpenSim::Config;
  6. use OpenSim::InventoryServer::Config;
  7. use OpenSim::InventoryServer::InventoryManager;
  8. my $METHOD_LIST = undef;
  9. sub getHandlerList {
  10. if (!$METHOD_LIST) {
  11. my %list = (
  12. "GetInventory" => \&_get_inventory,
  13. "CreateInventory" => \&_create_inventory,
  14. "NewFolder" => \&_new_folder,
  15. "MoveFolder" => \&_move_folder,
  16. "NewItem" => \&_new_item,
  17. "DeleteItem" => \&_delete_item,
  18. "RootFolders" => \&_root_folders,
  19. );
  20. $METHOD_LIST = \%list;
  21. }
  22. return $METHOD_LIST;
  23. }
  24. # #################
  25. # Handlers
  26. sub _get_inventory {
  27. my $post_data = shift;
  28. my $uuid = &_get_uuid($post_data);
  29. my $inventry_folders = &OpenSim::InventoryServer::InventoryManager::getUserInventoryFolders($uuid);
  30. my @response_folders = ();
  31. foreach (@$inventry_folders) {
  32. my $folder = &_convert_to_response_folder($_);
  33. push @response_folders, $folder;
  34. }
  35. my $inventry_items = &OpenSim::InventoryServer::InventoryManager::getUserInventoryItems($uuid);
  36. my @response_items = ();
  37. foreach (@$inventry_items) {
  38. my $item = &_convert_to_response_item($_);
  39. push @response_items, $item;
  40. }
  41. my $response_obj = {
  42. Folders => { InventoryFolderBase => \@response_folders },
  43. AllItems => { InventoryItemBase => \@response_items },
  44. UserID => { UUID => $uuid },
  45. };
  46. my $serializer = new XML::Serializer( $response_obj, "InventoryCollection");
  47. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  48. }
  49. sub _create_inventory {
  50. my $post_data = shift;
  51. my $uuid = &_get_uuid($post_data);
  52. my $InventoryFolders = &_create_default_inventory($uuid);
  53. foreach (@$InventoryFolders) {
  54. &OpenSim::InventoryServer::InventoryManager::saveInventoryFolder($_);
  55. }
  56. my $serializer = new XML::Serializer("true", "boolean");
  57. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  58. }
  59. sub _new_folder {
  60. my $post_data = shift;
  61. my $request_obj = &OpenSim::Utility::XML2Obj($post_data);
  62. my $folder = &_convert_to_db_folder($request_obj);
  63. &OpenSim::InventoryServer::InventoryManager::saveInventoryFolder($folder);
  64. my $serializer = new XML::Serializer("true", "boolean");
  65. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  66. }
  67. sub _move_folder {
  68. my $post_data = shift;
  69. my $request_info = &OpenSim::Utility::XML2Obj($post_data);
  70. &OpenSim::InventoryServer::InventoryManager::moveInventoryFolder($request_info);
  71. my $serializer = new XML::Serializer("true", "boolean");
  72. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  73. }
  74. sub _new_item {
  75. my $post_data = shift;
  76. my $request_obj = &OpenSim::Utility::XML2Obj($post_data);
  77. my $item = &_convert_to_db_item($request_obj);
  78. &OpenSim::InventoryServer::InventoryManager::saveInventoryItem($item);
  79. my $serializer = new XML::Serializer("true", "boolean");
  80. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  81. }
  82. sub _delete_item {
  83. my $post_data = shift;
  84. my $request_obj = &OpenSim::Utility::XML2Obj($post_data);
  85. my $item_id = $request_obj->{inventoryID}->{UUID};
  86. &OpenSim::InventoryServer::InventoryManager::deleteInventoryItem($item_id);
  87. my $serializer = new XML::Serializer("true", "boolean");
  88. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  89. }
  90. sub _root_folders {
  91. my $post_data = shift;
  92. my $uuid = &_get_uuid($post_data);
  93. my $response = undef;
  94. my $inventory_root_folder = &OpenSim::InventoryServer::InventoryManager::getRootFolder($uuid);
  95. if ($inventory_root_folder) {
  96. my $root_folder_id = $inventory_root_folder->{folderID};
  97. my $root_folder = &_convert_to_response_folder($inventory_root_folder);
  98. my $root_folders = &OpenSim::InventoryServer::InventoryManager::getChildrenFolders($root_folder_id);
  99. my @folders = ($root_folder);
  100. foreach(@$root_folders) {
  101. my $folder = &_convert_to_response_folder($_);
  102. push @folders, $folder;
  103. }
  104. $response = { InventoryFolderBase => \@folders };
  105. } else {
  106. $response = ""; # TODO: need better failed message
  107. }
  108. my $serializer = new XML::Serializer($response, "ArrayOfInventoryFolderBase");
  109. return $serializer->to_formatted(XML::Serializer::WITH_HEADER); # TODO:
  110. }
  111. # #################
  112. # subfunctions
  113. sub _convert_to_db_item {
  114. my $item = shift;
  115. my $ret = {
  116. inventoryID => $item->{inventoryID}->{UUID},
  117. assetID => $item->{assetID}->{UUID},
  118. assetType => $item->{assetType},
  119. invType => $item->{invType},
  120. parentFolderID => $item->{parentFolderID}->{UUID},
  121. avatarID => $item->{avatarID}->{UUID},
  122. creatorID => $item->{creatorsID}->{UUID}, # TODO: human error ???
  123. inventoryName => $item->{inventoryName},
  124. inventoryDescription => $item->{inventoryDescription} || "",
  125. inventoryNextPermissions => $item->{inventoryNextPermissions},
  126. inventoryCurrentPermissions => $item->{inventoryCurrentPermissions},
  127. inventoryBasePermissions => $item->{inventoryBasePermissions},
  128. inventoryEveryOnePermissions => $item->{inventoryEveryOnePermissions},
  129. };
  130. return $ret;
  131. }
  132. sub _convert_to_response_item {
  133. my $item = shift;
  134. my $ret = {
  135. inventoryID => { UUID => $item->{inventoryID} },
  136. assetID => { UUID => $item->{assetID} },
  137. assetType => $item->{assetType},
  138. invType => $item->{invType},
  139. parentFolderID => { UUID => $item->{parentFolderID} },
  140. avatarID => { UUID => $item->{avatarID} },
  141. creatorsID => { UUID => $item->{creatorID} }, # TODO: human error ???
  142. inventoryName => $item->{inventoryName},
  143. inventoryDescription => $item->{inventoryDescription} || "",
  144. inventoryNextPermissions => $item->{inventoryNextPermissions},
  145. inventoryCurrentPermissions => $item->{inventoryCurrentPermissions},
  146. inventoryBasePermissions => $item->{inventoryBasePermissions},
  147. inventoryEveryOnePermissions => $item->{inventoryEveryOnePermissions},
  148. };
  149. return $ret;
  150. }
  151. sub _convert_to_db_folder {
  152. my $folder = shift;
  153. my $ret = {
  154. folderName => $folder->{name},
  155. agentID => $folder->{agentID}->{UUID},
  156. parentFolderID => $folder->{parentID}->{UUID},
  157. folderID => $folder->{folderID}->{UUID},
  158. type => $folder->{type},
  159. version => $folder->{version},
  160. };
  161. return $ret;
  162. }
  163. sub _convert_to_response_folder {
  164. my $folder = shift;
  165. my $ret = {
  166. name => $folder->{folderName},
  167. agentID => { UUID => $folder->{agentID} },
  168. parentID => { UUID => $folder->{parentFolderID} },
  169. folderID => { UUID => $folder->{folderID} },
  170. type => $folder->{type},
  171. version => $folder->{version},
  172. };
  173. return $ret;
  174. }
  175. sub _create_default_inventory {
  176. my $uuid = shift;
  177. my @InventoryFolders = ();
  178. my $root_folder_id = &OpenSim::Utility::GenerateUUID();
  179. push @InventoryFolders, {
  180. "folderID" => $root_folder_id,
  181. "agentID" => $uuid,
  182. "parentFolderID" => &OpenSim::Utility::ZeroUUID(),
  183. "folderName" => "My Inventory",
  184. "type" => 8,
  185. "version" => 1,
  186. };
  187. push @InventoryFolders, {
  188. "folderID" => &OpenSim::Utility::GenerateUUID(),
  189. "agentID" => $uuid,
  190. "parentFolderID" => $root_folder_id,
  191. "folderName" => "Textures",
  192. "type" => 0,
  193. "version" => 1,
  194. };
  195. push @InventoryFolders, {
  196. "folderID" => &OpenSim::Utility::GenerateUUID(),
  197. "agentID" => $uuid,
  198. "parentFolderID" => $root_folder_id,
  199. "folderName" => "Objects",
  200. "type" => 6,
  201. "version" => 1,
  202. };
  203. push @InventoryFolders, {
  204. "folderID" => &OpenSim::Utility::GenerateUUID(),
  205. "agentID" => $uuid,
  206. "parentFolderID" => $root_folder_id,
  207. "folderName" => "Clothes",
  208. "type" => 5,
  209. "version" => 1,
  210. };
  211. return \@InventoryFolders;
  212. }
  213. # #################
  214. # Utilities
  215. sub _get_uuid {
  216. my $data = shift;
  217. if ($data =~ /<guid\s*>([^<]+)<\/guid>/) {
  218. return $1;
  219. } else {
  220. Carp::croak("can not find uuid: $data");
  221. }
  222. }
  223. 1;