Форум » [x]Harbour » Облачные сервисы (WebDAV, CalDAV &Co) » Ответить

Облачные сервисы (WebDAV, CalDAV &Co)

Dr. Oldwarez: После некоторого разбирательства с прогой удалось организовать импорт из ICAL-файлов и экспорт в оные. Но тут шеф захотел, чтобы был прямой контакт с CalDav через интернет. Я знаю, что на питоне такое возможно. На дельфине и даже Xojo (RealBasic) тоже - через спецбиблиотеку. Но как реализовать подключение к облачному сервису в Harbour/Minigui? Возможно ли это вообще?

Ответов - 174, стр: 1 2 3 4 5 6 7 8 9 All

Петр: colorize.prg [pre2] #include "color.ch" PROCEDURE QOutClr( cMessage, lNewLine ) LOCAL cDefColor, cDefFGClr, cCurFGClr, cCurBKClr, cClrPair STATIC hColors := { ; "black" => "N", ; "blue" => "B", ; "green" => "G", ; "cyan" => "BG", ; "red" => "R", ; "magenta" => "RB", ; "brown" => "GR", ; "white" => "W", ; "gray" => "N+", ; "blue+" => "B+", ; // b - Bright "green+" => "G+", ; "cyan+" => "BG+",; "red+" => "R+", ; "magenta+" => "RB+",; "yellow" => "GR+",; "white+" => "W+" ; } LOCAL cStr hb_default( @cMessage, "" ) hb_default( @lNewLine, .T. ) hb_HCaseMatch( hColors, .F. ) IF .NOT. Empty( cMessage ) // Save a colors scheme cDefColor := SetColor() cClrPair := GetClrPair( cDefColor, CLR_STANDARD + 1 ) cDefFGClr := GetClrFore( cClrPair ) cCurBKClr := GetClrBack( cClrPair ) cCurFGClr := cDefFGClr FOR EACH cStr IN hb_ATokens( cMessage, '#' ) // If a string between #-Tags is equal to any predefined Color, // and is equal to the default Foreground Color: set current Foreground Color IF hb_HHasKey( hColors, cStr ) .AND. cCurFGClr == cDefFGClr cCurFGClr := hColors[ cStr ] ELSE SetColor( SetClrPair( cDefColor, CLR_STANDARD + 1, cCurFGClr + '/' + cCurBKClr ) ) QQOut( cStr ) // Reset current Foreground Color cCurFGClr := cDefFGClr ENDIF NEXT IF lNewLine ? e"\n" ENDIF // Restore a colors scheme SetColor( cDefColor ) ENDIF RETURN [/pre2] ics.ch [pre2] #ifndef ICS_CH_ #define ICS_CH_ #define ICS_PARAM 1 #define ICS_PROPS 2 #define ICS_VALS 3 #endif /* ICS_CH_ */ [/pre2]

Dr. Oldwarez: Огромное спасибо! Обязательно попробую интегрировать в свою прогу! И с прошедшими праздниками!

Петр: Dr. Oldwarez пишет: Огромное спасибо! Обязательно попробую интегрировать в свою прогу! И с прошедшими праздниками! Был рад вам помочь. Если возникнут вопросы - обращайтесь. Спасибо!


Dr. Oldwarez: Петр пишет: #Libs -lhbmxml -lmxml -lics -lhbwin И сразу вопрос: где можно достать библиотеку ics.lib? У меня в директории C:\MINIGUI\HARBOUR\LIB есть hbmxml, mxml, hbwin. А вот ics.lib нет.

Петр: Dr. Oldwarez пишет: И сразу вопрос: где можно достать библиотеку ics.lib? ics.lib это библиотека из одной функции parse, написана на C. // This code is based on J Decker original code posted at // https://stackoverflow.com/questions/35003036/toolset-to-parse-icalendar-file-in-c Ну и плюс функция-обертка IcsToArray для использования с Harbour.

