1*70dc2e27SMarkus Himmel/* 2*70dc2e27SMarkus Himmel * Copyright 2014-2015 Markus Himmel. All rights reserved. 3*70dc2e27SMarkus Himmel * Distributed under the terms of the MIT License. 4*70dc2e27SMarkus Himmel * 5*70dc2e27SMarkus Himmel * Authors: 6*70dc2e27SMarkus Himmel * Markus Himmel, markus@himmel-villmar.de 7*70dc2e27SMarkus Himmel * 8*70dc2e27SMarkus Himmel * Corresponds to: 9*70dc2e27SMarkus Himmel * headers/os/translation/TranslatorRoster.h hrev48588 10*70dc2e27SMarkus Himmel * src/kits/translation/TranslatorRoster.cpp hrev48588 11*70dc2e27SMarkus Himmel */ 12*70dc2e27SMarkus Himmel 13*70dc2e27SMarkus Himmel/*! 14*70dc2e27SMarkus Himmel \file TranslatorRoster.h 15*70dc2e27SMarkus Himmel \ingroup translation 16*70dc2e27SMarkus Himmel \ingroup libtranslation 17*70dc2e27SMarkus Himmel \brief BTranslatorRoster class definition 18*70dc2e27SMarkus Himmel*/ 19*70dc2e27SMarkus Himmel 20*70dc2e27SMarkus Himmel/*! 21*70dc2e27SMarkus Himmel \class BTranslatorRoster 22*70dc2e27SMarkus Himmel \ingroup translation 23*70dc2e27SMarkus Himmel \ingroup libtranslation 24*70dc2e27SMarkus Himmel \brief Class that serves as an interface between applications and 25*70dc2e27SMarkus Himmel translators. 26*70dc2e27SMarkus Himmel 27*70dc2e27SMarkus Himmel BTranslatorRoster gives applications access to the translation kit. 28*70dc2e27SMarkus Himmel Applications can request translations and BTranslatorRoster will 29*70dc2e27SMarkus Himmel automatically search for a matching translator and have it perfrom the 30*70dc2e27SMarkus Himmel translation. 31*70dc2e27SMarkus Himmel 32*70dc2e27SMarkus Himmel \warning BTranslatorRoster does not perform chaining of any sort. Only 33*70dc2e27SMarkus Himmel translations that can be made by invoking a single translator are 34*70dc2e27SMarkus Himmel supported. 35*70dc2e27SMarkus Himmel 36*70dc2e27SMarkus Himmel \note BTranslationUtils provides some helper methods that perform the 37*70dc2e27SMarkus Himmel interaction with BTranslatorRoster for you. 38*70dc2e27SMarkus Himmel 39*70dc2e27SMarkus Himmel BTranslationRoster acts as a container. While in most cases the default 40*70dc2e27SMarkus Himmel roster is used, it is possible to create a roster that interacts with a 41*70dc2e27SMarkus Himmel custom set of translators. 42*70dc2e27SMarkus Himmel*/ 43*70dc2e27SMarkus Himmel 44*70dc2e27SMarkus Himmel/*! 45*70dc2e27SMarkus Himmel \name Constructors and Destructor 46*70dc2e27SMarkus Himmel*/ 47*70dc2e27SMarkus Himmel 48*70dc2e27SMarkus Himmel//! @{ 49*70dc2e27SMarkus Himmel 50*70dc2e27SMarkus Himmel/*! 51*70dc2e27SMarkus Himmel \fn BTranslatorRoster::BTranslatorRoster() 52*70dc2e27SMarkus Himmel \brief Constructs an empty BTranslatorRoster. 53*70dc2e27SMarkus Himmel 54*70dc2e27SMarkus Himmel \warning Only call the contructor if you want to use a custom collection of 55*70dc2e27SMarkus Himmel translators. Use Default() if you don't. 56*70dc2e27SMarkus Himmel*/ 57*70dc2e27SMarkus Himmel 58*70dc2e27SMarkus Himmel/*! 59*70dc2e27SMarkus Himmel \fn BTranslatorRoster::BTranslatorRoster(BMessage* model); 60*70dc2e27SMarkus Himmel \brief Constructs a BTranslatorRoster and fills it. 61*70dc2e27SMarkus Himmel 62*70dc2e27SMarkus Himmel \param model A message that contains information about a 63*70dc2e27SMarkus Himmel BTranslatorRoster. 64*70dc2e27SMarkus Himmel 65*70dc2e27SMarkus Himmel After initialization, \a model is searched for strings with the name 66*70dc2e27SMarkus Himmel \c "be:translator_path". The translators that are located at each path 67*70dc2e27SMarkus Himmel are added to the roster. If multiple paths point to translators with the 68*70dc2e27SMarkus Himmel same name, the translator at the path with the lowest index within the 69*70dc2e27SMarkus Himmel message will be kept. 70*70dc2e27SMarkus Himmel 71*70dc2e27SMarkus Himmel \warning Use Instantiate() instead of this constructor if \a model was 72*70dc2e27SMarkus Himmel created using Archive(). 73*70dc2e27SMarkus Himmel*/ 74*70dc2e27SMarkus Himmel 75*70dc2e27SMarkus Himmel/*! 76*70dc2e27SMarkus Himmel \fn BTranslatorRoster::~BTranslatorRoster(); 77*70dc2e27SMarkus Himmel \brief Deletes this BTranslatorRoster. 78*70dc2e27SMarkus Himmel 79*70dc2e27SMarkus Himmel If the BTranslatorRoster that is deleted is the default roster, a new 80*70dc2e27SMarkus Himmel default roster will be created when BTranslatorRoster::Default() is called 81*70dc2e27SMarkus Himmel for the next time. 82*70dc2e27SMarkus Himmel 83*70dc2e27SMarkus Himmel Release() is called on all translators in the roster. 84*70dc2e27SMarkus Himmel*/ 85*70dc2e27SMarkus Himmel 86*70dc2e27SMarkus Himmel/*! 87*70dc2e27SMarkus Himmel \fn static BTranslatorRoster* BTranslatorRoster::Default(); 88*70dc2e27SMarkus Himmel \brief Gets the default BTranslatorRoster. 89*70dc2e27SMarkus Himmel 90ed3c7f8fSAdrien Destugues At any point, there is only one default roster. It is created when this 91ed3c7f8fSAdrien Destugues method is called for the first time (possibly after being deleted) and is 92ed3c7f8fSAdrien Destugues populated according to the following rules: 93*70dc2e27SMarkus Himmel 94ed3c7f8fSAdrien Destugues If the environment variable \c TRANSLATORS is set, the default roster will 95ed3c7f8fSAdrien Destugues be populated with all translators that are present in the directories 96ed3c7f8fSAdrien Destugues denoted by \c TRANSLATORS. The paths are separated by a colon (<tt>:</tt>). 97ed3c7f8fSAdrien Destugues If multiple paths contain a translator with the same name, the translator 98*70dc2e27SMarkus Himmel that is located in the path that appears earliest in \c TRANSLATORS will 99*70dc2e27SMarkus Himmel be kept. 100*70dc2e27SMarkus Himmel 101ed3c7f8fSAdrien Destugues If \c TRANSLATORS is not set, the user non-packaged add-ons directory, the 102*70dc2e27SMarkus Himmel user add-ons directory, the system non-packaged add-ons directory and the 103*70dc2e27SMarkus Himmel system add-ons directory will be used. If those directories do not contain 104*70dc2e27SMarkus Himmel a subdirectory \c Translators, it will be created. The subdirectories are 105*70dc2e27SMarkus Himmel then added in the above order. If multiple directories contain a translator 106*70dc2e27SMarkus Himmel with the same name, the translator that is located in the path that appears 107*70dc2e27SMarkus Himmel earliest in the above list will be kept. 108*70dc2e27SMarkus Himmel*/ 109*70dc2e27SMarkus Himmel 110*70dc2e27SMarkus Himmel//! @} 111*70dc2e27SMarkus Himmel 112*70dc2e27SMarkus Himmel/*! 113*70dc2e27SMarkus Himmel \name Archiving 114*70dc2e27SMarkus Himmel*/ 115*70dc2e27SMarkus Himmel 116*70dc2e27SMarkus Himmel//! @{ 117*70dc2e27SMarkus Himmel 118*70dc2e27SMarkus Himmel/*! 119*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::Archive(BMessage* into, bool deep\ 120*70dc2e27SMarkus Himmel = true) const; 121*70dc2e27SMarkus Himmel \brief Archive this BTranslatorRoster into a BMessage. 122*70dc2e27SMarkus Himmel 123*70dc2e27SMarkus Himmel \param into Where the BTranslatorRoster will be stored. 124*70dc2e27SMarkus Himmel \param deep Unused. 125*70dc2e27SMarkus Himmel 126*70dc2e27SMarkus Himmel \retval B_OK The operation was successful. 127*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a into was NULL. 128*70dc2e27SMarkus Himmel \retval B_ERROR The operation failed. 129*70dc2e27SMarkus Himmel*/ 130*70dc2e27SMarkus Himmel 131*70dc2e27SMarkus Himmel/*! 132*70dc2e27SMarkus Himmel \fn static BArchivable* BTranslatorRoster::Instantiate(BMessage* from); 133*70dc2e27SMarkus Himmel \brief Creates a new BTranslatorRoster from a message. 134*70dc2e27SMarkus Himmel 135*70dc2e27SMarkus Himmel \param from The message that contains information about a 136*70dc2e27SMarkus Himmel BTranslatorRoster. 137*70dc2e27SMarkus Himmel 138*70dc2e27SMarkus Himmel \returns \c NULL if \a from was \c NULL, contained invalid archive data or 139*70dc2e27SMarkus Himmel archive data of a class that is not BTranslatorRoster. A pointer to a 140*70dc2e27SMarkus Himmel new BTranslatorRoster containing the information from \a from 141*70dc2e27SMarkus Himmel otherwise. 142*70dc2e27SMarkus Himmel*/ 143*70dc2e27SMarkus Himmel 144*70dc2e27SMarkus Himmel//! @} 145*70dc2e27SMarkus Himmel 146*70dc2e27SMarkus Himmel/*! 147*70dc2e27SMarkus Himmel \name Roster Management 148*70dc2e27SMarkus Himmel*/ 149*70dc2e27SMarkus Himmel 150*70dc2e27SMarkus Himmel//! @{ 151*70dc2e27SMarkus Himmel 152*70dc2e27SMarkus Himmel/*! 153*70dc2e27SMarkus Himmel \fn status_t BTranslatorRoster::AddTranslators(const char* loadPath =\ 154*70dc2e27SMarkus Himmel NULL); 155*70dc2e27SMarkus Himmel \brief Adds translators from a directory to the roster. 156*70dc2e27SMarkus Himmel 157*70dc2e27SMarkus Himmel \param loadPath A colon-separated list of directories to search for 158*70dc2e27SMarkus Himmel translators in. 159*70dc2e27SMarkus Himmel 160*70dc2e27SMarkus Himmel The following method is used to determine which translators to add: 161*70dc2e27SMarkus Himmel 162*70dc2e27SMarkus Himmel If \a loadPath is not \c NULL, the roster will be populated with all 163*70dc2e27SMarkus Himmel translators that are present in the directores denoted by \a loadPath. The 164*70dc2e27SMarkus Himmel paths are separated by a colon (<tt>:</tt>). If multiple paths contain a 165*70dc2e27SMarkus Himmel translator with the same name, the translator that is located in the path 166*70dc2e27SMarkus Himmel that appears earliest in \a loadPath will be kept. 167*70dc2e27SMarkus Himmel 168*70dc2e27SMarkus Himmel If \a loadPath is \c NULL and the environment variable \c TRANSLATORS is 169*70dc2e27SMarkus Himmel set, it will be populated with all translators that are present in the 170*70dc2e27SMarkus Himmel directories denoted by \c TRANSLATORS. The paths are separated by a colon 171*70dc2e27SMarkus Himmel (<tt>:</tt>). If multiple paths contain a translator with the same name, 172*70dc2e27SMarkus Himmel the translator that is located in the path that appears earliest in 173*70dc2e27SMarkus Himmel \c TRANSLATORS will be kept. 174*70dc2e27SMarkus Himmel 175*70dc2e27SMarkus Himmel If \a loadPath is \c NULL and \c TRANSLATORS is unset, the user 176*70dc2e27SMarkus Himmel non-packaged add-ons directory, the user add-ons directory, the system 177*70dc2e27SMarkus Himmel non-packaged add-ons directory and the system add-ons directory will be 178*70dc2e27SMarkus Himmel used. If those directories do not contain a subdirectory \c Translators, it 179*70dc2e27SMarkus Himmel will be created. The subdirectories are then added in the above order. If 180*70dc2e27SMarkus Himmel multiple directories contain a translator with the same name, the 181*70dc2e27SMarkus Himmel translator that is located in the path that appears earliest in the above 182*70dc2e27SMarkus Himmel list will be kept. 183*70dc2e27SMarkus Himmel 184*70dc2e27SMarkus Himmel \returns \c B_OK if everything went well, an error code specific to the 185*70dc2e27SMarkus Himmel operation that failed otherwise. 186*70dc2e27SMarkus Himmel*/ 187*70dc2e27SMarkus Himmel 188*70dc2e27SMarkus Himmel/*! 189*70dc2e27SMarkus Himmel \fn status_t BTranslatorRoster::AddTranslator(BTranslator* translator); 190*70dc2e27SMarkus Himmel \brief Adds a single BTranslator to the roster. 191*70dc2e27SMarkus Himmel 192*70dc2e27SMarkus Himmel \param translator The translator that should be added. 193*70dc2e27SMarkus Himmel 194*70dc2e27SMarkus Himmel \remark AddTranslator() calls Acquire() on the translator, so it is safe 195*70dc2e27SMarkus Himmel to release it if you had acquired it before. 196*70dc2e27SMarkus Himmel 197*70dc2e27SMarkus Himmel \retval B_OK The translator was successfully added to the roster. 198*70dc2e27SMarkus Himmel \retval B_NO_MEMORY There was no memory to enlarge the roster. 199*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a translator was \c NULL. 200*70dc2e27SMarkus Himmel*/ 201*70dc2e27SMarkus Himmel 202*70dc2e27SMarkus Himmel//! @} 203*70dc2e27SMarkus Himmel 204*70dc2e27SMarkus Himmel/*! 205*70dc2e27SMarkus Himmel \name Translator Access 206*70dc2e27SMarkus Himmel*/ 207*70dc2e27SMarkus Himmel 208*70dc2e27SMarkus Himmel//! @{ 209*70dc2e27SMarkus Himmel 210*70dc2e27SMarkus Himmel/*! 211*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetTranslators(BPositionIO*\ 212*70dc2e27SMarkus Himmel source, BMessage* ioExtension, translator_info** _info, int32*\ 213*70dc2e27SMarkus Himmel _numInfo, uint32 hintType = 0, const char* hintMIME = NULL, uint32\ 214*70dc2e27SMarkus Himmel wantType = 0); 215*70dc2e27SMarkus Himmel \brief Collects information about all translators that are able to perform 216*70dc2e27SMarkus Himmel a certain conversion in an array. 217*70dc2e27SMarkus Himmel 218*70dc2e27SMarkus Himmel \param source Read and seek interface to the data to be examinded. 219*70dc2e27SMarkus Himmel \param ioExtension A message containing configuration information for the 220*70dc2e27SMarkus Himmel translators. 221*70dc2e27SMarkus Himmel \param _info Where the resulting array will be stored. 222*70dc2e27SMarkus Himmel \param _numInfo Where the number of elements in the resulting array will 223*70dc2e27SMarkus Himmel be stored. 224*70dc2e27SMarkus Himmel \param hintType A hint about the data format in \a source. \c 0 represents 225*70dc2e27SMarkus Himmel an unknown type. 226*70dc2e27SMarkus Himmel \param hintMIME A hint about the MIME type of \a source. \c NULL represents 227*70dc2e27SMarkus Himmel an unknown type. 228*70dc2e27SMarkus Himmel \param wantType The format that \a source needs to be translated into. \c 0 229*70dc2e27SMarkus Himmel permits any output type. 230*70dc2e27SMarkus Himmel 231*70dc2e27SMarkus Himmel If this function returns \c B_OK the caller has to call \c delete[] when 232*70dc2e27SMarkus Himmel they are done using \a _info. 233*70dc2e27SMarkus Himmel 234*70dc2e27SMarkus Himmel \retval B_OK \a _info and \a _numInfo were successfully populated. 235*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR No suitable translator was found. 236*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a source, \a _info or \a _numInfo was \c NULL. 237*70dc2e27SMarkus Himmel \retval B_IO_ERROR There was an error interacting with \a source. 238*70dc2e27SMarkus Himmel \retval B_NO_MEMORY Could not allocate enough memory for the array. 239*70dc2e27SMarkus Himmel*/ 240*70dc2e27SMarkus Himmel 241*70dc2e27SMarkus Himmel/*! 242*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetAllTranslators(translator_id**\ 243*70dc2e27SMarkus Himmel _list, int32* _count); 244*70dc2e27SMarkus Himmel \brief Collects the IDs of all translators in the roster in an array. 245*70dc2e27SMarkus Himmel 246*70dc2e27SMarkus Himmel \param _list Where the resulting array will be stored. 247*70dc2e27SMarkus Himmel \param _count Where the number of elements in the resulting array will be 248*70dc2e27SMarkus Himmel stored. 249*70dc2e27SMarkus Himmel 250*70dc2e27SMarkus Himmel If this function returns \c B_OK the caller has to call \c delete[] when 251*70dc2e27SMarkus Himmel they are done using \a _info. 252*70dc2e27SMarkus Himmel 253*70dc2e27SMarkus Himmel \retval B_OK \a _list and \a _count were populated successfully. 254*70dc2e27SMarkus Himmel \retval B_NO_MEMORY Could not allocate the memory for the array. 255*70dc2e27SMarkus Himmel*/ 256*70dc2e27SMarkus Himmel 257*70dc2e27SMarkus Himmel/*! 258*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetTranslatorInfo(translator_id\ 259*70dc2e27SMarkus Himmel translatorID, const char** _name, const char** _info, int32* _version); 260*70dc2e27SMarkus Himmel \brief Looks up general information of the translator with a given ID. 261*70dc2e27SMarkus Himmel 262*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose information is 263*70dc2e27SMarkus Himmel requested. 264*70dc2e27SMarkus Himmel \param _name Where the name of the translator will be stored. 265*70dc2e27SMarkus Himmel \param _info Where the description of the translator will be stored. 266*70dc2e27SMarkus Himmel \param _version Where the version of the translator will be stored. 267*70dc2e27SMarkus Himmel 268*70dc2e27SMarkus Himmel Do not free any returned data. If any of \a _name, \a _info and \a _version 269*70dc2e27SMarkus Himmel are \c NULL, the non-null pointers will still be written to. 270*70dc2e27SMarkus Himmel 271*70dc2e27SMarkus Himmel \retval B_OK All non-null pointers were written to successfully. 272*70dc2e27SMarkus Himmel \retval B_BAD_VALUE All three pointers were \c NULL. 273*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 274*70dc2e27SMarkus Himmel ID \a translatorID. 275*70dc2e27SMarkus Himmel*/ 276*70dc2e27SMarkus Himmel 277*70dc2e27SMarkus Himmel/*! 278*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetInputFormats(translator_id\ 279*70dc2e27SMarkus Himmel translatorID, const translation_format** _formats, int32* _numFormats); 280*70dc2e27SMarkus Himmel \brief Looks up the input formats of the translator with a given ID. 281*70dc2e27SMarkus Himmel 282*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose input formats are 283*70dc2e27SMarkus Himmel requested. 284*70dc2e27SMarkus Himmel \param _formats Where the array of input formats will be stored. 285*70dc2e27SMarkus Himmel \param _numFormats Where the number of elements in the array of input 286*70dc2e27SMarkus Himmel formats will be stored. 287*70dc2e27SMarkus Himmel 288*70dc2e27SMarkus Himmel Do not free any of the returned data. 289*70dc2e27SMarkus Himmel 290*70dc2e27SMarkus Himmel \retval B_OK \a _formats and \a _numFormats were successfully set. 291*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a _formats or \a _numFormats was \c NULL. 292*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 293*70dc2e27SMarkus Himmel ID \a translatorID. 294*70dc2e27SMarkus Himmel*/ 295*70dc2e27SMarkus Himmel 296*70dc2e27SMarkus Himmel/*! 297*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetOutputFormats(translator_id\ 298*70dc2e27SMarkus Himmel translatorID, const translation_format** _formats, int32* _numFormats); 299*70dc2e27SMarkus Himmel \brief Looks up the output formats of the translator with a given ID. 300*70dc2e27SMarkus Himmel 301*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose output formats are 302*70dc2e27SMarkus Himmel requested. 303*70dc2e27SMarkus Himmel \param _formats Where the array of output formats will be stored. 304*70dc2e27SMarkus Himmel \param _numFormats Where the number of elements in the array of output 305*70dc2e27SMarkus Himmel formats will be stored. 306*70dc2e27SMarkus Himmel 307*70dc2e27SMarkus Himmel Do not free any of the returned data. 308*70dc2e27SMarkus Himmel 309*70dc2e27SMarkus Himmel \retval B_OK \a _formats and \a _numFormats were successfully set. 310*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a _formats or \a _numFormats was \c NULL. 311*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 312*70dc2e27SMarkus Himmel ID \a translatorID. 313*70dc2e27SMarkus Himmel*/ 314*70dc2e27SMarkus Himmel 315*70dc2e27SMarkus Himmel/*! 316*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::MakeConfigurationView(\ 317*70dc2e27SMarkus Himmel translator_id translatorID, BMessage* ioExtension, BView** _view,\ 318*70dc2e27SMarkus Himmel BRect* _extent); 319*70dc2e27SMarkus Himmel \brief Creates the configuration view of a specified translator from the 320*70dc2e27SMarkus Himmel roster. 321*70dc2e27SMarkus Himmel 322*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose configuration view 323*70dc2e27SMarkus Himmel should be created. 324*70dc2e27SMarkus Himmel \param ioExtension A message containing configuration information for the 325*70dc2e27SMarkus Himmel translator. 326*70dc2e27SMarkus Himmel \param _view Where a pointer to the newly created configuration view will 327*70dc2e27SMarkus Himmel be stored. 328*70dc2e27SMarkus Himmel \param _extent Where the size of of the newly created configuration view 329*70dc2e27SMarkus Himmel will be stored. 330*70dc2e27SMarkus Himmel 331*70dc2e27SMarkus Himmel \retval B_OK Everything went well. 332*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a _view or \a _extent were \c NULL or \a ioExtension 333*70dc2e27SMarkus Himmel was \c NULL or contained bad data. 334*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 335*70dc2e27SMarkus Himmel ID \a translatorID. 336*70dc2e27SMarkus Himmel \retval B_ERROR An error occurred or the translator chose not to supply 337*70dc2e27SMarkus Himmel a configuration view. 338*70dc2e27SMarkus Himmel*/ 339*70dc2e27SMarkus Himmel 340*70dc2e27SMarkus Himmel/*! 341*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::GetConfigurationMessage(\ 342*70dc2e27SMarkus Himmel translator_id translatorID, BMessage* ioExtension) 343*70dc2e27SMarkus Himmel \brief Populates a BMessage with the settings of the specified translator. 344*70dc2e27SMarkus Himmel 345*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose settings \a ioExtension 346*70dc2e27SMarkus Himmel should be populated with. 347*70dc2e27SMarkus Himmel \param ioExtension The message that should be populated. 348*70dc2e27SMarkus Himmel 349*70dc2e27SMarkus Himmel \retval B_OK \a ioExtension was populated successfully. 350*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 351*70dc2e27SMarkus Himmel ID \a translatorID. 352*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a ioExtension was \c NULL. 353*70dc2e27SMarkus Himmel \retval B_ERROR An error occurred or the translator chose not to provide 354*70dc2e27SMarkus Himmel this functionality. 355*70dc2e27SMarkus Himmel*/ 356*70dc2e27SMarkus Himmel 357*70dc2e27SMarkus Himmel/*! 358*70dc2e27SMarkus Himmel \fn status_t BTranslatorRoster::GetRefFor(translator_id translatorID,\ 359*70dc2e27SMarkus Himmel entry_ref* ref); 360*70dc2e27SMarkus Himmel \brief Returns the entry_ref of the specified translator. 361*70dc2e27SMarkus Himmel 362*70dc2e27SMarkus Himmel \param translatorID The ID of the translator whose entry_ref is to be 363*70dc2e27SMarkus Himmel found. 364*70dc2e27SMarkus Himmel \param ref Where the entry_ref will be written. 365*70dc2e27SMarkus Himmel 366*70dc2e27SMarkus Himmel \retval B_OK Everything went well. 367*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a ref was \c NULL. 368*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The roster does not contain any translator with the 369*70dc2e27SMarkus Himmel ID \a translatorID. 370*70dc2e27SMarkus Himmel \retval B_ERROR An error occurred. 371*70dc2e27SMarkus Himmel*/ 372*70dc2e27SMarkus Himmel 373*70dc2e27SMarkus Himmel//! @} 374*70dc2e27SMarkus Himmel 375*70dc2e27SMarkus Himmel/*! 376*70dc2e27SMarkus Himmel \name Core Methods 377*70dc2e27SMarkus Himmel*/ 378*70dc2e27SMarkus Himmel 379*70dc2e27SMarkus Himmel//! @{ 380*70dc2e27SMarkus Himmel 381*70dc2e27SMarkus Himmel/*! 382*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::Identify(BPositionIO* source,\ 383*70dc2e27SMarkus Himmel BMessage* ioExtension, translator_info* _info, uint32 hintType = 0,\ 384*70dc2e27SMarkus Himmel const char* hintMIME = NULL, uint32 wantType = 0); 385*70dc2e27SMarkus Himmel \brief Determines the best translator in the roster to perform a certain 386*70dc2e27SMarkus Himmel conversion. 387*70dc2e27SMarkus Himmel 388*70dc2e27SMarkus Himmel \param source Read and seek interface to the data to be examined. 389*70dc2e27SMarkus Himmel \param ioExtension A message containing configuration infortmation for the 390*70dc2e27SMarkus Himmel translators. 391*70dc2e27SMarkus Himmel \param _info Where information about the best translator will be written. 392*70dc2e27SMarkus Himmel \param hintType A hint about the data format in \a source. \c 0 represents 393*70dc2e27SMarkus Himmel an unknown type. 394*70dc2e27SMarkus Himmel \param hintMIME A hint about the MIME type of \a source. \c NULL represents 395*70dc2e27SMarkus Himmel an unknown type. 396*70dc2e27SMarkus Himmel \param wantType The format that \a source needs to be translated into. \c 0 397*70dc2e27SMarkus Himmel permits any output type. 398*70dc2e27SMarkus Himmel 399*70dc2e27SMarkus Himmel To determine the best translator, for all translators that report that 400*70dc2e27SMarkus Himmel they are able to perform the translation, the values they return for 401*70dc2e27SMarkus Himmel quality and capability are multiplied. The translator with the highest 402*70dc2e27SMarkus Himmel value gets returned. Note that quality and capability for the output 403*70dc2e27SMarkus Himmel format are not taken into consideration. 404*70dc2e27SMarkus Himmel 405*70dc2e27SMarkus Himmel \retval B_OK Identification was successful. Information about the chosen 406*70dc2e27SMarkus Himmel translator was written to \a _info. 407*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR No suitable translator was found. 408*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a source or \a _info was \c NULL. 409*70dc2e27SMarkus Himmel \retval B_IO_ERROR There was an error interacting with \a source. 410*70dc2e27SMarkus Himmel*/ 411*70dc2e27SMarkus Himmel 412*70dc2e27SMarkus Himmel/*! 413*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::Translate(BPositionIO* source,\ 414*70dc2e27SMarkus Himmel const translator_info* info, BMessage* ioExtension, BPositionIO*\ 415*70dc2e27SMarkus Himmel destination, uint32 wantOutType, uint32 hintType = 0, const char*\ 416*70dc2e27SMarkus Himmel hintMIME = NULL); 417*70dc2e27SMarkus Himmel \brief Finds and invokes the best translator for a conversion. 418*70dc2e27SMarkus Himmel 419*70dc2e27SMarkus Himmel \param source Read and seek interface to the input data. 420*70dc2e27SMarkus Himmel \param info Information about wich translator should be used. If 421*70dc2e27SMarkus Himmel \a info is \c NULL, Identify() will be used to find a suitable 422*70dc2e27SMarkus Himmel translator. 423*70dc2e27SMarkus Himmel \param ioExtension A message containing configuration information for the 424*70dc2e27SMarkus Himmel translator. 425*70dc2e27SMarkus Himmel \param destination Write interface to the output location. 426*70dc2e27SMarkus Himmel \param wantOutType The desired output format. If this is \c 0, any type 427*70dc2e27SMarkus Himmel is permitted. 428*70dc2e27SMarkus Himmel \param hintType A hint about the type of the data in \a source. 429*70dc2e27SMarkus Himmel \param hintMIME A hint about the MIME type of the data in \a source. 430*70dc2e27SMarkus Himmel 431*70dc2e27SMarkus Himmel \retval B_OK The translated data was successfully written to 432*70dc2e27SMarkus Himmel \a destination. 433*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR \a info was non-null but did not match to any 434*70dc2e27SMarkus Himmel translator in the roster. 435*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR \a info was \c NULL and no suitable translator was 436*70dc2e27SMarkus Himmel found. 437*70dc2e27SMarkus Himmel \retval B_ERROR An error occurred. 438*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a source or \a destination was \c NULL or 439*70dc2e27SMarkus Himmel \a ioExtension was \c NULL or contained bad data. 440*70dc2e27SMarkus Himmel \retval B_IO_ERROR An error occurred accessing \a source or \a destination. 441*70dc2e27SMarkus Himmel*/ 442*70dc2e27SMarkus Himmel 443*70dc2e27SMarkus Himmel/*! 444*70dc2e27SMarkus Himmel \fn virtual status_t BTranslatorRoster::Translate(translator_id\ 445*70dc2e27SMarkus Himmel translatorID, BPositionIO* source, BMessage* ioExtension, BPositionIO*\ 446*70dc2e27SMarkus Himmel destination, uint32 wantOutType); 447*70dc2e27SMarkus Himmel \brief Uses a specified translator from the roster to perform a conversion. 448*70dc2e27SMarkus Himmel 449*70dc2e27SMarkus Himmel \param translatorID The ID of the translator that should be used. 450*70dc2e27SMarkus Himmel \param source Read and seek interface to the input data. 451*70dc2e27SMarkus Himmel \param ioExtension A message containing configuration information for the 452*70dc2e27SMarkus Himmel translator. 453*70dc2e27SMarkus Himmel \param destination Write interface to the output location. 454*70dc2e27SMarkus Himmel \param wantOutType The desired output format. If this is \c 0, any type is 455*70dc2e27SMarkus Himmel permitted. 456*70dc2e27SMarkus Himmel 457*70dc2e27SMarkus Himmel \retval B_OK The translated data was successfully written to 458*70dc2e27SMarkus Himmel \a destination. 459*70dc2e27SMarkus Himmel \retval B_NO_TRANSLATOR The specified translator cannot handle the data in 460*70dc2e27SMarkus Himmel \a source. 461*70dc2e27SMarkus Himmel \retval B_ERROR An error occurred. 462*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a source or \a destination was \c NULL or 463*70dc2e27SMarkus Himmel \a ioExtension was \c NULL or contained bad data. 464*70dc2e27SMarkus Himmel \retval B_IO_ERROR An error occurred accessing \a source or \a destination. 465*70dc2e27SMarkus Himmel*/ 466*70dc2e27SMarkus Himmel 467*70dc2e27SMarkus Himmel//! @} 468*70dc2e27SMarkus Himmel 469*70dc2e27SMarkus Himmel/*! 470*70dc2e27SMarkus Himmel \name Miscellaneous 471*70dc2e27SMarkus Himmel*/ 472*70dc2e27SMarkus Himmel 473*70dc2e27SMarkus Himmel//! @{ 474*70dc2e27SMarkus Himmel 475*70dc2e27SMarkus Himmel/*! 476*70dc2e27SMarkus Himmel \fn bool BTranslatorRoster::IsTranslator(entry_ref* ref); 477*70dc2e27SMarkus Himmel \brief Determines whether the specified add-on contains at least one 478*70dc2e27SMarkus Himmel translator. 479*70dc2e27SMarkus Himmel 480*70dc2e27SMarkus Himmel \param ref The entry_ref to be tested. 481*70dc2e27SMarkus Himmel 482*70dc2e27SMarkus Himmel \retval true The add-on exposes translators. 483*70dc2e27SMarkus Himmel \retval false The add-on exposes no translators or an error occurred. 484*70dc2e27SMarkus Himmel*/ 485*70dc2e27SMarkus Himmel 486*70dc2e27SMarkus Himmel//! @} 487*70dc2e27SMarkus Himmel 488*70dc2e27SMarkus Himmel/*! 489*70dc2e27SMarkus Himmel \name Notifications 490*70dc2e27SMarkus Himmel*/ 491*70dc2e27SMarkus Himmel 492*70dc2e27SMarkus Himmel//! @{ 493*70dc2e27SMarkus Himmel 494*70dc2e27SMarkus Himmel/*! 495*70dc2e27SMarkus Himmel \fn status_t BTranslatorRoster::StartWatching(BMessenger target); 496*70dc2e27SMarkus Himmel \brief Register a messenger to be notified when the roster changes. 497*70dc2e27SMarkus Himmel 498*70dc2e27SMarkus Himmel \param target The BMessenger to be registered. 499*70dc2e27SMarkus Himmel 500*70dc2e27SMarkus Himmel Whenever a translator is added to or removed from the roster, all 501*70dc2e27SMarkus Himmel messengers that were registered through this method are sent a message. 502*70dc2e27SMarkus Himmel \c message->what will be \c B_TRANSLATOR_ADDED or \c B_TRANSLATOR_REMOVED 503*70dc2e27SMarkus Himmel (as defined in AppDefs.h) respectively. 504*70dc2e27SMarkus Himmel 505*70dc2e27SMarkus Himmel \retval B_OK \a target was successfully registered. 506*70dc2e27SMarkus Himmel \retval B_NO_MEMORY Unable to allocate more memory for the list of targets. 507*70dc2e27SMarkus Himmel*/ 508*70dc2e27SMarkus Himmel 509*70dc2e27SMarkus Himmel/*! 510*70dc2e27SMarkus Himmel \fn status_t BTranslatorRoster::StopWatching(BMessenger target); 511*70dc2e27SMarkus Himmel \brief Unregister a messenger from the notification list. 512*70dc2e27SMarkus Himmel 513*70dc2e27SMarkus Himmel \param target The BMessenger to be removed. 514*70dc2e27SMarkus Himmel 515*70dc2e27SMarkus Himmel \retval B_OK \a target was successfully unsubscribed. 516*70dc2e27SMarkus Himmel \retval B_BAD_VALUE \a target could not be found on the notification list. 517*70dc2e27SMarkus Himmel 518*70dc2e27SMarkus Himmel \sa StartWatching(BMessenger target) 519*70dc2e27SMarkus Himmel*/ 520*70dc2e27SMarkus Himmel 521*70dc2e27SMarkus Himmel//! @} 522