File: //usr/local/share/perl5/Net/OSCAR/XML/Protocol.xml
<?xml version="1.0"?>
<!DOCTYPE oscar SYSTEM "Protocol.dtd">
<oscar>
<!-- OSCAR primitives -->
<define name="flap">
<byte>42</byte> <!-- FLAP packet start indicator -->
<byte name="channel">2</byte>
<word name="seqno" />
<data length_prefix="word" name="msg" />
</define>
<define name="snac">
<word name="family" />
<word name="subtype" />
<byte name="flags1" />
<byte name="flags2" />
<dword name="reqid" />
<data name="data" />
</define>
<define name="TLV">
<word name="type" />
<data length_prefix="word" name="data" />
</define>
<define name="subtyped_TLV">
<word name="type" />
<byte name="subtype" />
<data length_prefix="byte" name="data" />
</define>
<define name="userinfo">
<data name="screenname" length_prefix="byte" />
<word name="evil" />
<tlvchain count_prefix="word">
<tlv type="1"><word name="flags" /></tlv>
<tlv type="2"><dword name="membersince" /></tlv>
<tlv type="3"><dword name="onsince" /></tlv>
<tlv type="4"><word name="idle" /></tlv>
<tlv type="13"><data length="16" count="-1" name="capabilities" /></tlv>
<tlv type="25"><data length="2" count="-1" name="shortcaps" /></tlv>
<tlv type="29">
<tlvchain subtyped="yes">
<tlv type="1" subtype="1"><data name="icon_md5sum" /></tlv>
<tlv type="2" subtype="-1"><data length_prefix="word" name="extended_status" /></tlv>
</tlvchain>
</tlv>
<tlv type="5"> <!-- Only found in channel 3 IMs, why is it in this structure??? -->
<tlvchain>
<tlv type="12"><data name="invitation_message" /></tlv>
<tlv type="10001">
<word />
<data length_prefix="byte" name="chat_url" />
</tlv>
</tlvchain>
</tlv>
<!-- Self-info only -->
<tlv type="15"><dword name="session_length" /></tlv>
<tlv type="10"><dword name="ip" /></tlv>
<!-- This contains a second copy of this structure - why?! -->
<tlv type="512" name="sub_info" />
</tlvchain>
</define>
<!-- Random protocol crap -->
<define name="service_request" family="1" subtype="4">
<word name="type" />
<!-- Chat extra -->
<tlvchain>
<tlv type="1" name="chat">
<word name="exchange" />
<data length_prefix="byte" name="url" />
<word>0</word>
</tlv>
</tlvchain>
</define>
<define name="error" family="-1" subtype="1">
<word name="errno" />
<tlvchain>
<tlv type="4"><data name="error_details" /></tlv>
</tlvchain>
</define>
<define name="service_redirect_response" family="1" subtype="5">
<tlvchain>
<tlv type="13"><word name="service_type" /></tlv>
<tlv type="6"><data name="auth_cookie" /></tlv>
<tlv type="5"><data name="server_ip" /></tlv>
</tlvchain>
</define>
<!-- Signing on -->
<define name="BOS_signon" family="0" subtype="1" channel="1" flags2="6">
<data name="cookie" />
</define>
<define name="signon" family="23" subtype="2">
<tlvchain>
<tlv type="1"><data name="screenname" /></tlv>
<!-- For AIM-style signons -->
<tlv type="37"><data name="auth_response" /></tlv>
<!--
Set this if the password was hashed before putting
it into the auth_response
-->
<tlv type="76"><data name="pass_is_hashed" /></tlv>
<!-- For ICQ-style signons -->
<tlv type="2"><data name="password" /></tlv>
<tlv type="3"><data name="clistr" /></tlv>
<tlv type="22"><word name="supermajor" /></tlv>
<tlv type="23"><word name="major" /></tlv>
<tlv type="24"><word name="minor" /></tlv>
<tlv type="25"><word name="subminor" /></tlv>
<tlv type="26"><word name="build" /></tlv>
<tlv type="20"><dword name="subbuild" /></tlv>
<tlv type="15"><data>en</data></tlv>
<tlv type="14"><data>us</data></tlv>
<tlv type="74"><byte>1</byte></tlv>
</tlvchain>
</define>
<define name="ICQ_signon_request" channel="1">
<dword>1</dword>
<ref name="signon" />
</define>
<define name="initial_signon_request" family="23" subtype="6">
<tlvchain>
<tlv type="1"><data name="screenname" /></tlv>
<tlv type="75" default_generate="yes" />
<tlv type="90" default_generate="yes" />
</tlvchain>
</define>
<!-- How server sends challenge for challenge/response authentication to client -->
<define name="authentication_key" family="23" subtype="7">
<data name="key" length_prefix="word" />
</define>
<!-- Random crap that's part of signon, protocol negotiation -->
<define name="authorization_response" family="23" subtype="3">
<tlvchain>
<!-- If there's an error -->
<tlv type="8"><word name="error" /></tlv>
<tlv type="4"><data name="error_details" /></tlv>
<!-- Basic info -->
<tlv type="1"><data name="screenname" /></tlv>
<tlv type="17"><data name="email" /></tlv>
<tlv type="6"><data name="auth_cookie" /></tlv>
<tlv type="5"><data name="server_ip" /></tlv>
<!-- Other stuff -->
<tlv type="19"><word name="registration_status" /></tlv>
<tlv type="84"><data name="password_change_url" /></tlv>
</tlvchain>
</define>
<define name="rate_class_info">
<word name="class_id" />
<dword name="window_size" />
<data name="levels">
<dword name="clear" />
<dword name="alert" />
<dword name="limit" />
<dword name="disconnect" />
<dword name="current" />
<dword name="max" />
</data>
<dword name="last_time" />
<byte name="current_state" />
</define>
<define name="rate_info_response" family="1" subtype="7">
<data count_prefix="word" name="classes">
<ref name="rate_class_info" />
</data>
<data count="-1" name="classmembers">
<word name="class_id" />
<data count_prefix="word" name="snacs">
<word name="family" />
<word name="subtype" />
</data>
</data>
</define>
<define name="rate_acknowledgement" family="1" subtype="8">
<word count="-1" name="classes" />
</define>
<define name="personal_info_request" family="1" subtype="14" />
<define name="buddylist_rights_request" family="19" subtype="2" />
<define name="buddylist_request" family="19" subtype="4" />
<define name="locate_rights_request" family="2" subtype="2" />
<define name="locate_rights_response" family="2" subtype="3">
<tlvchain>
<tlv type="1"><word name="max_profile_len">1024</word></tlv>
<tlv type="2"><word name="max_capabilities">16</word></tlv>
<tlv type="3"><word>10</word></tlv>
<tlv type="4"><word>4096</word></tlv>
</tlvchain>
</define>
<define name="buddy_rights_request" family="3" subtype="2" />
<define name="buddy_rights_response" family="3" subtype="3">
<tlvchain>
<tlv type="1"><word name="maxbuddies">600</word></tlv>
<tlv type="2"><word name="maxwatchers">750</word></tlv>
<tlv type="3"><word name="maxnotifies">512</word></tlv>
</tlvchain>
</define>
<define name="IM_parameters">
<word name="channel">0</word>
<dword name="flags">3</dword>
<word name="max_size">8000</word>
<word name="max_send_warn">999</word>
<word name="max_recv_warn">999</word>
<word name="min_msg_interval">0</word>
<word>0</word>
</define>
<define name="add_IM_parameters" family="4" subtype="2"><ref name="IM_parameters" /></define>
<define name="IM_parameter_request" family="4" subtype="4"><ref name="IM_parameters" /></define>
<define name="IM_parameter_response" family="4" subtype="5"><ref name="IM_parameters" /></define>
<define name="BOS_rights_request" family="9" subtype="2" />
<define name="BOS_rights_response" family="9" subtype="3">
<tlvchain>
<tlv type="1"><word name="max_permits">200</word></tlv>
<tlv type="2"><word name="max_denies">200</word></tlv>
</tlvchain>
</define>
<define name="self_information" family="1" subtype="15"><ref name="userinfo" /></define>
<define name="minimum_report_interval" family="11" subtype="2" />
<define name="MOTD" family="1" subtype="19" />
<define name="server_ready" family="1" subtype="3">
<word count="-1" name="families" />
</define>
<define name="set_service_versions" family="1" subtype="23">
<data count="-1" name="service">
<word name="service_id" />
<word name="service_version" />
</data>
</define>
<define name="set_tool_versions" family="1" subtype="2">
<data count="-1" name="service">
<word name="service_id" />
<word name="service_version" />
<word name="tool_id" />
<word name="tool_version" />
</data>
</define>
<define name="rate_info_request" family="1" subtype="6" />
<define name="rate_change" family="1" subtype="10">
<enum type="word" name="message_type">
<edef name="change" value="1" />
<edef name="warning" value="2" />
<edef name="alert" value="3" />
<edef name="clear" value="4" />
</enum>
<ref name="rate_class_info" />
</define>
<define name="outgoing_warning" family="4" subtype="8">
<word name="is_anonymous" />
<data name="screenname" length_prefix="byte" />
</define>
<define name="incoming_warning" family="1" subtype="16">
<word name="new_level" />
<ref name="userinfo" />
</define>
<define name="memory_request" family="1" subtype="31" /> <!-- This was an attempt to block third-party clients by requesting MD5s of portions of the AIM.EXE binary; it is no longer used, huzzah -->
<define name="host_versions" family="1" subtype="24">
<data count="-1" name="server">
<word name="service_id" />
<word name="service_version" />
</data>
</define>
<define name="buddylist_done" family="19" subtype="7" />
<!-- Buddylist stuff -->
<define name="buddylist_3_response" family="19" subtype="3">
<tlvchain>
<tlv type="4"><word count="-1" name="maximums" /></tlv>
<tlv type="2"><word>254</word></tlv>
<tlv type="3"><word>508</word></tlv>
<tlv type="5"><word>0</word></tlv>
<tlv type="6"><word>97</word></tlv>
<tlv type="7"><word>10</word></tlv>
</tlvchain>
</define>
<define name="buddylist" family="19" subtype="6"> <!-- This is supremely weird and fucked up, no bloody way we'll be able to get it in the XML; notably, it is split across multiple SNACs, but not on any sort of coherent boundary, and you have to slice random bits off the front and back... See OSCAR/Callbacks.pm handler for this protobit. -->
<data name="data" />
</define>
<define name="buddylist_modification_acknowledgement" family="19" subtype="14">
<word name="error" count="-1" />
</define>
<define name="buddylist_error" family="19" subtype="15">
<data name="data" />
</define>
<!-- Packets are limited to 8k in size, which we could exceed if we try to put too many
modifications into one packet. Since we need to flatten one modification at a time
and stop when we hit the size cap, this stuff is a bit peculiar. -->
<define name="buddylist_modification">
<data name="entry_name" length_prefix="word" />
<word name="group_id" />
<word name="buddy_id" />
<word name="entry_type" />
<data name="entry_data" length_prefix="word" />
</define>
<define name="buddylist_add" family="19" subtype="8"><data name="mods" /></define>
<define name="buddylist_modify" family="19" subtype="9"><data name="mods" /></define>
<define name="buddylist_delete" family="19" subtype="10"><data name="mods" /></define>
<!-- We also provide this more regular version for use in parsing changes sent by the server -->
<define name="buddylist_change">
<data name="changes" count="-1">
<ref name="buddylist_modification" />
</data>
</define>
<define name="start_buddylist_modifications" family="19" subtype="17" />
<define name="end_buddylist_modifications" family="19" subtype="18" />
<!-- User information -->
<define name="get_info" family="2" subtype="21">
<word>0</word>
<word>1</word>
<data length_prefix="byte" name="screenname" />
</define>
<define name="get_away" family="2" subtype="21">
<word>0</word>
<word>3</word>
<data length_prefix="byte" name="screenname" />
</define>
<define name="incoming_profile" family="2" subtype="6">
<ref name="userinfo" />
<tlvchain>
<tlv type="2"><data name="profile" /></tlv>
<tlv type="4"><data name="awaymsg" /></tlv>
</tlvchain>
</define>
<define name="set_info" family="2" subtype="4">
<tlvchain>
<tlv type="1"><data name="profile_mimetype" /></tlv>
<tlv type="2"><data name="profile" /></tlv>
<tlv type="3"><data name="awaymsg_mimetype" /></tlv>
<tlv type="4"><data name="awaymsg" /></tlv>
<tlv type="5"><data name="capabilities" length="16" count="-1" /></tlv>
<tlv type="6">
<tlvchain><tlv type="4"><word>2</word></tlv></tlvchain>
</tlv>
</tlvchain>
</define>
<define name="set_idle" family="1" subtype="17">
<dword name="duration" />
</define>
<!-- Extended information -->
<define name="typing_notification" family="4" subtype="20">
<dword>0</dword>
<dword>0</dword>
<word>1</word>
<data length_prefix="byte" name="screenname" />
<word name="typing_status" />
</define>
<define name="incoming_extended_information" family="1" subtype="33">
<!-- Gee, thank you for this wonderful structure, AOL... Love you too. -->
<!-- Only one item in the TLV chain will be present, client should key off of which one -->
<tlvchain subtyped="yes">
<tlv type="0" subtype="65"><data name="upload_checksum" /></tlv>
<tlv type="1" subtype="65"><data name="upload_checksum" /></tlv>
<tlv type="0" subtype="129"><data name="resend_checksum" /></tlv>
<tlv type="1" subtype="129"><data name="resend_checksum" /></tlv>
<tlv type="2" subtype="-1"><data length_prefix="word" name="status_message" /></tlv>
</tlvchain>
</define>
<define name="set_extended_status" family="1" subtype="30">
<tlvchain>
<tlv type="29" name="status_message">
<word>2</word>
<byte>4</byte>
<data length_prefix="byte">
<data length_prefix="word" name="message" />
<word>0</word>
</data>
</tlv>
<tlv type="6" name="stealth">
<!--
0x100 is the 'stealth' flag
Presumably there are other things that can go here...
-->
<dword name="state" />
</tlv>
</tlvchain>
</define>
<define name="icon_upload" family="16" subtype="2">
<tlvchain>
<tlv type="1"><data name="icon" /></tlv>
</tlvchain>
</define>
<!-- Buddylist -->
<define name="buddy_status_update" family="3" subtype="11">
<ref name="userinfo" />
</define>
<define name="buddy_signoff" family="3" subtype="12">
<data length_prefix="byte" name="screenname" />
</define>
<!-- IMs -->
<define name="standard_IM_header">
<data length="8" name="cookie" />
<word name="channel">1</word>
</define>
<define name="standard_IM_footer">
<tlvchain>
<tlv type="2">
<tlvchain>
<tlv type="1281">
<word>257</word>
<word>257</word>
</tlv>
<tlv type="257">
<word>0</word>
<word>0</word>
<data name="message" />
</tlv>
</tlvchain>
</tlv>
<tlv type="4" name="is_automatic" />
<tlv type="3" name="request_server_confirmation" />
<tlv type="11" name="supports_typing_status" />
<tlv type="8" name="icon_data">
<dword name="icon_length" />
<word>1</word>
<word name="icon_checksum" />
<dword name="icon_timestamp" />
</tlv>
</tlvchain>
</define>
<define name="rendezvous_IM">
<tlvchain>
<tlv type="5">
<enum type="word" name="status">
<edef name="propose" value="0" />
<edef name="cancel" value="1" />
<edef name="accept" value="2" />
</enum>
<data length="8" name="cookie" />
<!-- Indicates request type -->
<data length="16" name="capability" />
<tlvchain>
<!-- 1 == push, 2 == pull -->
<tlv type="10"><word name="push_pull" /></tlv>
<tlv type="11"><word name="error" /></tlv>
<tlv type="15" default_generate="yes" />
<!-- File transfer stuff -->
<tlv type="2"><dword name="client_1_ip" /></tlv>
<tlv type="3"><dword name="client_2_ip" /></tlv>
<tlv type="4"><dword name="client_external_ip" /></tlv>
<tlv type="5"><word name="port" /></tlv>
<tlv type="22"><dword name="proxy_ip" /></tlv>
<!-- Proposal message -->
<tlv type="12"><data name="invitation_msg" /></tlv>
<tlv type="13"><data name="charset">us-ascii</data></tlv>
<tlv type="14"><byte name="language">48</byte></tlv>
<!-- See 'rendezvous service-specific data' -->
<tlv type="10001"><data name="svcdata" /></tlv>
<tlv type="10002"><data name="svcdata_charset" /></tlv>
</tlvchain>
</tlv>
</tlvchain>
</define>
<define name="incoming_IM" family="4" subtype="7">
<ref name="standard_IM_header" />
<ref name="userinfo" />
<data name="message_body" />
</define>
<define name="outgoing_IM" family="4" subtype="6">
<ref name="standard_IM_header" />
<data name="screenname" length_prefix="byte" />
<data name="message_body" />
</define>
<define name="IM_acknowledgement" family="4" subtype="12">
<data length="8" name="cookie" />
<word name="channel" />
<data length_prefix="byte" name="screenname" />
</define>
<!-- Chat -->
<define name="chat_invitation_accept" family="13" subtype="4">
<word name="exchange">4</word>
<data length_prefix="byte" name="url" />
<word>0</word>
<byte>2</byte>
</define>
<define name="chat_invitation_decline" family="4" subtype="11">
<data length="8" name="cookie" />
<word name="channel">2</word>
<data length_prefix="byte" name="screenname" />
<tlvchain>
<!-- 0=not supported, 1=declined, 2=client is not accepting transfers -->
<tlv type="3"><word name="code">1</word></tlv>
</tlvchain>
</define>
<define name="chat_navigator_rights_request" family="13" subtype="2" />
<define name="chat_navigator_room_create" family="13" subtype="8">
<ref name="chat_room_info" />
</define>
<define name="chat_data">
<tlvchain count_prefix="word">
<tlv type="106"><data name="name" /></tlv>
<tlv type="111"><word name="occupant_count" /></tlv>
<tlv type="115" name="occupants" count="-1">
<ref name="userinfo" />
</tlv>
<tlv type="209"><word name="max_msg_len" /></tlv>
<tlv type="211"><data name="name" /></tlv>
<tlv type="214"><data name="charset">us-ascii</data></tlv>
<tlv type="215" default_generate="yes"><data name="language">en</data></tlv>
<tlv type="219"><data name="encoding" /></tlv>
</tlvchain>
</define>
<define name="chat_room_info">
<word name="exchange" />
<data length_prefix="byte" name="url">create</data>
<word name="instance">65535</word>
<byte name="detail_level">1</byte>
<ref name="chat_data" />
</define>
<word />
<data length_prefix="byte">
<byte />
<data name="name" />
</data>
<word />
<byte name="detail_level" />
<tlvchain count_prefix="word">
<tlv type="111"><word name="occupant_count" /></tlv>
<tlv type="115">
<data name="occupants" count="-1">
<ref name="userinfo" />
</data>
</tlv>
</tlvchain>
<define name="chat_navigator_response" family="13" subtype="9">
<tlvchain>
<!-- These two come from the 'chat navigator rights request' -->
<tlv type="2"><byte name="max_concurrent_rooms" /></tlv>
<tlv type="3" count="-1" name="exchange">
<word name="exchange" />
<ref name="chat_data" />
</tlv>
<!-- These two come from the create room request -->
<tlv type="4" count="-1" name="room">
<ref name="chat_room_info" />
</tlv>
</tlvchain>
</define>
<define name="chat_room_status" family="14" subtype="2">
<ref name="chat_room_info" />
</define>
<define name="chat_buddy_arrival" family="14" subtype="3">
<data name="arrivals" count="-1">
<ref name="userinfo" />
</data>
</define>
<define name="chat_buddy_departure" family="14" subtype="4">
<data name="departures" count="-1" length_prefix="byte" />
</define>
<define name="chat_IM">
<data length="8" name="cookie" />
<word>3</word> <!-- channel -->
<tlvchain>
<tlv type="1" default_generate="yes" />
<tlv type="3"><data name="sender" length_prefix="byte" /></tlv>
<tlv type="6" name="reflect" />
<tlv type="7" name="is_automatic" />
<tlv type="5">
<tlvchain>
<tlv type="4"><data name="type">text/x-aolrtf</data></tlv>
<tlv type="2"><data name="charset">us-ascii</data></tlv>
<tlv type="3"><data name="language">en</data></tlv>
<tlv type="5"><data>binary</data></tlv>
<tlv type="1"><data name="message" /></tlv>
</tlvchain>
</tlv>
</tlvchain>
</define>
<define name="outgoing_chat_IM" family="14" subtype="5"><ref name="chat_IM" /></define>
<define name="incoming_chat_IM" family="14" subtype="6"><ref name="chat_IM" /></define>
<!-- Administrative services -->
<define name="admin_request_response" family="7" subtype="5">
<word name="request_type" />
<tlvchain count_prefix="word">
<tlv type="1"><data name="new_screenname" /></tlv>
<tlv type="17"><data name="new_email" /></tlv>
<tlv type="8"><word name="error_code" /></tlv>
<tlv type="4"><data name="error_url" /></tlv>
<tlv type="3"><word name="subrequest" /></tlv>
</tlvchain>
</define>
<define name="buddy_icon_uploaded" family="16" subtype="3" />
<define name="buddy_icon_download" family="16" subtype="4">
<data name="screenname" length_prefix="byte" />
<byte>1</byte>
<word>1</word>
<byte>1</byte>
<data name="md5sum" length_prefix="byte" />
</define>
<define name="buddy_icon_downloaded" family="16" subtype="5">
<data name="screenname" length_prefix="byte" />
<word name="flags" />
<byte name="number" />
<data name="checksum" length_prefix="byte" />
<data name="icon" length_prefix="word" />
</define>
<define name="confirm_account_request" family="7" subtype="6" />
<define name="confirm_account_response" family="7" subtype="7">
<!-- If present and 19, indicates error, otherwise success -->
<word name="status" />
</define>
<define name="change_account_info" family="7" subtype="4">
<!-- Not all of these need to be present. -->
<tlvchain>
<tlv type="1"><data name="new_screenname" /></tlv>
<tlv type="17"><data name="new_email" /></tlv>
<tlv type="2"><data name="newpass" /></tlv>
<tlv type="18"><data name="oldpass" /></tlv>
</tlvchain>
</define>
<!-- ICQ -->
<define name="ICQ_meta">
<tlvchain>
<tlv type="1">
<data length_prefix="word" prefix_order="vax" >
<dword name="our_uin" order="vax" />
<word name="type" order="vax" />
<word name="seqno" order="vax" />
<data name="typedata" />
</data>
</tlv>
</tlvchain>
</define>
<define name="ICQ_meta_request" family="21" subtype="2"><ref name="ICQ_meta" /></define>
<define name="ICQ_meta_response" family="21" subtype="3"><ref name="ICQ_meta" /></define>
<!-- Type 2000 -->
<define name="ICQ_meta_info_request">
<word name="subtype" order="vax">1202</word>
<dword name="uin" order="vax" />
</define>
<!-- Type 2010 -->
<define name="ICQ_meta_info_response">
<word name="subtype" order="vax" />
<!-- 10 == success -->
<byte name="status" />
<data name="response_data" />
</define>
<!-- Type 2010 subtypes -->
<!-- 200 -->
<define name="ICQ_meta_info_response:_basic">
<data name="nickname" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="firstname" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="lastname" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="email" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="home">
<data name="city" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="state" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="phone_num" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="fax_num" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="address" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="cell_phone_num" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="zip_code" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<word name="country_code" order="vax" />
</data>
<byte name="gmt_offset" />
<byte name="authorization" />
<byte name="web_aware" />
<byte name="direct_connect_permissions" />
<byte name="publish_primary_email" />
</define>
<!-- 210 -->
<define name="ICQ_meta_info_response:_office">
<data name="city" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="state" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="phone_num" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="fax_num" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="address" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="zip_code" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<word name="country_code" order="vax" />
<data name="company" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="department" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="position" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<word name="occupation" order="vax" />
<data name="office_website" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</define>
<!-- 220 -->
<define name="ICQ_meta_info_response:_background">
<word name="age" order="vax" />
<byte name="gender" />
<data name="homepage" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<word name="birth_year" order="vax" />
<byte name="birth_month" />
<byte name="bith_day" />
<byte name="language_1" />
<byte name="language_2" />
<byte name="language_3" />
<word />
<data name="origin_city" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<data name="origin_state" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<word name="origin_country" order="vax" />
<byte name="marital_status" />
</define>
<!-- 230 -->
<define name="ICQ_meta_info_response:_notes">
<data name="notes" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</define>
<!-- 235 -->
<define name="ICQ_meta_info_response:_email">
<data count_prefix="byte" name="addresses">
<byte name="publish" />
<data name="address" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</data>
</define>
<!-- 240 -->
<define name="ICQ_meta_info_response:_interests">
<data count_prefix="byte" name="interests">
<word name="category" order="vax" />
<data name="interest" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</data>
</define>
<!-- 250 -->
<define name="ICQ_meta_info_response:_affiliations">
<data count_prefix="byte" name="past_affiliations">
<word name="category" order="vax" />
<data name="keyword" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</data>
<data count_prefix="byte" name="affiliations">
<word name="category" order="vax" />
<data name="keyword" length_prefix="word" prefix_order="vax" null_terminated="yes" />
</data>
</define>
<!-- 270 -->
<define name="ICQ_meta_info_response:_homepage">
<byte name="enabled" />
<word name="category" order="vax" />
<data name="keywords" length_prefix="word" prefix_order="vax" null_terminated="yes" />
<byte />
</define>
<!-- Rendezvous service-specific data -->
<define name="chat_invite_rendezvous_data">
<word name="exchange">4</word>
<data length_prefix="byte" name="url" />
<word>0</word>
</define>
<define name="file_transfer_rendezvous_data">
<!-- 1 if only sending a single file, otherwise 2 -->
<word name="file_count_status" />
<word name="file_count" />
<dword name="size" />
<data count="-1" null_terminated="yes" name="files" />
</define>
<define name="buddy_list_transfer_rendezvous_data">
<data count="-1" name="group">
<data length_prefix="word" name="name" />
<data count_prefix="word" name="buddies">
<data length_prefix="word" name="name" />
</data>
</data>
</define>
<!-- Direct-connect and file transfer stuff -->
<define name="file_transfer_header">
<data length="4">OFT2</data>
<word name="header_length">256</word>
<!-- 0x0101 for syn, 0x0202 for ack, 0x0204 for fin -->
<word name="type" />
<data length="8" name="cookie" />
<word name="encrypt">0</word>
<word name="compress">0</word>
<word name="file_count" />
<word name="files_left" />
<word name="part_count">1</word>
<word name="parts_left">1</word>
<dword name="byte_count" />
<dword name="bytes_left" />
<dword name="mtime" />
<dword name="checksum" />
<dword name="received_initial_checksum">4294901760</dword>
<dword name="received_size">0</dword>
<dword name="ctime" />
<dword name="initial_checksum">4294901760</dword>
<dword name="bytes_received" />
<dword name="received_checksum" />
<data length="32" pad="0" name="client_id">Cool FileXfer</data>
<byte name="flags">32</byte>
<byte name="name_offset">28</byte>
<byte name="size_offset">17</byte>
<data length="69" pad="0" />
<data length="16" pad="0" name="mac_file_info" />
<word name="encoding">0</word>
<word name="language">0</word>
<data length="64" pad="0" name="filename" />
</define>
<!-- Migration: See http://iserverd1.khstu.ru/oscar/sequences.html#migration -->
<define name="pause" family="1" subtype="11" />
<define name="pause_ack" family="1" subtype="12">
<word count="-1" name="families" />
</define>
<define name="unpause" family="1" subtype="13" />
<define name="migrate" family="1" subtype="18">
<word count_prefix="word" name="families" />
<tlvchain>
<tlv type="5"><data name="peer" /></tlv>
<tlv type="6"><data name="cookie" /></tlv>
</tlvchain>
</define>
<!-- Direct connect proxy -->
<!-- In front of any of these is a 16-bit network order length -->
<define name="direct_connect_proxy_hdr">
<word name="magic">1098</word>
<word name="msg_type" />
<dword>0</dword>
<data name="data" />
</define>
<define name="direct_connect_proxy_init"> <!-- msg_type 2 -->
<ref name="direct_connect_proxy_hdr" />
<word>0</word>
<data length_prefix="byte" name="screenname" />
<data length="8" name="cookie" />
<tlvchain>
<tlv type="1"><data name="capability" /></tlv>
</tlvchain>
</define>
<define name="direct_connect_proxy_reply"> <!-- msg_type 3 -->
<ref name="direct_connect_proxy_hdr" />
<word>544</word>
<word name="port" />
<dword name="ip" />
</define>
</oscar>