В самописной клиентской части понадобилось организовать работу с семантиками cTANYFILE etc.. Правильно ли я понимаю, что для управления данными следует использовать функции mapReadFileOnServer и mapSaveFileOnServer?
Семантика означает, что у Вас имя файла зарегистрированного типа. Тип не говорит, что файл на ГИС Сервере. Говорит о том, что его на Вашем компьютере можно попросить открыть зарегистрированной в ОС программой.
Значения семантик типа TANYFILE и т.п. - это не сам файл, а ссылка на него: абсолютный или относительный путь, либо алиас этого файла на ГИС Сервере.
Функции mapReadFileOnServer и mapSaveFileOnServer предназначены для скачивания файла с ГИС Сервера и загрузки его на сервер соответственно.
То есть, если карта у Вас на ГИС Сервере, Вы хотите добавить ссылку на файл в некий объект, так, чтобы это было видно всем пользователям этой карты, следует сначала загрузить файл на ГИС Сервер в виртуальную папку, затем, сформировав путь (алиас виртуальной папки на ГИС Сервер / имя файла), записать его в соответствующую семантику.
Это понятно. Ситуация такая. На сервере заведено хранилище, сслылающееся на субдерикторию карты, оно, соответственно, указано в алиасе карты, и содержимое семантики при этом имеет форамат HOST#<server>#ALIAS#<alias.sitx>#DOC#<storage alias>#filename.ext. И десктоповая Панорама, и вебсервер отрабатывают совершенно нормально. А каким образом получить файл из самописного клиента?
Если просто дать значение семантики на вход mapReadFileOnServer, она выдает 0 и ошибку ids_access, а к path приписывает все неразобранное значение alias.
P.S. И еще касательно хранилищ, пока не понимаю, каким образом, например, получить их список через API.
// Прочитать файл на сервере (если есть доступ к виртуальной папке) // alias - алиас файла на сервере, начиная с имени виртуальной папки (кроме выполняемых файлов, // файлов карт, матриц и растров) // path - путь, по которому будет сохранен файл (после записи путь дополняется именем файла) // size - размер поля, содержащего путь // error - поле для записи кода ошибки, если функция вернет ноль // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapReadFileOnServer(long int number, const WCHAR * alias, WCHAR * path, long int size, long int * error);
Обратите внимание на входные параметры. В alias указывается все, что после "ALIAS#". В path указывается директория, а не конечный файл (имя файла будет извлечено из алиаса).
При ошибке в переменной error должен быть код, по которому можно разобраться, что за ошибка произошла. Перечень кодов ошибок есть в \include\maperr.rh
Пример вызова mapReadFileOnServer есть в SDK для ГИС Панорама (см. \mapexam\mapexam82.cpp), а также в SDK для GIS WebService (см. метод TRestMethod::GetFileFromGisServerFolder в \SDK\restmethod\mapinfo.cpp).
Цитата
Илья Рыбалко написал: И еще касательно хранилищ, пока не понимаю, каким образом, например, получить их список через API.
Цитата
// Запросить список папок на сервере, доступных для записи файлов // number - номер активного подключения к ГИС Серверу от 1 до mapActiveServerCount() // folder - путь к виртуальной папке, в которой запрашивается список файлов и папок или 0 // Например, "Data\\Maps" // Если folder равно 0, то запрашивается список алиасов всех доступных папок // allfiles - признак запроса всех файлов в папке folder, если не установлен, // то буден выдан список внутренних папок и файлов MAP,SIT,SITX,RSC,MTW,MTQ,RSW // parm - адрес буфера для размещения списка запрошенных данных или 0 // Если parm равно 0, то запрашивается размер буфера, требуемый для размещения списка // length - размер буфера для размещения списка // Список данных заполняется только для файлов и папок, непосредственно расположенных // в заданной папке без вложений // При успешном выполнении возвращает размер сформированного списка // Если размер списка превышает размер буфера, то данные считаны не полностью. // Тогда нужно выделить больший буфер и запросить данные повторно // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapGetFolderList(long int number, const WCHAR * folder, long int allfiles, TMCDATALIST * parm, long int size);
Код, как это вызывается непосредственно из ГИС Панорама приведен также в SDK(см. \ready\mapscena\folders.cpp, а также в примерах 55 и 56 - в \mapexam).
Описанное выше справедливо для всех файлов, размещаемых в виртуальных каталогах ГИС Сервера.
Для документов, на которые объекты могут ссылаться по алиасам формата HOST#СЕРВЕР#ALIAS#Карта#DOC#Папка#документ.расширение следует использовать функцию mapReadSiteDocumentUn. Строку с алиасом она разберет сама и отправит необходимый запрос на сервер.
Цитата
// Считать документ на сервере // hMap - идентификатор открытой основной карты // hSite - идентификатор открытой пользовательской карты // alias - алиас документа на сервере (может храниться в семантике // объекта карты, начинается со строки "HOST#") // name - полный путь к считанному документу, строка заполняется // автоматически при считывании документа, имя документа и // дата редактирования устанавливаются такими, какими они были // при записи в mapSaveSiteDocument. // Например: HOST#WorkServer#ALIAS#Моя_Карта#DOC#MyFolder#schema.png // size - размер буфера в байтах для записи пути (не менее 520 байт) // При успешном выполнении возвращает имя считанного файла документа в поле name // При ошибке возвращает ноль
_MAPIMP long int _MAPAPI mapReadSiteDocumentUn(HMAP hMap, HSITE hSite, const WCHAR *alias, WCHAR *name, long int size);