Петр: IcsToArray2 обладает тем же функционалом, написана на Harbour. [pre2] // This code is based on J Decker original code posted at // https://stackoverflow.com/questions/35003036/toolset-to-parse-icalendar-file-in-c // disclaimer : no support // code provided as a example of minimal things one can do. // format for lines is... // PARAMETER[;PARAM_PROPERTY..]:VALUE[,VALUE2..]\n #ifndef __DBG_PARTS__ #xtranslate hb_traceLog( [<x,...>] ) => #endif #define ICS_PARAMETER 1 #define ICS_PROPERTY 2 #define ICS_VALUE 3 FUNCTION IcsToArray2( cInput, i ) LOCAL nStart := 1 LOCAL nEnd := 1 LOCAL nState := ICS_PARAMETER LOCAL char, cParameter, cProperty, cValue LOCAL aIcs := {} LOCAL aProps := {} LOCAL aValues := {} LOCAL lInQuote := .F. hb_default( @cInput, "" ) IF hb_eol() $ cInput cInput := StrTran( cInput, hb_eol(), e"\n" ) ENDIF FOR EACH char IN cInput SWITCH nState CASE ICS_PARAMETER IF char == ":" .OR. char == ";" cParameter := SubStr( cInput, nStart, nEnd - nStart ) hb_traceLog( "PARAMETER:%s", cParameter ) IF char == ";" nState := ICS_PROPERTY ELSE nState := ICS_VALUE ENDIF nStart := nEnd + 1 ENDIF EXIT CASE ICS_PROPERTY IF char == '"' IF ! lInQuote lInQuote := .T. ELSE lInQuote := .F. EXIT ENDIF ENDIF IF lInQuote EXIT ENDIF IF char == ";" .OR. char == ":" cProperty := SubStr( cInput, nStart, nEnd - nStart ) hb_traceLog( "PROPERTY:%s", cProperty ) AAdd( aProps, cProperty ) IF char == ":" nState := ICS_VALUE ENDIF nStart := nEnd + 1 EXIT ENDIF EXIT CASE ICS_VALUE IF char == e"\n" .OR. char == "," cValue := SubStr( cInput, nStart, nEnd - nStart ) hb_traceLog( "VALUE:%s", cValue ) AAdd( aValues, cValue ) IF char == e"\n" AAdd( aIcs, { cParameter, AClone( aProps ), AClone( aValues ) } ) aProps := {} aValues := {} nState := ICS_PARAMETER ENDIF nStart := nEnd + 1 ENDIF EXIT ENDSWITCH nEnd++ NEXT IF nEnd != nStart i := 1 ENDIF RETURN aIcs [/pre2]

Петр: Пример использования [pre2] PROCEDURE Main( cFile ) LOCAL cStr := hb_MemoRead( cFile ) LOCAL aIcs, err := 0 aIcs := IcsToArray2( cStr, @err ) IF err == 0 ? hb_ValToExp( aIcs ), hb_eol() sp_Dump2( aIcs ) ENDIF RETURN STATIC PROCEDURE sp_Dump2( aSource ) LOCAL e1, e2 hb_default( @aSource, {} ) IF ! Empty( aSource ) FOR EACH e1 IN aSource ?? e1[ ICS_PARAM ] FOR EACH e2 IN e1[ ICS_PROPS ] ?? ";" + e2 NEXT FOR EACH e2 IN e1[ ICS_VALS ] IF e2:__enumIsFirst() ?? ":" + e2 ELSE ?? "," + e2 ENDIF NEXT ?? hb_eol() NEXT ENDIF RETURN [/pre2] P.S. Код в посте №1669 исправил для использования IcsToArray2 Также добавлена функция извлечения кода возврата и его описания sf_GetHTTPStatusCode .

Dr. Oldwarez: Спасибо за функцию. Только теперь вопрос: как передать имя файла в процедуру Import2Cal (бывшая Main), чтобы не выдавало такого вот сбоя. [pre2]Error BASE/1081 Argument error: + Args: [1] = U [2] = C /[/pre2] У меня cFile:=cTempDIR+'\Test.ics', где cTempDIR - директория временных файлов, прописанная в INI PS: Поздравляю с днём Победы

Петр: Dr. Oldwarez пишет: PS: Поздравляю с днём Победы Спасибо. И Вас и всех остальных форумчан с Праздником! Только теперь вопрос: как передать имя файла в процедуру Import2Cal Не совсем понял вопрос Import2Cal( cFile ). И зачем вам директория временных файлов. Error BASE/1081 Argument error: + Args: [1] = U [2] = C / cFile:=cTempDIR+'\Test.ics' TYPE( cTempDIR ) == "U" (Args: [1] = U) и складывать его с '\Test.ics' ([2] = C) нельзя Лучше так cFile:=hb_defaultValue(hb_DirSepAdd(cTempDIR), hb_DirTemp())+'Test.ics'

Dr. Oldwarez: Петр пишет: Import2Cal( cFile ). И зачем вам директория временных файлов. А куда ещё временные ics-ы девать?

Петр: Dr. Oldwarez пишет: А куда ещё временные ics-ы девать? Ну вам виднее. Я обхожусь обычной субдиректорией в директории программы. И файлы там не временные, а копии файлов на сервере, как и рекомендуют разработчики.

Dr. Oldwarez: Error BASE 1081 уже убрал. Но теперь curl ругается на опцию --no-progress-meter [pre2]curl: option --no-progress-meter: is unknown curl: try 'curl --help' for more information[/pre2]

