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