Dima: Dr. Oldwarez Может CURL древний [pre2] Fixed in 7.67.0 - November 6 2019 Changes: curl: added --no-progress-meter [/pre2]

Dr. Oldwarez: Dima пишет: Dr. Oldwarez Может CURL древний Fixed in 7.67.0 - November 6 2019 Changes: curl: added --no-progress-meter Да, древний. И не обновляется, несмотря на прямую замену. Лучше давайте уберём эту опцию

Dr. Oldwarez: Петр пишет: IcsToArray2 обладает тем же функционалом, написана на Harbour. Пока решил прочесать программу и обнаружил, что эта функция не работает. Выдаёт пустой массив

Петр: Dr. Oldwarez пишет: Выдаёт пустой массив Да, если строка на входе не валидная. Можно и в ошибку времени исполнения свалиться, но так лучше. И в дальнейшем приводите самодостаточные примеры или хотя бы часть своего кода, чтобы был какой-то предмет для разговора.

Dr. Oldwarez: Бывший main [pre2]FUNCTION Import2Cal() LOCAL cStr LOCAL cCmdLn := 'curl.exe -u "%1$s:%2$s" %3$s -T "%4$s" -X %5$s %6$s%7$s' LOCAL cOpt:='',aICS LOCAL aEvent,w:=0, cUid LOCAL cFile:=hb_defaultValue(cTempLW,"")+'\Termin.ics' LOCAL cStdOut, cStdErr cStr:=hb_MemoRead( cFile ) aICS:=IcsToArray2(cStr,@w ) aEvent := sf_GetEvent( IcsToArray2(cStr,@w ) ) MsgInfo(STR(LEN(aICS))) cUid := sf_GetUID( aEvent ) cStr := RTrim( cUid ) + '.ics' cUid += ".ics" cOpt := '--insecure --no-progress-meter ' cOpt += '--http1.1 ' cOpt += '--header "Content-Type: text/calendar; charset=utf-8" ' cOpt += '--dump-header _header.log ' cCmdLn:=hb_StrFormat(cCmdLn, cCalLogin, cCalPwd, cOpt, cFile, "PUT", cCalName, cUid ) //MsgInfo(cCmdLn) hb_ProcessRun( cCmdLn,,@cStdOut,@cStdErr) IF ! Empty( cStdErr ) hb_MemoWrit( hb_DirBase() + "_err.log", cStdErr ) ENDIF IF ! Empty( cStdOut ) hb_MemoWrit( hb_DirBase() + "_out.xml", cStdOut ) ENDIF RETURN NIL [/pre2] [pre2] STATIC FUNCTION sf_GetEvent(aSource) LOCAL nStart, nEnd, nLen, e1, e2 hb_default(@aSource, {}) IF .NOT. Empty( aSource ) nStart := nEnd := 0 FOR EACH e1 IN aSource DESCEND IF e1[ICS_PARAMETER] = "BEGIN" FOR EACH e2 IN e1[ICS_VALUE] DESCEND IF hb_LeftEq(e2, "VEVENT") nStart := e1:__enumIndex() EXIT ENDIF NEXT ELSEIF e1[ICS_PARAMETER] = "END" FOR EACH e2 IN e1[ICS_VALUE] DESCEND IF hb_LeftEq(e2, "VEVENT") nEnd := e1:__enumIndex() EXIT ENDIF NEXT ENDIF IF nEnd > 0 EXIT ENDIF NEXT IF nStart != 0 .AND. nStart > nEnd nLen := nStart - nEnd + 1 RETURN ACopy(aSource, Array(nLen), nEnd, nLen) ENDIF ENDIF RETURN {} [/pre2] Я проверил, что пустой массив aEvent выдаёт именно sf_getevent. aICS длиной в 12 элементов, как и положено ICS_PARAMETER ICS_VALUE - они не из "ICS.CH"? И где его взять?

Dima: Dr. Oldwarez пишет: И не обновляется, несмотря на прямую замену Так не бывает..........ну если корректно заменил конечно :)

Петр: Dr. Oldwarez пишет: Я проверил, что пустой массив aEvent выдаёт именно sf_getevent. aICS длиной в 12 элементов, как и положено У вас sf_getevent для использования с IcsToArray Для IcsToArray2 sf_GetEvent() код нужно модифицировать Читайте внимательно Код в посте №1669 исправил для использования IcsToArray2

Петр: Dr. Oldwarez пишет: ICS_PARAMETER ICS_VALUE - они не из "ICS.CH"? И где его взять? ICS_PARAMETER см. мой пост №1675 если коротко [pre2] #include "ics.ch" #define ICS_PARAMETER ICS_PARAM #define ICS_PROPERTY ICS_PROPS #define ICS_VALUE ICS_VALS [/pre2]



полная версия страницы